Python基础(8)- 关键字yield

前几天遇到了这个yield,不知道是干嘛的,这里学习整理下,主要参考了:
如何理解Python关键字yield
Python高级特性

上面介绍的都很好,这里就根据自己的理解,简单整理下。

1. 什么是迭代

常见的list、tuple等集合,我们会通过遍历,比如for循环来获取每一个元素,这就是迭代。这些可以遍历的对象,也叫做可迭代对象

小例子

a = [1,2,3]
print(a)
for i in a:
    print(i)
    
b = 'abcd'
print(b)
for i in b:
    print(i)
    
c = {'name':'lufei','age':20}
print(c)
for k in c:
    print(k)
for v in c.values():
    print(v)
for k,v in c.items():
    print(k,v)

#out
[1, 2, 3]
1
2
3
abcd
a
b
c
d
{'name': 'lufei', 'age': 20}
name
age
lufei
20
name lufei
age 20

我们怎样判断一个对象是否可以去迭代呢?可以使用collections模块的Iterable

print(type(a),isinstance(a,Iterable))
print(type(b),isinstance(b,Iterable))
print(type(c),isinstance(c,Iterable))
print(type(123),isinstance(123,Iterable))

#out
<class 'list'> True
<class 'str'> True
<class 'dict'> True
<class 'int'> False

2. 列表生成式(List Comprehensions)

一个非常简单的方式来生成list,像这样:

range(10)
Out[56]: range(0, 10)

list(range(10))
Out[57]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

list(x for x in range(10))
Out[58]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

list(x*x for x in range(10))
Out[59]: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

[x*x for x in range(3)]
Out[60]: [0, 1, 4]

#上面的for后面还可以加上if判断
[x for x in range(10) if x>5]
Out[61]: [6, 7, 8, 9]

#for循环也可以嵌套
[x+y for x in 'abc' for y in 'xyz']
Out[62]: ['ax', 'ay', 'az', 'bx', 'by', 'bz', 'cx', 'cy', 'cz']

3.迭代器

前面,我们说了for循环和可迭代对象,像这种可以使用for循环不断取出先一个元素的对象,就叫做迭代器(Iterator)。迭代器不单单可以使用for循环来遍历,
还可以使用next()函数不断获取下一个元素,当没有下一个元素时,会抛出StopIteration异常。
我们可以使用collections模块的Iterator来判断一个对象是否为迭代器

from collections import Iterator

isinstance([1,2,3],Iterator)
Out[2]: False

isinstance('abc',Iterator)
Out[3]: False

isinstance({'name':'lufei','age':20},Iterator)
Out[4]: False

创建一个迭代器有3中方式:

  • 为对象创建 iter()和next()方法
  • 内置的iter()可以将可迭代对象转换为迭代器
  • 生成器
a = [1,2,3]

type(iter(a))
Out[6]: list_iterator

isinstance(iter(a),Iterator)
Out[7]: True

4. 生成器

上面,我们使用list()或者[],很简单方便的生成了一个列表,只要我们将[]替换为(),就创建一个一个generator。生成器可以一边循环,一边计算生成下一个元素,而不是像list一样,一下生成所有的数据。

(x+y for x in 'abc' for y in 'xyz')
Out[63]: <generator object <genexpr> at 0x0000021AE0FC9D58>

a = (x+y for x in 'abc' for y in 'xyz')

a
Out[66]: <generator object <genexpr> at 0x0000021AE0FC9518>

isinstance(a,Iterator)
Out[67]: True

通常,我们使用yield语句可以返回一个生成器,很多例子,这里都是举一个斐波那契数列
yield类似return,只不过他返回的是生成器,调用了next()之后,

def fab(n):
    a,b,i = 0,1,0
    while i<n:
        print(b)
        a,b = b,a+b
        i+=1

fab(5)

#out
1
1
2
3
5

#使用yield改造
def fab(n):
    a,b,i = 0,1,0
    while i<n:
        yield b
        a,b = b,a+b
        i+=1

for i in fab(5):
    print(i)

我们调用fab的时候,执行到yield,会返回一个生成器,当调用next()后,程序会回到yield停止的地方继续往下执行
这样,就是每次只生成当前元素,而不是一下子生成所有的元素;
当然,for循环替我们调用了next(),并处理了StopIteration异常。
好了,梳理好上面这些概念,到yield这里,其实还好,平时在理解下,多用用,好,就到这。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,591评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,448评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,823评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,204评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,228评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,190评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,078评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,923评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,334评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,550评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,727评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,428评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,022评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,672评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,826评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,734评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,619评论 2 354

推荐阅读更多精彩内容