Python之迭代器与生成器

迭代器

什么是迭代器

  • 迭代器是指用 iter(可迭代对象) 函数返回的对象(实例)
  • 迭代器可以用 next(it) 函数获取可迭代对象的数据

迭代器函数

  • iter(iterable) 从可迭代对象中返回一个迭代器,iterable 必须是一个能提供迭代器的可迭代对象
  • next(iterator) 从迭代器 iterator 中获取下一条记录,如果无法获取下一条记录,则触发 StopIteration 异常
lst = [2,3,5,7]
it = iter(lst)
print(next(it))  # 2
print(next(it))  # 3
print(next(it))  # 5
print(next(it))  # 7
print(next(it))  # 没数据了,触发 StopIteration 异常

迭代器说明

  • 迭代器是访问可迭代对象的一种方式
  • 迭代器只能向前取值,不会后退
  • iter 函数可以返回一个可迭代对象的迭代器

迭代器的用途

代迭器对象能用 next 函数获取下一个元素

lst = [2,3,5,7]
it = iter(lst)
while True:
  try:
    x = next(it)
    print(x)
  except StopIteration:
    print('遍历结束')
    break

生成器

什么是生成器

  • 生成器是能够动态提供数据的对象,生成器对象也是可迭代对象(实例)
  • 基本不占用计算机内存,现用现生成

生成器的分类

  • 生成器函数
  • 生成器表达式

生成器函数

  • 含有 yield 语句的函数是生成器函数,此函数被调用时将返回一个生成器对象
  • 生成器内部的局部变量会一直存在,直到函数返回

yield 语句

  • yield 表达式
  • yield 用于 def 函数中,目的是将此函数作为生成器函数使用
  • yield用来生成数据,供迭代器 next(it) 函数使用
def myyield():
    yield 2
    yield 3
    yield 5

gen = myyield()
it = iter(gen)

while True:
    try:
        x = next(it)
        print(x)
    except StopIteration:
        print('遍历结束')
        break
# 执行结果
# 2
# 3
# 5
# 遍历结束

生成器函数说明

  • 生成器函数的调用将返回一个生成器对象,生成器对象是一个可迭代对象
  • 在生成器函数调用return时会出生一个 StopIteration 异常来通知 next(it) 函数不再能提供数据

生成器表达式

  • 用推导式的形式生成一个新的生成器
  • (表达式 for 变量 in 可迭代对象 [if 真值表达式])
gen = (x**2 for x in range(1, 4))
it = iter(gen)
next(it)  # 1
next(it)  # 4
next(it)  # 9
next(it)  # StopIteration
列表推导式和生成表达式的区别
L = [1,2,3,4]

gen = (x for x in L)  # gen绑定生成器 
lst = [x for x in L]  # lst绑定列表
L[1] = 222            # 改变原列表的第二个元素

for x in lst:
  print(x)  # 1 2 3 4 不变

for x in gen:
  print(x)  # 1 222 3 4 ,第二个数是 222

迭代工具函数

迭代工具函数的作用是生成一个个性化的可迭代对象

函数

  • zip(iter1 [,iter2, iter3,...]) 返回一个 zip 对象此对象用于生成一个元组,此元组的个数由最小的可迭代对象决定
numbers = [10086, 10000, 10010, 95588]
names = ['中国移动', '中国电信', '中国联通']

for n, a in zip(numbers, names):
  print(a, '的客服号码是:', n)
# 中国移动 的客服号码是: 10086
# 中国电信 的客服号码是: 10000
# 中国联通 的客服号码是: 10010

for x in zip(numbers, names):
  print(x)
# (10086, '中国移动')
# (10000, '中国电信')
# (10010, '中国联通')

 # 以下用zip函数生成一个字典
d = dict(zip(names, numbers))
print(d) #   {'中国移动': 10086, '中国电信': 10000, '中国联通': 10010}

for x in zip(range(10), numbers, names):
  print(x)
# (0, 10086, '中国移动')
# (1, 10000, '中国电信')
# (2, 10010, '中国联通')
  • enumerate(iterable[,start]) 枚举函数,生成带索引的枚举对象,返回迭代类型为索引-值对(index,value)对, 默认索引从零开始,也可以使用 start 绑定
names = ['中国移动', '中国电信', '中国联通']

for x in enumerate(names):
  print(x)
# (0, '中国移动')
# (1, '中国电信')
# (2, '中国联通')

for x in enumerate(names, start=100):
  print(x)  
# (100, '中国移动')
# (101, '中国电信')
# (102, '中国联通')

你可能感兴趣的:(Python之迭代器与生成器)