Python自学之路之函数一些补充
一、函数何时被创建,注意分析以下两个例子的结果:
题1: info = [] def func(): print(item) for item in range(10): info.append(func) print(info) info[0]() info[1]() info[2]() 打印结果: 9 9 9 题2: info = [] def func(i): def inner(): print(i) return inner for item in range(10): info.append(func(item)) info[0]() info[1]() info[4]() 打印结果: 0 1 4
二、函数不被调用,永远不会执行
例1: 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]() print(v1,v2) 打印结果: 9 9 9 例2: func_list = [] for i in range(10): # func_list.append(lambda :x) # 函数不被调用,内部永远不执行(不知道是什么。) func_list.append(lambda :i) # 函数不被调用,内部永远不执行(不知道是什么。) print(func_list) v = func_list[2]() print(v)
打印结果:
[<function <lambda> at 0x00000230B63E1E18>, <function <lambda> at 0x00000230B80C0AE8>, <function <lambda> at 0x00000230B80C0EA0>, <function <lambda> at 0x00000230B80C0B70>, <function <lambda> at 0x00000230B80C0F28>, <function <lambda> at 0x00000230B80D8048>, <function <lambda> at 0x00000230B80D80D0>, <function <lambda> at 0x00000230B80D8158>, <function <lambda> at 0x00000230B80D81E0>, <function <lambda> at 0x00000230B80D8268>]
9
三、执行函数时,会新创建一块内存保存自己函数执行的信息 => 闭包
例1: 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)) print(base_list) print(func_list[2]()) print(func_list[3]()) # 1. base_list 和 func_list中分别保存的是什么? """ base_list中存储都是base函数。 func_list中存储的是inner函数,特别要说的是每个inner是在不同的地址创建。 """ 打印结果: [<function base at 0x000001B2944C1E18>, <function base at 0x000001B2944C1E18>, <function base at 0x000001B2944C1E18>, <function base at 0x000001B2944C1E18>, <function base at 0x000001B2944C1E18>, <function base at 0x000001B2944C1E18>, <function base at 0x000001B2944C1E18>, <function base at 0x000001B2944C1E18>, <function base at 0x000001B2944C1E18>, <function base at 0x000001B2944C1E18>] 2 3 # 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 打印结果: 9 0 1 2 3 4 5 6 7 8 9
四、匿名函数
lambda函数也叫匿名函数,即没有具体名称的函数,他允许快速定义单行函数,可以用在任何需要函数的地方。
简单看几个lambda函数实例:
## 1、 def fn(x,y): return x + y v = fn(2,3) v2 = lambda x,y:x + y print(v2(2,3)) ## 2、 fn = [lambda j:i*j for i in range(6)] print([f(2) for f in fn]) 注意点:函数不被调用,永远不会执行,所以打印出的结果如下: [10, 10, 10, 10, 10, 10] ## 3、 fn = map(lambda i:(lambda j: i*j), range(6)) # 0 1 2 3 4 5 print([f(2) for f in fn]) 打印结果; fn = map(lambda i:(lambda j: i*j), range(6)) # 0 1 2 3 4 5 print([f(2) for f in fn]) ## 4、 lst = [] for i in range(6): # 0...5 lst.append(lambda j:i*j) if i==3: break print([f(2) for f in lst]) 打印结果: [6, 6, 6, 6] ## 5、 fn = [(lambda i:lambda j:i*j)(i) for i in range(6)] print([f(2) for f in fn])
五、高级一点内置函数
- map 循环每个元素(第二个参数),然后让每个元素执行函数(第一个参数),将每个函数执行的结果保存到新的列表中,并返回。
v = map( lambda x : x + 1, [1, 2, 3] ) print(list(v)) 打印结果: [2, 3, 4]
- filter
v1 = [11,22,33,'asd',44,'xf'] def func(x): if type(x) == int: return True return False result = filter(func,v1) # [11,] print(list(result)) result = filter(lambda x: True if type(x) == int else False ,v1) print(list(result)) result = filter(lambda x: type(x) == int ,v1) print(list(result)) 打印结果: [11, 22, 33, 44] [11, 22, 33, 44] [11, 22, 33, 44]
- reduce
import functools v1 = ['wo','hao','e'] def func(x,y): return x+y result = functools.reduce(func,v1) print(result) result = functools.reduce(lambda x,y:x+y,v1) print(result) 打印结果: wohaoe wohaoe

浙公网安备 33010602011771号