迭代器、生成器、面向过程编程(day4)
2018-01-02 09:52
357 查看
一、迭代器 1、迭代的概念 迭代器即迭代的工具,那什么是迭代呢? 迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值 while True: #只是单纯地重复,因而不是迭代 print('===>') l=[1,2,3] count=0 while count < len(l): #迭代 print(l[count]) count+=1 2、为何要有迭代器?什么是可迭代对象?什么是迭代器对象? 1)为何要有迭代器? 对于序列类型:字符串、列表、元组,我们可以使用索引的方式迭代取出其包含的元素。但对于字典、集合、文件等类型是没有索引的,若还想取出其内部包含的元素,则必须找出一种不依赖于索引的迭代方式,这就是迭代器 2)什么是可迭代对象? 可迭代对象指的是内置有__iter__方法的对象,即obj.__iter__,如下 'hello'.__iter__ (1,2,3).__iter__ [1,2,3].__iter__ {'a':1}.__iter__ {'a','b'}.__iter__ open('a.txt').__iter__ 3)什么是迭代器对象? 可迭代对象执行obj.__iter__()得到的结果就是迭代器对象 而迭代器对象指的是即内置有__iter__又内置有__next__方法的对象 PS:文件类型是迭代器对象 open('a.txt').__iter__() open('a.txt').__next__() 4)注意: 迭代器对象一定是可迭代对象,而可迭代对象不一定是迭代器对象 3、迭代器对象的使用 dic={'a':1,'b':2,'c':3} iter_dic=dic.__iter__() #得到迭代器对象,迭代器对象即有__iter__又有__next__ 但是:迭代器.__iter__()得到的仍然是迭代器本身 iter_dic.__iter__() is iter_dic #True print(iter_dic.__next__()) #等同于next(iter_dic) 一次取一个值 print(iter_dic.__next__()) #等同于next(iter_dic) print(iter_dic.__next__()) #等同于next(iter_dic) print(iter_dic.__next__()) #这次执行会抛出异常StopIteration,或者说结束标志 #有了迭代器,我们就可以不依赖索引迭代取值了 iter_dic=dic.__iter__() while 1: try: k=next(iter_dic) print(dic[k]) except StopIteration: break #这么写太丑陋了,需要我们自己捕捉异常,控制next,python这么牛逼,能不能帮我解决呢?能,请看for循环 4、for循环 基于for循环,我们可以完全不再依赖索引去取值了 dic={'a':1,'b':2,'c':3} for k in dic: print(dic[k]) for循环的工作原理 1:执行in后对象的dic.__iter__()方法,得到一个迭代器对象iter_dic 2: 执行next(iter_dic),将得到的值赋值给k,然后执行循环体代码 3: 重复过程2,直到捕捉到异常StopIteration,结束循环 5、迭代器的优缺点 优点: - 提供一种统一的、不依赖于索引的迭代方式 - 惰性计算,节省内存 缺点: - 无法获取长度(只有在next完毕才知道到底有几个值) - 一次性的,只能往后走,不能往前退 二、生成器 1、什么是生成器 只要函数内部包含有yield关键字,那么函数名()的到的结果就是生成器,并且不会执行函数内部代码 def func(): print('====>first') yield 1 print('====>second') yield 2 print('====>third') yield 3 print('====>end') g=func() print(g) #<generator object func at 0x0000000002184360> 2、生成器就是迭代器 g.__iter__ g.__next__ 生成器就是迭代器,因此可以这么取值 res=next(g) print(res) 3、协程函数 yield关键字的另外一种使用形式:表达式形式的yield def eat(name): print("%s ready to eat" %name) while True: food = yield print("%s eat %s" %(name,food)) e=eat('sb') e.send(None) #对于表达式形式的yield,在使用时,第一次必须传None,g.send(None)等同于next(g) e.send('面条') e.send('米饭') e.send('冒菜') 4、yield总结 yield为我们提供了一种自定义迭代器对象的方法 yield与return的区别1:yield可以返回多次值 2:函数暂停与再继续的状态是由yield帮我们保存的 三、面向过程编程 1、首先强调: 面向过程编程绝对不是用函数编程这么简单,面向过程是一种编程思路、思想,而编程思路是不依赖于具体的语言或语法的。言外之意是即使我们不依赖于函数,也可以基于面向过程的思想编写程序 2、定义 面向过程的核心是过程二字,过程指的是解决问题的步骤,即先干什么再干什么 基于面向过程设计程序就好比在设计一条流水线,是一种机械式的思维方式 3、优点:复杂的问题流程化,进而简单化 4、缺点:可扩展性差,修改流水线的任意一个阶段,都会牵一发而动全身 5、应用:扩展性要求不高的场景,典型案例如linux内核,git,httpd 6、举例 流水线1: 用户输入用户名、密码--->用户验证--->欢迎界面 流水线2: 用户输入sql--->sql解析--->执行功能 ps:函数的参数传入,是函数吃进去的食物,而函数return的返回值,是函数拉出来的结果 面向过程的思路就是,把程序的执行当做一串首尾相连的功能,该功能可以是函数的形式,然后一个函数吃,拉出的东西给另外一个函数吃,另外一个函数吃了再继续拉给下一个函数吃。。。
相关文章推荐
- python全栈开发-Day11 迭代器、生成器、面向过程编程
- 迭代器、生成器、面向过程编程
- python-迭代器、生成器、内置函数及面向过程编程
- python基础之生成器表达式形式、面向过程编程、内置函数部分
- Python开发基础-Day10生成器表达式形式、面向过程编程、内置函数部分
- DAY22 生成器表达式形式、面向过程编程、内置函数
- 面向过程编程、三元表达式、列表推导式与生成器表达式
- python基础----迭代器、生成器、协程函数及应用(面向过程实例)
- PHP中的面向对象和面向过程的编程方法
- 面向过程编程,面向对象编程和面向切面编程理解
- 面向过程编程、面向对象编程
- day4 迭代器 生成器 装饰器 递归
- 面向对象编程和面向过程编程的差异!
- Python--day4--迭代器-生成器-装饰器-目录
- 编程思想:面向对象和面向过程
- 刨根问底之面向过程编程 、面向对象编程、类、对象
- 【Python学习日记】面向过程 和 面向对象 编程
- 如何从普通程序员晋升为架构师 面向过程编程OP和面向编程OO
- 浅析两大类编程中五子棋,面向过程的设计思路
- [读书笔记] - <Essential C++> - 第二章: 面向过程的编程风格