为了使需要重复编写的代码书写方便,设定了函数。一般使用为两种场景,有重复代码和代码太长需要省略的,利用函数的编程称为函数式编程。

1.函数的参数

参数分为形参和实参,形参就是只是起一个站位的作用的就是形参,实参就是执行参数时传值时的参数。
传参分为位置传参,关键字传参,位置传参必须要在关键字传参之前。
参数还有默认参数和动态参数,默认参数就是在定义函数时的形参就赋值,动态参数能一直添加参数(args只能按照位置传参,传入的实参会组成元组;kwargs只能按关键字传参,传入的参数会组成一个字典)
注意事项:
kwargs必须放在
args后面,默认值和动态参数可以同一级别,其他参数在这些之前

2.函数返回值

返回值可以是任意类型,如果函数中没使用return,则默认返回None。
如果函数中return中返回的值里带逗号,则会转换为元组再返回。
函数执行return会立刻停止运行函数并返回值。

3.函数内存关系

函数在传参和返回值时都是使用的内存地址,这一特性可节省内存以及可在函数运行中修改可变类型。
如果不想让外部变量和函数内部参数一致,可以使用copy模块中的copy.deepcopy函数拷贝一份数据再传递给函数。
函数在运行完毕后会被立即回收,所以如果内部参数未指向内存地址时,也就是不是默认参数时,函数多次运行如果结果相同,但是内存地址不会指向同一地址,而是会开辟多块地址。
当函数的参数是默认参数时,这个值会一直被维护并重复使用。

4.函数作用域

函数会先在函数内部查找变量,如果内部没有就会使用全局变量
全局变量尽量使用大写,局部变量尽量使用小写
局部变量可以使用global函数进行声明,使其变成一个全局变量

  1. B = 1
  2. def a() :
  3. global B
  4. B = 2

5.函数的嵌套

在一般情况下函数都会在全局里,如果当函数名冲突时,可以选择函数的嵌套。

6.函数的闭包

闭包就是将数据封装在一个区域里面,使用时就会运行(本质上就是基于函数嵌套搞出来的的一个特殊嵌套)
闭包的作用主要是:封装数据防止污染全局和将数据封存到包里面需要时再使用

7.装饰器

装饰器主要是在不修改源码的情况下将函数封装在一个包里面

  1. def outer(origin):
  2. def inner(*args, **kwargs):
  3. # 执行前
  4. res = origin(*args, **kwargs) # 调用原来的func函数
  5. # 执行后
  6. return res
  7. return inner
  8. @outer
  9. def func():
  10. pass
  11. func()

装饰器的扩展应用functools,functools函数主要就是用来将装饰器装饰好的函数也能用原来的函数名应用。

  1. import functools
  2. def auth(func):
  3. @functools.wraps(func)
  4. def inner(*args, **kwargs):
  5. """阿巴阿巴"""
  6. res = func(*args, **kwargs) # 执行原函数
  7. return res
  8. return inner
  9. @auth
  10. def handler():
  11. "123"
  12. pass
  13. handler()
  14. # 调取函数的函数名
  15. print(handler.__name__)
  16. # 调取函数内部的注释
  17. print(handler.__doc__)

8.匿名函数

匿名函数是基于lambda表达式实现的一个没有名字的函数,主要是用来执行简单的函数,默认将代码执行结果返回

  1. func = lambda x: x + 100
  2. v1 = func(10)
  3. print(v1) # 110

9.三元运算

比较简单的条件语句可以基于三元运算实现,也可以与lambda结合起来使用

  1. func = lambda x: "大了" if x > 66 else "小了"
  2. v1 = func(1)
  3. print(v1) # "小了"
  4. v2 = func(100)
  5. print(v2) # "大了"

10.生成器

生成器主要的功能是用来节省内存,单独使用next执行时执行完毕后会报错,应与for…in…配合起来利用

  1. def func():
  2. print(111)
  3. yield 1
  4. print(222)
  5. yield 2
  6. print(333)
  7. date=func()
  8. for item in date:
  9. print(item)

.send函数

send函数的作用是在生成器返回值时,下次使用为返回值进行赋值,第一次必须为None

  1. def func():
  2. print(111)
  3. v1 = yield 1
  4. print(v1)
  5. print(222)
  6. v2 = yield 2
  7. print(v2)
  8. print(333)
  9. v3 = yield 3
  10. print(v3)
  11. print(444)
  12. data = func()
  13. n1 = data.send(None)
  14. print(n1)
  15. n2 = data.send(666)
  16. print(n2)
  17. n3 = data.send(777)
  18. print(n3)
  19. n4 = data.send(888)
  20. print(n4)

11.python内置函数

abs 绝对值
pow 指数
sem 求和
divmod 求商和余数
round 浮点类型数据取小数点后的位置
min 最小值
max 最大值
all 是否全部为True
any 是否存在True
bin 十进制转二进制
oct 十进制转八进制
hex 十进制转十六进制
ord 获取字符对应的unicode码点(十进制)
chr 根据码点(十进制)获取对应字符
int 整型
foat 浮点类型
str 字符串类型unicode编码
bytes 字节类型utf-8、gbk编码
bool 布尔类型
list 列表类型
dict 词典类型
tuple 元组类型
set 集合类型
len 获取字符串长度
print 输出
input 输入
open 打开文件
type 获取数据类型
range 数字生成器
enumerate 同时将数字与value迭代
id 查看内存地址
hash 哈希
help 帮助信息,一般在终端使用
zip 将不同的列表元素根据索引挨个关联成一个元组
callable 检查是否是可执行
sorted 排序

12.推倒式

列表、字典、集合使用for…in…if…句式可以实现将迭代条件判断集合在一起的功能

  1. num_list = [ i for i in range(10)]

元组不同于其他类型,元组返还的是一个生成器
推倒式内部支持嵌套