1、什么是迭代器。
迭代器迭代取值的工具,迭代是一个重复的过程,但是每次重复都是基于上一次的结果而来。
2、为何要用迭代器
1、为了找到一种新的、统一的取值方式(可以不依赖于索引以及key取值)
2、惰性计算,不耗费内存
3、如何用迭代器
3.1、可迭代的对象iterable
内置有 __ iter__方法
srt.__ iter__
list.__ iter__
dict.__ iter__
tuple.__ iter__
set.__ iter__
with open('a.txt',mode='rt',encoding='utf-8').__ iter__
3.2、迭代器对象iterator
1、内置有__ iter __方法
with open('a.txt',mode='rt',encoding='utf-8').__ iter__
迭代器对象内置iter方法是为了for循环底层工作原理设置起来更简单
2、内置有__ next __方法
with open('a.txt',mode='rt',encoding='utf-8').__ next__
调用:可迭代对象.__ iter __()返回迭代器对象=iter(可迭代对象)
调用:迭代器对象.__ iter __()返回的是他本身=iter(可迭代对象)
调用:迭代器对象.__ next __() 返回的是下一个值=next(迭代器对象)
msg = '123456'
msg1 = iter(msg)
while True:
try:
print(next(msg1),end='')
except StopIteration:
break
# 123456
msg = '123456'
msg1 = iter(msg)
print(next(msg1))
print(next(msg1))
for i in msg1:
print(i,end='')
# 1
# 2
# 3456
总结迭代器对象优缺点:
优点:
1、提供了一种新的、统一的取值方式
2、惰性计算,不耗费内存
缺点:
1、取值不够灵活
2、一次性的,只能往后取,无法预知数据的个数
4、自定义迭代器
生成器
函数内但凡出现yield关键字,再调用函数不会执行函数体代码,会得到一个生成器对象
生成器就是一种自定义的迭代器
def func():
print('1')
yield 1
print('2')
yield 2
print('3')
yield 3
g = func()
next(g) # 1
next(g) # 2
next(g) # 3
def func():
start = 0
while True:
yield start
start +=1
res = func()
print(next(res)) # 0
print(next(res)) # 1
print(next(res)) # 2
yield VS retrun
相同点:返回值层面都一样
不同点:retrun只能返回一次值,函数立即结束,yield 可以返回多次
5、表达式
三元表达式
三元表达式是python为我们提供的一种简化代码的解决方案,语法如下:
res = 条件成立时返回的值 if 条件 else 条件不成立时返回的值
def max2(x,y):
if x > y:
return x
else:
return y
res = max2(1,2)
x=1
y=2
res = x if x > y else y # 三元表达式
优点:方便,改变了编程习惯,可称之为声明式编程
生成式
1、列表生成式
number = []
for i in range(1,6):
number.append(i**2)
print(number)
li = [i**2 for i in range(1,5)]
print(li)
# [1, 4, 9, 16]
li = ['hello' for i in range(1,5)]
print(li)
# ['hello', 'hello', 'hello', 'hello']
name = ['tom','jon','monm']
l = [ ]
for i in name:
if i.endswith('m'):
l.append(i)
print(l) # ['tom', 'monm']
l2 = [i for i in name if i.endswith('m')]
print(l2) # ['tom', 'monm']
2、字典生成式
res = {i:i**2 for i in range(5)}
print(res) # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
dic = {'name':'tom','age':18}
print({k:v for k,v in dic.items()})
# {'name': 'tom', 'age': 18}
3、集合生成式
res = {i for i in range(5)}
print(res) # {0, 1, 2, 3, 4}
4、生成器表达式
res = (i for i in range(5))
print(res) # <generator object <genexpr> at 0x00000234FDE00A50>
print(next(res)) # 0
print(next(res)) # 1
print(next(res)) # 2
print(next(res)) # 3
print(next(res)) # 4
res = (i for i in range(5))
for i in res:
print(i)
for i in res:
print(i)
for i in res:
print(i)
# 只输出一次 0 1 2 3 4 ,遍历同一个迭代器,第一次循环后,迭代器里已经没有值了
res = (i for i in range(5))
list1 = list(res)
print(list1)
# [0, 1, 2, 3, 4]
print(list1)
# [] 遍历同一个迭代器,第一次已经取完值,所以为空