python函数之迭代器、生成器、函数递归、三元表达式和生成式

迭代器

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))

posted @ 2021-07-02 15:38  zhutianyu  阅读(71)  评论(0)    收藏  举报