实例详解python函数的对象、函数嵌套、名称空间和作用域
### Python函数的对象、函数嵌套、名称空间和作用域详解 #### 一、Python函数作为对象 在Python中,函数是一等公民,这意味着函数也是一种对象。我们可以像操作其他对象一样来操作函数,例如将函数赋值给变量、将函数作为参数传递给另一个函数或者将函数作为返回值。 ##### 1.1 函数对象的功能 - **引用**:我们可以将函数名赋值给一个变量,通过该变量来调用函数。 ```python def f1(): print('from f1') f = f1 # 将函数名f1赋值给f f() # 通过f调用函数 ``` - **作为参数传给一个函数**:函数可以作为参数传递给另一个函数。 ```python def f1(): print('from f1') def f2(a): return a f3 = f2(f1) f3() ``` - **作为函数的返回值**:函数可以作为另一个函数的返回值。 ```python def f1(): print('from f1') def f2(): return f1 f3 = f2() f3() ``` - **作为容器类型的元素**:函数可以被存储在列表、元组、字典等容器类型中。 ```python def f1(): print('from f1') l = [1, 2, 3, f1] l[3]() ``` #### 二、函数的嵌套 在Python中,可以在一个函数内部定义另一个函数,这就是所谓的函数嵌套。内部函数只能在其外部函数内部访问。 ##### 2.1 函数的嵌套定义 ```python def outer_function(x): def inner_function(y): return x + y return inner_function(2) outer_function(3) ``` ##### 2.2 函数的嵌套调用示例 下面的例子展示了如何根据不同的参数调用不同的内部函数。 ```python from math import pi def circle(r, action): if action == 'p': def perimeter(): return 2 * pi * r res = perimeter() elif action == 'a': def area(): return pi * r**2 res = area() else: return '' return res result = circle(2, 'p') print(result) # 输出圆的周长 ``` #### 三、名称空间与作用域 名称空间是指Python程序中变量名与其对应的值之间的映射。Python中有三种不同的名称空间: - **内置名称空间**:包含了Python解释器自带的名字,如`int`、`float`、`len`等。这些名字在解释器启动时就存在,并且在解释器关闭时消失。 - **全局名称空间**:除了内置名称空间之外的所有名字都属于全局名称空间,如自定义的变量名、函数名等。它们在模块首次执行时创建,在模块卸载时销毁。 - **局部名称空间**:当函数被调用时,它会创建一个新的局部名称空间来存储函数内部定义的变量。这些变量在函数退出后就被销毁。 ##### 3.1 查找顺序 当查找一个名字时,Python遵循以下顺序: - 首先查找局部名称空间中的变量。 - 如果没有找到,则查找全局名称空间。 - 最后查找内置名称空间。 #### 四、作用域 作用域指的是变量存在的区域,即变量可以被访问的范围。 - **全局作用域**:在模块级别定义的变量属于全局作用域。全局变量在整个模块内都是可访问的,也可以被其他模块引用。 - **局部作用域**:函数内部定义的变量仅在该函数内可见。 #### 五、全局与局部变量的交互 - **全局变量修改局部变量**:默认情况下,局部作用域不能修改全局作用域中的变量。如果需要修改全局变量,可以使用`global`关键字。 ```python x = 100 def f1(): global x x = 1 f1() print(x) # 输出1 ``` - **非局部变量**:对于嵌套函数来说,如果想要修改外层函数中的变量,可以使用`nonlocal`关键字。 ```python def f1(): x = 1 def f2(): nonlocal x x = 3 f2() print(x) # 输出3 f1() ``` #### 六、总结 本文深入介绍了Python中函数作为对象的应用、函数嵌套的概念、名称空间以及作用域的相关知识。通过这些概念的学习,我们可以更好地理解和利用Python的强大特性来编写高效且结构清晰的代码。希望本文能够帮助大家加深对这些知识点的理解。如果有任何疑问或需要进一步讨论的地方,请随时留言交流。
- 粉丝: 11
- 资源: 930
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助