一,什么是生成器

  可以理解为一种数据类型,这种数据类型自动实现了迭代器协议(其他数据类型需要调用自己内置的__iter__方法),所以生成器是可迭代对象。

二,生成器分类在python中的表现形式

  1,生成器函数:常规函数定义,但是,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数状态,以便下次从它离开的地方继续执行day18-5.py

def test():
yield 1
yield 2 g=test()
print(g)
print(g.__next__())
print(g.__next__()) <generator object test at 0x000001D40CF6F3B8>
1
2

  不同于return可以yield多个值,因为是可迭代对象所以有next方法

  2,生成器表达式:类似于列表推导,但是生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表

  

三,三元表达式,如果表达式成立返回前面的值否则返回后面的值day18-7.py

name='zhangsan'
print('SB' if name == 'zhangsan' else '帅哥')

  

四,列表表达式,举例说明 day18-8.py

#使用for循环实现生鸡蛋
egg_list=[]
for i in range(10):
egg_list.append('鸡蛋%s' %i) print(egg_list) #使用列表表达式生鸡蛋
l=['鸡蛋%s'%i for i in range(10) ]
print(l) ['鸡蛋0', '鸡蛋1', '鸡蛋2', '鸡蛋3', '鸡蛋4', '鸡蛋5', '鸡蛋6', '鸡蛋7', '鸡蛋8', '鸡蛋9']
['鸡蛋0', '鸡蛋1', '鸡蛋2', '鸡蛋3', '鸡蛋4', '鸡蛋5', '鸡蛋6', '鸡蛋7', '鸡蛋8', '鸡蛋9']

  使用for循环和列表表达式生成是结果是一样的

  使用三元表达式加一个if判断条件(三元表达式可以是三元也可以是二元,但是不能是四元)

l=['鸡蛋%s'%i for i in range(10) if i>5]
print(l) ['鸡蛋6', '鸡蛋7', '鸡蛋8', '鸡蛋9']

  以上使用表达式生成的列表直接在内存中,可以使用生成器表达式

egg_list=['鸡蛋%s'%i for i in range(10)]
laomuji=('鸡蛋%s'%i for i in range(10))
print(laomuji)
print(next(laomuji)) #next的本质就是调用__next__
print(laomuji.__next__())
print(next(laomuji)) <generator object <genexpr> at 0x000001D39C97F3B8>
鸡蛋0
鸡蛋1
鸡蛋2

  PS:不能无限制的next因为定义生成器的时候定义了范围0-9所以最多到鸡蛋9

  总结:

  1,把列表解析的[]换成()得到的就是生成器表达式

  2,列表解析与生成器表达式都是一种便利的编程方式,只不过生成器表达式更节省内存

  3,Python不但所以迭代器协议让for循环变得更加通用。大部分内置函数,也是使用迭代器协议访问对象的。例如,sum函数是Python的内置函数,该函数使用迭代器协议访问对象,而生成器实现了迭代器协议,所以,我们可以直接作用计算一系列值的和

print(sum(x ** 2 for x in range(4)))

14

  

  PS:生成器只能遍历一次(for,next,list等操作均为遍历),一次遍历以后里面的值为空了

  day18-9.py

#定义生成器函数遍历0 1 2 3
def test():
for i in range(4):
yield i
#生成器函数执行赋值给t
t=test()
#列表表达式赋值
t1=(i for i in t)
t2=(i for i in t1)
print(t1)
#遍历输出[0, 1, 2, 3]
print(list(t1))
#因为t1已经遍历过一次了使用遍历t2输出为一个空列表
print(list(t2)) <generator object <genexpr> at 0x0000020A158D3938>
[0, 1, 2, 3]
[]

  

Python全栈day18(三元运算,列表解析,生成器表达式)的更多相关文章

  1. python迭代器 生成器 三元运算 列表解析

    1.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外,迭代器的一大优 ...

  2. python 全栈开发,Day14(列表推导式,生成器表达式,内置函数)

    一.列表生成式 生成1-100的列表 li = [] for i in range(1,101): li.append(i) print(li) 执行输出: [1,2,3...] 生成python1期 ...

  3. python全栈开发day13-迭代器、生成器、列表推导式等

    昨日内容:函数的有用信息.带参数的装饰器.多个装饰器修饰一个函数 迭代器 可迭代对象:内部含有__iter__方法 迭代器 定义:可迭代对象.__iter__()就是迭代器,含有__iter__且__ ...

  4. day13 生成器 三元运算 列表解析

    本质上来说生成器迭代器都是一种数据类型,如果你直接打印生成器是无法得出值的,会得到一串内存地址,即一个对象想要得到生成器的值必须要用for或者next,list等来获取 生成器生成器就是一个可迭代对象 ...

  5. Python全栈day18(迭代器协议和for循环工作机制)

    一,什么是迭代和递归 递归和迭代都是循环的一种. 简单地说,递归是重复调用函数自身实现循环.迭代是函数内某段代码实现循环,而迭代与普通循环的区别是:循环代码中参与运算的变量同时是保存结果的变量,当前保 ...

  6. 巨蟒python全栈开发django4:url反向解析图解&&模板渲染

    第一部分: 1.(1)知识点回顾: django回顾: ()下载安装 输入网址,a,form表单get post,爬虫 (请求)==>django项目服务端的url(r"index/& ...

  7. python 全栈开发,Day46(列表标签,表格标签,表单标签,css的引入方式,css选择器)

    一.列表标签 列表标签分为三种. 1.无序列表<ul>,无序列表中的每一项是<li> 英文单词解释如下: ul:unordered list,“无序列表”的意思. li:lis ...

  8. Python全栈之路----数据类型—列表

    1.列表是一个数据的集合,集合内可以放任何数据类型,可对集合进行方便的增删改查操作.列表里面的数可以重复. L1 = [ ] #定义空列表 L2 = [ 'a' , 'b' , 'c' , 'd' ] ...

  9. 巨蟒python全栈开发django4:url反向解析图解&&模板渲染2

    注意:前端有aaa变量,后端没有aaa变量,存在p标签,但是显示不出来 有p标签,我们可以指定默认值,在没有其他内容的时候 过滤器有60多种,有点多,用到的时候再记和查 结果: 显示是acd 看长度 ...

随机推荐

  1. SCUT入门-环境搭建

    SCUT是一款基于C#且开源的游戏服务端框架,并且有一定的上线项目.最近正在入门中... 1.安装 去官网可以直接下载安装版:http://www.scutgame.com/ 源代码建议OSC Chi ...

  2. Message: 'geckodriver' executable needs to be in PATH. 解决方法

    问题描述: 执行如下代码 # coding=utf-8 from selenium import webdriver driver = webdriver.Firefox() driver.maxim ...

  3. location 将多级目录下的文件转成一个文件

    /ck-135-201-7142.html 指向/ck/135/201/7142.html [root@web01 www]# cat /app/server/nginx/conf/rewrite/d ...

  4. linux 下面压缩,解压.rar文件以及rar,unrar实例

    http://www.rarlab.com/download.htm [root@bass src]# wget http://www.rarlab.com/rar/rarlinux-x64-5.4. ...

  5. 从零开始,跟我一起做jblog项目(一)引言

    从零开始,跟我一起做jblog项目(一)引言 想做一个java版的blog,源自一个很久之前的想法 当时刚学习JAVA的web编程 想买自己的域名,自己的VPS,安装自己的WEB服务 用google ...

  6. ansible之并行运行

    ansible之并发运行 转载 2016年07月14日 12:33:39 标签: 并发 / ansible 4474 ansible默认只会创建5个进程,所以一次任务只能同时控制5台机器执行.那如果你 ...

  7. html 处理

    近期做了一个后台管理网站,后台页面都是Html页面,里面再通过ajax访问后台服务.要做到比较好的用户体验,即:如果用户没有登录或没有权限马上调到登录页面,而不是等到页面加载后再ajax时判断是否登录 ...

  8. JQueryEasyUI-DataGrid显示数据,条件查询,排序及分页

    <html><head>    <title></title>    <script src="/jquery-easyui-1.3.4 ...

  9. 一般来说,主方法main()结束的时候线程结束

    suspend()是将一个运行时状态进入阻塞状态(注意不释放锁标记).恢复状态的时候用resume().Stop()指释放全部. 这几个方法上都有Deprecated标志,说明这个方法不推荐使用. 一 ...

  10. java----EL表达式

     Java Web中的EL(表达式语言)详解 表达式语言(Expression Language)简称EL,它是JSP2.0中引入的一个新内容.通过EL可以简化在JSP开发中对对象的引用,从而规范页面 ...