一 迭代器
1 什么是迭代器
#迭代器即迭代的工具,那什么是迭代呢?
#迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值
while True: #只是单纯地重复,因而不是迭代
print('===>')
l=[1,2,3]
count=0
while count < len(l): #迭代
print(l[count])
count+=1
2 为何要用迭代器?
1.可以不依赖索引取值
2.同一时刻在内存中只有一个值,不会过多地占用内存
3 如何用迭代器?
可迭代的对象:但凡内置有__iter__方法的对象都是可迭代的对象,例如str,list,dict,tuple,set,文件
迭代器的对象:既内置有__iter__方法又内置有__next__方法的对象称之为迭代器对象,例如 文件
可迭代对象.__iter__() - ------》迭代器对象
迭代器对象.__iter__() - ------》迭代器本身
迭代器对象.__next__() - ------》迭代器的下一个值
for i in obj:
pass
4 for准确地说应该是迭代器循环,for循环的原理如下:
1. 先调用in后面那个值的__iter__方法,得到迭代器对象
2. 执行迭代器.__next__()方法得到一个返回值,然后赋值给一个变量k,运行循环体代码
3, 循环往复,直到迭代器取值完毕抛出异常然后捕捉异常自动结束循环
5 总结迭代器:
迭代器的优缺点
优点:
1.可以不依赖索引取值
2.同一时刻在内存中只有一个值,不会过多地占用内存(惰性计算,节省内存)
缺点:
1.不如按照索引或者key取值的方式灵活
2.无法预测迭代器所包含值的长度(只有在next完毕才知道到底有几个值)
可迭代的对象=====》迭代器对象:调用可迭代对象内置的__iter__方法会有一个返回值,
该返回值就是对应的迭代器对象
dic={'x':1,'y':2,'z':3}
迭代器对象 = 调用可迭代的对象
iter_dic=dic.__iter__()
# print(iter_dic)
res1=iter_dic.__next__()
print(res1)
三个不同的迭代器
iter_dic1=dic.__iter__()
iter_dic2=dic.__iter__()
iter_dic3=dic.__iter__()
二 生成器
1 什么是生成器
#只要函数内部包含有yield关键字,那么函数名()的到的结果就是生成器,并且不会执行函数内部代码
def func():
print('====>first')
yield 1
print('====>second')
yield 2
print('====>third')
yield 3
print('====>end')
g=func()
print(g) #<generator object func at 0x0000000002184360>
2 生成器就是迭代器
g.__iter__
g.__next__
#2、所以生成器就是迭代器,因此可以这么取值
res=next(g)
print(res)
3 yield关键字:只能用在函数内 **
在函数内但凡包含有yield关键字,再去执行函数,就不会立刻运行函数体代码了
会得到一个返回值,该返回值成之为生成器对象,生成器本质就是迭代器
4 总结yield:
1. 提供一种自定义迭代器的解决方案
2. yield可用于返回值
yield VS return
相同点:都可以用于返回值
不同点:yield可以暂停函数,yield可以返回多次值,而return只能返回值一次值函数就立刻终止
三,三元表达式、列表推导式、生成器表达式
1 三元表达式
res = 条件成立情况下的返回值 if 条件 else 条件不成立情况下的返回值
name=input('姓名>>: ')
res='SB' if name == 'alex' else 'NB'
print(res)
2 列表生成式
[i
for i in range(10)]
[i for i in range(10) if i > 3]
3 生成器表达式 {}()
#1、把列表推导式的[]换成()就是生成器表达式
#2、示例:生一筐鸡蛋变成给你一只老母鸡,用的时候就下蛋,这也是生成器的特性
>>> chicken=('鸡蛋%s' %i for i in range(5))
>>> chicken
<generator object <genexpr> at 0x10143f200>
>>> next(chicken)
'鸡蛋0'
>>> list(chicken) #因chicken可迭代,因而可以转成列表
['鸡蛋1', '鸡蛋2', '鸡蛋3', '鸡蛋4',]
#3、优点:省内存,一次只产生一个值在内存中
生成字典
{i:i for i in range(10) if i > 3}
生成集合
{i for i in range(10) if i > 3}