1. 迭代器 Iterator
什么是迭代器
-
迭代器是访问可迭代对象的工具
-
迭代器是指用 iter(obj) 函数返回的对象(实例)
-
迭代器可以用next(it)函数获取可迭代对象的数据
迭代器函数iter和next
iter(iterable) 从可迭代对象中返回一个迭代器,iterable必须是能提供一个迭代器的对象 next(iterator) 从迭代器iterator中获取下一个记录,如果无法获取一下条记录,则触发 StopIteration 异常
迭代器说明
-
迭代器只能往前取值,不会后退
-
用iter函数可以返回一个可迭代对象的迭代器
"""
迭代器自定义对象示例
通过一个技能管理类,不断的添加我们的技能
再通过一个技能迭代器类,去实现for语句的原理(功能)
"""
class SkillIterator:
def __init__(self,data):
self.__data = data
self.__index = -1
def __next__(self):
self.__index += 1
if self.__index > len(self.__data)-1:
raise StopIteration()
return self.__data[self.__index]
class SkillManager:
def __init__(self):
self.__skills = []
# 添加一系列的技能存入列表当中
def add_skill(self,skill):
self.__skills.append(skill)
def __iter__(self):
return SkillIterator(self.__skills)
manager = SkillManager()
manager.add_skill('Python')
manager.add_skill('Java')
manager.add_skill('C++')
manager.add_skill('PHP')
# for skill in manager:
# print(skill)
it = manager.__iter__()
while True:
try:
item = it.__next__()
print(item)
except StopIteration:
break
迭代器的用途
-
迭代器对象能用next函数获取下一个元素
2. 生成器
生成器是在程序运行时生成数据,与容器不同,它通常不会在内存中保留大量的数据,而是现用现生
成。
-
yield 是一个关键字,用于定义生成器函数,生成器函数是一种特殊的函数,可以在迭代过程中逐步产生值,而不是一次性返回所有结果。
-
跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
-
每次使用 yield 语句生产一个值后,函数都将暂停执行,等待被重新唤醒。
-
yield 语句相比于 return 语句,差别就在于 yield 语句返回的是可迭代对象,而 return 返回的为不可迭代对象。
-
然后,每次调用生成器的 next() 方法或使用 for 循环进行迭代时,函数会从上次暂停的地方继续执行,直到再次遇到 yield 语句。
生成器有两种
-
生成器函数
-
生成器表达式
生成器函数
含有yield 语句的函数是生成器函数,此函数调用回返回一个生成器对象,生成器也是可迭代对象
yield 语句的语法
yield 表达式
""" 生成器示例 """ # def simple_generate(): # print("生成器开始执行") # yield 1 # print("继续执行到第一个yield之后") # yield 2 # print("继续执行到第二个yield之后") # yield 3 # print("生成器结束") # # # 创建一个生成器对象 # gen = simple_generate() # # print(next(gen)) # print(next(gen)) # print(next(gen)) # print(next(gen)) def myrange(stop): i = 0 while i < stop: print("做一个分割") yield i i += 1 gen = myrange(5) for x in myrange(10): print("x=",x) print(next(myrange(10)))
生成器表达式
语法:
( 表达式 for 变量 in 可迭代对象 [if 真值表达式])
""" 生成器表达式 """ # 列表推导式 list01 = [34,35,45,33,657] list02 = [item for item in list01 if item > 35] # print(list02) # 生成器表达式 generate02 = (item for item in list01 if item > 35) # print(generate02) for item in generate02: print(item)