作用域
python中被赋值的变量的位置不同,限制了能访问到变量的范围也不同,换句话说就是“变量的作用域是由其在代码中的位置所决定的”。
1.LEGB规则
L(local):局部作用域,拿两层嵌套函数来说:内层函数定义的变量,其作用域就是局部作用域,只能由内层函数来使用,优先级最高。只有在调用内层函数时才会调用这种局部变量,所以是暂时存在的。
E(enclosing):嵌套作用域,拿两层嵌套函数来说:外层函数定义的变量,其作用域就是嵌套作用域。内外层函数都可以使用这种变量,常用于闭包。
G(globle):全局作用域,定义在函数之外的变量,模块中的函数都可以使用。
B(built-in):内置作用域,系统内置模块中的变量。
2.函数搜索变量范围的优先级是:局部作用域>嵌套作用域>全局作用域>内置作用域
简单举例说明:
#-*- coding:utf-8 -*-
a=10 #全局作用域
def test1():
b=20 #嵌套作用域
def test2():
c=30 #局部作用域
return(b-c)
print(test2())
test1()
高阶函数
函数作为参数传入的函数就是高阶函数。简单举例说明:
#-*- coding:utf-8 -*-
import sys
def my_print():
print("this is a test!")
def my_confirm(f):
confirm=input("是否继续yes/no:")
if confirm == 'yes':
f()
else:
print("即将退出!")
sys.exit()
my_confirm(my_print)
闭包
嵌套作用域的变量被内层函数调用就是闭包,简单举例说明:
#-*- coding:utf-8 -*-
def size1():
a=10 #嵌套作用域的变量
def inner1():
if a>5:
print("more!")
else:
print("less!")
return inner1 #指向了inner1函数的内存地址
size1()()
def size2(a=1): #变量作为外层函数参数传入
def inner2():
if a>5:
print("more!")
else:
print("less!")
return inner2
size2(20)()
转载于:https://blog.51cto.com/fengjicheng/2105079