标签:func 保留 def 内存 循环调用 append 延长 pass 生成器
def extendList(val, list=[]): list.append(val) return list list1 = extendList(10) print(list1) #[10] list2 = extendList(123, []) print(list2) #[123] list3 = extendList(‘a‘) print(list3) #[10,a] ‘‘‘ a = 5 a = 6 print(a) lst = [] lst.append(1) print(lst) lst.append(2) print(lst) lst = [] lst.append(1) print(lst) ‘‘‘ """ 函数如果定义一个默认形参,那么这个值会在内存当中提前保留一份 在函数调用时,如果用户定义了实参,那么使用用户自己的实际值 如果用户没有给与实际参数,那么使用默认形参值 print("<===>") def func(a = 5): print(a) func() # a = 5 func(6) def func(val, list=[]): list.append(val) print( list) func(1) func(2,[5,6,7]) func(3) """ # ###3.res多少? def func(): return [lambda x : i*x for i in range(4)] res = [m(2) for m in func()] print(res) ‘‘‘ 在ceshi函数当中 跑循环4遍 ,循环定义4个函数 注意的是,遍历的时候仅仅是定义,只有在调用的时,才会运行函数体, 所以定义时,i变量不会直接走入函数体内参与运算 最后通过lst返回,lst当中包含4个函数,因为内函数func使用了外函数ceshi的变量i, 所以变量i延长了它的生命周期,这是闭包的特点 返回出来之后,通过列表推导式 , 循环调用了4次函数,这个时候 2 与先前的i 参与运算, 因为i值已经全部循环结束,最后的i = 3,所以每个函数的运算结果 都是 2*i => 2 * 3 =>6 因为循环4次,所以列表里 产生了4 个 6; ‘‘‘ def ceshi(): lst = [] for i in range(4): def func(x): return i*x lst.append(func) return lst lst = ceshi() print(lst) res = len(lst) #4 ‘‘‘ # [ <function ceshi.<locals>.func at 0x000001805BB50EA0>, <function ceshi.<locals>.func at 0x000001805BB50F28>, <function ceshi.<locals>.func at 0x000001805BB50E18>, <function ceshi.<locals>.func at 0x000001805BB85048> ] lst = [函数1,函数2,函数3,函数4] ‘‘‘ for m in lst: ‘‘‘ def func(x): return i*x ‘‘‘ res = m(2) print(res) ‘‘‘ 函数的定义处和函数的调用处要分开 只有在函数调用的时候,才会执行函数体, 定义的时候只是单纯的定义包括参数,而没有去调用里面的内容 ‘‘‘ for i in range(4): pass print(i) # ###4.打印多少? def add(a,b): #普通求和函数 return a + b def test(): #生成器函数 for i in range(4): yield i # 初始化生成器函数 返回生成器 g=test() for n in [2,10]: g=(add(n,i) for i in g) print(list(g)) """ 定义一个生成器可以使用两种方式 要么使用生成器表达式,要么使用生成器函数, 注意只有调用时,才能执行生成器里面的内容 , next,for,list都是在调用生成器 而g=(add(n,i) for i in g) 写法是在定义生成器 next(g) for .. in g list(g) 是在调用 在循环时候,只是定义了生成器2次,没有在调用,下次再拿取n的时,n已经等于10 第一次调用生成器 先计算g=(add(n,i) for i in (0,1,2,3)) 得到结果得范围 g = (10,11,12,13) 第二次调用生成器 先计算g=(add(n,i) for i in (10,11,12,13)) 得到结果得范围 g = (20,21,22,23) list进行强转,得到列表[20,21,22,23] """ ‘‘‘ g=(add(n,i) for i in g) # i的范围 0 1 2 3 add(n,0) => add(10,0) => 10 add(n,1) => add(10,1) => 11 add(n,2) => add(10,2) => 12 add(n,3) => add(10,3) => 13 g = (10,11,12,13) g=(add(n,i) for i in g) add(n,10) => add(10,10) => 20 add(n,11) => add(10,11) => 21 add(n,12) => add(10,12) => 22 add(n,13) => add(10,13) => 23 [20,21,22,23] ‘‘‘ for n in [2,10]: pass print(n)
标签:func 保留 def 内存 循环调用 append 延长 pass 生成器
原文地址:https://www.cnblogs.com/huangjiangyong/p/10920450.html