三元表达式
其目的是为了简化书写,既然是简化就必然有局现性
三元表达式只能简化仅有两个分支的if判断,
a=1
b=2
m=a if a>b else b
print(m)
函数的递归调用
在调用一个函数的过程又直接或间接地调用函数本身,称之为函数的递归调用
递归必须满足两个条件:
1,每进入下一次递归,问题的规模都应该有所减少
2,必须有一个明确的结束条件
递归时出现以下错误
RecursionError: maximum recursion depth exceeded while calling a Python object 在调用函数是超出了最大递归深度 #系统默认次数是1000 import sys print(sys.getrecursionlimit()) >>>1000 ------------------------------------------- #可修改 import sys sys.getrecursionlimit(2000) >>>2000
小练习
用while循环和递归的方法把列表中的值取出来
l=[1,[2,[3,[4,[5,[6]]]]]]
用while循环把列表中的值取出来 l=[1,[2,[3,[4,[5,[6]]]]]] while True: tag=False for i in l: if type(i) == list: l = i tag=True else: print(i) if tag==False: break 用递归的方法取出来 l = [1, [2, [3, [4, [5, [6]]]]]] def func(li): for x in li: if type(x)is not list: print(x) else: func(x) func(l)
递归的使用案例:二分查找法
想从一个按照(从小到大)或(从大到小)排列的数字列表中找到指定的数字,遍历的效率太低,用二分法(算法的一种,算法是解决问题的方法)可以极大低缩小问题规模
匿名函数
1、匿名函数:就是没有名字的函数
2、为何要用:用于仅仅临时使用一次的场景,不需要重复利用
3、特点:
仅定义时使用一次,
参数没有括号,直接用冒号隔开,
函数体只能写在一行,不能换行
通常与内置函数联用(max、min、sorted、)
4、使用方法:一般都是与其他内置函数配合使用
单独使用格式:
lambda 参数1,参数2...: 函数体
与内置函数结合使用
salaries={
'egon':300000,
'alex':100000000,
'wupeiqi':10000,
'yuanhao':2000
}
salaries={ 'egon':300000, 'alex':100000000, 'wupeiqi':10000, 'yuanhao':2000 } res=max(salaries) print(res) 此时比的是key的值, --------------------------------------------------------------------- 可以通过max函数的key参数来改变max函数的比较依据,(此key并非key,value的key) 运行原理: max函数会“for循环”出一个值,然后将该值传给key指定的函数 调用key指定的函数,将拿到的返回值当作比较依据 max(salaries,key= ) -------------------------------------------------------------------- max与有名函数 def func(name): return salaries[name] res=max(salaries,key=func) #'egon' print(res) ------------------------------------------------------------------------- max与匿名函数 res=max(salaries,key=lambda name:salaries[name]) #'egon' print(res)
sorted排序,与匿名函数连用
salaries={
'egon':300000,
'alex':100000000,
'wupeiqi':10000,
'yuanhao':2000
}
res=sorted(salaries,key=lambda name:salaries[name])
res=sorted(salaries,key=lambda name:salaries[name],reverse=True)
print(res)
map映射:把一个列表按照我们自定义的映射规则映射成一个新的列表
names=['alex','lxx','wxx','yxx']
res=map(lambda name: name + "dSB", names)
print(list(res))
>>>>['alexdSB', 'lxxdSB', 'wxxdSB', 'yxxdSB']
zip:映射
l1 = [1,2,3,4,5] l2 = ["a","b","c","d"] print(list(zip(l1,l2))) #对应存为元组,当一方的值比另一方多时,也不会报错 >>[(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd')] l1 = [1,2,3,4,5] l2 = ["a","b","c","d"] l3 = [11,22,33] print(list(zip(l1,l2,l3))) >>[(1, 'a', 11), (2, 'b', 22), (3, 'c', 33)]
filter: 从一个列表中过滤出符合我们过滤规则的值
运行原理:相当于for循环取出每一个人名,然后传给匿名函数,将调用匿名函数返回值为True的那个人名给留下来
names=['alex_sb','lxx_sb','wxx_sb','egon','yxx']
res=filter(lambda name:name.endswith('sb'),names)
print(res)
print(list(res))
>>>> <filter object at 0x0000028CBDB23128>
>>>> ['alex_sb', 'lxx_sb', 'wxx_sb']
-----------------------------------------------------------------
普通方法实现此功能
# print([name for name in names if name.endswith('sb')])
reduce: 把多个值合并成一个结果
#from functools import reduce py3中,必须用它调用reduce from functools import reduce l=['a','b','c','d'] res=reduce(lambda x,y:x+y,l,'A') # 'A','a' => 'Aa' # 'Aa','b'=>'Aab' # 'Aab','c'=>'Aabc' # 'Aabc','d'=>'Aabcd' print(res) >>>>Aabcd --------------------------------------------------- from functools import reduce l=[1,2,3,4,5,6] res = reduce(lambda x,y:x+y,l) print(res) >>21
列表生成式
一个快速产生列表的表达式
优点:方便,改变了编程习惯,可称之为声明式编程
---------------------------------------------------------------- res=[i+1 for i in range(1,100)] print(res) ---------------------------------------------------------------- res=[i+1 for i in range(1,100)if i>50] print(res)
生成器表达式
把列表推导式的[]换成()就是生成器表达式
优点:省内存,一次只产生一个值在内存中
res=(i+1 for i in range(1,100)if i>50) print(res) >>>> <generator object <genexpr> at 0x0000020348A45468>
列表生成式与生成器表达式实际区分
#注意看print缩进 列表生成式 with open(r'E:\python代码\16\aaa.py',encoding='utf-8')as f: li=[len(i) for i in f] print(max(li)) >>>>58 --------------------------- with open(r'E:\python代码\16\aaa.py',encoding='utf-8')as f: li=[len(i) for i in f] print(max(li)) >>>>58 还有输出的原因,即使文件关闭了,文件中的内容存入列表,已经读入内存 ------------------------------------------------------------------------------- 生成器表达式 with open(r'E:\python代码\16\aaa.py',encoding='utf-8')as f: li=(len(i) for i in f) print(max(li)) >>>>58 with open(r'E:\python代码\16\aaa.py',encoding='utf-8')as f: li=(len(i) for i in f) print(max(li)) >>>>ValueError: I/O operation on closed file. 只有在调用__next__的时候才会去取值,此时I/O已经关闭