一、生成器函数

1、生成器:就是自己用python代码写的迭代器,生成器的本质就是迭代器(所以自带了__iter__方法和__next__方法,不需要我们去实现)。

2、用以下两种方式构建一个生成器:

1,生成器函数:跟常规函数定义类似,但是,使用yield语句而不是return语句返回结果。

yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次从它离开的地方继续执行。

2,生成器表达式:类似于列表推导,但是,返回的是生成器的一个对象,

而不是一次构建一个结果列表。

3、生成器函数

3-1、先看一般的函数:

deffunc1(x):

x+= 1

returnx

func1(5) #函数的执行命令,并且接收函数的返回值。

print(func1(5)) #6

3-2、再看生成器函数:

deffunc1(x):

x+= 1

print(666)yieldx

x+=2

print(777)print(x)yield 'xiaobai'x+=3g= func1(5) #此时的func1(5)不会执行函数,因为它只是生成器函数对象

print(g) #

print(g.__next__()) #666 6

print(next(g)) #777 8 xiaobai

3-3、yield与return的区别:

return:结束函数,给函数的执行者返回值

yield:不会结束函数,一个next对应一个yield,

执行yield上面的代码并给 生成器对象.__next__() 返回值

3-4、生成器函数与迭代器的区别

区别1:自定制的区别

迭代器由可迭代对象转化而来,已经‘写死了’

l1 = [1,2,3,4,5]

l1.__iter__()

生成器可用自定制函数来定制

deffunc1(x):

x+= 1

yieldx

x+= 3

yieldx

x+= 5

yieldx

g1= func1(5)print(g1.__next__())print(g1.__next__())print(g1.__next__())

区别2:内存级别的区别。

迭代器是需要可迭代对象进行转化,可迭代对象非常占内存。

生成器直接创建,不需要转化,从本质就节省内存。

deffunc1():for i in range(1000000):yieldi

g1=func1()for i in range(50):print(g1.__next__()) #一个next取一次值,可用for循环取值

3-5、send与next

先看例子:

deffunc1():print(1)

count= yield 6

print(count)print(2)

count1= yield 7

print(count1)print(3)yield 8g=func1()print(g.__next__()) #1 6

print(g.send('xiaobai')) #xiaobai 2 7

print(g.send('xiaigou')) #xiaogou 3 8

总结:

send与next一样,也是对生成器取值(执行一个yield)的方法。

send可以给上一个yield 传值。

注意小坑:

1,第一次取值只能用next

2,最后一个yield不可能得到send传的值

3-6、生成器close()方法:

deffun():for i in range(5):yieldi

g=fun()print(g.__next__())print(g.__next__())print(g.__next__())

g.close()#直接把生成器的值取(删)完了,后面就不能再取值

print(g.__next__()) #报错

a= (i for i in range(4))print(a.__next__())print(a.__next__())

a.close()print(a.__next__()) #报错

3-7、生成器函数的应用例子

要制作一批量很大的衣服,用普通的函数只能一次全部制作完:

defcloth1(n):for i in range(n+1):print('衣服%s号' %i)

cloth1(100000) #一次全部制作完了

而用生成器函数,需要制作多少就先制作多少:

defcloth2(n):for i in range(1,n+1):yield '衣服%s号' %i

g= cloth2(10000)

先制作50件:for i in range(50):print(g.__next__()) #衣服1号,衣服2号,衣服3号...衣服50号

再制作50件:for i in range(50):print(g.__next__()) #衣服51号,衣服52号,衣服53号...衣服100号

二、列表推导式,生成器表达式

1、普通方法创建一个元素为1到100的列表:

l1 =[]for num in range(1,101):

l1.append(num)print(l1)

2、列表推导式:一行代码几乎搞定你需要的任何的列表。

2-1、两种方式:

循环模式

筛选模式

2-2、循环模式:[变量(加工后的变量) for 变量 in iterable]

#1到100的列表

l = [i for i in range(1,101)]print(l) #[1,2,3,4...100]

#python1到python15的列表

l2 = ['python%s' % i for i in range(1,16)]print(l2) #[python1,python2,python3...python15,]

#1到10的平方

l3 = [i*i for i in range(1,11)]print(l3) #[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

2-3、筛选模式 [变量(加工后的变量) for 变量 in iterable if 条件]

#30以内的偶数

l4 = [i for i in range(1,31) if i % 2 ==0]print(l4) #[2, 4, 6, 8,10,...28, 30]

#30以内能被3整除的数

l5 = [i for i in range(1,31) if i % 3 ==0]print(l5) #[3, 6, 9, 12, 15, 18, 21, 24, 27, 30]

#30以内能被3整除的数的平方

l6 = [i**2 for i in range(1,31) if i % 3 ==0]print(l6) #[9, 36, 81, 144, 225, 324, 441, 576, 729, 900]

#找出列表中含有两个'e'的元素

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

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

l7= [j for i in names for j in i if j.count('e') == 2]print(l7) #['Jefferson', 'Wesley', 'Steven', 'Jennifer']

2-4、列表推导式优缺点

优点:一行解决,方便。

缺点:容易着迷,不易排错,不能超过三次循环。

列表推导式不能解决所有列表的问题,所以不要太刻意用。

3、生成器表达式:将列表推导式的[]换成()即可。

g = (i for i in range(100000000000))print(g) #生成器表达式左边的变量g是生成器对象

print(g.__next__()) #0

print(g.__next__()) #1

print(g.__next__()) #2

上面代码相当于:deffunc():for i in range(100000000000):yieldi

g= func() #生成器对象

print(g.__next__())print(g.__next__())print(g.__next__())

4、扩展

4-1、字典推导式

# 例一:将一个字典的key和value对调

dic= {'a': 10, 'b': 34}

new_dic= {dic[k]: k for k indic}print(new_dic)

# 结果:

# {10: 'a', 34: 'b'}

# 例二:合并大小写对应的value值,将k统一成小写

dic= {'a': 10, 'b': 34, 'A': 7, 'Z': 3}

new_dic= {k.lower():dic.get(k.lower(),0) + dic.get(k.upper(),0) for k indic}print(new_dic)

# 结果:

# {'a': 17, 'b': 34, 'z': 3}

4-2、集合推导式

# 例一:计算列表中每个值的平方,自带去重功能

set1= {x**2 for x in [1, -1, 2]}print(set1)

# 结果:

# {1, 4}

4-3、集合推导式和字典推导式的区别

相同点:外层都是使用大括号{}

不同点:返回的形式是 key:values 形式的就是字典,返回的形式是 values1,values2...形式的是集合#集合推导式

set1 = {x**2 for x in (1, -1, 2)}print(set1,type(set1)) #{1, 4}

#字典推导式

dic1 = {x**2:x for x in (1, -1, 2)}print(dic1,type(dic1)) #{1: -1, 4: 2}

4-4、练习题

#例1: 过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母

l1 = [i.upper() for i in ['asdf','a','b','qwe'] if len(i) >= 3]print(l1)#结果:#['ASDF', 'QWE']

#例2: 求(x,y)其中x是0-5之间的偶数,y是0-5之间的奇数组成的元组列表

l2 = [(x,y) for x in range(6) if x % 2 ==0 for y in range(6) if y % 2 == 1]print(l2)#结果:#[(0, 1), (0, 3), (0, 5), (2, 1), (2, 3), (2, 5), (4, 1), (4, 3), (4, 5)]

#例3: 求M中3,6,9组成的列表

M = [[1,2,3],[4,5,6,24,3],[7,8,9,12,9]]

l3= [j for i in M for j in i for z in [3,6,9] if j / z == 1]print(l3)#结果:#[3, 6, 3, 9, 9]

python列表推导式实现从1加到100_python之生成器和列表推导式相关推荐

  1. Python-各种结构解析以及生成器(列表解析,字典解析,集合解析,元组构成的生成器)

    1.列表解析: 举例:生成一个列表,元素0-9,对每一个元素自增1后求平方返回新列表. test = [ (i + 1) ** 2 for i in range(10)] print(test) # ...

  2. Python学习day12(生成器,列表/生成器推导式)

    Python学习day12(生成器,列表/生成器推导式) 生成器 初始生成器 我们知道的迭代器有两种:一种是调用方法直接返回的,一种是可迭代对象通过执行iter方法得到的,迭代器有的好处是可以节省内存 ...

  3. day 012 生成器 与 列表推导式

    生成器的本质就是迭代器,写法和迭代器不一样,用法一样. 获取方法: 1.通过生成器函数 2.通过各种推导式来实现生成器 3.通过数据的转换也可以获取生成器 例如: 更改return 为 yield 即 ...

  4. 巨蟒python全栈开发-第12天 生成器函数 各种推导式 yield from

    一.今日主要内容总览(重点) 1.生成器(目的:帮助我们创建对象) (1)生成器的本质就是迭代器 (2)一个一个的创建对象 (3)创建生成器的方式: 1.生成器函数 2.通过生成器表达式来获取生成器 ...

  5. 14 Python之生成器,生成器函数以及推导式

    一.生成器 本质就是迭代器. 我们可以直接执⾏__next__()来执⾏ 以下⽣成器 一个一个的创建对象 创建生成器的方式: 1.生成器函数 2.通过生成器 表达式来获取生成器 3.类型转换(看不到) ...

  6. day12 生成器和各种推导式

    今天主要学习了 1.生成器 2.生成器函数 3.各种推导式(比较诡异,理解了很简单,不理解很难) 4.生成器表达式(重点) 一.生成器 def func():print'我叫周润发'return '林 ...

  7. 《 Python List列表全实例详解系列(二)》__创建列表(5种方式)

    < Python List列表全实例详解系列(二)> __创建列表(5种方式) 上一篇:< Python List 列表全实例详解系列(一)>__系列总目录.列表概念 本章目录 ...

  8. python中整数类型的表示需加引导符号_Python内置类型及常见问题

    python的内置数据类型非常丰富,大致可以分为五类:None.数字类型.序列类型.映射类型和集合类型.下面我将分别对他们进行介绍,做个总结以备以后查看.下面的表列出了各个类别下的具体数据类型.*注: ...

  9. python元组和列表都支持的方法是_Python进阶1-元组和列表

    本系列文章是一系列学习笔记,希望较为深入地分析Python3中的原理.性能,文章中绝大部分观点都是原作作者的观点(如下),本人对书中示例加以实践和总结,并结合相应的Python的C语言源码(3.6.1 ...

最新文章

  1. 二叉树-二叉树的最大深度(递归 )
  2. 组织级项目管理实例分享——来自项目管理群的讨论
  3. python绘制3维图-python——绘制二元高斯分布的三维图像,
  4. OpenCV之邻域运算之最值滤波
  5. 在c++中qsort()排序函数的使用qsort函数应用大全
  6. DDD实战成绩管理---用户故事
  7. Chrome无法打开文件的错误 [Not allowed to load local resource: file://XXXX]
  8. window 创建python虚拟环境
  9. “无语!只因姓True,苹果封了我的iCloud账户”
  10. WSAData小说明(转)
  11. Compiere 开源CRM的比较选择
  12. 基于JavaSSM和微信小程序的智能二维码门禁管理系统
  13. 10首现代诗歌欣赏:什么是孤独
  14. 资源分享——免费的高端PPT模板网址
  15. Mock工具介绍,为什么使用Mock?
  16. PyQt 记住上次打开路径
  17. 预成大器,远离对日外包
  18. 逆水寒能不能网页预约服务器,逆水寒春暖花开服务器怎么预约?春暖花开服务器预约方法介绍...
  19. Software Version 1976
  20. 任正非的《北国之春》(zz.is2120)

热门文章

  1. MySQL中的索引(唯一索引篇)
  2. 标题在图表上_从零开始学Excel——标题和图例的设置(143)
  3. 浏览器复制不进行url编码_谷歌浏览器测试版支持在PC上复制号码并操作关联安卓设备进行拨打...
  4. 限流10万QPS、跨域、过滤器、令牌桶算法-网关Gateway内容都在这儿
  5. 如何根据sessionID获取session解决方案
  6. 蓝桥杯java第八届第二题--纸牌三角形
  7. Java设计模式——装饰者模式
  8. 跨域解决方案之CORS
  9. linux介绍及目录结构(一)
  10. 常见的排序算法(1)