2018-07-16

## 1\. 生成器和生成器函数

```

生成器的本质就是迭代器

生成器的三种创建办法:

    1.通过生成器函数

    2.通过生成器表达式创建生成器

    3.通过数据转换

```

## 2\. 生成器函数:

函数中包含了yield的就是生成器函数

注意:生成器函数被执行. 获取到的是生成器. 而不是函数的执行生成器表达式:

(结果 for 变量 in 可迭代对象 if 筛选)

取值:

### 1\. \_\_next\_\_()

```c

def func():

print("我是周杰伦")

yield "昆凌" \# 函数中包含了yield, 当前这个函数就不再是普通的函数了. 是生成器函数

g = func()

print(g.\_\_next\_\_())

print(func().\_\_next\_\_())

g1 = func()

g2 = func()

print(g1.\_\_next\_\_())

print(g1.\_\_next\_\_())

print("==============")

print(g2.\_\_next\_\_())

g = func() \# 通过函数func()来创建一个生成器

print(g.\_\_next\_\_()) \# 周杰伦

print(g.\_\_next\_\_()) \# 王力宏

print(g.\_\_next\_\_()) \# 笛卡尔积

print(g.\_\_next\_\_())

\# return 直接返回结果. 结束函数的调用

\# yield 返回结果.可以让函数分段执行

\#

def func():

lst = []

for i in range(1,100001):

lst.append("衣服%s" % i)

return lst

def gen():

i = 1

while i \< 100001:

yield "衣服%s" % i

i = i + 1

g = gen()

print(g.\_\_next\_\_())

print(g.\_\_next\_\_())

print(g.\_\_next\_\_())

print(g.\_\_next\_\_())

print(g.\_\_next\_\_())

print(g.\_\_next\_\_())

def func():

yield 11

yield 22

yield 33

yield 44

g = func() \# 拿到的是生成器. 生成器的本质是迭代器. 迭代器可以被迭代 生成器可以直接for循环

for i in g:

print(i) \# 本质上执行的是\_\_next\_\_()

it = g.\_\_iter\_\_()

while True:

try:

print(it.\_\_next\_\_())

except StopIteration:

break

```

2\. send(值) 给上一个yield位置传一个值, 第一个和最后一个yield不用传值

```c

def func():

    print("大碴粥")

    a = yield "11"

    print(a)

    print("狗不理")

    b = yield "22"

    print(b)

    print("大麻花")

    c = yield "33"

    print(c)

g = func()

print(g.__next__())

print(g.send(1))

print(g.send(2))

print(g.send(3))

# __next__() 可以让生成器向下执行一次

# send() 也可以让生成器向下执行一次, 给上一个yield传一个值, 第一个不能用send(). 最后一个也不要传值

def eat():

    print("我吃什么啊")

    a =  yield  "馒头"

    print("a=",a)

    b =  yield  "大饼"

    print("b=",b)

    c =  yield  "韭菜盒子"

    print("c=",c)

    yield  "GAME OVER"

gen = eat()      # 获取⽣成器

ret1 = gen. __next__ ()

print(ret1)

ret2 = gen.send("胡辣汤")

print(ret2)

ret3 = gen.send("狗粮")

print(ret3)

ret4 = gen.send("猫粮")

print(ret4)

def func():

    yield 11

    yield 22

    yield 33

    yield 44

g = func()

lst = list(g)  # 可迭代对象

print(lst)

```

3\\. 可以for循环

4\\. list(g)

2\. 各种推倒式和生成器表达式

```c

# 生成列表 里面装1-14的数据

lst = []

for i in range(1,15):

    lst.append("python%s" % i)

print(lst)

# 列表推倒式; 最终给你的是列表

# 语法 [最终结果(变量) for 变量 in 可迭代对象]

lst = [i for i in range(1,15)]

print(lst)

# [最终结果 for 变量 in 可迭代对象 if 条件]

lst = [i for i in range(1,101) if i%2==0]

print(lst)

# 1. 获取1-100内能被3整除的数

lst = [i for i in range(1,101) if i % 3 == 0]

# 2. 100以内能被3整除的数的平方

lst = [i*i for i in range(1,101) if i % 3 == 0]

# 3. 寻找名字中带有两个e的⼈的名字

names = [['Tom', 'Billy', 'Jefferson' , 'Andrew' , 'Wesley' , 'Steven' ,

'Joe'],['Alice', 'Jill' , 'Ana', 'Wendy', 'Jennifer', 'Sherry' , 'Eva']]

lst = [name for first in names for name in first if name.count("e") == 2]

print(lst)

lst = ["衣服%s" % i for i in range(10000)]

```

```c

g = (i for i in range(10))

print(list(g))

gen = ("麻花藤我第%s次爱你" % i for i in  range(10))

for i in  gen:

    print(i)

```

\# 生成器的惰性机制

```c

def func():

    print(111)

    yield  222

g = func()

g1 = (i  for i in  g)

g2 = (i  for i in  g1)

print(list(g))

print(list(g1))

print(list(g2))

```

1\. 列表推倒式 [结果 for 变量 in 可迭代对象 if 筛选]

2\. 字典推倒式 {结果 for 变量 in 可迭代对象 if 筛选} 结果=\\\\\\\>key:value

```c

dic = {"a":"b", "c":"d"}

# 把字典中的key:value互换 .{"b":"a", "d":"c"}

new_dic = {dic[key]:key for key in dic}

print(new_dic)

lst1 = ["alex", "wusir", "taibai", "ritian"]

lst2 = ['sb', "很色", "很白", "很牛"]

# {"alex":"sb", "wusir":"很色"}

dic = { lst1[i]:lst2[i] for i in range(len(lst1))}

print(dic)

```

3\. 集合推倒式 {结果 for 变量 in 可迭代对象 if 筛选} 结果=\\\\\\\>key

```c

lst = ["马化腾", "马化腾", "王建忠", "张建忠", "张建忠", "张雪峰", "张雪峰"]

s = {i for i in lst}    # 集合推倒式

print(s)

```

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

推荐阅读更多精彩内容

  • 包(lib)、模块(module) 在Python中,存在包和模块两个常见概念。 模块:编写Python代码的py...
    清清子衿木子水心阅读 3,805评论 0 27
  • 1.1==,is的使用 ·is是比较两个引用是否指向了同一个对象(引用比较)。 ·==是比较两个对象是否相等。 1...
    TENG书阅读 729评论 0 0
  • PYTHON-进阶-ITERTOOLS模块小结转自wklken:http://wklken.me/posts/20...
    C_Y_阅读 968评论 0 2
  • 愿看到这里的人都有未来,都热爱生活,像我一样白天世俗忙碌的活着,黑夜,将自己装进酒杯,看着它,嘴角上扬,满满的不屑。
    麦田小圈圈阅读 181评论 0 0
  • “平江土话”跻身中国十大拗口难懂方言之列,今霸蛮罗列几十句以飧广大读者朋友和方言爱好者。(呕心原创.平台转载请先联...
    天河水响阅读 888评论 0 2