三元表达式
三元表达式仅应用于:
1.条件成立返回一个值
2、条件不成立返回一个值。
若一般函数表达如下
比大小:
def max2(x,y):if x>y:
returrn xelse:returny
res=max2(10,11)
print(res)
若我们用三元表达式表达:
def max2(x,y):return x if x> y elsey
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)+2age(4)=age(3)+2age(3)=age(2)+2age(2)=age(1)+2age(1)=18def age(n):if n ==1:return 18
return age(n-1)+2age(5)
print(age(5))
#打印结果26
小练习
要求把列表里每个元素都打印出来
items=[1,[2,[3,[4,[5,[6,[7,[8,]]]]]]]]
def tell(l):for item inl:if type(item) isnot 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}
defget(k):returnsalaries[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 连用
fromfunctools import reduce
l=['my','name','is','alex','alex','is','sb']
res=reduce(lambda x,y:x+' '+y,l)
print(res)
#打印结果 my nameis alex alex is sb
filter 过滤
将名字中没有sb结尾的名字过滤掉
names = ['ales_sb','wxx_sb','yxx_sb','egon']
res=filter(lambda x:True if x.endswith('sb') elseFalse,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']
内置函数 表达方式都是 bytes()/ chr()/
bytes 把别的字符编码转成bytes 的字符编码
chr 就用在一个范围内的整数参数 返回一个对应的字符
divmod 返回的结果 除法取整 以及 余数, 要 给2个参数值。
enumerate 多用于for循环中 对于一个可迭代对象,enumerate 将其组成一个索引序列,利用他可以同时获得一个索引和值
eval 将字符串str当成有效的表达式来求值并返回计算借故偶
filter过滤 将所不需要的内容过滤掉
id查看内存地址
input 交互输入
iter 加可迭代对象,得到的是 一个生成器对象
len 统计长度
map 一一映射关系
max 求最大值
min 求最小值
ord 是chr()函数的配对函数,以一个字符串作为参数,返回对应的ascii数值
sorted 升序排序
pow(2,3,3) 里面要传3个参数 表达的意思为 2 的3次方 在除以3 最后取余 得出的结果为1个返回值。
reversed():反转,
round():四舍五入
slice():切片 可以给 slice()命名一个变量名, 可以给多个数据按照同一个切片要求取值
sum() 求和
zip 拉链
left='hello'right={'x':1,'y':2,'z':3}
res=zip(left,right)
print(list(res)) 拉链式的