函数的定义
def 函数名():
code
return 返回值
定义函数的三种方法
- 有参函数
- 无参函数
- 空函数
函数返回值
- return 终止函数
- 返回值 可以返回多个值, 以元组形式存储
- 默认返回None
Nonetype ....
函数调用
函数名()
函数的参数
形参
描述意义
位置形参
一个一个从左到右
默认形参
默认值, 默认形参必须放在位置形参的后面
实参
具有具体的值
位置实参
一个一个从左到右传值给形参
关键字实参
键值对的形式传给形参 ; 关键字实参必须放在位置实参的后面
可变长参数
*
形参
接收多余的位置实参,以元组的形式存储
实参
打散元组,以位置实参的形式传参给形参
**
形参
接收多余的关键字实参,以字典的形式存储
实参
**{'a':1} --> a=1
打散字典,以关键字实参的形式传给形参(形参必须得有这个key的形参名)
函数对象
- 引用
- 函数的参数
- 函数的返回值
- 容器类元素
函数对象 是 函数名 == 变量名
函数的嵌套
def f1():
def f2():
pass
名称空间和作用域
- 内置
- 全局
- 局部
执行顺序: 内置 --> 全局 --> 局部
查找顺序: 当前 --> 局部 --> 全局 --> 内置
全局作用域:
局部作用域
- 全局作用域(x=1)和局部作用域的(x=3)毫无关联
- 局部作用域1的(x=1)和局部作用与2的(x=3)毫无关联
闭包函数
把函数A和变量x包在函数B内部,然后通过函数B的返回值返回出函数A对象
def B(x):
# x = 1
def A():
print(x)
pass
return A
装饰器
用来给函数加功能的,他的本质也是函数
- 不改变被装饰函数的源代码
- 不改变被装饰函数的调用方式
def outter(func):
def wrapper(*args,**kwrags):
# 逻辑
res = func(*args,**kwargs) # func是被装饰的函数
return res
return wrapper
@outter
def index():
pass
def sanceng(engine):
def outter(func):
def wrapper(*args,**kwrags):
# 逻辑
res = func(*args,**kwargs) # func是被装饰的函数
return res
return wrapper
return outter
@sanceng(engine)
def index():
pass
迭代器
可迭代对象: 具有iter方法的对象, 可迭代对象不一定是迭代器对象
迭代器对象: 具有iter和next方法的对象, 迭代器对象一定是可迭代对象, 迭代器对象加上iter方法还是迭代器本身
for 循环原理
for i in lt:
- 把lt变成迭代器对象
- 然后迭代使用next方法获取每一个元素
- 捕捉异常中断while循环
三元表达式
print(1) if i > 10 else print(2)
列表推导式
[i for i in range(10)] # 0-9已经拿出来了
字典生成式
{k:v for k,v in dic.items()}
生成器表达式
(i for i in range(10)) # 不去使用next取值,是没有值的
生成器
自定制的迭代器
def func():
yield
yield:
1. 暂停函数,遇到下一个yield继续运行函数体代码
- 具有返回值
- 让函数()变成生成器对象
return:
1. 终止函数
- 返回值
匿名函数
没有名字的函数 lambda 参数:代码块
一般不单独使用,与 max/min/map/filter/sorted联用
递归
函数调用函数本身,但是必须得有结束条件
内置函数
内置函数是直接用的,属于python解释器的
数据类型的内置函数只有数据类型本身才能使用
enumerate()
面向过程编程
流水线
优点: 思路清晰
缺点: 可扩展性差 ; 功能与功能之间不独立 ; 调试麻烦