博客
关于我
python day10
阅读量:798 次
发布时间:2023-03-05

本文共 1535 字,大约阅读时间需要 5 分钟。

默认参数的陷阱

当默认参数的值是一个可变数据类型时,每次调用函数时,如果不传值就会共用这个数据类型的资源。这种行为可能导致不可预见的副作用,影响程序的正确性。


函数的命名空间

2.1 函数的进阶

命名空间和作用域:

  • 内置命名空间:由Python解释器一启动时加载的可用名称,例如 printinputlenlist 等。
  • 全局命名空间:程序从上到下执行时,依次加载到内存中的变量名和函数名。
  • 局部命名空间:函数内部定义的变量和函数名,调用函数时才产生,执行结束后消失。

作用域两种:

  • 全局作用域:包含内置和全局命名空间的变量,使用 globals() 查看。
  • 局部作用域:函数内的变量,使用 locals() 查看。

2.2 全局变量的使用

  • 对于不可变数据类型(如整数、字符串),局部可以查看全局变量,但不能修改。
  • 若要修改全局变量,需在程序开始时声明 global,如:
a = 1def func():    global a    a = 2func()print(a)

函数的嵌套和作用域链

3.1 函数嵌套的作用域

嵌套函数可以访问外部函数的局部变量,但不能修改其全局变量。例如:

def max(a, b):    return a if a > b else bdef the_max(x, y, z):    c = max(x, y)    return max(c, z)print(the_max(1, 2, 3))

3.2 非局部变量的使用

nonlocal 用于声明上层局部变量。例如:

a = 1def outer():    a = 1    def inner():        a = 2        def inner2():            nonlocal a  # 声明上层局部变量            a += 1        inner2()        print('##a## : ', a)    inner()    print('**a** : ', a)outer()print('全局 :', a)

结果:

##a## :  3**a** :  1全局 :  1

函数名的本质

函数名本质上是函数的内存地址,可以:

  • 被引用
  • def func():    print(123)f = funcprint(f)
    1. 作为容器元素
    2. def func():    print(123)def f2():    print('f2')l = [func, f2]print(l)for i in l:    i()
      1. 作为函数参数和返回值
      2. def f1():    print('f1')def f2():    print('f2')def f3():    print('f3')l = [f1, f2, f3]d = {'f1': f1, 'f2': f2, 'f3': f3}d['f2']()

        闭包

        闭包是嵌套函数,能够记住外部函数的变量。例如:

        def outer():    a = 1    def inner():        print(a)    inner()print(outer.__closure__)

        结果:

        (
        ,)

        闭包常用形式:

        def outer():    a = 1    def inner():        print(a)        return inner    return innerinner = outer()inner()

        通过以上内容,可以清晰理解函数命名空间、作用域、闭包等概念及其实际应用。

    转载地址:http://dtafk.baihongyu.com/

    你可能感兴趣的文章