迭代器&生成器

85 阅读1分钟

迭代器&生成器


关键词:可迭代对象;迭代器;生成器

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