Python 迭代器-生成器-面向过程编程
上节课复习:
1. 函数的递归调用
在调用一个函数的过程中又直接或者间接地调用了函数本身称之为函数的递归
函数的递归调用有两个明确的阶段:
1. 回溯
一层一层地调用本身
注意:
1.每一次调用问题的规模都必须有所减少
2.必须有一个明确的结束条件或者进入递归的条件
2. 递推
往回一层一层的推算出结果 2. 二分法 3.三元表达式
res=条件成立情况下的返回值 if条件 else条件不成立情况下的返回值
4.列表生成式
[for i in range(10) if i > 3]
5.字典生成式
(i:i for in in range(10) if i>3)
6.匿名函数
匿名函数的精髓在于没有名字,没有名字意味着只能调用一次就会被当做垃圾回收
lambda 参数1,参数2....:函数体代码 max([],key=lambda 参数1,参数2....:函数体代码)
理论性的知识:
1. 迭代器
1.什么是迭代器
迭代器指的是迭代取值的工具
迭代是一个重复的过程,每一次重复都是基于上一次的结果而来
#单纯的重复不是迭代
i=0
while True:
print(i)
#迭代:重复+每次重复都是基于上一次的结果而进行
l=['a','b','c']
i = 0
while i < len(l):
print(l[i])
i+=1
2.为何要用迭代器
迭代器提供了一种通用的且不依赖于索引的迭代取值方式 3.如何用迭代器
1.可迭代的对象iterable: 但凡内置有__iter__方法的对象都称之为可迭代的对象
可迭代的对象: str, list, tuple, dict, set, 文件对象
执行可迭代对象下的__iter__方法,返回的值就是一个迭代器对象iterator
dic={'x':1,'y':2,'z':3}
iter_dic=dic.__iter__()
print(iter_dic.__next__())
print(iter_dic.__next__())
print(iter_dic.__next__())
print(iter_dic.__next__())
2.迭代器对象
1.内置有__next__方法的对象,执行迭代器__next__方法可以不依赖索引取值
2.又内置有__iter__方法的对象,执行迭代器__iter__方法得到的仍然是迭代器本身
ps:
1.迭代器对象一定是可迭代的对象,而可迭代的对象却不一定是迭代器对象
2.文件对象本身就是一个迭代器对象 for本质应该称之为迭代器循环
工作原理
1.先调用in后面那个对象的__iter__方法,将其变成一个迭代器对象
2.调用next(迭代器),将得到的返回值赋值给变量名k
3.循环往复直到next(迭代器)抛出异常,for会自动捕捉异常然后结束循环
ps:从for角度,可以分辨出但凡可以被for循环循环取值的对象都是可迭代的对象
dic={'x':1,'y':2,'z':3}
for k in dic:
print(k)
3.迭代器总结
优点:
1.提供一种不依赖于索引的迭代取值方式
2.同一时刻在内存中只存在一个值,更节省内存
缺点:
1.取值不如按照索引的方式灵活,(不能取指定的某一个值,而且只能往后取)
2.无法预测迭代器的长度 2.生成器(自定义的一种迭代器)
大前提: 生成器就是一种自定义的迭代器,本质就是迭代器
但凡函数内包含yield关键字,调用函数不会执行函数体代码,会得到一个返回值,该返回值就是生成器对象
会触发函数的执行,直到碰到一个yield停下来,并且将yield后的值当做本次next的结果返回
了解: yield的表达式形式的应用 x=yield
def dog(name):
print('狗哥 %s 准备开吃' %name)
food_list=[]
while True:
food=yield food_list # food=yield='肉包子'
print('%s 吃了 %s' %(name,food))
food_list.append(food) g=dog('alex') # 强调:针对表达式形式的yield的使用,第一步必须让函数先暂停到一个yield的位置,才能进行传值操作
# next(g) # 张开狗嘴,让生成器先暂停到yield的位置,准备接收外部传进来的值
res1=next(g) #g.send(None)
# print(res1) res2=g.send('屎包子') # 1. 先为当前暂停位置的yield赋值 2. next(生成器)直到再次碰到一个yield停下来,然后其的值当做本次next的结果
# print(res2) res3=g.send('肉包子')
# print(res3) res4=g.send('泔水')
print(res4)
总结yield: 只能在函数内使用
1. yield提供了一种自定义迭代器的解决方案
2. yield可以保存函数的暂停的状态
3.yield对比return
1.相同点: 都可以返回值,值的类型与个数都没有限制
2.不同点: yield可以返回多次值,而return只能返回一次值函数就结束了 3. 面向过程编程:
核心是过程二字,过程指的就是解决问题的步骤,即先干什么再干什么后干什么....
基于该思想编写程序就好比在设计一条流水线,是一种机械式的思维方式
优点: 复杂的问题流程化,进而简单化
缺点: 可扩展性差 代码操作:
1. 生成器表达式 2. 内置函数:
abs() 取绝对值,负数变正数
all() 如果迭代器内所有值为真就返回True,否则为False(如果是空列表也为True)
any() 如果可迭代对象有一个值为真就返回True
bin() 返回一个整数 int 或者长整数 long int 的二进制表示
oct() 将一个整数转换成8进制字符串
hex() 将10进制整数转换成16进制,以字符串形式表示
bool() 除了0,空,None 为False,其他都为True
bytes() 转成bytes类型
callable() 判断是否为可调用函数,可调用返回True,不可调用返回False
chr() 以十进制对应ASCII码表返回出对应的字符
ord() 以字符对应ASCII码表返回出对应的十进制
dir() 查看一个对象.有哪些属性能够引用
divmod() 取几除以几返回(商,余)
enumerate() for循环中打印出来格式 索引,值
eval() 用来执行一个字符串表达式,并返回表达式的值
set() 可变集合
frozenset() 不可变集合
help() 用于查看函数或模块用途的详细说明
pow() pow(x,y,z) (x**y)%z x的y次方除以z取余
reversed() 函数返回一个反转的迭代器
round() 返回浮点数x的四舍五入值
slice() 主要用在切片操作函数里的参数传递
zip() 用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。
Python 迭代器-生成器-面向过程编程的更多相关文章
- day14 迭代器 生成器 面向过程思想
"" 迭代器 什么是迭代器(iterator) 器指的某种工具, 迭代指的是更新换代的过程,例如应用程序的版本更新从1.0 变成 1.1 再1.2 迭代的目的是要根据上一个结果,产 ...
- Python基础之面向过程编程
要求:在文件里递归找到关于包含“Python”内容的文件的绝对路径并打印出来 #定义阶段 import os,time def init(func): #装饰器的作用是使下面的生成器初始化,yield ...
- Python函数之面向过程编程
一.解释 面向过程:核心是过程二字,过程即解决问题的步骤,基于面向过程去设计程序就像是在设计,流水线式的编程思想,在设计程序时,需要把整个流程设计出来, 一条工业流水线,是一种机械式的思维方式 二.优 ...
- python基础之面向过程编程,模块
面向过程编程 面向过程的核心是过程,指的是解决问题的步骤,即先干什么再干什么,就好像设计一条流水线. 优点:复杂的问题流程化,进而简单化 缺点:可扩展性差,修改流水线的任意一个阶段,都会牵一发而动全身 ...
- 匿名函数 python内置方法(max/min/filter/map/sorted/reduce)面向过程编程
目录 函数进阶三 1. 匿名函数 1. 什么是匿名函数 2. 匿名函数的语法 3. 能和匿名函数联用的一些方法 2. python解释器内置方法 3. 异常处理 面向过程编程 函数进阶三 1. 匿名函 ...
- python函数:匿名函数、函数递归与二分法、面向过程编程
今天主要讲三大部分内容: 一.匿名函数二.函数递归与二分法三.面向过程编程 一.匿名函数: """ 1. 什么时匿名函数 def定义的是有名函数:特点是可以通过名字重复调 ...
- day22 yield的表达式的应用,面向过程编程,内置函数前几个
Python之路,Day10 = Python基础10 生成器表达式: (i for i in range(10) if i > 5)os.walk(r'文件路径')返回一个迭代器, 第一次ne ...
- PYTHON-匿名函数,递归与二分法,面向过程编程
"""匿名函数1 什么是匿名函数 def定义的是有名函数:特点是可以通过名字重复调用 def func(): #func=函数的内存地址 pass 匿名函数就是没有名字的 ...
- Python迭代器生成器与生成式
Python迭代器生成器与生成式 什么是迭代 迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果.每一次对过程的重复称为一次"迭代",而每一次迭代得到的结果会作为下一次迭 ...
随机推荐
- golang——关于for循环的学习
1.for循环的用法 (1)常规用法 func main() { slice := []int{1, 2, 3, 4, 5, 6} //方式1 for i := 0; i < len(slice ...
- Golang bash alias 自动配置GOPATH并运行项目
BASH代码: source ~/.bash_profile; export GOPATH=$GOPATH:`cd ..; pwd`; echo -e "* GOPATH: $GOPATH ...
- [TJOI2013]松鼠聚会
Description 有N个小松鼠,它们的家用一个点x,y表示,两个点的距离定义为:点(x,y)和它周围的8个点即上下左右四个点和对角的四个点,距离为1.现在N个松鼠要走到一个松鼠家去,求走过的最短 ...
- Permutation UVA - 11525(值域树状数组,树状数组区间第k大(离线),log方,log)(值域线段树第k大)
Permutation UVA - 11525 看康托展开 题目给出的式子(n=s[1]*(k-1)!+s[2]*(k-2)!+...+s[k]*0!)非常像逆康托展开(将n个数的所有排列按字典序排序 ...
- js中toFixed重写
在测试原生的toFixed发现,它在个浏览器上表现不一致,并且有些值在保留小数时得到的结果并不是想要,如在chrome下测试: 所以针对toFixed方法不准的问题,我们进行方法改造: 主要思路是:对 ...
- 总结用CoreText绘制文本时遇到的问题以及解决办法
关于CoreText不做解释.用的人自然知道这个是干什么的. 功能非常强大,可以绘制文本,图片等. 这次用的Xcode7.0的版本.所以之前很多方法,现在不能用.也不是不能用,就是有黄色警告很不爽. ...
- Python3 动手自己写谷歌翻译
本篇为实现谷歌翻译的功能,在编写的时候以为只是一个接口的问题. 没想到的是每次翻译都会触发一次JS的执行,在请求参数中生成一个tk. 文中tk的实现是复用的网上大神的代码生成tk. 好了,不说了直接看 ...
- RFTWEB测试对象抓取的方法
本文转自:http://feiyeguohai.iteye.com/blog/1468576 Rational Functional Tester (RFT) 作为 IBM 自己设计研发的自动化测试工 ...
- C#方法参数关键字
一.params关键字 prams告诉函数的调用者,该函数的参数数量是可变,如果调用函数的参数标识了params关键字,那么我们可以使用逗号分割的参数或者一个数组来作为参数: 1.这里只能是数组,Li ...
- 解剖嵌入式设备开发时以SD卡启动时SD卡的存储结构(以三星exynos4412为例)
目前面对高性能产品的嵌入式开发中,用SD卡来代替以往的JLINK显得备受大家喜欢,而且MCU厂家也对以SD卡启动的支持度越来越大,反而对JLINK不在那么重视(不过依旧保留着).一些以开发开发板的公司 ...