zoukankan      html  css  js  c++  java
  • 三元表达式、递归、匿名函数

    一:三元表达式

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

    三元表达式的实现形式:

    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))
  • 相关阅读:
    fopen
    C++ list的基本操作和使用
    lua调用有返回值的c++
    Duplicate methods named spliterator with the parameters () and () are inherited from the types Colle
    Android手机联网状态、GPS
    c风格字符串的标准库函数
    Filter in Servlet
    Annotation 注解
    container injection——容器技术
    windows上安装Maven与Gradle
  • 原文地址:https://www.cnblogs.com/li1992/p/8695266.html
Copyright © 2011-2022 走看看