Python开发——函数【迭代器、生成器、三元表达式、列表解析】
递归和迭代
小明问路篇解释说明
- 递归:小明——>小红——>小于——>小东;小东——>小于——>小红——>小明
小明向小红问路,因小红不知道,所以向小于问路,因小于不知道,所以向小东问路,
小东知道路,告诉小于,小于知道后,告诉小红,小红知道后,告诉小明
- 迭代:
小明向小红问路,因小红不知道,所以告诉小明去问小红,
于是,小明向小于问路,因小于不知道,所以向告诉小明去问小东,
于是,小明向小东问路,然后小东告诉小明。
什么是迭代器协议?
- 迭代器协议:对象必须有一个next()方法,执行该方法,要么返回迭代的下一项,要么引起stopiteration异常,以终止迭代(只能往后走,不能往前退)
- 可迭代对象:实现了迭代器协议的对象(如何实现?对象内部有一个__iter__()方法。)。
- 协议是一种约定,可迭代对象实现了可迭代协议,Python的内部工具(如:for循环,sum、min、max函数等)使用迭代器协议访问对象。
for循环
- for循环的本质就是遵循迭代器协议去访问对象,但for循环的对象不一定是可迭代对象
- 字符串、列表、元祖、字典、集合、文件对象,这些都不是可迭代对象,只不过在for循环时调用了他们内部的__iter__()方法,把他们变成了可迭代对象。然后for循环调用可迭代对象的__next__()方法去取值,而且for循环会捕捉stopiteration异常,以终止迭代
- for循环是基于迭代器协议提供了一个统一的可以遍历所有对象的方法(不仅序列类型可以使用,非序列类型,如:字典,集合,文件对象也可以使用)
s = 'hello'
# print(dir(s))
# 字符串(不可迭代对象)有__iter__()方法
# 遵循迭代器协议,生成可迭代对象liter_test
liter_test = s.__iter__()
print(liter_test) # <str_iterator object at 0x0352E9F0>
print(liter_test.__next__()) # h
print(liter_test.__next__()) # e
print(liter_test.__next__()) # l
print(liter_test.__next__()) # l
print(liter_test.__next__()) # o
# 集合
s = {1,2,3}
# 集合(不可迭代对象)有__iter__()方法
# 遵循迭代器协议,生成可迭代对象iter_s
iter_s = s.__iter__()
print(iter_s) # <set_iterator object at 0x056CB260>
print(iter_s.__next__()) #
print(iter_s.__next__()) #
print(iter_s.__next__()) #
生成器
什么是生成器?可以理解为一种数据类型,自动实现了迭代器对象(其他的数据类型需要调用自己内置的__iter__方法,生成器不用,因为其下有__next__()方法或next()方法),所以生成器就是可迭代对象
生成器在Python中的表达形式?
生成器函数:常规函数定义,但是函数中包含yield,取代return,作为返回值;
yield特性:可以返回值,多次yield,保存状态
生成器函数
1 def t():
yield
yield 1
yield 3
g = t()
print(g) # <generator object t at 0x04932CC0>
print(g.__next__()) # None
print(g.__next__()) #
print(g.__next__()) #
生成器表达式:
- 列表解析的中括号[]换成小括号()就是生成器表达式
- 列表解析和生成器表达式都是一种便利的编程方式,生成器更节省内存。
- Python不但使用迭代器协议,让for循环变得更加通用,大部分的内置函数,也是使用迭代器协议访问对象,例如:sum函数的Python的内置函数,该函数使用迭代器协议访问对象,而生成器实现了迭代器协议,所以我们可以直接计算以下一系列的和
print(sum(x**2 for x in range(4))) #
# 而不用
print(sum([x**2 for x in range(4)])) #
生成器表达式
生成器表达式
1 l = (i for i in range(10))
print(l) # <generator object <genexpr> at 0x04ADBB10>
print(l.__next__()) #
print(next(l)) #
print(l.__next__()) #
print(next(l)) #
# ····
三元表达式
'true' if name == 'yuan' else 'false'
################--三元表达式--####################
name = 'yuan'
res = 'true' if name == 'yuan' else 'false'
print(res) # true
列表解析
中括号[]+三元表达式——>列表,很方便的生成列表,缺点:生成真实列表,数据量大时,消耗内存
[ i for i in range(10) if i > 5] 三元表达式
################--列表解析--#######################
egg_list = []
for i in range(10):
egg_list.append(i)
# egg_list.append('鸡蛋%s'%i)
print(egg_list) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] l = [i for i in range(10)]
# l = ['鸡蛋%s'%i for i in range(10)]
print(l) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # 三元表达式
li = [i for i in range(10) if i > 5]
print(li) # [6, 7, 8, 9]
Python开发——函数【迭代器、生成器、三元表达式、列表解析】的更多相关文章
- python迭代器 生成器 三元运算 列表解析
1.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外,迭代器的一大优 ...
- python学习10—迭代器、三元表达式与生成器
python学习10—迭代器.三元表达式与生成器 1. 迭代器协议 定义:对象必须提供一个next方法,执行该方法或者返回迭代中的下一项,或者返回一个StopIteration异常,以终止迭代(只能往 ...
- python 之 函数 面向过程 三元表达式 函数递归
5.11 面向过程编程思想 核心是'过程'二字,过程即解决问题的步骤,即先干什么,再干什么........ 基于面向过程编写程序就好比在设计一条流水线,是一种机械式的思维方式. 总结优缺点: 优点:复 ...
- day13 生成器 三元运算 列表解析
本质上来说生成器迭代器都是一种数据类型,如果你直接打印生成器是无法得出值的,会得到一串内存地址,即一个对象想要得到生成器的值必须要用for或者next,list等来获取 生成器生成器就是一个可迭代对象 ...
- Python入门之三元表达式\列表推导式\生成器表达式\递归匿名函数\内置函数
本章目录: 一.三元表达式.列表推导式.生成器表达式 二.递归调用和二分法 三.匿名函数 四.内置函数 ================================================ ...
- python递归-三元表达式-列表生成式-字典生成式-匿名函数-部分内置函数-04
递归 递归: # 函数在调用阶段直接或间接地又调用了自身 应用场景: # 将列表中的数字依次打印出来(循环的层数是你必须要考虑的点) --> l = [1, [2, [3, [4, [5, ...
- Python 函数递归-三元表达式-列表生成式-字典生成式-匿名函数-内置函数
上节课复习: 1. 无参装饰器 def 装饰器名字(func): def wrapper(*args,**kwargs): res = func(*args,**kwargs) return res ...
- python函数-迭代器&生成器
python函数-迭代器&生成器 一.迭代器 1 可迭代协议 迭代:就是类似for循环,将某个数据集内的数据可以“一个挨着一个取出来” 可迭代协议: ① 协议内容:内部实现__iter__方法 ...
- day19-1 迭代器,三元表达式,列表推导式,字典生成式,
目录 迭代器 可迭代对象 迭代器对象 总结 三元表达式(三目表达式) 列表推导式 字典生成式 迭代器 可迭代对象 拥有iter方法的对象就是可迭代对象 # 以下都是可迭代的对象 st = '123'. ...
随机推荐
- 1.1.8 怎样在Word的页眉中插入一级标题
可以通过域来实现,其具体的操作步骤: 1.为章.节标题使用标题样式.例如:章标题使用标题1样式,节标题使用标题2样式.操作方法:选中章(节)标题,然后点击选项卡中“样式”中的). 2.设置文档页眉和页 ...
- Firebird 烂笔头(一)
下载非安装版,将文件解压缩到D:\FireBird2.5下面.然后里面有.bat文件,选择自己适合的类型安装后,在服务里面会有一个firebirdserver开头的服务,右键启动. win+R,在命令 ...
- tomcat接口调用时延开关
项目中有些页面时延不稳定,需要看每次接口调用时延,怎么看,有两种方法:一种是直接去catalina.out日志中看,一种是直接去localhost_access_log日志中看,第一种需要在代码中实现 ...
- Struts1 不能进入Action,页面空白问题解决
http://blog.csdn.net/barry_liao/article/details/35592935 Struts1 不能进入Action,页面空白问题解决 标签: Struts1Acti ...
- python 前后端分离 简单的数据库返回接口
1.使用node http-server 起本地服务器 或者打开nginx 直接用nginx的默认页面也可以 (用下面的html文件替换nginx下html文件夹下的index.html) http ...
- OutOfMemoryError异常java内存泄漏(Memory Leak)和内存溢出(Memory Overflow)
本篇文章理解源自于<深入理解java虚拟机>2.4章节 实战:OutOfMemoryError异常 在以下例子中,所有代码都可以抛出OutOfMemoryError异常,但是要区分到底 ...
- react使用ant-design组件库
新建项目并引入组件 1,全局安装脚手架 npm install -g create-react-app 2,新建项目 create-react-app reactantd 3,安装组件 npm ins ...
- [UE4]Input Key Selector
一.Input Key Selector:按键设置 二.On Key Selected:按键收集完毕后触发该事件. 三.点击On Key Selected控件后,会显示“...”,表示可以接受键盘输入 ...
- css3属性box-sizing:border-box 用法解析
响应式Web设计经常需要我们通过百分比设置组件宽度.如果我们不考虑边框,那么很容易就可以实现,但如果你给每一列以及总宽度都采用百分比设置,那这个时候固定的边框大小就会出来捣乱.下面我们将看到一组方法去 ...
- jquery如何实现当页面下拉到一定位置时,右下角出现回到顶部图标
渐进式返回顶部