Python全栈day18(三元运算,列表解析,生成器表达式)
一,什么是生成器
可以理解为一种数据类型,这种数据类型自动实现了迭代器协议(其他数据类型需要调用自己内置的__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(三元运算,列表解析,生成器表达式)的更多相关文章
- python迭代器 生成器 三元运算 列表解析
1.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外,迭代器的一大优 ...
- python 全栈开发,Day14(列表推导式,生成器表达式,内置函数)
一.列表生成式 生成1-100的列表 li = [] for i in range(1,101): li.append(i) print(li) 执行输出: [1,2,3...] 生成python1期 ...
- python全栈开发day13-迭代器、生成器、列表推导式等
昨日内容:函数的有用信息.带参数的装饰器.多个装饰器修饰一个函数 迭代器 可迭代对象:内部含有__iter__方法 迭代器 定义:可迭代对象.__iter__()就是迭代器,含有__iter__且__ ...
- day13 生成器 三元运算 列表解析
本质上来说生成器迭代器都是一种数据类型,如果你直接打印生成器是无法得出值的,会得到一串内存地址,即一个对象想要得到生成器的值必须要用for或者next,list等来获取 生成器生成器就是一个可迭代对象 ...
- Python全栈day18(迭代器协议和for循环工作机制)
一,什么是迭代和递归 递归和迭代都是循环的一种. 简单地说,递归是重复调用函数自身实现循环.迭代是函数内某段代码实现循环,而迭代与普通循环的区别是:循环代码中参与运算的变量同时是保存结果的变量,当前保 ...
- 巨蟒python全栈开发django4:url反向解析图解&&模板渲染
第一部分: 1.(1)知识点回顾: django回顾: ()下载安装 输入网址,a,form表单get post,爬虫 (请求)==>django项目服务端的url(r"index/& ...
- python 全栈开发,Day46(列表标签,表格标签,表单标签,css的引入方式,css选择器)
一.列表标签 列表标签分为三种. 1.无序列表<ul>,无序列表中的每一项是<li> 英文单词解释如下: ul:unordered list,“无序列表”的意思. li:lis ...
- Python全栈之路----数据类型—列表
1.列表是一个数据的集合,集合内可以放任何数据类型,可对集合进行方便的增删改查操作.列表里面的数可以重复. L1 = [ ] #定义空列表 L2 = [ 'a' , 'b' , 'c' , 'd' ] ...
- 巨蟒python全栈开发django4:url反向解析图解&&模板渲染2
注意:前端有aaa变量,后端没有aaa变量,存在p标签,但是显示不出来 有p标签,我们可以指定默认值,在没有其他内容的时候 过滤器有60多种,有点多,用到的时候再记和查 结果: 显示是acd 看长度 ...
随机推荐
- Linux下编译、使用静态库和动态库 自己测过的
每个程序实质上都会链接到一个或者多个的库.比如使用C函数的程序会链接到C运行时库,GUI程序会链接到窗口库等等.无论哪种情况,你都会要决定是链接到静态库(static libary)还是动态库(dyn ...
- [svc]linux查看主板型号及内存硬件信息
公司服务器内存不够用了. 想看看买啥型号的. 购买内存条注意点: ddr3 or4 频率 块钱. 内存槽及内存条: dmidecode |grep -A16 "Memory Device$& ...
- redhat yum替换成CentOS yum 并修改源
wget http://mirrors.163.com/centos/6/os/x86_64/Packages/python-iniparse-0.3.1-2.1.el6.noarch.rpm wge ...
- sass 的使用心得
//定义颜色 $c55:#; $c22:#; $c33:#; $c99:#; $c77:#; $c00:#; $cff:#fff; $caa:#aaa; $ccc:#ccc; $cf0:#f0f0f0 ...
- 移动端rem的用法
标签: 1.rem(font size of the root element)是指相对于根元素的字体大小的单位,em(font size of the element)是指相对于父元素的字体大小的单 ...
- ubuntu 15.04
修改更新源: sudo vim /etc/apt/sources.list 删除里面所有内容 方法1: 按ggdG 方法2: :%d 替换源 搜狐源: deb http://mirrors.sohu. ...
- python操作word之pywin32的安装
PyCharm 2016.2 官网中文汉化破解版 注册码 http://idea.lanyus.com/ 首先下载安装win32com,下载32位的,不然安装的时候可能检测不到python https ...
- wcf客户端终结点样本集合
1. <bindings> <basicHttpBinding> <binding name="BasicHttpBinding_IUser" /&g ...
- tiny4412 u-boot 启动参数的设置
参考 http://www.cnblogs.com/chenfulin5/p/5887552.html 制作SD卡 u-boot 编译完之后, 进入 u-boot 目录里面的 sd_fuse cd ~ ...
- 2015 Multi-University Training Contest 3 1002 RGCDQ
RGCDQ Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=5317 Mean: 定义函数f(x)表示:x的不同素因子个数. 如:f ...