迭代器&生成器
关键词:可迭代对象;迭代器;生成器
1. 可迭代对象和迭代器
可迭代对象包含迭代器、序列[字符串、列表、元组、集合]、字典。及通过.iter()之后变为迭代器,不能直接进行迭代。所有能被for循环的至少是一个可迭代对象,只有文件类型是迭代器,其余全不是。迭代器一次只能取一个值,取出之前不占内存,因此,通过迭代器读取文件可以节省大量内存。
# 1. 可迭代对象
ran = range(1000)
iterator = ran.__iter__()
print(iterator)
print(iterator.__next__())
print(iterator.__next__())
# 2. for循环的实质和底层
l = [1,2,3,4,5]
iter = l.__iter__()
while True:
try:
print(iter.__next__())
except StopAsyncIteration:
break
2. 生成器
生成器本质是迭代器,通过写函数,造了一个迭代器
def make_cloth_sample(n):
'''
生成器:本质---迭代器,写函数造了一个迭代器
'''
print("做第一件衣服!")
yield 1
print("做第二件衣服!")
yield 2
print("做第三件衣服!")
yield 3
ret = make_cloth_sample(4)
# print(ret)
# print(ret.__next__())
# print(ret.__next__())
# for i in ret:
# print(i)
for n in range(4):
print(ret.__next__())
# f.readline():生成器-----------------generator
def listen():
f = open('../data/data_generator.txt', mode='r', encoding='utf-8')
while True:
content = f.readline().strip()
if content:
yield content
for content in listen():
print(content)
# 注:将来,写的所有代码,最好把读文件的操作都写成一个生成器!
# 写个登录程序
def login():
user = input("username:")
passwd = input("passward:")
with open('../data/data_generator.txt', mode='r', encoding='utf-8') as f:
for line in f:
usr, pwd = line.strip().split('|')
if user == usr and passwd == pwd:
print("登录成功!")
else:
print("登录失败!")
login()
# ------------------------拆分为如下更加简洁:
def get_user(file):
with open('../data/data_generator.txt', mode='r', encoding='utf-8') as f:
for line in f:
usr, pwd = line.strip().split('|')
yield usr, pwd
def login():
user = input('username:')
passwd = input('passward:')
for usr, pwd in get_user(file):
if usr == user and pwd == passwd:
print('登录成功!')
break
else:
print('登录失败!')
login()