递归和迭代

  小明问路篇解释说明

  • 递归:小明——>小红——>小于——>小东;小东——>小于——>小红——>小明

    小明向小红问路,因小红不知道,所以向小于问路,因小于不知道,所以向小东问路,

    小东知道路,告诉小于,小于知道后,告诉小红,小红知道后,告诉小明

  • 迭代

      小明向小红问路,因小红不知道,所以告诉小明去问小红,

    于是,小明向小于问路,因小于不知道,所以向告诉小明去问小东,

    于是,小明向小东问路,然后小东告诉小明。

什么是迭代器协议?

  1. 迭代器协议:对象必须有一个next()方法,执行该方法,要么返回迭代的下一项,要么引起stopiteration异常,以终止迭代(只能往后走,不能往前退)
  2. 可迭代对象:实现了迭代器协议的对象(如何实现?对象内部有一个__iter__()方法。)。
  3. 协议是一种约定,可迭代对象实现了可迭代协议,Python的内部工具(如:for循环,sum、min、max函数等)使用迭代器协议访问对象。

for循环

  1. for循环的本质就是遵循迭代器协议去访问对象,但for循环的对象不一定是可迭代对象
  2. 字符串、列表、元祖、字典、集合、文件对象,这些都不是可迭代对象,只不过在for循环时调用了他们内部的__iter__()方法,把他们变成了可迭代对象。然后for循环调用可迭代对象的__next__()方法去取值,而且for循环会捕捉stopiteration异常,以终止迭代
  3. for循环是基于迭代器协议提供了一个统一的可以遍历所有对象的方法(不仅序列类型可以使用,非序列类型,如:字典,集合,文件对象也可以使用)
 1 s = 'hello'
 2 # print(dir(s))
 3 # 字符串(不可迭代对象)有__iter__()方法
 4 # 遵循迭代器协议,生成可迭代对象liter_test
 5 liter_test = s.__iter__()
 6 print(liter_test)   # <str_iterator object at 0x0352E9F0>
 7 print(liter_test.__next__())    # h
 8 print(liter_test.__next__())    # e
 9 print(liter_test.__next__())    # l
10 print(liter_test.__next__())    # l
11 print(liter_test.__next__())    # o

1 # 集合
2 s = {1,2,3}
3 # 集合(不可迭代对象)有__iter__()方法
4 # 遵循迭代器协议,生成可迭代对象iter_s
5 iter_s = s.__iter__()
6 print(iter_s)       # <set_iterator object at 0x056CB260>
7 print(iter_s.__next__())    # 1
8 print(iter_s.__next__())    # 2
9 print(iter_s.__next__())    # 3

生成器

什么是生成器?可以理解为一种数据类型,自动实现了迭代器对象(其他的数据类型需要调用自己内置的__iter__方法,生成器不用,因为其下有__next__()方法或next()方法),所以生成器就是可迭代对象

生成器在Python中的表达形式?

生成器函数:常规函数定义,但是函数中包含yield,取代return,作为返回值;

      yield特性:可以返回值,多次yield,保存状态

生成器函数1 def t():
2     yield
3     yield 1
4     yield 3
5 g = t()
6 print(g)        # <generator object t at 0x04932CC0>
7 print(g.__next__())     # None
8 print(g.__next__())     # 1
9 print(g.__next__())     # 3

生成器表达式:

  1. 列表解析的中括号[]换成小括号()就是生成器表达式
  2. 列表解析和生成器表达式都是一种便利的编程方式,生成器更节省内存。
  3. Python不但使用迭代器协议,让for循环变得更加通用,大部分的内置函数,也是使用迭代器协议访问对象,例如:sum函数的Python的内置函数,该函数使用迭代器协议访问对象,而生成器实现了迭代器协议,所以我们可以直接计算以下一系列的和
1 print(sum(x**2 for x in range(4)))  # 14
2 # 而不用
3 print(sum([x**2 for x in range(4)]))    #14

生成器表达式
生成器表达式1 l = (i for i in range(10))
2 print(l)    # <generator object <genexpr> at 0x04ADBB10>
3 print(l.__next__())     # 0
4 print(next(l))          # 1
5 print(l.__next__())     # 2
6 print(next(l))          # 3
7 # ····

三元表达式

'true' if name == 'yuan' else 'false'
1 ################--三元表达式--####################
2 name = 'yuan'
3 res = 'true' if name == 'yuan' else 'false'
4 print(res)    # true
5     

列表解析

  中括号[]+三元表达式——>列表,很方便的生成列表,缺点:生成真实列表,数据量大时,消耗内存

  [ i for i in range(10) if i > 5]  三元表达式

 1 ################--列表解析--#######################
 2 egg_list = []
 3 for i in range(10):
 4     egg_list.append(i)
 5     # egg_list.append('鸡蛋%s'%i)
 6 print(egg_list) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
 7
 8
 9 l = [i for i in range(10)]
10 # l = ['鸡蛋%s'%i for i in range(10)]
11 print(l)    # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
12
13 # 三元表达式
14 li = [i for i in range(10) if i > 5]
15 print(li)   # [6, 7, 8, 9]

转载于:https://www.cnblogs.com/yuanlili/p/8650547.html

Python开发——函数【迭代器、生成器、三元表达式、列表解析】相关推荐

  1. python二十二:迭代,三元表达式,列表解析

    迭代器协议:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代(只能往后走,不能往前退)   可迭代对象:实现了迭代器协议的对象( ...

  2. 三元表达式列表解析生成器表达式

    三元表达式 列表解析 生成器表达式 三元表达式 在作简单的判断时,三元表达式能简化代码: def max(x, y):if x > y:return xelse:return y # 这个函数可 ...

  3. 4 三元表达式 列表解析 生成器表达式

    三元表达式 #!/usr/bin/env python3 # _*_ coding:utf-8 _*_ # @File : 三元表达式 # @Version : 1.0'''三元表达式能实现简单的 i ...

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

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

  5. Python入门之三元表达式\列表推导式\生成器表达式\递归匿名函数\内置函数

    本章目录: 一.三元表达式.列表推导式.生成器表达式 二.递归调用和二分法 三.匿名函数 四.内置函数 ================================================ ...

  6. python第四周迭代器生成器序列化面向过程递归

    第一节装饰器复习和知识储备------------ 第一节装饰器复习和知识储备------------ def wrapper(*args,**kwargs):index(*args,**kwargs ...

  7. Python中的三目运算符(三元表达式)

    Python中的三目运算符(三元表达式) 一般支持三目运算符的语言(如C语言)的语法格式一般是这样的: 判断条件(返回布尔值)?为真时的结果:为假时的结果 比如: x = x%2==1 ? x+1:x ...

  8. python自动化_day4_迭代器生成器内置函数和匿名函数

    什么是可迭代的 含有__iter__方法的就是可迭代的: python 可迭代对象--Iterable Python中经常使用for来对某个对象进行遍历,此时被遍历的这个对象就是可迭代对象, 像常见的 ...

  9. Python基础 day4 迭代器生成器 装饰器 Json pickle 数据序列化 软件目录结构规范 作业:ATM项目开发...

    本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 列表生成器 1.列表生成式,迭代器&生成器 列表生成式 孩子, ...

最新文章

  1. 东莞网络推广浅析网站优化中常见的引流方式有哪些?
  2. python多线程加锁异步处理装饰器
  3. 【Redis】16.Redis哨兵
  4. python并发编程4-线程
  5. 零基础学习次世代,3D游戏建模要美术基础吗?
  6. MSSQL 触发器 暂停 和 启动
  7. 电子城西区北扩规划一路道路工程_雁塔区电子城街道重点项目进度
  8. Oracle变量的定义、赋值及使用
  9. Mac Homebrew命令报错/usr/local/Homebrew/Library/Homebrew/version.rb:368:in `initialize’
  10. guzzle 封装api_Wuzzlist API与Guzzle的速成课程
  11. 【presto】presto 查询hive分桶表问题
  12. python matplotlib 基础练习:画一元二次函数
  13. 极客日报:iPhone13系列9月15日正式推出;微信视频号支持发布1小时视频;Firefox 92正式发布
  14. matlab中的向量除法
  15. Label 标签使用
  16. [整站源码]thinkphp古筝古琴书画培训类网站模板+前后端源码
  17. (附源码)ssm+mysql+基于ssm技术的校自助阅览室的设计与实现 毕业设计242326
  18. AI+药物研发:人工智能赋能新药研发
  19. 在MySQL命令行下如果输错了命令怎么办?
  20. PBlaze5 920系列特性——可变Sector Size管理(上)

热门文章

  1. cad抛物线曲线lisp_CAD如何画抛物线啊?
  2. Linux自建RustDesk中继服务器
  3. k8s节点重启后,该节点一直not ready
  4. 《MATLAB App Designer从入门到实践》随书源代码
  5. 高级域渗透技术之再谈Kerberoast攻击
  6. idr帧 i帧 p帧_GOP、IDR帧、I帧周期的关系
  7. 【AUTOSAR-COM】-10.3-接收的IPDU Callout(Com_RxIpduCallout)的使用小结
  8. 海天MA3200Ⅱ/1700卧式_节能注塑机
  9. Nand2Tetris Project1
  10. Windows10启用Administrator并设置任意密码(包括空密码)【解决Administrator默认没有Administrator权限的Windows默认鬼畜(有毒)设置】