• python3基础笔记(三)函数与全局、局部变量


    一、函数

     使用函数可以

    • 减少代码重用。
    • 保持一致性,容易维护。
    • 可扩展性。

      1.函数的定义方法:

    def function(x):
        x+=1
        return x
      • def:定义函数的关键字。
      • function:函数名。
      • 函数名后括号内的变量表示函数的参数(可以是0个或多个参数)
      • 冒号代表一个代码块的开始。
      • x+=1处是函数的代码块
      • return:函数的返回值,如果不写return默认返回None
        • 可以返回多个值(用逗号分割)python会吧这些值组成一个元祖返回。
        • 当函数遇到 return 时直接跳出函数。

      2.函数的参数

      • 函数在定义时的参数叫函数的形参。
      • 函数在调用时候的参数叫函数的实参。
      • 函数在定义时候不会分配内存空间,只有在调用时才会分配内存空间。

      3.位置参数和关键字

        关键字参数必须在所有位置参数之后。

    def function(a, b):
        print("a={0},b={1}".format(a, b))
        return a,b
    
    function(1,2)            #位置参数必须和函数的参数必须一一对应。缺一不可
    function(b=3, a=0)    #关键字参数    指定关键字赋值 顺序不需要一一对应。同样也缺一不可。
    

      输出:

    a=1,b=2
    a=0,b=3

      4.默认参数

    def function(a, b,c=100):
        print("a={0}, b={1}, c={2}".format(a, b, c))
        return a,b
    
    function(1,2)            #不指定默认参数 取默认值
    function(b=3, a=0)    #不指定默认参数 取默认值
    function(1, 2, 3)        #指定默认参数
    

      输出:

    a=1, b=2, c=100
    a=0, b=3, c=100
    a=1, b=2, c=3

        

      5.参数组(非固定长度参数)

      不定长参数:

        若传入一个列表,则吧列表也当做一个元素。

    def function(a,*args):
        print(a)
        print(args)
        return None
    
    function(1,2,3,4,5,76)
    function(1,[1,2,3,4,5])

      输出:

    1
    (2, 3, 4, 5, 76)
    1
    ([1, 2, 3, 4, 5],)

     


      若传入一个列表需要在列表前加一个*(星)

      例如:

    def function(a,*args):
        print(a)
        print(args)
        return None
    
    function(1,2,3,4,5,76)
    function(1,*[1,2,3,4,5])
    

      输出:

    1
    (2, 3, 4, 5, 76)
    1
    (1, 2, 3, 4, 5)

      

      不定长关键字:

    def function(a, **kwargs):
        print(a)
        print(kwargs)
        return None
    
    function(1, x=2, y=3)
    

      输出:

    1
    {'y': 3, 'x': 2}

      


      若传入一个字典需要在字典前加 **(两个星)

      例如:

    def function(a, **kwargs):
        print(a)
        print(kwargs)
        return None
    
    function(1, x=2, y=3)
    function(1,**{'one': 1, '2':2, 'name':'zjs'})
    

      输出:

    1
    {'x': 2, 'y': 3}
    1
    {'one': 1, 'name': 'zjs', '2': 2}

      6.函数的递归

      

    def function(n):
        if n == 1:
            return n
        else:
            s = n + function(n-1)
        return s
    
    res = function(4)
    print(res)
    

      

      该程序完成的功能是获得 n + (n-1) + (n-2) + ... + 1 相加的和

      程序执行流程如下:

    1.  函数执行到 第 8 行(res = function(4))时候执行 function 函数并传入参数 4
    2.  判断 4 是否等于 1 返回值为假 执行第 5 行
    3.  s = 4 + function(3) 调用函数 function 并传入参数 3
      1. 判断 3 是否等于 1 返回值为假执行第 5 行
      2. s = 3+function(2)调用函数 function 并传入参数 2
        1. 判断 2 是否等于 1 返回值为假执行第 5 行
        2. s = 2+function(1)调用函数 function 并传入参数 1
          1. 判断 1 是否等于 1 返回值为真执行 return 1 给调用者
        3. s = 2 + 1 然后执行 return s (s=3)给调用者
      3. s = 3 + 3 然后执行return s (s=6)给调用者
    4.  s = 4 + 6 然后执行return s (s=10)给调用者
    5.  res = 10
    6.  print(10)
    7.  函数结束。

       输出:

    10

      同理:当把n传入100时会得到结果5050


      7.lambda表达式(匿名函数):

      除了 def 语句用来定义函数之外,还可以使用匿名函数 lambda ,它是Python一种生成函数对象的表达式形式。匿名函数通常是创建了可以被调用的函数,它返回了函数,而并没有将这个函数命名。lambda有时被叫做匿名函数也就是这个原因,需要一个函数,又不想动脑筋去想名字,这就是匿名函数。

      lambda函数的语法只包含一个语句,如下:   

      

    lambda arg1,arg2,.....argn : expression
    

      lambda表达式没有 返回值 表达式本身就是一个返回值

    def func(a, b, c):
        return a + b + c
    print(func(1, 2, 3))
    # 返回值为6
    # lambda匿名函数
    f = lambda a, b, c: a + b + c
    print(f(1, 2, 3))
    # 返回结果为6
    

     注:

      冒号:之前的a,b,c表示它们是这个函数的参数。
      匿名函数不需要 return 来返回值,表达式本身结果就是返回值。


      8.高阶函数:

        以下两个条件满足其一就叫做高阶函数:

      • 函数的返回值返回值是一个函数名。
      • 函数的传入参数是一个函数名。

      


    二、全局变量与局部变量

      全局变量:作用域在全局的变量叫做全局变量,该变量在一个程序内的任何地方都可以被访问。(不在任何代码块内)

      局部变量:仅仅在代码块(函数)内可用,其他地方不能读取和使用。

      如果局部变量与全局变量重名:

      • 若无 global 关键字默认访问局部变量。
    v = "123"
    def function():
    
        v = "456"   #此处创建了新的变量(局部变量)
        print(v)
    
    function()
    print(v)

        输出:

    456
    123
      • 若有 global 关键字则访问全局变量。
    v = "123"
    def function():
        global v
        v = "456"   #此处修改了全局变量
        print(v)
    
    function()
    print(v)
    

        输出:

    456
    456

    如果全局变量是个列表或字典等可变类型变量:可以对内部元素进行操作。

    v = [1, 2, 3, "test"]
    def function():
        v[1] = "aaa"
        v.append(555)
        print(v)
    
    function()
    print(v)
    

      

      输出:

    [1, 'aaa', 3, 'test', 555]
    [1, 'aaa', 3, 'test', 555]

      但是:

    v = [1, 2, 3, "test"]
    def function():
        v = "aaa"       #相当于创建了一个新的变量v
        print(v)
    
    function()
    print(v)
    

      输出:

    aaa
    [1, 2, 3, 'test']

       如果是嵌套的函数:

    v = "aaa"
    def function():
        v = "bbb"       # 相当于创建了一个新的变量v
        print(v)
        def inner_function():
            v = "ccc"
            print(v)
        inner_function()
        print(v)
    function()
    print(v)
    

      

      输出:

    bbb
    ccc
    bbb
    aaa

      如果 inner_function 想调用 function 的局部变量 v 需要使用 nonlocal 关键字

    v = "aaa"
    def function():
        v = "bbb"       # 相当于创建了一个新的变量v
        print(v)
        def inner_function():
            nonlocal v  # 不创建新的变量 使用上一级函数的局部变量v
            v = "ccc"
            print(v)
        inner_function()
        print(v)
    function()
    print(v)
    

      输出:

    bbb
    ccc
    ccc
    aaa

      总结:

        当全局变量与局部变量重名时优先读取局部变量,能读取全局变量,无法对全局变量重新赋值
        但是对于可变类型,可以对内部元素进行操作
        如果函数中有 global 关键字,变量本质上就是全局的那个变量,可读取可赋值

    不成文规定:全局变量全部使用大写字母表示。

      

  • 相关阅读:
    深入了解Java ClassLoader、Bytecode 、ASM、cglib (I)
    如何在ant里import
    敏捷练习(1)评估我的生活方向盘
    你是一个合格的孩子吗?
    [转] C# 路径(目录)
    XML学习记录
    js学习总结不断更新(1)
    LINQ TO XML练习
    做技术,切不可沉湎于技术
    js学习总结持续更新(2)
  • 原文地址:https://www.cnblogs.com/zbuter/p/8711186.html
Copyright © 2020-2023  润新知