1.迭代器(Iterator)
概念:
迭代意味着重复多次,就像循环一样。
迭代器是一个可以记住遍历的位置的对象。
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。
迭代器只能往前不会后退。
1.iter():返回迭代器自身。
2.next():返回容器的下一个元素,如果没有元素了,抛StopIteration异常。也可以使用内置函数
next,next(it)和it.next()等效。
1、可迭代对象(Iterable)
可以被用作如for循环之中对象通常都是可迭代的。
其中一些包括:所有的序列类型,如:list,str,tuple。
集合类型,如:set,frozenset。
映射类型,如:dict。
文件对象和其他满足迭代协议的对象(即实现了iter方法或者getitem方法)
2、不可迭代对象
那些不支持迭代协议的对象都是非迭代对象,常见的有:数字类型:int,float ...
#[1.list]
#列表是可迭代的
my_list=[1,2,3]
for item in my_list:
print(item)
'''
会依次打印1,2,3
'''
#[2.string]
#字符串也是可迭代的
my_string="hello"
for char in my_string:
print(char)
'''
会依次打印'h','e','l','l','o'
'''
#[3.dict]
#字典是可迭代的,迭代的是它的键
my_dict={'a':1,'b':2}
for key in my_dict:
print(key)
'''
#会依次打印'a','b'
'''
#[4.int]
#数字是非可迭代的
my_number=10
print(my_number.__iter__)#报错
#[5.float]
#浮点类型是非可迭代的
float_number=0.34
print(float_number.__iter__)#报错
2、生成器
1、概念:
Python中一种特殊类型的迭代器,本质上是可以记住执行位置的函数。
生成器使用yield语句来生成一个值序列,不是一次性地产生一个完整的数据集并返回。
2、特点:
1.与迭代器类似,生成器也支持惰性计算,它们一次只生成一个项目
2.在每次产生输出之后,其状态会被挂起,直到下一次使用next()函数或for循环请求下一个值
3.当生成器函数执行完成时,或者遇到无法再产生新值的条件时,会抛出StopIteration异常
4.使用生成器函数定义生成器
5.生成器是通过在函数中使用yield关键字来定义的。
每当yield语句运行时,它会返回一个值,并在此时挂起函数的状态,包括局部变量、指针位置等。下一次调用时,它会从中断点继续执行
3、实例:
1、简单生成器函数
def count_up_to(max):
count=1
while count<=max:
yield count
count+=1
#创建生成器
counter=count_up_to(5)
#使用next()获取值
print(next(counter))#输出1
print(next(counter))#输出2
#可以继续调用next()获取剩余的值,或者使用for循环
for number in counter:
print(number)
#输出3 4 5
'''在这个示例中,生成器函数count_up_to接受参数max并计数到这个值。
每次yield被调用,它就会产生当前的计数值,
并在下一次调用时从上次离开的地方继续执行。'''
2、生成器表达式
#使用生成器表达式创建生成器
gen_exp=(x*x for x in range(4))
#使用for循环迭代生成器
for num in gen_exp:
print(num)
#依次打印0,1,4,9
'''
生成器表达式看起来类似于列表推导,
但使用圆括号而不是方括号。
它们非常适合于简单
的场景,
其中一个完整的生成器函数可能显得过于冗长。'''
3、yield关键字
用于定义生成器函数中的一个位置,这里会产出(yield)一个值给调用者,并暂停函数的执行,直到下一次通过next()来请求另一个值。
当生成器函数中执行到一个yield表达式时,它会返回该表达式后面的值给生成器的调用者,并暂停执行(所有局部变量和状态都会被保留)。
yield的挂起的函数执行可以在下一次调用next()或迭代时继续从上次暂停的位置恢复。
def simple_generator():
print("Stage1")
yield 1
print("Stage2")
yield 2
print("Stage3")
yield 3
gen=simple_generator()
#每次调用next()时,生成器从上次暂停的地方开始,直到遇到下一个yield
val=next(gen)
#输出"Stage1",返回1
val=next(gen)
#输出"Stage2",返回2
总结生成器的特点:
内存效率:可以用于无法放在内存中的大型数据集。
改善性能:惰性计算意味着只有在必要时才计算值,可以减少不必要的计算节省计算资源。
简洁性:使用生成器和生成器表达式,可以使代码更简洁易懂。
适用于管道处理:生成器可以被链式结合,用于构建复杂的数据管道。
标签:14,迭代,Python,生成器,yield,next,print,my From: https://blog.csdn.net/Lorcian/article/details/144250559