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 看长度 ...
随机推荐
- Fastboot和Recovery
Fastboot是什么意思?从字面意思来讲,Fastboot是『快速启动』的意思.通常大家所讨论的Fastboot,通常都是说安卓手机的Fastboot模式.在安卓手机中fastboot是一种比rec ...
- DIY一个基于树莓派和Python的无人机视觉跟踪系统
DIY一个基于树莓派和Python的无人机视觉跟踪系统 无人机通过图传将航拍到的图像存储并实时传送回地面站差点儿已经是标配.假设想来点高级的--在无人机上直接处理拍摄的图像并实现自己主动控制要怎么实现 ...
- Hadoop单机Hadoop测试环境搭建
Hadoop单机Hadoop测试环境搭建: 1. 安装jdk,并配置环境变量,配置ssh免密码登录 2. 下载安装包hadoop-2.7.3.tar.gz 3. 配置/etc/hosts 127.0. ...
- java 代理模式,观察者模式
代理模式1 import <a href="http://lib.csdn.net/base/17" class='replace_word' title="Jav ...
- [shell]Linux脚本开头#!/bin/bash和#!/bin/sh是什么意思以及区别
一直以为在shell脚本中#都是代表着注释功能,同样在脚本开始的#!/bin/sh也只是告诉用户这是一个shell脚本,而最近顺手查了下,才发现不是这个意思,分享下面的文章. 转自:http://ww ...
- per-cpu
What is percpu data? percpu data 是内核为smp系统中不同CPU之间的数据保护方式,系统为每个CPU维护一段私有的空间,在这段空间中的数据只有这个CPU能访问.但是这种 ...
- 记一次安装多版本php的四个雷区,你踩着了吗
记一次安装多版本php的四个雷区,你踩着了吗 技术小疯子关注3人评论740人阅读2018-06-29 15:00:30 记一次安装多版本的php的四个雷区,你踩着了吗 需求:公司需要在同一台服 ...
- 关于webRTC中video的使用实践
此次demo使用chrome49调试测试 前端在操作视频输入,音频输入,输出上一直是比较弱的,或者说很难进行相关的操作,经过我最近的一些研究发现,在PC上实际上是可以实现这一系列的功能的,其实现原理主 ...
- 树形dp - BNU 39572 Usoperanto
Usoperanto Problem's Link Mean: 给定n个单词,每个单词可以作为形容词来修饰其他单词. 如果当前单词Wi修饰Wj,那么这个修饰的代价是:Wi~Wj之间的单词的总长度. 你 ...
- Bitcoin: A Peer-to-Peer Electronic Cash System(比特币论文翻译)
比特币历史: 2008年,比特币论文诞生 2009年1月,第一批比特币诞生 2011年4月,比特币价格第一次达到了1美元 2011年6月,涨到30美元,然后开始跌 2013年1月,4美元 2013年1 ...