'''生成器generator''' l =[x*x for x in range(10)] print(l) # 实现生成器 t =(x*x for x in range(10)) print(t) # 使用next()方法,可以获取生成式中的下一个元素 # 如果生成器中的元素已经取完了,则抛出StopIteration异常 # print(next(t)) print('----------------------------------') 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.立即暂停函数的执行 ''' # print(n) yield n n += 1 g = nature() # print(next(g)) # print(next(g)) # print(next(g)) # print(next(g)) # print(next(g)) for e in g: print(e) 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 = 2 b = 3 a+b = 5; a = b b = a+b a = 3 b = 5 a+b = 8; a = b b = a+b ''' def fib(): a,b = 0,1 while True: yield b # t = a # a = b # b = t+b # 先计算赋值符号的右边,然后再赋值 a,b = b,a+b f = fib() print(f) print(fib) for i in f: print(i) time.sleep(0.5)
''' 高阶函数 函数名本质就是一个指向该函数的变量 ''' print(abs(-5)) print(abs) f = abs print(f(-5)) abs = 7 print(abs) # print(abs(-5)) ''' 函数作为参数传入 一个函数A可以接收另一个函数B作为参数,我们把这个函数A称我高阶函数 ''' def add(x,y,f): return f(x)+f(y) print(add(3,4,f)) print(add(-3,-4,f)) def g(x): return x*x print(add(3,4,g)) # map()函数 /reduce()/filter() 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)) print(s(1,3,5,7)) ''' 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) ''' def s(): ss = 0 for arg in (1,2,3,4): ss += arg return ss ''' print(h) print(h())
''' 装饰器Decorator 在代码运行期间动态增加功能的方式,就称为装饰器 ''' # 创建一个装饰器 def log(func): ''' func:将要被装饰的函数 ''' def wrapper(*args,**kw): print('调用函数:%s'%func.__name__) return func(*args,**kw) return wrapper import time # now = log(now) # now() @log def now(): # print('调用函数:%s'%now.__name__) print(time.strftime('%Y-%m-%d %H:%M:%S')) now() # 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): # wrapper.__name__ = func.__name__ print('%s:%s'%(text,func.__name__)) return func(*args,**kw) return wrapper return decorator @log2('马上立刻执行函数') # now2 log2('马上立刻执行函数')(now2) def now2(): # print('调用函数:%s'%now.__name__) print(time.strftime('%Y-%m-%d %H:%M:%S')) now2() print(now2.__name__)
|