代码拉取完成,页面将自动刷新
'''
可迭代对象:
Python中任意的对象,
只要它定义了可以返回一个迭代器的 __iter__ 方法,
或者定义了可以支持下标索引的 __getitem__ 方法
那么它就是一个可迭代对象
'''
'''
任意对象,只要定义了 next(Python2) 或者 __next__ 方法,
它就是一个迭代器。就这么简单。现在我们来理解迭代(iteration)。
'''
'''
它就是从某个地方(比如一个列表)取出一个元素的过程。
当我们使用一个循环来遍历某个东西时,这个过程本身就叫迭代。
'''
'''
生成器也是一种迭代器,但是你只能对其迭代一次。
这是因为它们并没有把所有的值存在内存中,而是在运行时生成值。
你通过遍历来使用它们,要么用一个 “for” 循环,要么将它们传递给任意可以进行迭代的函数和结构。
大多数时候生成器是以函数来实现的。然而,它们并不返回一个值,而是 yield (暂且译作“生出”)一个值。
这里有个生成器函数的简单例子:
'''
def generator_function():
for i in range(10):
yield i
for item in generator_function():
print(item)
print('-'*10,"分割线","-"*10)
'''
生成器最佳应用场景是:
你不想同一时间将所有计算出来的大量结果集分配到内存当中,特别是结果集里还包含循环。
原因:这样做会消耗大量资源
'''
# 计算斐波那契数列的生成器:
# generator version
def fibon(n):
a = b = 1
for i in range(n):
yield a
a, b = b, a + b
c = []
for x in fibon(10):
c.append(x)
print(c) # 打印出10个斐波那契数列
# 不使用yield的话
# import pdb
# def fibon(n):
# pdb.set_trace() # 使用pdb的话控制台打印的就会是该pdb所在的函数
# a = b = 1
# result = []
# for i in range(n):
# result.append(a)
# a, b = b, a + b
# return result
# print(fibon(10))
'''
在测试前你需要再知道一个Python内置函数:next()。
它允许我们获取一个序列的下一个元素。那我们来验证下我们的理解:
'''
def generator_function():
for i in range(3):
yield i
gen = generator_function()
print(next(gen)) # 0
print(next(gen)) # 1
'''
我们可以看到,在 yield 掉所有的值后,next() 触发了一个 StopIteration 的异常。
基本上这个异常告诉我们,所有的值都已经被 yield 完了。
你也许会奇怪,为什么我们在使用 for 循环时没有这个异常呢?啊哈,答案很简单。
for 循环会自动捕捉到这个异常并停止调用 next()。
你知不知道Python中一些内置数据类型也支持迭代哦?我们这就去看看:
'''
my_string = "Yasoob"
# str 对象不是一个迭代器,他是一个可迭代对象
# next(my_string) # 'str' object is not an iterator
'''
它是一个可迭代对象,而不是一个迭代器。
这意味着它支持迭代,但我们不能直接对其进行迭代操作。那我们怎样才能对它实施迭代呢?
是时候学习下另一个内置函数,iter。它将根据一个可迭代对象返回一个迭代器对象。这里是我们如何使用它:
'''
my_string = "Yasoob"
my_iter = iter(my_string) # 根据一个可迭代对象返回一个迭代器对象
next(my_iter)
# 对于创建字典的回顾
a = [1,23,4]
b = [2,345,5]
c = dict(zip(a,b))
print(c)
for i,j in c.items():
print(i,j)
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。