Python-迭代器/生成器

2023-11-01

可调用对象(callable)

Python中的可调用对象包括以下七种:

  1. 用户使用def或lambda语句创建的函数。
  2. 使用C语言(CPython)实现的内置函数,如time.strftime()和len()。
  3. 使用C语言实现的方法,如dict.get()。
  4. 方法,在类的定义体中定义的函数。
  5. 类。
  6. 类的实例,需要定义__call__()方法后的类的实例。
  7. 使用yeild关键字的函数或方法。

将可调用对象转换成迭代器,使用下面的方法:

iter(callable, sentinel) -> iterator  

可迭代对象(iterable)

Python中可迭代的对象包括列表、集合、元组、字典、字符串和文件对象,这些对象都内置了__iter__()方法。 将可迭代对象转换成迭代器,使用下面的方法:

iter(iterable) -> iterator 
# 或
iterable.__iter__()

迭代器(iterator)

既有内置__iter__()方法又有内置__next__()方法的对象。迭代器调用__iter__()方法后还是迭代器本身,调用__next__()方法可以获取迭代器中的元素。可调用对象用法:

n = [1, 2, 3, 4, 5]
idx = -1
def value():
    global idx
    idx += 1
    return n[idx]

nums = iter(value, 4)

while True:
    # print(next(nums, -1))
    print(nums.__next__())

结果:
在这里插入图片描述

可迭代对象用法:

key_value = {1: 'y', 2: 'x', 3: 'z'}

key_value = key_value.__iter__()
# key_value = iter(key_value)

while True:
    print(key_value.__next__())

迭代器中元素耗尽时会抛出StopIteration异常,结果:
在这里插入图片描述
迭代器优点:

  1. 提供了一种通用不依赖索引的迭代取值方式;
  2. 同一时刻在内存中只存在一个值,更节省内存。

迭代器缺点:

  1. 取值不如按照索引的方式灵活,不能取指定的某一个值,只能往后取,不能往前去
  2. 无法预测迭代器的长度。

生成器(generator)

生成器是一种自定义的迭代器,本质上是迭代器。生成器有两种:元组生成器和函数生成器。元组生成器类似于列表生成式,如下所示是用元组创建的一个生成器:

gener = (i for i in range(1000))

函数生成器由yield关键字标识。yield关键字有return和暂停的功能;yield语句执行后下次迭代将会从yeild后的语句开始而不是从函数开头的语句开始执行。用法如下所示:

def gener():
    sum = 0
    for i in range(1000):
    	x = yield i
        sum += (x + i)
        print('---sum:', sum)
g = gener()  # g是生成器对象
next(g)  # 与g.__next__()功能一样
g.send(8) # 向生成器中传值:第一次迭代必须send(None),send给x
g.close()  # 关闭生成器,此后不可再迭代

调用一次next()方法,下次调用时函数生成器从sum+=(x+i)开始执行。可使用send方法往生成器中传值,使用close方法关闭生成器。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python-迭代器/生成器 的相关文章

随机推荐