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