三元表达式、递归、匿名函数

一:三元表达式

三元表达式仅应用于:
  条件成立返回一个值
  条件不成立返回一个值

三元表达式的实现形式:

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))

 

 

posted @ 2018-04-02 17:02  Leslie-x  阅读(160)  评论(0编辑  收藏  举报