三元表达式、递归、匿名函数
一:三元表达式
三元表达式仅应用于:
条件成立返回一个值
条件不成立返回一个值
三元表达式的实现形式:
x = 10 y = 11 res = x if x > y else y print(res) def max2(x, y): return x if x > y else y res = max2(1, 10) print(res) def age(n): return 18 if n == 1 else age(n - 1) + 2 print(age(10))
二:函数的递归
在函数的调用中,间接或直接的调用了函数本身
def foo(): print("from foo") foo() foo() import sys print(sys.getrecursionlimit())#最大递归层级
递归分为两个阶段:
回溯阶段:一定要在满足某种条件结束回溯,否则会无限循环;
递归阶段
l = [1,[2,[3,[4,[5,[6,[7,[8,[9,[10]]]]]]]]]] def tell(l): for item in l: if type(item) is not list: print(item) else: tell(item) tell(l)
上述的函数如果通过索引取值的话,不知到什么时候会取到底,但是通过递归取值,就能很好的完成取值任务。
递归总结:
1:递归一定要有一个明确的结束条件。
2:递归每进入一次,问题的规模都应该减少。
3:在python中没有尾递归优化,递归次数过多会导致栈溢出。
三:匿名函数
有名函数和匿名函数的对比:
有名函数:循环使用,保存了函数名字,通过名字就可以重复引用函数功能
匿名函数:一次性使用,随时使用随时定义
def func(x,y,z=1): return x+y+z lambda x,y,z=1:x+y+z #与函数有相同的作用域,但是匿名意味着引用计数为0,使用一次就释放,除非让其有名字 func=lambda x,y,z=1:x+y+z func(1,2,3)
匿名的目的就是要没有名字,给匿名函数命名就失去了意义了,其参数规则、作用域关系和有名函数是一样的。匿名函数的函数体通常应该是一个表达式,该表达式必须要有一个返回值。
四:内置函数
注意:内置函数id()可以返回一个对象的身份,返回值为整数。这个整数通常对应与该对象在内存中的位置,但这与python的具体实现有关,不应该作为对身份的定义,即不够精准,最精准的还是以内存地址为准。is运算符用于比较两个对象的身份,等号比较两个对象的值,内置函数type()则返回一个对象的类型。
主要使用的内置函数
def get(k): return salaries[k] 匿名函数 print(max(salaries,key=lambda x:salaries[x])) print(sorted(salaries,key=lambda x:salaries[x])) print(sorted(salaries,key=lambda x:salaries[x],reverse=True)) map映射 nums = [1,2,3,4] res = map(lambda x:x**2,nums)#得到的是一个迭代器对象 print(list(res)) names = ["alex", "wupeiqi", "yuanhao", "egon"] res = map(lambda x: x+"_nb" if x == "egon" else x+"_sb", names) print(list(res)) reduce合并 from functools import reduce res = reduce(lambda x, y: x+y, range(1, 101), 0) print(res) name = ["my", "name", "is", "alex", "alex", "is", "sb", "sb"] res = reduce(lambda x, y: x+" "+y+" ", name) print(res) filter过滤,只过滤为True的值 names = ["alex_sb", "wupeiqi_sb", "yuanhao_sb", "egon"] res = filter(lambda x:x.endswith("sb"),names) print(list(res)) ages = [12, 13, 45, 67, 2, 334, 6, 787, 98, 9] res = filter(lambda x: x > 30, ages) print(list(res))
Ideal are like the stars --- we never reach them ,but like mariners , we chart our course by them