人工智能(python)开发 —— 迭代器 (Iterator)和生成器 (Generator)



一、迭代器概念

1、迭代器的定义

        迭代器是访问可迭代对象的一种方法,用迭代器可以访问可迭代对象
        迭代器是指iter(可迭代对象)返回的对象
        迭代器可以用next(it)函数获取可迭代对象的数据

2、迭代器函数

        iter(iterable) 从可迭代对象中返回一个迭代器,iterable必须是一个能提供一个迭代器的对象。
        next(iterator)从迭代器iterator中获取下一个记录。如果无法获取下一条记录,则触发StopIteration异常通知
说明
        a、迭代器只能往前取值,不能后退
        b、用iter函数可以返回一个可迭代对象的迭代器

3、示例

L = [2, 3, 5, 7]
it = iter(L)  # 让可迭代对象L 提供一个迭代器 并用it绑定
next(it)      # 2
next(it)      # 3
next(it)      # 5
next(it)      # 7
next(it)      # StopIteration 异常通知

# 用迭代器获取range对象的数据
it = iter(range(1, 10, 3))
next(it)  # 1
next(it)  # 4
next(it)  # 7
next(it)  # StopIteration  # 通知next调用者,已无数据

4、for语句和while、iter、next的组合

        for 语句实质就是while 、next、iter的组合,for语句会更简单方便,两者实现的效果一样,顾一般参与for语句迭代对象

L = [2, 3, 5, 7]
# 用for循环来访问可迭代对象中的数据
for x in L:
    print(x)
# 用while循环访问可迭代对象中的数据
# 第一步,让L给我们一个迭代器
it = iter(L)
# 第二步,循环用it迭代器去获取L中的数据,
# 直到StopIteration为止
while True:
    try:
        x = next(it)
        print(x)
    except StopIteration:
        break

二、生成器 Generator (python 2.5 及之后的版本)

1、生成器的定义

        生成器是能够动态提供数据的对象,生成器对象也是可迭代对象
        生成器有两种: 生成器函数和生成器表达式

2、生成器函数

        含有yield语句的函数是生成器函数,此函数被调用将返回一个生成器对象
                注:  yield 翻译为(产生或生成)
yield 语法
        yield  表达式
yield 说明
        yield 用于def 函数中,目的是将此函数作为生成器函数使用
        yield 用来生成数据,供迭代器的next(it) 函数使用
yield 示例
def myyield():
    '''此函数因为含有yield语句,所以是生成器函数'''
    print("即将生成1")
    yield 1
    print("即将生成3")
    yield 3
    print("即将生成5")
    yield 5
    print("即将生成7")
    yield 7
    print("生成器函数调用结束")

gen = myyield()  # gen 绑定是的生成器,生成器是可迭代对象

# 方法1 通过iter和next访问
it = iter(gen)
# next(it)开始执行生成器函数的语句,直到遇见yield语句为止
x = next(it)
print(x)

# 方法2 使用for语句
for x in gen:
    print(x)  # 1 3 5 7
生成器函数说明
        a、生成器函数的调用将返回一个生成器对象,生成器对象是可迭代对象
        b、生成器函数调用 return 会触发一个StopIteration异常

3、生成器表达式

语法
        (表达式  for  变量  in  可迭代对象  [if  真值表达式])
                说明:[ ]内的if子句可以省略
作用
        用推导式的形式生成一个新的生成器
示例
gen = (x ** 2 for x in range(1, 5))
it = iter(gen)
next(it)  # 1
next(it)  # 4
next(it)  # 9
next(it)  # 16
看程序执行结果有什么不同:
1) 程序1  列表推导式,直接生成了lst列表
L = [2, 3, 5, 7]
lst = [x + 1 for x in L]
it = iter(lst)
print(next(it))  # 3
L[1] = 30
print(next(it))  # 4

2) 程序2   生成器表达式,lst内的元素只有在next的时候才生成
L = [2, 3, 5, 7]
lst = (x + 1 for x in L)
it = iter(lst)
print(next(it))  # 3
L[1] = 30
print(next(it))  # 31

三、迭代工具函数

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

1、zip(iter1, iter2, iter3, ....)

        返回一个zip对象,此对象用于生成一个元组,此元组的中的元素分别由iter1,iter2可迭代对象中的元素构成(元组个数由最小的可迭代对象决定)

2、enumerate(iterable, start=0)

        生成带索引的枚举对象,返回的迭代类型为索引-值对 (index-value) 对,默认索引从零开始,也可用start指定
        应用场景:删除数据

3、示例

numbers = [10086, 10000, 10010, 95588]
names = ['中国移动', '中国电信', '中国联通']

for t in zip(numbers, names):
    print(t)

# 运行结果:
(10086, '中国移动')
(10000, '中国电信')
(10010, '中国联通')
for n, a in zip(numbers, names):  # 等同于序列赋值
    print(a, '的客服号码是:', n)

# 运行结果:
中国移动 的客服号码是: 10086
中国电信 的客服号码是: 10000
中国联通 的客服号码是: 10010
for t in zip(range(2), numbers, names):
    print(t)

# 运行结果:     
(0, 10086, '中国移动')
(1, 10000, '中国电信')
d = dict(zip(numbers, names))    # 可以通过zip 直接组成字典
>>> d
{10086: '中国移动', 10000: '中国电信', 10010: '中国联通'}
for t in enumerate(names):
	print(t)

# 运行结果: 	
(0, '中国移动')
(1, '中国电信')
(2, '中国联通')
for t in enumerate(names, 20000):
	print(t)

# 运行结果:
(20000, '中国移动')
(20001, '中国电信')
(20002, '中国联通')

四、附录

        人工智能(python)—— 目录汇总



版权声明:本文为qq_27297393原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。