一、迭代器
什么是迭代器?
迭代器的定义:是一个重复的过程,每一次重复,都是基于上一次的结果而来。
迭代器的优点:节省内存
那么,迭代器如何使用呢?
例如:
l=['a','b','c','d']
count=0
while count < len(l):
print(l[count])
count+=1
你看,每一次的取值都是基于上一次的结果。
那如果数据类型是字典、集合、文件呢?我们还可以通过索引来取值吗?不能,那么这时候就需要用到迭代器了。
在此之前,我们先搞懂什么是可迭代对象iterator,凡是对象下有__iter__方法即对象.__iter__,该对象就是可迭代对象。所以,可迭代对象包括:字符串、列表、元祖、字典、集合、文件。
我们可以将要迭代的对象处理成迭代器:x.__iter__(),然后利用next一个个的取值。
但一个个按照next取值后,没有值会报错StopIteration,那么就可以按下面的方法取值:
while True:
try:
print(next(iter_x)
except StpoIteration:
break
总结:
什么是迭代器对象:
1.有__iter__,执行得到仍是迭代本身
2.有__next__
迭代器的优点:
1.提供了一种统一的不依赖于索引的迭代方式
2.迭代器本身,比起其他数据类型更省内存
迭代器的缺点:
1.一次性,只能往后走,不能回退,不如索引取值灵活
2.无法预知什么时候取值结束,即无法预知长度。
二、for循环的原理
for循环就是在用迭代器!!!
l=[1,2,3,4,5]
for item in l: # iter_l=l.__iter__()
print(item)
三、生成器
什么是生成器?
生成器的定义:在函数内部包含yield关键字,那么该函数执行的结果就是是生成器
yield的功能:
1.把函数的结果做成迭代器,即将函数封装成___iter__,__next__
2.函数暂停与再继续运行的状态是由yield保存的
yield与return的比较:
相同:都有返回值的功能
不同:return只能返回一次值,而yield可以返回多次值
四、三元表达式
普通写法:
def foo():
if x>3:
return 1
else:
return 0
三元表达式写法:
1 if x>3 else 2
五、列表解析式
普通写法:
l= []
for i in rang(10):
l.append('egg%s'%i)
print(l)
列表解析式写法:
l=['egg%s' %i for i in range(10)]
print(l)
六、生成器表达式
l=('egg%s' %i for i in range(10))
l就是生成器
激活取值next(l)