python初识函数(3)
引言
今天继续深入python中的函数内容,在今后的编程中,我们会经常把一个功能写入函数中,这样能让代码更加清晰和有条理。

名称空间
所谓名称空间就是用于存放变量名与变量值绑定关系的内存空间。名称空间分为三种内置名称空间、全局名称空间、局部名称空间。内置名称空间是解释器提前给我们定义好的,python解释器运行产生,关闭销毁。全局名称空间是在代码运行时产生的变量名都会存放在全局名称空间中,py文件运行产生,结束销毁。局部名称空间是函数体代码执行过程中产生的变量名都放在局部名称空间,函数体代码执行产生,结束销毁。
名字的查找顺序
有这么多名称空间那么如果我要找的变量名在三个空间中都有,那我该先找哪一个呢,那就要看你所处的空间是在哪里。
- 如果在局部名称空间中,现在局部名称空间中查找没有再去全局最后才看内置空间。
- 如果在全局空间中,先在全局空间内查找没找到再去内置空间。
- 按照上面所讲明的,我们可以理解为只能从内往外。
- 多个局部名称空间之间如果不是嵌套的,那么互不干涉。
作用域
作用域是来解释名称空间能够作用的范围。
- 内置名称空间:程序任意阶段任意位置都可以使用
- 全局名称空间:程序任意阶段任意位置均可使用
- 局部名称空间:一般情况下只在各自局部名称空间中有效
注意:也可以通过一些手段打破规则

global和nonlocal关键字
global关键字:局部修改全局不可而变类型
# x = 111
# def index():
# # x = 222 # 并不是在修改全局的x 而是在局部名称空间中创建了一个新的x
# # 如果想要在局部名称空间中修改全局名称空间中的名字 那么需要使用关键字申明
# global x # 申明 修改的是全局x而不是产生新的x
# x = 666
# index()
# print(x)
l1 = [111, 222, 333]
def index():
l1.append(444)
index()
print(l1)
'''
想在局部修改全局不可变类型要用关键字global,修改全局可变类型不需要关键字。
'''
def index():
x = 111 # 在index的局部产生一个x=111
l1 = [11, 22, 33]
def f1():
# x = 222 # 在f1的局部产生一个x=222
# print(x)
# 局部名称空间嵌套 内层修改外层
# nonlocal x
# x = 333
l1.append(44)
f1()
print(x)
print(l1)
index()
'''
当处于局部名称空间嵌套的情况下,内存要修改外层不可变类型需要关键字nonlocal,修改可变类型不需要关键字。
'''
函数名的多种用法
- 函数名可以当做变量名来赋值
- 函数名可以当成函数的实参
- 函数名可以当做函数的返回值
- 函数名可以作为容器类型的元素
# Author:Jason
# def index():
# print('from function index')
# 用法1:函数名可以当做变量名赋值
# print(index)
# res = index # 让res也指向函数体代码
# print(res)
# res() # index()
# 用法2:函数名还可以当成函数的实参
# def index():
# print('from index')
# def func(a):
# print('from func')
# print(a)
# a()
# func(index)
# 用法3:函数名还可以当做函数的返回值
# def func():
# print('from func')
# return index # 将函数名当做返回值
# def index():
# print('from index')
# res = func() # res接收函数名
# print(res) # 指向的是index函数的内存地址
# res() # index()
# 用法4:函数名可以作为容器类型的元素
'''容器类型:内部可以存档多个元素的数据类型>>>:列表、元组、字典'''
# def index():
# print('from index')
# l1 = [11, 22, 33, 44, index]
# print(l1)
# l1[-1]() # index()
总结
在学习函数的初期可能会有点吃力,但是要记住在学习函数的时候 前期一定要细心 死咬概念 定义调用。并且函数的学习会让我们的代码逻辑更加清晰 更加便于维护。
