python迭代器与生成器

迭代器

1、什么是迭代器

​ 迭代器指的是迭代取值的工具,迭代是一个重复的过程,每次重复都是基于上一次的结果而继续的,单纯的重复并不是迭代

2、迭代器应用场景

​ 迭代器是用来迭代取值的工具,优点在于能够不依赖与索引进行循环取值

3、迭代器的使用
可迭代对象
# 凡是内置有__iter__方法的都称之为可迭代对象
# 调用可迭代对象下的__iter__方法会将其转换成迭代器对象
# 常见的可迭代对象包括:列表、字符串、元组、集合、字典、文件

迭代器方法遍历字典

#!/usr/bin/env python3
# -*- coding:utf-8 -*-


dic = {
     
	'a': 1,
	'b': 2,
	'c': 3
}
dic_iter = dic.__iter__()

while True:
	try:
		print(dic_iter.__next__())
	except StopIteration:
		break

迭代器与for循环的工作原理

for循环工作原理:

1. 调用对象下的__iter__()方法得到一个迭代器对象
2. 调用迭代器对象下的__next__()方法拿到一个返回值,然后赋值
3. 循环往复步骤2,直到抛出异常StopIteration,捕捉异常然后结束循环


即for循环是上部分代码实现的功能的简化
迭代器优缺点

**优点:**1、可以遍历无索引数据 2、节省内存(同一时间内存中只有调用时的值)

**缺点:**1、无法如索引取值一样精准定位取值 2、生命周期短(取完即销毁)

生成器(yield)

1、什么是生成器

​ 生成器是自定义的迭代器,本质就是生成器

​ 在函数内一旦存在yield关键字,调用函数并不会执行函数体代码,会返回一个生成器对象

2、生成器应用场景

​ 将函数挂起,适用于大多数并发编程中

3、生成器案例
基础生成器案例
#!/usr/bin/env python3
# -*- coding:utf-8 -*-


def my_range(begin, end, step=1):
	print('start...')
	while begin < end:
		yield begin
		begin += step
	print('over...')


gen = my_range(1, 10)
for i in my_range(1, 10):
	print(i)


生成器用法一

通过yield挂起函数为函数内部变量传值

#!/usr/bin/env python3
# -*- coding:utf-8 -*-


# 生成器用法一: 通过yield挂起函数为函数内部变量传值
def shopping(name):
	print('{}去商场扫货啦!'.format(name))
	while True:
		good = yield
		print('{}把{}买下来啦!'.format(name, good))


fan = shopping('小范')    # 获取生成器对象
fan.send(None)      # 初始化,将函数挂起,yield开始等待接受值
fan.send('耐克球鞋')    # 传入值给yield 再通过yield赋值给good
fan.send('旺仔牛奶')    # 传入值给yield 再通过yield赋值给good

生成器用法二: 通过yield挂起函数并返回值
#!/usr/bin/env python3
# -*- coding:utf-8 -*-

def shopping(name):
	good_list = []
	print('{}去商场扫货啦!'.format(name))
	while True:
		good = yield good_list
		print('{}把{}买下来啦!'.format(name, good))
		good_list.append(good)


fan = shopping('小范')  # 获取生成器对象
res = fan.send(None)  # 初始化,将函数挂起,yield开始等待接受值
print('现在购物车里有:{}'.format(res))
res = fan.send('耐克球鞋')  # 传入值给yield 再通过yield赋值给good 最后通过res接受yield的返回值
print('现在购物车里有:{}'.format(res))
res = fan.send('旺仔牛奶')  # 传入值给yield 再通过yield赋值给good 最后通过res接受yield的返回值
print('现在购物车里有:{}'.format(res))

你可能感兴趣的:(python,python)