1. 生成器和生成器函数

生成器的本质就是迭代器
生成器的三种创建办法:
1.通过生成器函数
2.通过生成器表达式创建生成器
3.通过数据转换
 

2. 生成器函数:

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

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

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

取值:

1. __next__()

 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不用传值

 def func():
     print("大碴粥")
     a = "
     print(a)
     print("狗不理")
     b = "
     print(b)
     print("大麻花")
     c = "
     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)
 

3. 各种推导式和生成器表达式:

 # 生成列表 里面装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)]
 g = (i for i in range(10))
 print(list(g))

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

生成器的惰性机制

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))

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

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

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

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)

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

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

【学习笔记】--- 老男孩学Python,day13 生成器,生成器函数,各种推倒式和生成器表达式的更多相关文章

  1. 【学习笔记】--- 老男孩学Python,day10, 初识函数 形参、实参

    函数:对功能的封装语法: def 函数名(形参): 函数体 函数名(实参) 函数名:命名规则和变量一样 函数的返回值: return, 函数执行完毕. 不会执行后面逻辑 1. 如果函数中不写retur ...

  2. Python3学习笔记(十四):可迭代对象、迭代器和生成器

    记得在刚开始学Python的时候,看到可迭代对象(iterable).迭代器(iterator)和生成器(generator)这三个名词时,完全懵逼了,根本就不知道是啥意识.现在以自己的理解来详解下这 ...

  3. 学习笔记《简明python教程》

    学习笔记<简明python教程> 体会:言简意赅,很适合新手入门 2018年3月14日21:45:59 1.global 语句 在不使用 global 语句的情况下,不可能为一个定义于函数 ...

  4. python3.4学习笔记(二十三) Python调用淘宝IP库获取IP归属地返回省市运营商实例代码

    python3.4学习笔记(二十三) Python调用淘宝IP库获取IP归属地返回省市运营商实例代码 淘宝IP地址库 http://ip.taobao.com/目前提供的服务包括:1. 根据用户提供的 ...

  5. python3.4学习笔记(二十一) python实现指定字符串补全空格、前面填充0的方法

    python3.4学习笔记(二十一) python实现指定字符串补全空格.前面填充0的方法 Python zfill()方法返回指定长度的字符串,原字符串右对齐,前面填充0.zfill()方法语法:s ...

  6. python3.4学习笔记(二十) python strip()函数 去空格\n\r\t函数的用法

    python3.4学习笔记(二十) python strip()函数 去空格\n\r\t函数的用法 在Python中字符串处理函数里有三个去空格(包括'\n', '\r', '\t', ' ')的函数 ...

  7. python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL

    python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL实战例子:使用pyspider匹配输出带.html结尾的URL:@config(a ...

  8. Python学习笔记(4):容器、迭代对象、迭代器、生成器、生成器表达式

    在了解Python的数据结构时,容器(container).可迭代对象(iterable).迭代器(iterator).生成器(generator).列表/集合/字典推导式(list,set,dict ...

  9. 【学习笔记】--- 老男孩学Python,day4 编码,数据类型,字符串方法

    今日主要内容 1. 编码 1. 最早的计算机编码是ASCII. 美国人创建的. 包含了英文字母(大写字母, 小写字母). 数字, 标点等特殊字符!@#$% 128个码位 2**7 在此基础上加了一位 ...

随机推荐

  1. 逆向工程生成的Mapper.xml以及*Example.java详解

    逆向工程生成的接口中的方法详解 在我上一篇的博客中讲解了如何使用Mybayis逆向工程针对单表自动生成mapper.java.mapper.xml.实体类,今天我们先针对mapper.java接口中的 ...

  2. Maven国内阿里镜像(Maven下载慢的解决方法)

    Maven是当前流行的项目管理工具,但官方的库在国外经常连不上,连上也下载速度很慢.国内oschina的maven服务器很早之前就关了.今天发现阿里云的一个中央仓库,亲测可用. <mirror& ...

  3. javascript数据基本类型和引用类型区别详解

    JavaScript基本数据类型: js基本数据类型包括:undefined,null,number,boolean,string.基本数据类型是按值访问的,就是说我们可以操作保存在变量中的实际的值. ...

  4. Dubbo架构设计详解(转载)

    原文地址:http://shiyanjun.cn/archives/325.html Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解 ...

  5. spring boot日志管理配置

    spring Boot在所有内部日志中使用Commons Logging,但是默认配置也提供了对常用日志的支持,如:Java Util Logging,Log4J,Log4J2和Logback.每种L ...

  6. iptables关键学习总结

    iptables技术推荐参考这位仁兄的博客:http://www.zsythink.net/archives/category/%E8%BF%90%E7%BB%B4%E7%9B%B8%E5%85%B3 ...

  7. Struts全局跳转

    1.在struts配置文件中配置一个全局跳转 2.然后关联一个jsp文件 4.关联好以后会出现如图所示页面 在代码中会有如图所示的代码增加 5.然后再action中设置跳转

  8. expect安装和使用

    Expect是一个我们常在shell交互时常用到的工具,它主要由expect-send组成.Expect是等待输出内容中的特定字符.然后由send发送特定的相应.Expect的工作流程类似于:小明和小 ...

  9. redis-集群创建脚本

    之前建好了redis集群, 但没有找到集群重启的机制, 停电2次, 重新创建太麻烦, 于是写了个脚本辅助启动 redis的创建过程可以看: http://www.cnblogs.com/wenbron ...

  10. 3-nginx.conf参数配置

    –#定义Nginx运行的用户和用户组 –user www www; –#nginx进程数,建议设置为等于CPU总核心数. –worker_processes8; –#全局错误日志定义类型,[ debu ...