python学习记录六
返回函数
def calc_sum(*args): ax = 0 for n in args: ax = ax + n return ax def lazy_sum(*args): def sum(): ax = 0 for n in args: ax = ax + n return ax return sum
返回的不是求和结果,而实求和函数
>>> f = lazy_sum(1,3,5,7,9) >>> f <function lazy_sum.<locals>.sum at 0x101c6ed90> >>> f() 25
当我们调用lazy_sum()
时,每次调用都会返回一个新的函数,即使传入相同的参数:
>>> f1 = lazy_sum(1, 3, 5, 7, 9) >>> f2 = lazy_sum(1, 3, 5, 7, 9) >>> f1==f2 False
f1()
和f2()
的调用结果互不影响。
def count(): fs = [] for i in range(1, 4): def f(): return i*i fs.append(f) return fs f1, f2, f3 = count() 在上面的例子中,每次循环,都创建了一个新的函数,然后,把创建的3个函数都返回了。 你可能认为调用f1(),f2()和f3()结果应该是1,4,9,但实际结果是: >>> f1() 9 >>> f2() 9 >>> f3() 9 全部都是9!原因就在于返回的函数引用了变量i,但它并非立刻执行。等到3个函数都返回时,它们所引用的变量i已经变成了3,因此最终结果为9。 返回闭包时牢记一点:返回函数不要引用任何循环变量,或者后续会发生变化的变量。 可以这么写试试 def count(): def f(j): def g(): return j*j return g fs = [] for i in range(1, 4): fs.append(f(i)) # f(i)立刻被执行,因此i的当前值被传入f() return fs
匿名函数
>>> list(map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9])) [1, 4, 9, 16, 25, 36, 49, 64, 81] 我们可以看出 lambda x: x * x 实际上都是: def f(x) return x * x关键字lambda表示匿名函数,冒号前面的x表示函数参数。匿名函数也是一个函数对象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数:
装饰器
由于函数也是一个对象 而且函数对象可以被赋值给变量 通过变量也可以调用函数
>>> def now(): ... print(‘2015-3-25‘) ... >>> f = now >>> f() 2015-3-25函数对象有一个__name__属性,可以拿到函数的名字: >>> now.__name__ ‘now‘ >>> f.__name__ ‘now‘
相关推荐
夜斗不是神 2020-11-17
huavhuahua 2020-11-20
Yasin 2020-11-16
xiaoseyihe 2020-11-16
千锋 2020-11-15
diyanpython 2020-11-12
chunjiekid 2020-11-10
wordmhg 2020-11-06
世事一场大梦 2020-11-17
xiaoseyihe 2020-11-16
Morelia 2020-11-03
CloudXli 2020-11-03
文山羊 2020-10-31
comtop0 2020-10-31
pythonxuexi 2020-10-30
三石 2020-10-29
chaochao 2020-10-27
PythonMaker 2020-10-27