三元表达式
三元表达式仅应用于:
1.条件成立返回一个值
2、条件不成立返回一个值。
若一般函数表达如下
比大小:
def max2(x,y): if x>y: returrn x else: return y res=max2(10,11) print(res)
若我们用三元表达式表达:
def max2(x,y): return x if x> y else y print(max2(10,11)
由此对比 三元表达式
就会比一般函数表达简单 不复杂, 由之前的几行代码 最后3行代码搞定
二、函数的递归:
函数的递归调用,即在函数调用的过程中,又直接或间接的调用了函数的本身
直接调用: def foo(): print(‘from foo‘) foo() foo() 直接调用 第一层结束foo(). 需要第2层代码块里的foo()结束,而第二层结束又需要冲洗调用foo()。。。。。以此类推 。。 死循环。 这个主要是讲 第一层结束 需要第二层给出结果, 第二层结束需要第三层给出结果, 直至给个结果出来 (结束回溯)才会重新反馈给上一层,然后由上一层的结果在返回给上上一层, 以此类推。直至调用的函数有了结果
间接调用 def bar(): print(‘from bar‘) foo() def foo(): print(‘from foo‘) bar() foo() 原理同上,调用foo() 在运行foo()代码块 需要调用bar()由bar ()的 结果来给到foo(),在运行bar()代码块时也会调用foo(), 由foo()的结果来给到bar(). 虽然这个也是一个死循环。但是能很清楚的讲述递归 含义
递归:
递归分为两个阶段:
1:回溯:
注意:一定要在满足某种条件结束回溯,否则的会无限递归
2、递推
总结:
1、递归一定要有一个明确的结束条件
2、每进入下一次递归,问题的规模都应该减少
3、在python中没有尾递归优化
完整的递推
age(5)=age(4)+2 age(4)=age(3)+2 age(3)=age(2)+2 age(2)=age(1)+2 age(1)=18 def age(n): if n ==1: return 18 return age(n-1)+2 age(5) print(age(5)) #打印结果 26
小练习
要求把列表里每个元素都打印出来 items=[1,[2,[3,[4,[5,[6,[7,[8,]]]]]]]] def tell(l): for item in l: if type(item) is not list: print(item) else: tell(item) tell(items)
匿名函数:
匿名函数:没有名字,一次性使用, 随时定义
有名函数:循环使用,保存了名字,通过名字就可以重复引用函数功能
强调:
1、匿名的目的就是要没有名字,给匿名函数赋给一个名字是没有意义的
2 、匿名函数的参数规则,作用域关系与有名函数是一样的
3、匿名函数的函数体通常应该是一个表达式,该表达时必须要有一个返回值
匿名函数(lambda)应用:lambda x:代码块 ,nums nums 是给前面的代码块赋值的
salaries={ ‘egon‘:3000, ‘alex‘:100000000, ‘wupeiqi‘:10000, ‘yuanhao‘:2000 } def get(k): return salaries[k] print(max(salaries,key=lambda x:salaries[x])) #key=lambda x:salaries[x] 这个是出薪资最高的那个人的名字 而不是字典里key 的名字按照字母顺序 比出高低 lambda x:salaries[x] 这就是一个匿名函数 比完就可以不用再用直接扔掉
print(min(salaries,key=lambda x:salaries[x]))
打印结果 yuanhao
与sorted连用 排序
salaries={ ‘egon‘:3000, ‘alex‘:100000000, ‘wupeiqi‘:10000, ‘yuanhao‘:2000 } salaries=sorted(salaries) print(salaries)#[‘alex‘, ‘egon‘, ‘wupeiqi‘, ‘yuanhao‘] #默认按照字典的键的大小排序,不是按照工资高低排序
salaries=sorted(salaries,key=lambda x:salaries[x])
print(salaries)
#[‘yuanhao‘, ‘egon‘, ‘wupeiqi‘, ‘alex‘] 这个是按照升序的方式排列
salaries=sorted(salaries,key=lambda x:salaries[x],reverse=True) #降序
# print(salaries) # 这个是按照降序的方式排列
###打印结果[‘alex‘, ‘wupeiqi‘, ‘egon‘, ‘yuanhao‘]
与map 连用 映射关系
求出下列列表元素的平方并组成个列表 nums=[1,2,3,4,5] res=map(lambda x:x**2,nums) print(list(res)) #打印结果 [1, 4, 9, 16, 25]
把下面所有人的名字户后面都加上‘_SB‘
names=[‘alex‘,‘wpeiqi‘,‘yuanhao‘] res=map(lambda x:x+‘_SB‘,names) print(list(res)) #打印结果 [‘alex_SB‘, ‘wpeiqi_SB‘, ‘yuanhao_SB‘]
下面名字中egon 后面加上_NB ,其他加_SB。这里要用到三元表达式与匿名函数的结合使用 names=[‘alex‘,‘wpeiqi‘,‘yuanhao‘,‘egon‘] res=map(lambda x:x+‘_NB‘ if x==‘egon‘ else x+‘_SB‘,names) print(list(res)) 打印结果[‘alex_SB‘, ‘wpeiqi_SB‘, ‘yuanhao_SB‘, ‘egon_NB‘]
reduce 合并,与 from functools import reduce 连用
from functools import reduce l=[‘my‘,‘name‘,‘is‘,‘alex‘,‘alex‘,‘is‘,‘sb‘] res=reduce(lambda x,y:x+‘ ‘+y,l) print(res) #打印结果 my name is alex alex is sb
filter 过滤
将名字中没有sb结尾的名字过滤掉
names = [‘ales_sb‘,‘wxx_sb‘,‘yxx_sb‘,‘egon‘] res=filter(lambda x:True if x.endswith(‘sb‘) else False,names ) print(list(res)) #打印结果 [‘ales_sb‘, ‘wxx_sb‘, ‘yxx_sb‘] 将egon 过滤掉
选出年龄超过30岁以上的年龄 ages=[18,19.25,33,50,99] res=filter(lambda x:x>30,ages) print(list(res)) #[33, 50, 99]
salaries ={ ‘egon‘:3000, ‘alex‘:100000000, ‘wupeiqi‘:10000, ‘yuanhao‘:2000 } res=filter(lambda k:salaries[k]>10000,salaries) print(list(res)) #打印结果# [‘alex‘]