嵌套函数
>>> graphic = '三角形' >>> def chang(): graphic = '正方形' def chang1(): #内部嵌套的函数命名可相同 graphic = '圆形' print('第三层打印',graphic) chang1() print('第二层打印',graphic) >>> chang() 第三层打印 圆形 第二层打印 正方形 >>> print('第一层打印',graphic) 第一层打印 三角形 #在各自的命名空间中同名变量不受影响
匿名函数
lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数
语法为 lambda [arg1 [,arg2,.....argn]]:expression ,以变量的方式调用 sum = lambda arg1, arg2: arg1 + arg2
装饰器
装饰器的作用:在原先代码不改变的情况扩展功能
def test(f): def inner(): print('hello') f() return inner # 返回内部函数对象,内部不调用,这种现象称为‘‘闭包’’ @test def log(): print('world') # @test 相当于执行 log= test(log) log() # 现在的log()相当于inner() -------------------- hello world
装饰器的参数传递
def test(f): def inner(*arg): print('hello') f(*arg) #此处f(*arg)是原先login函数的调用 return inner @test def login(x=None): if x == 'xing': print('world') login() #不传参数,因为inner函数是可选参数,f(*arg)则中则为默认参数x = None --------------- # hello -------------- login('xing') --------------- # hello # world
递归函数
递归函数需设停止递归的条件
递归代码还有代码的话,递归结束后还会依次执行
def calc(n): print(n ) n = int(n /2) # 50 if n > 0: calc(n) # 50 print(n)
生成器
a = [x for x in range(10)] b = (x for x in range(10)) print(a) print(b) ------------------- # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # <generator object <genexpr> at 0x00505070>
生成器函数
使用yield关键字
def g_test(): while True: print('hello') n = yield 5 # yield是暂停并return 5 print(n) g = g_test() # 必选先执行赋值变量操作 g.__next__() # 刚建立的生成器必须先执行此步 print(g.__next__()) g.send('world') # send方法可发送值给n ------------------------ hello None # 执行完第一个__next__(),n并未赋值,print(n)为None hello 5 # yield 5 返回了5 ,print()出来了 world hello