• 01python 中的函数与函数式编程(python函数)


    一、函数的定义与调用

     
     
     
    11
     
     
    1
    def lenght(s):
    2
        l = 0
    3
        for i in s:            # 关于for 循环的基本用法是时候做一波总结了
    4
            l = l + 1
    5
        return l
    6
    
    
    7
    
    
    8
    a = 'ssssssss'
    9
    print(lenght(a))
    10
    
    
    11
    >>> 8
     
     

    # 1 函数的返回值

    1)return关键字的作用

      return 是一个关键字,这个词翻译过来就是“返回”,所以我们管写在return后面的值叫“返回值”,要研究返回值,我们还要知道返回值有几种情况:分别是没有返回值、返回一个值、返回多个值

    2)没有返回值

      不写return的情况下,会默认返回一个None:我们写的第一个函数,就没有写return,这就是没有返回值的一种情况。 


     
     
     
    12
     
     
     
     
     
    1
    def lenght(s):
    2
        l = 0
    3
        for i in s:            # 关于for 循环的基本用法是时候做一波总结了
    4
            l = l + 1
    5
        
    6
    
    
    7
    
    
    8
    a = 'ssssssss'
    9
    print(lenght(a))
    10
    
    
    11
    
    
    12
    >>> None
     
     
    3)只写return
    只写return,后面不写其他内容,也会返回None,有的同学会奇怪,既然没有要返回的值,完全可以不写return,为什么还要写个return呢?这里我们要说一下return的其他用法,就是一旦遇到return,结束整个函数

     
     
     
    12
     
     
     
     
     
    1
    def ret_demo():
    2
        print(111)
    3
        return
    4
        print(222)
    5
    
    
    6
    
    
    7
    ret = ret_demo()
    8
    print(ret)
    9
    
    
    10
    
    
    11
    >>>111
    12
       None
     
     
    4)返回一个值

          刚刚我们已经写过一个返回一个值的情况,只需在return后面写上要返回的内容即可。

    5)返回多个值

      可以返回任意多个、任意数据类型的值

     
     
     
     
    19
     
     
     
     
     
    1
    # return 返回多个值
    2
    def func():
    3
        return 1, 2, 3, 4
    4
    
    
    5
    func()
    6
    print(func())
    7
    
    
    8
    >>>(1, 2, 3, 4)        #返回值为一个元组
    9
    
    
    10
    
    
    11
    # 返回多个值的接收
    12
    def func():
    13
        return 1, 2, 3, 4
    14
    
    
    15
    
    
    16
    a, b, c, d = func()
    17
    print(a, b, c, d)
    18
    
    
    19
    >>>1  2  3  4
     
     
    总结下函数的返回    return
    1)当函数没有return时:在调用函数的时候返回None
    2)当函数return后面没有传参数时:调用函数时也返回None
    3)return可以以元组的形式返回多个数据


    # 2 函数的参数 

    1)形参与实参

     
     
     
    11
     
     
     
     
     
    1
    def lenght(s):      # 形参
    2
        L = 0
    3
        for i in s:     # 关于for 循环的基本用法是时候做一波总结了
    4
            L = L + 1
    5
        return L
    6
    
    
    7
    
    
    8
    a = 'ssssssss'
    9
    print(lenght(a))    # 实参
    10
    
    
    11
    >>> 8
     
     
    2)传递多个参数
     
     
     
    7
     
     
     
     
     
    1
    # 函数传递多个参数
    2
    def sum01(x, y):
    3
        return x if x > y else y        # 三元运算符
    4
    
    
    5
    print(sum01(1, 2))
    6
    
    
    7
    >>>2
     
     
    3)位置参数
        1、按照位置传参
        2、按照关键字传参

     
     
     
    11
     
     
     
     
     
    1
    def mymax(x,y):
    2
        #此时x = 20,y = 10
    3
        print(x,y)
    4
        the_max = x if x > y else y
    5
        return the_max
    6
    
    
    7
    ma = mymax(y = 10,x = 20)
    8
    print(ma)
    9
    
    
    10
    >>>20 10
    11
       20
     
     
        3、位置、关键字混着来

     
     
     
    11
     
     
     
     
     
    1
    def mymax(x,y):
    2
        #此时x = 20,y = 10
    3
        print(x,y)
    4
        the_max = x if x > y else y
    5
        return the_max
    6
    
    
    7
    ma = mymax(10,y = 20)
    8
    print(ma)
    9
    
    
    10
    >>>10 20
    11
       20
     
     
        4、默认参数

     
     
     
    10
     
     
     
     
     
    1
    def stu_info(name,sex = "male"):    # 形参
    2
        """打印学生信息函数,由于班中大部分学生都是男生,
    3
            所以设置默认参数sex的默认值为'male'
    4
        """
    5
        print(name,sex)
    6
    
    
    7
    stu_info('pontoon', 'female')      # 实参
    8
    >>> pontoon female
    9
    
    
    10
    
    
     
     
        5、动态传参(*args, **kwargs)
    面试题*args与**kwargs的区别?
      *args 用来将参数打包成tuple给函数体调用
      **kwargs 打包关键字参数成dict给函数体调用

     
     
     
    10
     
     
     
     
     
    1
    def sum_func(*args):
    2
        x = 0
    3
        for i in args:
    4
            x = i + x
    5
        return x
    6
    
    
    7
    
    
    8
    print(sum_func(1, 2, 3, 4))
    9
    
    
    10
    >>> 10
     
     
                                                           
    6、传递可变参数
    ------------------------------在函数中num = num+num与num += num是不一样的-------------------------------------------

     
     
     
    38
     
     
     
     
     
    1
    当函数接收到的参数是一个可变数据类型时,则会共享引用!
    2
    def mutable(num_list):
    3
        num_list.extend([1, 2, 3])
    4
        print(num_list)
    5
    
    
    6
    
    
    7
    gl_list = [5, 6, 7]                    # 接收一个列表        
    8
    mutable(gl_list)                       # 执行函数
    9
    print(gl_list)
    10
    
    
    11
    >>>[5, 6, 7, 1, 2, 3]
    12
    [5, 6, 7, 1, 2, 3]
    13
    
    
    14
    -----------------------------------------------------------------------------------
    15
    def demo(num, num_list):
    16
        print('函数内部代码')
    17
    
    
    18
        num += num
    19
        num_list += num_list               # 相当于执行num_list.extend(num_list)
    20
    
    
    21
        print(num)
    22
        print(num_list)
    23
        print('内部代码完成')
    24
    
    
    25
    
    
    26
    gl_num = 9
    27
    gl_list = [1, 2, 3]
    28
    demo(gl_num, gl_list)
    29
    print(gl_num)
    30
    print(gl_list)
    31
    
    
    32
    
    
    33
    >>>函数内部代码
    34
    18
    35
    [1, 2, 3, 1, 2, 3]
    36
    内部代码完成
    37
    9
    38
    [1, 2, 3, 1, 2, 3]
     
     
        7、顺序
     
    函数的执行顺序:
            位置参数,*args,默认参数,**kwargs

    二,命名空间和作用域

     

            三种命名空间之间的加载与取值顺序:        
        命名空间的本质:存放名字与值的绑定关系    

    加载顺序:内置命名空间(程序运行前加载)->全局命名空间(程序运行中:从上到下加载)->局部命名空间(程序运行中:调用时才加载)

    取值顺序:

      在局部调用:局部命名空间->全局命名空间->内置命名空间

      在全局调用:全局命名空间->内置命名空间

    综上所述,在找寻变量时,从小范围,一层一层到大范围去找寻。

            作用域        

    作用域就是作用范围,按照生效范围可以分为全局作用域和局部作用域。

    全局作用域:包含内置名称空间、全局名称空间,在整个文件的任意位置都能被引用、全局有效

    局部作用域:局部名称空间,只能在局部范围生效

    globals和locals方法

    看一段代码

     
     
     
    27
     
     
     
     
     
    1
    # 这个函数时会报错的
    2
    def sss():
    3
        a = 10
    4
        print(a)
    5
    
    
    6
    print(sss())
    7
    print(a)
    8
    
    
    9
    >>>10
    10
    NameError: name 'a' is not defined
    11
    
    
    12
    -----------------------------------------------------------------------------------
    13
    # 加上global关键字就不会了
    14
    a = 20
    15
    def sss():
    16
        global a
    17
        a = 10
    18
        print(a)
    19
    
    
    20
    print(a)
    21
    print(sss())
    22
    print(a)
    23
    
    
    24
    >>> 20        # 全局作用域的a
    25
        10        # 调用函数是函数局部打印的a
    26
        None      # 调用函数是由于没有返回值,所以返回None  
    27
        10        # global关键字,将局部变量转换成了全局变量
     
     

    函数的嵌套和作用域链

        函数的本质:是一个变量,变量可以作为函数的参数接收,变量也被函数返回,所以一个函数既可以接受函数也可以返回函数    
      函数的嵌套的本质:就是函数接收函数以及返回函数!

     
     
     
    35
     
     
     
     
     
    1
    # 函数之间的调用
    2
    def max_func(x, y):
    3
        return x if x > y else y
    4
    
    
    5
    
    
    6
    def max_func01(a, b, c, d):
    7
        ret1 = max_func(a, b)
    8
        ret2 = max_func(c, ret1)
    9
        ret3 = max_func(ret2, d)
    10
        return ret3
    11
    
    
    12
    
    
    13
    print(max_func01(10, 32, -45, 22))
    14
    
    
    15
    >>> 32
    16
    -------------------------------------------------------------------------------
    17
    
    
    18
    # 函数嵌套
    19
    def outer():
    20
        print('outer')
    21
    
    
    22
        def inner():
    23
            print('inner')
    24
        return inner
    25
    
    
    26
    print(outer())
    27
    
    
    28
    >>>outer
    29
     <function outer.<locals>.inner at 0x000000DBE7D73730>    # 只调用了一层函数,return的是一个函数名,所以print的时候打印出了地址
    30
    
    
    31
    print(outer()())    # 调用两层
    32
    
    
    33
    >>>outer
    34
    inner
    35
    None                # 内层的inner()函数没有返回值,所以print None
     
     
    函数的作用域链
    函数的作用域链的本质:就是内部函数可以引用外部函数的变量,包括外部函数的形参
    看三个例子
     1 # 函数嵌套的定义——内部函数可以使用外部函数的变量
     2 def outer():
     3     a = 1
     4 
     5     def inner():
     6         b = 2
     7         print(a)
     8         print("inner")
     9 
    10         def in_inner():
    11             print(a, b)
    12             print("in_inner")
    13         in_inner()
    14     inner()
    15 
    16 
    17 outer()
    18 
    19 >>>1
    20 inner
    21 1 2
    22 in_inner
     1 a = 1
     2 
     3 
     4 def outer():
     5     a = 1
     6 
     7     def inner():
     8         b = 2
     9         print(a)
    10         print("inner")
    11 
    12         def in_inner():
    13             global a
    14             a += 1
    15             print("in_inner")
    16         in_inner()
    17     inner()
    18     print('函数内部a:', a)
    19 
    20 
    21 outer()
    22 print("全局变量a:", a)
    23 
    24 >>>1
    25 inner
    26 in_inner
    27 函数内部a: 1
    28 全局变量a: 2
     1 a = 1
     2 
     3 
     4 def outer():
     5     a = 1
     6 
     7     def inner():
     8         a = 2
     9         print(a)
    10         print("inner")
    11 
    12         def in_inner():
    13             nonlocal a          # 不同于global只将a返回给上一级,不能返回给全局
    14             a += 1
    15             print("in_inner")
    16         in_inner()
    17         print("in_inner a:", a)
    18     inner()
    19     print('函数内部 a:', a)
    20 
    21 
    22 outer()
    23 print("全局变量 a:", a)
    24 
    25 >>> 2
    26 inner
    27 in_inner
    28 in_inner a: 3
    29 函数内部 a: 1
    30 全局变量 a: 1
     

    闭包

    什么叫做闭包?
    内部函数包含对外部作用域而非全局作用域名字的引用,该内部函数称之为闭包
    为什么要用到闭包?
    闭包的作用:当我们在调用完函数后,函数内部的变量都会被释放,但是使用了闭包函数,因为内部函数引用了外部函数的变量,所以外部函数的变量永远不会消失!所以闭包的作用就是储存内部函数的变量!

     
     
     
    x
     
     
     
     
     
    1
    # 创建一个简单的闭包函数
    2
    def outer():
    3
        a = 2
    4
    
    
    5
        def inner():
    6
            print(a)
    7
        return inner
    8
    
    
    9
    print(outer()())
    10
    
    
    11
    >>>2
    12
    None
     
     
    好吧至此python函数的概念就到此为止了。
  • 相关阅读:
    包建强的培训课程(6):Android App瘦身优化
    包建强的培训课程(14):Android与ReactNative
    包建强的培训课程(13):iOS与ReactNative
    包建强的培训课程(12):iOS深入学习(内存管理、Block和GCD等)
    包建强的培训课程(11):iOS Runtime实战
    Neo4j 第九篇:查询数据(Match)
    Neo4j 第八篇:投射和过滤
    Neo4j 第七篇:模式(Pattern)
    Neo4j 第六篇:Cypher语法
    Python 学习 第14篇:数据类型(元组和集合)
  • 原文地址:https://www.cnblogs.com/pontoon/p/10238248.html
Copyright © 2020-2023  润新知