25 函数总结 重点
总结
- 自定义函数
- 基本函数结构(98%)
- 高级
- 参数
- 闭包
函数的参数传递的是什么?
【内存地址=引用 or 值】
v = [11,2,33,4]
def func(arg):
print(id(arg)) # 列表内存地址
print(id(v)) # 列表内存地址
func(v)
# 传递的是内存地址。
*args和**kwargs的作用
-
返回值
-
常见数据类型可以返回
-
函数也可以返回
def func(): def inner(): pass return inner v = func()
-
特殊
- 默认没返回就是None
- return 1,2,3 等价于 return (1,2,3,4,)
执行函数
-
函数不被调用,内部代码永远不执行。
def func(): return i func_list = [] for i in range(10): func_list.append(func) print(i) # 9 v1 = func_list[4]() v2 = func_list[0]()
func_list = [] for i in range(10): # func_list.append(lambda :x) # 函数不被调用,内部永远不执行(不知道是什么。) func_list.append(lambda :i) # 函数不被调用,内部永远不执行(不知道是什么。) print(func_list) func_list[2]()=
执行函数时,会新创建一块内存保存自己函数执行的信息 => 闭包
def base(): return i def func(arg): def inner(): return arg return inner base_list = [] # [base,base,] func_list = [] # [由第一次执行func函数的内存地址,内部arg=0 创建的inner函数,有arg=1的inner函数 ] for i in range(10): # i = 0 ,1 base_list.append(base) func_list.append(func(i)) # 1. base_list 和 func_list中分别保存的是什么? """ base_list中存储都是base函数。 func_list中存储的是inner函数,特别要说的是每个inner是在不同的地址创建。 """ # 2. 如果循环打印什么? for item in base_list: v = item() # 执行base函数 print(v) # 都是9 for data in func_list: v = data() print(v) # 0 1 2 3 4
-
总结:
- 传参:位置参数 > 关键字参数
- 函数不被调用,内部代码永远不执行。
- 每次调用函数时,都会为此次调用开辟一块内存,内存可以保存自己以后想要用的值。
- 函数是作用域,如果自己作用域中没有,则往上级作用域找。