回顾:
函数的递归调用
函数在调用阶段间接或直接又调用了自己
递归:
回溯:重复的过程,但每次重复过程后下一次重复的过程的问题的复杂度会减低,最终要有一个结束条件。
递推:基于回溯的结果,一步一步往上推
二分法:
算法:高效率解决问题的方法
二分法必须基于一个有顺序的容器类型
判断某个值在不在容器里面
每次截取上一次容器类型一半进行比较
三元表达式:
结果一 if 条件 else 结果二
只有结果为2个可能性的情况下就可以用三元表达式
匿名函数
没有名字的函数
关键字lambda
lambda 形参:返回值
1.当场定义当场调用
(lambda 形参:返回值)()
2.给匿名命名
func = lanbda 形参:返回值
func()
3.匿名函数通常是配合其他函数一起使用的(内置函数,自定义函数)
常见的内置函数
max:内部基于for循环的,先一个一个将传入的容器类型的元素一个个取出,如果没有指定key(key对应着一个函数)那么就根据取出的元素一个个进行比较得出最大的值。如果指定了key,那么max会将元素交给这个函数,拿函数的返回值进行比较,但出来的结果还是传入的结果
min:同上,求出最小值
sum:求和
map:映射关系,一个个成对应map(匿名函数,容器对象)
filter:过滤
zip:拉链,也是一一对应,返回出来的是一个元祖
sorted:排序,里面可以指定rerverse=True可以使其反转,默认是False
reduce:是将多个值变成一个值,reduce(匿名函数,对象,默认值)不指定默认值的话那么就拿容器的第一和第二个进行比较
今日内容:
迭代器:
迭代:就是更新换代的过程,但迭代有个前提就是每次迭代都是基于上一次迭代的结果
所以说迭代器就是重复过程的工具
可迭代对象:
内置有__iter__方法的对象就是可迭代对象
迭代器对象:
内置有__iter__方法和__next__方法的就是迭代器对象
迭代器对象里面的调用__iter__方法得到的是自身,然后可迭代对象调用__iter__方法得到的结果就是迭代器对象
count =0
while count < 3:
print(111)
count+=1
这个就可以说是一个迭代器
迭代器对象调用__next__方法可以进行取值
迭代器对象一定是可迭代对象,但可迭代对象一定不是迭代器对象
迭代器优缺点:
优点:不依赖索引取值,减少内存空间,不会内存溢出
缺点:不能取出指定的元素,取完后会报错,需要try处理。
特点:只能依次往后进行取值,不能后退
迭代器的取值:
ls = [1,2,3,4]
iter_l = ls.__iter__() 生成一个迭代器对象
print(iter_l.__next__())进行取值
print(iter_l.__next__())
print(iter_l.__next__())
print(iter_l.__next__())
print(iter_l.__next__()) 如果已经去完了就会报错stopiteration
for 循环的本质:
for循环的in后面的跟着的是一个可迭代对象
for循环执行的步骤:
1.将in后面的可迭代对象执行__iter__方法转换成迭代器对象
2.调用__next__方法进行迭代取值
3.进行异常处理
生成器:
其本质上也是一个迭代器,但是一个自定义的迭代器。
其内部有yield的关键字
如果在函数内部有yield关键字,那么这个函数在函数名加括号调用的时候,不会执行其函数体代码,会将其转换成一个生成器,这也可以说是,生成器初始化,将函数变成一个迭代器
例子:
def func(): print('2222') yield print('33333') yield .......... res = func()生成器初始化
这样在res.__next__()就可以进行取值,但会返回一个None,yield后面可以跟值,yield后面跟的值,就是调用__next__()获取到的您可以得到的值。
yield后面可以跟多个值,返回的会打包成一个元祖。
另外yield会暂停函数的运行状态。
yield表达式:
yield支持外界传参 def dog(name): print('%s 准备开吃'%name) while True: food = yield print('%s 吃了 %s'%(name,food)) g = dog('owen') g.__next__() #必须将代码运行至yield才能够为其传值 然后用关键字send从外界为其传值 g.send('火腿') #给yield的左边变量传参,触发了__next__方法 g.send('大鸡腿')
yield总结:
1.能够将自定义的函数变成一个生成器,提供了一种自定义生成器的方式
2.yield能够将函数的运行状态给暂停住
3.能够支持外界给其传参,关键字send
4.yield可以有返回值
与return的异同点:
相同之处:都有返回值,并能够返回多个值
不同点:yield能够暂停函数的运行状态,并且yield可以返回多次值,但return只能返回一次值,并且立即结束函数。yield可以有外界进行传参
内置函数:
chr():是将数字转为ascill表对应的字符
ord():是将字符转为ascill表对应的数字
div():是返回当前对象名称空间的里面的可调用的名字
divmod()是分页器
callable()是可以判断是不是一个可调用(加括号可以执行其相应的功能)的对象
all()里面的对象只要有一个为False那么将为false
any()里面的对象只要有一个为true,那么就都为true
help()查看对象里面的注释内容
exec():字符串执行python代码,支持多行,并且只要是支持python语法的都能够被执行,并且会将执行代码过程中产生的名字放入某个名称空间里面
eval():字符串执行python代码,但不支持语法,只能做简单的表达式
isinterance判断对象是不是什么类型(object,类型)
str()转为字符串
int()转为整型
面向过程概念:
面向过程就是一条流水线式的写代码,就是先干这个在干那个,一步一步往下面走。
优点:就是将复杂的问题流程化,将其简单化了
缺点:可扩展性低,若果后期要加功能,那么的话又要重新来编辑,复用性低,维护性低。
建议是在写好不用去更改的场景下去使用面向过程,如linux的内核,就是写好后不用去更改的场景