一:迭代器
可迭代的对象(Iterable):在python中,但凡内置有__iter__方法的对象,都是可迭代的对象
迭代器(Iterator):迭代取值工具,可迭代的对象执行__iter__方法得到的返回值就是迭代器对象
可迭代的对象:str,list,tuple,dict,set,file(这些对象都是python内置的)
特点:
内置有__iter__方法的都叫可迭代的对象,执行该方法会拿到一个迭代器对象
迭代器:可以被next()函数调用并不断返回下一个值的对象;可迭代对象调用iter()方法后生成迭代器对象。
迭代器表示的是一个数据流;可以使用isinstance()函数来判断一个对象是否是Iterable/Iterator。
迭代器对象:文件对象本身就是迭代器对象
1、获取迭代器对象的方式:
执行可迭代对象的__iter__方法,拿到的返回值就是迭代器对象
迭代器对象执行__iter__方法,返回的是它本身
2、特点:
内置有__next__方法,执行该方法会拿到迭代器对象中的一个值
内置有__iter__方法,执行该方法会拿到迭代器本身
for循环原理分析:
1、for 循环称之为迭代器循环,in后跟的必须是可迭代的对象
2、for循环执行时会对in后面的对象使用__iter__方法,拿到对应的迭代器对象
3、然后调用迭代器对象的__next__方法,拿到一个返回值赋值给变量,执行一次循环体
4、周而复始,直到取完所有的值,for循环会检测到异常自动结束循环
二:生成器
在Python中,有种一边循环一边计算的机制,称为生成器:generator
两种实现生成器的方式:
1,使用生成器表达式:
#创建一个生成器,只需把列表生成式的[]改成()
a = (x * x for x in range(1,11))
print(a) #<generator object <genexpr> at 0x000002528FB61BF8>
#可以通过next()函数获得generator的下一个返回值
# print(next(a)) #1
# print(next(a)) #4
# print(next(a)) #9
#一般使用for循环来取值
for i in a:
print(i)
2,构造使用yield关键字返回值的函数:
函数内包含有yield关键字,调用函数时,不会执行函数体代码,而是拿到一个返回值,该返回值就是一个生成器对象
生成器本质上也是一个迭代器
def chicken():
print('=====>first')
yield 1
print('=====>sencond')
yield 2
print('=====>third')
yield 3
yield小结:
1、为我们提供了一种自定义迭代器的方式,可以在函数内用yield关键字,调用函数拿到的结果就是一个生成器,即也是一个迭代器
2、yield可以像return一样用于返回值,区别是return只能返回一次值,而yield可返回多次,因为yield可以保存函数执行的状态
#写一个生成器,即自定义一个迭代器
def my_range(start,end,step):
n = start
while n < end:
yield n #函数内有yield
n += step
for item in my_range(2,22,5):
print(item)
def send_food(name):
while True:
food = yield
print('%s is eating %s' %(name,food))
sf = send_food('mydog')
sf.__next__() #必须初始化一次,让函数停在yield的位置
sf.send('bond') #send有两方面的功能:1、给yield传值;2、同__next__的功能,每次取得迭代器中的一个值
三:面向过程编程
1,面向过程的编程思想
核心是'过程'二字,过程即解决问题的步骤,即先干什么,再干什么。。。。
基于面向过程编写程序就好比在设计一条流水线,是一种机械式的思维方式。
2,总结优缺点:
优点:复杂的问题流程化,进而简单化
缺点:修改一个阶段,其他阶段都有可能需要做出修改,牵一发而动全身,即扩展性极差
应用:用于扩展性要求低的场景