函数作用域

函数的定义:
Python 定义一个函数使用 def 关键字,语法形式如下:
def <函数名>(<参数列表>):
<函数体>
return <返回值列表>

参数:
定义函数时 () 里的参数叫形参(形式参数),它只是一个变量名,供函数体中的代码调用。
函数调用时,传入 () 里的参数叫实参(实际参数),它是实际的数据,会传递给形参,供函数体执行。
在定义函数时,如果要求调用者必须传递实参给这个形参,它就是必须参数。
直接定义在函数名后的 () 中的形参就是必须参数。
调用时必须传递实参给必须参数,否则报错

在定义函数时,某些形参有可能在调用时不用接收实参,这种情况可以定义为默认参数。
在函数名后 () 中,以 参数名=默认值 的形式定义的形参就是必须参数。
注意:默认参数必须定义在必须参数的后面

在函数名后的 () 中,在形参前加 * 号可以定义位置不定参,通常它会定义为 *args。
它用来接收函数调用时,以位置参数传递过来的超过形参数量的多余的实参。
注意:不订参必须定义在默认参数后面
位置不定参数会将所有多余的位置实参创建成元组

在函数名后的 () 中,在形参前加 ** 号可以定义关键字不定参,通常它会定义为 kwargs。
它用来接收函数调用时,以关键字参数传递过来的超过形参数量的多余的实参。
注意:不订参必须定义在默认参数后面
关键字不定参数会将所有多余的关键字实参创建成
字典**

在传递实参时,可以通过 * 对迭代对象进行解包。
def fun(a,b,arg):
print(a,b,arg)
ls = [1,2,3,4,5,6]
fun(
ls)

在传递实参时,可以通过 ** 对字典对象进行解包。
def fun(a,b, kwargs):
print(a,b,kwargs)
d = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
fun(
d)

返回值
函数还有一个很重要的功能就是返回结果。
python 中使用 return 关键字来退出函数,返回到函数被调用的地方继续往下执行。
return 可以将 0 个,1 个,多个函数运算完的结果返回给函数被调用处的变量。
函数可以没有返回值,也就是说函数中可以没有 return 语句,这时函数返回 None,例如上面我们定义的那些函数。
return 会将多个返回值以元组的形式返回。

函数作用域:
python 是解释型编程语言,解释器在运行一个 python 程序时会在计算机内存中申请一块内存用来运行这个程序。全局变量在这块内存空间中都可以被访问和修改。定义在函数里,的变量就是局部变量,它只在它定义的函数里起作用,一旦函数执行完毕它就不存在了

Python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的。
变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称。Python的作用域一共有4中,分别是:
L (Local) 局部作用域
E (Enclosing) 闭包函数外的函数中
G (Global) 全局作用域
B (Built-in) 内建作用域
全局作用域:包含内置名称空间、全局名称空间,在整个文件的任意位置都能被引用、全局有效
局部作用域:局部名称空间,只能在局部范围内生效
以 L –> E –> G –>B 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内建中找。

直接定义在函数外的变量就是全局变量,在程序运行的全过程有效。
有时候需要在函数内部修改全局变量。
使用 globals 关键字可以在函数内部修改全局变量
a = 1
def d():
a += 2
print(a)

d()
此时调用函数会报错,会在函数内部找a的值然后加1赋值给a,但是在函数内部没有定义a,而且函数内部不能修改全局变量a
有两种办法,加一句global a,就可以在函数内部修改全局变量,第二种就是在内部定义一个变量a,加一句a = 0;

g_count = 0
def outer():
global g_count
g_count = 2 如果没有global g_count这句,这个变量与上面那个全局的变量是两个不同的变量
print(g_count)
c = 12 局部变量
def inner():
nonlocal c 内部函数 修改函数外的局部变量
c = 23
a = 11 本地作用域
inner()
outer()

使用nonlocal和global关键字:
1.外部必须有这个变量
2.在内部函数声明nonlocal变量之前不能再出现同名变量

posted @ 2020-10-31 18:23  shero2020  阅读(104)  评论(0编辑  收藏  举报