本篇文章小编给大家分享一下python中迭代器生成器与装饰器代码解析,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。
迭代器
每一个可迭代类内部都要实现__iter__()方法,返回一个迭代类对象,迭代类对象则定义了这个可迭代类如何迭代。
for循环调用list本质上是是调用了list的迭代器进行迭代。
# 对list进行for循环本质上是调用了list的迭代器 list = [1,2,3,4] # for 循环调用 for elem in list: print(elem) # 迭代器调用 list_iter = list.__iter__() while True: try: print(next(list_iter)) except StopIteration: break
实现一个自己自定的迭代类,规定迭代一个可迭代的数据结构为“倒计时”模式。
# 可迭代对象类 class CountDown(object): def __init__(self,num): self.num = num def __iter__(self): return MyIterator(self.num) # 迭代类 class MyIterator(object): def __init__(self,num): self.NUM= num self.FINAL = 0 self.now = num def __iter__(self): return self def __next__(self): step = 1 if self.NUM生成器
含有yield指令的函数可以称为生成器,它可以将函数执行对象转化为可迭代的对象。这样就可以像debug一样一步一步推进函数。可以实现的功能是可以实现让函数内部暂停,实现了程序的异步功能,这样可以及进行该函数与外部构件的信息交互,实现了系统的解耦。
from collections import Iterable def f(): pass # 含有yield指令的函数可以称为生成器 def g(): yield() print(type(f()),isinstance(f(),Iterable)) print(type(g()),isinstance(g(),Iterable))使用生成器可以降低系统的耦合性
import os # 生成器是迭代器的一种,让函数对象内部进行迭代 # 可以实现让函数内部暂停,实现了程序的异步功能,同时也实现了解耦。 def my_input(): global str str = input('input a line') pass def my_write(): with open('workfile.txt','w') as f: while(str): f.write(str+'n') yield() return mw = my_write() while(True): my_input() try: next(mw) except StopIteration: pass if not str: break装饰器
装饰器封装一个函数,并且用这样或者那样的方式来修改它的行为。
不带参数的装饰器
# 不带参数的装饰器 from functools import wraps # 装饰器封装一个函数,并且用这样或者那样的方式来修改它的行为。 def mydecorator(a_func): @wraps(a_func) #声明这个注解就可以不重写传入的函数,只是调用的时候wrap一下。不加的话,a_func函数可以看作被重写为wrapTheFunction. def wrapTheFunction(): print(f"function in {id(a_func)} starts...") a_func() print(f"function in {id(a_func)} ends...") return wrapTheFunction # 在函数定义前加入此注解就可以将函数传入装饰器并包装 @mydecorator def f(): print('hi') pass f() print(f.__name__)带参数的装饰器(实现输出到自定义的日志文件)
# 带参数的装饰器(实现输出到自定义的日志文件) from functools import wraps def logit(logfile='out.log'): def mydecorator2(a_func): @wraps(a_func) def wrapTheFunction(*args, **kwargs): # 这个保证了函数可以含有任意形参 log_string = a_func.__name__ + " was called" print(log_string) # 打开logfile,并写入内容 with open(logfile, 'a') as opened_file: # 现在将日志打到指定的logfile opened_file.write(log_string + 'n') return a_func(*args, **kwargs) return wrapTheFunction return mydecorator2 # func group1 @ logit('out1.log') def func1(str): print(str) pass @ logit('out2.log') def func2(): pass func1('I have a foul smell') func2()实现一个装饰器类(这样写可以简化装饰器函数,并且提高封装性)
# 带参数的装饰器(实现输出到自定义的日志文件) from functools import wraps def logit(logfile='out.log'): def mydecorator2(a_func): @wraps(a_func) def wrapTheFunction(*args, **kwargs): # 这个保证了函数可以含有任意形参 log_string = a_func.__name__ + " was called" print(log_string) # 打开logfile,并写入内容 with open(logfile, 'a') as opened_file: # 现在将日志打到指定的logfile opened_file.write(log_string + 'n') return a_func(*args, **kwargs) return wrapTheFunction return mydecorator2 # func group1 @ logit('out1.log') def func1(str): print(str) pass @ logit('out2.log') def func2(): pass func1('I have a foul smell') func2()
太极熊猫2百度版 安卓版v1.7.1
下载黎明觉醒应用宝版 安卓版v1.111.1
下载暗影格斗3国际版 (Shadow Fight 3)最新版v1.40.3
下载王者战魂华为版 安卓版v3.6.1
下载放置魔法学院免广告版 v2.9.5
放置魔法学院内置Mod菜单是游戏的破解版本,在该版本中为玩家
万乘之国qq版本 安卓版v1.0.5
万乘之国qq版本是一款极具魅力的策略游戏,玩家们可以通过不同
动物餐厅国际服无限内购版 v12.9
动物餐厅国际服免广告版是游戏的破解版本,在该版本中为玩家去除
欧洲卡车司机 安卓版v3.2
欧洲卡车司机是款模拟经营游戏,这款游戏的画面还是蛮逼真的,给
疯狂大酒店 (Grand Hotel Mania)最新中文版v4.10.0.20
疯狂大酒店(Grand Hotel Mania)是一款好玩的