三元表达式,递归,匿名函数
回顾
1.迭代器
根据上一个结果,得到一个新的结果,即一个新的值
本质就是在帮你获取值,其目的就是为了统一取值的方式
一个数据类型要想被迭代器取值,必须支持迭代器
判断一个类型是否支持,就看其是否具备iter方法,只要具备的就称之为可迭代对象(iterable)
调用iter就能获取迭代器,后续通过调用迭代器的next方法就能获取到值
如此一来我们就可以通过统一的方式来操作各种数据类型,这样就有了for循环
for的本质就是在使用迭代器取值,所以for的后面只能跟可迭代的类型
2.生成器
产生数据的工具
生成器可以不断产生新的数据,并且同一时间在内存中只有一个数据,节省了内存开销
如何得到生成器
生成器本质是一个函数,但是其函数体中至少具备一个yield关键字
yield关键字的特点
调用存在yield的函数时,不会立即执行函数体,返回一个生成器
yield可以使得函数暂停执行
可以返回一个值给next的调用者
可以返回多次值
还能保存函数的执行状态
yield出现几次,就说明能产生几个数据,就能调用几次next
迭代器本质就是生成器
生成器是实现迭代器的基础,所以生成器也具备iter和next
3.面向过程编程思想
编程思想就是一种编程的方式方法
编程思想没有好坏之分,只有合适与不合适
其核心是过程,即做事情的具体步骤流程
优点:把一个复杂的问题简单化,流程化
缺点:扩展性极差
-------------------------------------------------------------------------------
三元表达式
符合python语法的表达方式称之为表达式
三元,三个元素
总体就是由三个元素组成的表达式
其目的就是为了简化书写,既然是简化必然就有局限性
三元表达式只能帮你简化仅有两个分支的if判断,并且这个判断无论成立与否必须返回一个值
递归
递归指的是一个函数在执行过程中直接或间接调用该函数本身
递归时可能会出现以下错误:
RecursionError: maximum recursion depth exceeded while calling a Python object
在调用函数时超出了最大递归深度
python为了防止递归太多导致内存溢出,所以给递归调用加上了深度(次数)限制,默认为1000
递归调用本质上就是在循环执行代码,与普通循环不同的是,函数调用会产生一系列内存开销,所以就会导致内存溢出,而循环没有这个问题
如此一来,则表示所有递归能做的事情,循环也可以做
在使用递归时要注意:
1.一定要在某个条件满足时结束循环调用
2.循环调用的次数不能超过系统的限制
3.每一次执行函数都应该使问题的规模减少,否则就是无用的循环
4.python中没有尾递归优化机制(使得递归调用时占用的开销更小)
在使用递归完成遍历所有元素(不知道有几层)时,可以发现,递归使用起来,代码量更少,并且代码结构更加清晰
什么时候该使用递归
你不知道到底要循环几次
递归之二分查找法
分半查找
原理:先将整体分为两半,然后取出中间的元素,与你要查找的目标进行比较,如果你要找的比中间值大,请走右边,
如果你要找的比中间值小,请走左边
1.先得到一个中间值,比较是不是你要找的,如果是则直接返回
2.如果不是,那就把列表拆为两半进行比较
3.如果你要找的比中间值大找右边,如果你要找的比中间值小找左边
匿名函数
匿名函数
匿名指的就是没有名字
其最明显的特点就是
有名字的值可以多次使用,多次访问
而没有名字的值,只能临时使用一次,用完就没了
匿名函数与有名函数的区别
关键字为lambda
参数不需要加括号,并且支持所有类型的参数
名称空间与作用域完全相同
函数体中不能写return,会自动将执行结果返回
函数体只能有一个表达式,且不能换行
匿名函数什么时候使用
当你的函数的函数体只有一行表达式时并且仅使用一次时就可以作为匿名函数
更多的是与内置函数联用,包括(max,min,sorted,map,filter,reduce)
map(映射)
map用于从一个可迭代对象中取出所有数据,进行一系列操作后,再放回新列表中
filter(过滤)
用于从一堆数据中过滤一些不满足条件的数据,提供一个函数,要求函数的返回值是bool类型,
True表示要保留,False表示要过滤掉
reduce (合并)
是把列表中的数据进行合并,每次传给你两个值


浙公网安备 33010602011771号