'''生成器 generator''' # 实现生成器 t = (x*x for x in range(10)) # 使用next()方法可以获取生成器中的下一个元素 print(next(t)) # 如果生成器中的元素已取完,则抛出StopIteration异常 g = (x*x for x in range(10)) for i in g: print(i) ''' 利用函数实现生成器 ''' # import time # def nature(): # n = 1 # while True: # ''' # return n 1.返回n的值 2.立即结束函数 # yield n 1.返回n的值 2.立即暂停函数的执行 # ''' # yield n # 收获 return # n += 1 # g = nature() # for i in g: # print(i) # time.sleep(1) # 练习:用生成器生成斐波那契序列 ''' 1 1 2 3 5 8 13 a = 0 b = 1 a+b=1; a = b b = a+b a = 1 b = 1 a+b=2; a = b b = a+b a = 1 b = 2 a+b=3; a = b b = a+b a = 3 b = 3 a+b=5; a = b b = a+b a = 3 b = 5 a+b=8; a = b b = a+b ''' import time def fib(): a,b = 0,1 while True: yield b # 先计算赋值符号的右边,然后再赋值 a,b = b,a+b time.sleep(1) f = fib() # for i in f: # print(i) # time.sleep(0.5) from collections.abc import Iterable print(isinstance(f,Iterable)) ''' 高阶函数 函数名本质上就是一个指向该函数的变量 ''' print(abs) # <built-in function abs> f = abs print(f(-5)) ''' 函数作为参数传入 一个函数A可以接受另一个函数B作为参数,这个函数A称为高阶函数 ''' f = abs def add(x,y,f): return f(x)+f(y) print(add(3,5,f)) def g(x): return x*x print(add(3,4,g)) # map() 函数 r = map(g,[1,2,3,4,5]) print(list(r)) ''' 函数作为返回值 ''' def s(*args): ss = 0 for arg in args: ss += arg return ss print(s(1,2,3,4)) ''' lazy_s()函数中定义了内部函数s(),而s()函数中又引用了外部函数lazy_s()的参数args 当lazy_s()函数返回函数s(),相关的参数和变量都已经保存在返回的函数中 这种程序结构称为 闭包Closure ''' def lazy_s(*args): def s(): ss = 0 for arg in args: ss += arg return ss return s h = lazy_s(1,2,3,4) print(h()) ''' 匿名函数 lambda 表达式 匿名函数一般只用于处理简单的情况 ''' def g(x): return x*x r = map(g,[1,2,3,4]) print(list(r)) r = map(lambda x: x*x*x,[1,2,3,4]) print(list(r) f = lambda x,y: x+y print(f(2,3)) # 匿名写奇数 h = lambda x: x%2 == 1 print(h(3)) ''' 装饰器Decorator 在代码运行期间动态增加功能的方式称为装饰器 ''' # 创建一个装饰器 def log(func): def wrapper(*args,**kw): # func:将要被装饰的函数 print('调用函数:%s'%func.__name__) return func(*args,**kw) return wrapper import time @log # now = log(now) # @log就相当于限下面的 f = log(now) f() def now(): print(time.strftime('%Y-%m-%d %H:%M:%S')) now() # f = now # f() # f = log(now) # f() # print(now) # print(now.__name__) # now.__name__ = '现在' # print(f.__name__) import functools # 可传参的装饰器 def log2(text): def decorator(func): @functools.wraps(func) def wrapper(*args,**kw): print('%s:%s'%(text,func.__name__)) return func(*args,**kw) return wrapper return decorator @log2('马上执行函数') # now2 = log2('马上执行函数')(now2) def now2(): print(time.strftime('%Y-%m-%d %H:%M:%S')) now2() print(now2.__name__)
|