目录
函数的定义
def 函数名():
pass
函数的三种定义方式
空函数
def func():
pass
有参函数
def func(args):
pass
无参函数
def func():
pass
函数的调用
函数名()
函数的返回值
- return 可以返回值
- return 可以终止函数
- return 可以返回多个值,用元组返回
函数的参数
形参
位置形参
从左到右依次接收位置实参
默认形参
具有默认值;它必须放在位置形参后面
实参
位置实参
从左到右依次传值给位置形参
关键字实参
按照形参名传值;它必须放在位置实参后面
可变长参数
*
*形参:接收多余的位置实参,用元组接收
*实参:打散可迭代对象,当作位置实参传给形参
**
**形参:接收多余的关键字实参,用字典接收
**实参:打散字典,当作关键字实参传给形参
def func(*args,**kwargs): # 接收所有多余的参数
pass
函数对象
def func():
pass
引用
f1 = func
容器类元素
lt = [func]
函数的返回值
def f2():
return func
f3 = f2()
函数的参数
def f2(func):
pass
f2(func)
函数嵌套
def f1():
def f2():
pass
名称空间与作用域
内置名称空间
内置函数
全局名称空间
除了内置和局部都是全局
局部名称空间
函数内部的
执行顺序
内置 --》 全局 --》 局部
搜索顺序
从当前开始 局部 -》 全局 -》 内置
全局作用域
全局的x和局部的x没有半毛钱关系
x = 1
def f1():
x = 3
f1()
print(x)
局部作用域
局部1x和局部2的x没有半毛钱关系
def f1():
x = 1
def f2():
x = 3
def f3():
x = 4
global
x = 1
def f1():
global x # 让下面的x变成全局的x
x = 3
f1()
print(x)
nonlocal
def f1():
x = 1
def f2():
nonlocal x
x = 3
def f3():
x = 4
可变数据类型会打破作用域关系
闭包函数
def a(x):
def b():
print(x)
return b
c = a(100)
x = 20
c()
装饰器
- 本质就是函数
- 不修改源代码
- 不改变调用方式
二层装饰器
import time
def index(x):
return 123
def time_count(func):
def wrapper(*args,**kwargs):
start = time.time()
res = func(*args,**kwargs)
end = time.time()
print(end - start)
return res
return wrapper
index = time_count(index)
res = index(10) # wrapper()
两层装饰器模板
def deco(func):
def wrapper(*args,**kwargs):
res = func(*args,**kwargs)
return res
return wrapper
@deco
def index():
pass
三层装饰器
def sanceng(x):
def deco(func):
def wrapper(*args,**kwargs):
res = func(*args,**kwargs)
return res
return wrapper
return deco
@sanceng(10)
def index():
pass
迭代器
可迭代对象
含有iter方法 --》除了数字
迭代器对象
含有iter和next方法的 --》 文件
三元表达式
列表推导式
字典生成式
生成器表达式
g = (i for i in range(10))
print(next(g)) # g.__next__()
生成器
含有yield的函数
yield
- 暂停函数
- 一个next可以拿到一个yield的值
递归
函数调用函数本身;有退出条件
count = 0
def a():
global count
print(count)
count += 1
if count == 100:
return
a()
递归能干的事情,绝大多数能用循环代替
匿名函数
lambda 参数:返回值
与max/min/filter/map/sorted/sum
内置函数
enumerate 获取索引+值
面向过程编程
类似与流水线