Python 生成器、迭代器、反射器
生成器(generator)
一个函数调用时返回一个迭代器,那么这个就叫生成器(generator),如果函数中包含yield语法,那么这个函数就变成了生成器
return作用:在一个生成器中,如果没有return,则默认执行到函数完毕;如果遇到return,如果在执行过程中return则会抛出StopIteration终止迭代
|
|
yield: 每需要一个时,添加一个
简单地讲,yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator,调用 fab(5) 不会执行 fab 函数,而是返回一个 iterable 对象!在 for 循环执行时,每次循环都会执行 fab 函数内部的代码,执行到 yield b 时,fab 函数就返回一个迭代值,下次迭代时,代码从 yield b 的下一条语句继续执行,而函数的本地变量看起来和上次中断执行前是完全一样的,于是函数继续执行,直到再次遇到 yield。看起来就好像一个函数在正常执行的过程中被 yield 中断了数次,每次中断都会通过 yield 返回当前的迭代值。
迭代器
迭代器iter :存在内存中或者文件中,一次只能读取1个元素
是访问元素的一种方式,迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完后结束
迭代器的优点:不需要事项准备好整个迭代过程中的所有元素,迭代器仅在迭代到某个元素时才计算该元素,在这之前或之后,元素可以不存在或者被销毁,该特点使它特别适合用于遍历一个大的文件或集合,如几个G的文件
特点
1.访问值不需要关心迭代器内部结构,仅需通过next()方法来不断取下一个内容
2.不能随机访问集合中的某个值,只能从头到尾依次访问
3.访问到一半时不能回退
4.用于循环大的数据集合,节约内存
方法
next():返回迭代器的下一个元素
__iter__:返回迭代器对象本身
定义一个迭代器
names = iter(["a","b","d"])
使用
print (names.next())
反射器
- hasattr(obj,attr) 这个方法用来检查obj中是否有一个名为attr的属性,返回一个布尔值
- getattr(obj,attr) 这个方法将返回名为attr值得属性的值,如attr为’bar’,则返回obj.bar方法
- setattr(obj,attr,val) 调用这个方法将给obj的名为attr的值得属性赋值为val,如果attr为’bar’,则相当于obj.bar=val
三种执行方式
以字符串的形式导入模块
123456temp = 'sys'model = __import__(temp)print model.path# 结果:['/Users/study/py01']以字符串的形式执行函数
12345temp = "mymodel" #模块名称func = "myfunc" #函数名称model = __import__(temp)func1 = getattr(model, func) #到mymodel模块中找myfunc函数,如果有返回functionfunc1(*args, **kwargs) #执行func1函数,即执行模块中的函数以字符串的形式判断类里面有没有对应的方法,根据输入的内容,执行类中对应的方法
12345678910111213141516171819202122class MyClass(object):def sayhi(self):print "sayhi"def info(self):print "info"def do(self):print "do"def run(self):print "run"def outside():print "outside other funciton"m = MyClass()user_input = raw_input('Pls input function:')if hasattr(m, user_input): #判断有没有该方法func = getattr(m, user_input) #获得该方法func() #执行方法else:print "Error!"setattr(m, user_input, outside) #设置方法func = getattr(m,user_input)func()