您的位置:首页 > 其它

生成器、迭代器、反射器

2016-05-04 23:12 295 查看
生成器(generator):

一个函数调用时返回一个迭代器,那么这个就叫生成器(generator),如果函数中包含yield语法,那么这个函数就变成了生成器
return作用:在一个生成器中,如果没有return,则默认执行到函数完毕;如果遇到return,如果在执行过程中return则会抛出StopIteration终止迭代

def fab(max):
n, a, b = 0, 0, 1
while n < max:
yield b
a, b = b, a + b
n = n + 1
for n in fab(5):
print n
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

三种执行方式:

以字符串的形式导入模块

temp = 'sys'
model = __import__(temp)
print model.path

结果:
['/Users/study/py01']


以字符串的形式执行函数

temp = "mymodel"  #模块名称
func = "myfunc"   #函数名称
model = __import__(temp)
getattr(model, func) #到mymodel模块中找myfunc函数,如果有返回function
以字符串的形式判断类里面有没有对应的方法,根据输入的内容,执行类中对应的方法

class 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()


本文出自 “天天向上goto” 博客,请务必保留此出处http://ttxsgoto.blog.51cto.com/4943095/1770213
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: