zoukankan      html  css  js  c++  java
  • python学习7—函数定义、参数、递归、作用域、匿名函数以及函数式编程

    python学习7—函数定义、参数、递归、作用域、匿名函数以及函数式编程

    1. 函数定义

    def test(x)
        # discription
        y = 2 * x
        return y

      返回一个值,则返回原本的object;  

      过程与函数的区别,过程无return返回值,但是python会自动赋予一个None返回值。

    def test(x)
        # discription
        y = 2 * x
        print(y)

      若返回多个值,python会将多个元素包装成一个元组,并返回。即实际上仍然只返回一个值。

      函数只要碰到第一个return就会结束调用。

    2. 传参数的方法

      位置参数,一一对应

      关键字参数,不须一一对应

    test(x=5)

      混用位置参数与关键字参数时,位置参数必须位于关键字参数前面,且同一个形参不能传多个值。

    3. 参数组

      可变长短的参数,*args,**kwargs

      *的作用就是for循环取参数

    def test(x,*args)
        print(x)
        print(args[1])
    
    test(1,2,3,4,5,6)
    test(1,[2,3,4,5])  #传入整个列表作为一个整体
    test(1,*[2,3,4,5])  #传入列表中的单个元素

      **kwargs处理键值对,字典

    def test(x,**kwargs)
        print(x)
        print(kwargs)
    
    test(1,y=2,z=3)

      连起来用,*args必须位于**kwargs前面

    def test(x,*args,**kwargs)
        print(x)
        print(args)
        print(kwargs)
    
    test(1,2,3,5,66,y=2,z=3)
    test(1,*[1,1,2,3],**{'y':1})

     4. 默认参数

      如果定义函数时指定了默认参数,则在调用时可指定该参数,也可忽略该参数。

    def test(x,y,z=2):
        print(x,y,z)
    
    test(1,2)
    
    test(1,2,5)

    5. 递归函数

      递归类似函数递推公式:

    # recursion
    def calc(n):
        print(n)
        if int(n/2) == 0:
            return n
        else:
            return calc(int(n/2))
    
    calc(10)

      函数递归调用过程如下图所示,递归函数重复调用自身,相当于重复调用子函数,当最终嗲用结束时,最内层的子函数返回值逐层返回给各个子函数

     6. 函数作用域

      一个函数在调用时,不管在哪里调用,都只与该函数在定义时有关系。嵌套定义的函数必须从外层到内层逐层调用,不可只运行嵌套定义的子函数。

    def foo():
        name = 'abc'
        def bar():
            name = 'xyz'
            print(name)
            def tt():
                print(name)
            return tt
        return bar
    
    print(foo()()())

    7. 匿名函数

      匿名函数使用lambda关键词定义,需将lambda赋值给一个变量才能调用该匿名函数,lambda会自动将冒号后面的内容return返回给函数句柄。

    # the next two functions are of the same function
    # first
    def calc(x):
        return x+1
    # second
    func = lambda x:x+1
    # lambda(10) is wrong
    print(func(10))
    1. lambda匿名函数的定义相当于一个值,如果不赋值给一个变量,则此匿名函数会在定义后在内存里立即被释放
    2. lambda函数不能返回复杂逻辑,只能返回一行,一个确定的最终的结果
    3. 若需要返回多个值,则需要手动组成一个元组,这里与用def定义的函数不同
    lambda x,y,z:(x+1,y+1,z+1)

     8. 编程风格(方法论)

    1. 面向过程编程
    2. 函数式编程
      1. 不用变量保存状态,不修改变量
      2. 函数即变量地址
      3. 高阶函数:函数接收的参数是函数名,或函数的返回值中包含函数
      4. 尾调用优化:函数在最后一步调用另一个函数
    3. 面向对象编程
  • 相关阅读:
    1509 加长棒
    51Nod 1158 全是1的最大子矩阵
    P2953 [USACO09OPEN]牛的数字游戏Cow Digit Game
    P3384 【模板】树链剖分
    北京集训DAY3
    北京集训DAY2
    北京集训DAY1
    51Nod 1422 沙拉酱前缀 二分查找
    51Nod 1109 01组成的N的倍数
    51Nod 1043 幸运号码 数位DP
  • 原文地址:https://www.cnblogs.com/yangjingxuan/p/11678942.html
Copyright © 2011-2022 走看看