7.2内容
迭代器
1,什么是迭代器:
迭代器指的是迭代取值的工具,迭代是一个重复的过程,每次重复都是基于上一次的结果而继续的,单纯的重复并不是迭代
count = 0
while count < 5:
print(count)
count +=1
这个就是一个迭代关系
?
2,为何要有迭代器:
l = [‘egon‘,‘liu‘,‘alex‘]
i = 0
while i < len(l):
print(l[i])
i +=1
上述迭代取值的方式只适用于又索引的数据类型:列表,字符串,元组
为了解决基于索引迭代器取值的局限性
python必须提供一种能够不依赖于索引的取值方式,这就是迭代器
?
可迭代的对象:但凡内置__iter__方法的都称之为可迭代对象
字符串,列表,字典,元组,集合,文件
?
调用可迭代对象下的__iter__方法会将其转换成迭代器对象
?
优点:
1,找到一种通用的迭代取值方案
2,惰性计算,节省内存
?
缺点:
1不能取指定的值,只能往后next
2,迭代器对象是一次性的:一个迭代器只能去一次
?
3,可迭代对象于迭代器对象详解
3.1:
可迭代对象(可以转换成迭代器的对象):内置有__iter__方法对象
可迭代对象.__iter__():得到可迭代对象
?
3.2
迭代器对象:内置有__next__方法并且内置有__iter__方法的对象
迭代器对象.__next__():得到迭代器的下一个值
迭代器对象.__iter__():得到迭代器本身,说白了调了和没调一样
?
for循环的工作原理:for循环可以称之为叫迭代器循环
d = {‘a‘:1,‘b‘:2,‘c‘:3}
?
1、__iter__()得到一个迭代器对象
2、迭代器对象.__next__()拿到一个返回值。然后将该返回值赋值给k
3、循环往复步骤2,知道抛出StopIteration异常for循环会捕捉异常然后结束循环
for k in d:
print(k)
?
?
?
生成器
yield 对比 return
相同点:都可以返回任意类型,任意个数的值
不同点:return只能返回值一次值,函数就立即结束
yield可以返回多个次值,yield可以暂停函数的运行
?
?
def func ():
print(‘aon‘)
yield 111
print(‘two‘)
yield 222
print(‘three‘)
yield
函数内但凡出现yield关键字,在调用函数不会立即执行函数体代码 ,而会返回一个生成器对象,生成器对象本质就是一个自定义的迭代器对象
g=func()
?
函数嵌套调用:函数递归
1,什么是函数递归
函数递归是函数嵌套的一种特殊格式
即在调用一个函数时,在其内部又调用了自己
递归应该分为两个阶段
1.1,回溯:一层一层的往下调用
1.2,递推:一层一层的往上退出结果
2,为什么要用函数递归
函数递归提供了一种基于函数实现的新的循环机制
?
age(n) = age(n-1)+10
?
def age(n):
if n == 1:
return
else:
return age(n-1)+10
?
?
def foo():
print(‘form foo‘)
foo()
foo()
例子1:
l = [11,[22,[33,[44,[55,[66,[77,[88,[99]]]]]]]]]
?
def func(l):
for item in l:
if type(item) is list:
func(item)
else:
print(item)
func(l)
?
例2:递归实现二分法
nums = [3,7,9,13,21,35,44,77,99]
find_num = 63
def search (nums,find_num):
print(nums)
if len(nums) == 0:
print(‘not exists‘)
return
mid = len(nums)//2
if find_num > nums[mid]
search(nums[mid+1:],fid_num)
找左边
search(nums[:mid],find_num)
elif find_num< nums[mid]
找右边
?
?
?
条件成立时的返回值 if 条件 else 条件不成立时的返回值
res = ‘ok‘ if ‘a‘ ! = ‘a‘ else ‘no‘
print(res)
生成式
匿名函数:lambda
匿名函数与内置函数配合使用·
max
?
min
?
sorted
?
filter
?
map
?
reduce
?
?
面向过程编程