生成器generator
定义
能够动态(循环一次计算一次返回一次)提供数据的可迭代对象。
作用:在循环过程中,按照某种算法推算数据,不必创建容器存储完整的结果,从而节省内存空间。数据量越大,优势越明显。
以上作用也称之为延迟操作或惰性操作,通俗的讲就是在需要的时候才计算结果,从而不是一次构建出所有结果。
"""
yield --> 生成器
生成器 = 可迭代对象 + 迭代器
简述生成器与迭代器的区别(面试题常考)
"""
#生成器的原理
class MyGenerator:
"""
生成器 = 可迭代对象 + 迭代器
"""
def __init__(self,stop_value):
self.begin = 0
self.stop_value = stop_value
def __iter__(self):
return self
def __next__(self):
if self.begin >= self.stop_value:
raise StopIteration
temp = self.begin
self.begin += 1
return temp
def my_range(stop_value):
number = 0
while number < stop_value:
yield number
number += 1
my01 = my_range(5)
print(type(my01),dir(my01))
print(id(my01.__iter__()),id(my01))
for item in my01:
print(item)
生成器函数
定义
含有yield语句的函数,返回值为生成器对象。
练习
从列表[4,5,566,7,8,10]中选出所有偶数。
方法1:结果存入另外一个列表中
方法2:使用生成器实现
方法一:
list01 = [4,5,566,7,8,10]
result = []
for item in list01:
if item % 2 == 0:
result.append(item)
print(result)
方法二:
list01 = [4,5,566,7,8,10]
def get_even():
for item in list01:
if item %2 ==0:
yield item
my01 = get_even()
for item in my01:
print(item)
内置生成器
- 枚举函数enumerate
作用:遍历可迭代对象时,可以将索引与元素组合为一个元组。 - zip
作用:将多个可迭代对象中对应的元素组合成一个个元组。
练习
练习1:定义生成器函数my_enumerate,实现下列现象,将元素与索引合成一个元组。
"""
练习
"""
# #原理
# list01 = [ 3,4,55,6,7]
# for item in enumerate(list01):
# #(索引,元素)
# print(item)
#
# #实际开发写的
# for index,element in enumerate(list01):
# print