1 什么是迭代器
迭代器就是用来迭代取值的工具
什么是迭代?
迭代就是一个重复的过程,但是每次重复都是基于上一次的结果进行的
# 单纯的重复不叫迭代
while True:
1+1
# 下面才是迭代的过程
count = 1
while count < 5:
print(count)
count += 1
2、为何要用迭代器
优点
(1) 找到一种通用的迭代取值方案->for循环
(2)惰性计算,节省内存
缺点:
1、不能取指定的值,只能往后next
2、迭代器对象是一次性的:一个迭代器对象值取干净了,不能继续取了
3、什么是可迭代对象
内置有__iter__方法的对象都是可迭代对象
"abc".__iter__()
[1, 2, 3].__iter__()
(1, 2, 3).__iter__()
{"x": 1, "y": 2}.__iter__()
{1, 2, 3, 4}.__iter__()
调用可迭代对象的__iter__()会得到一个返回值,该返回值是迭代器对象
4、什么是迭代器对象
可迭代对象执行obj.__iter__()得到的结果就是迭代器对象
而迭代器对象指的是即内置有__iter__又内置有__next__方法的对象
文件类型是迭代器对象:
open(‘a.txt‘).__iter__()
open(‘a.txt‘).__next__()
ps:迭代器对象一定是可迭代对象,而可迭代对象不一定是迭代器对象
5、如何用迭代器
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,这样太麻烦了,于是有了for循环
dic={‘a‘:1,‘b‘:2,‘c‘:3}
for k in dic:
print(dic[k])
for工作原理:
1、调用in后那个对象的__iter__方法,得到一个迭代器对象iter_names
2、x=next(iter_names),然后运行循环体代码
3、重复步骤2,直到取完值,抛出异常,for循环会帮我们捕捉异常结束循环
什么是生成器
只要函数内部包含有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>
ps:yield 对比 return
相同点:都可以返回任意类型、任意个数的值
不同点:return只能返回值一次值,函数就立即结束,yield可以返回多次值,yield可以暂停函数的运行
1、什么是函数递归
函数递归是函数嵌套调用的一种特殊格式,即在调用一个函数时,在其内部又调用了自己
递归应该分为两个阶段
1、回溯:回溯就是从外向里一层一层递归调用下去,回溯阶段必须要有一个明确地结束条件,
每进入下一次递归时,问题的规模都应该有所减少(否则,单纯地重复调用自身是毫无意义的)
2、递推: 递推就是从里向外一层一层结束递归
2、为何要用函数递归
函数递归提供了一种基于函数实现的新的循环机制
ps:python中的递归效率低且没有尾递归优化
3、递归实现二分法
想从一个按照从小到大排列的数字列表中找到指定的数字,
遍历的效率太低,用二分法(算法的一种,算法是解决问题的方法)可以极大低缩小问题规模
l=[1,2,10,30,33,99,101,200,301,311,402,403,500,900,1000] #从小到大排列的数字列表
def search(n,l):
print(l)
if len(l) == 0:
print(‘not exists‘)
return
mid_index=len(l) // 2
if n > l[mid_index]:
#in the right
l=l[mid_index+1:]
search(n,l)
elif n < l[mid_index]:
#in the left
l=l[:mid_index]
search(n,l)
else:
print(‘find it‘)
search(3,l)
def max2(x,y):
if x > y:
return x
else:
return y
res=max2(10,20)
print(res)
三元表达式就是把上述代码精简
代码格式:条件成立时的返回值 if 条件 else 条件不成立时的返回值
x = 10
y = 20
res = x if x > y else y
print(res)
列表生成式
l=[结果 for循环 条件]
print(l = ["ok" for i in range(10) if i > 3])
字典生成式
print({"k%s" %i:i for i in range(3)})
集合生成式
print({i for i in range(3)})
生成器表达式
print(i for i in range(5))
python函数之迭代器、生成器、函数递归、三元表达式和生成式
原文:https://www.cnblogs.com/zty78/p/14963537.html