函数的进阶

def func1():
    a1 = 1
    b2 = 2
    print(666)
func1()
# len()
print()

全局名称空间:存储的是全局(py文件)的变量与值的对应关系
临时(局部)名称空间:当函数执行时,会在内存中临时开辟一个空间,此空间记录函数中的变量与值的对应关系,随着函数的结束,临时名称空间而关闭。
python中的空间:
全局名称空间
临时(局部)名称空间
内置名称空间: len print 等内置函数等等。
print()
加载顺序: 内置名称空间 ---> 全局名称空间 ---> 函数执行时:临时(局部)名称空间


作用域:
全局作用域: 内置名称空间 全局名称空间
局部作用域:临时(局部)名称空间

取值顺序: 函数执行时:临时(局部)名称空间 ---> 全局名称空间 ----> 内置名称空间

# 取值顺序满足就近原则
len = 66
print(len)
a = 1
def func():
    a = 66
    def func1():
        a = 99
        print(a)
    func1()
func()

坑 (取值)
global nonlocal

局部只能引用全局的变量但是不能修改,修改就会报错
global
1可以修改全局变量
2在局部空间可以声明一个全局变量

# global第一个作用 可以修改全局变量
a = 1 def func(): global a #使用global引用全局变量a a=1 a += 1 print(a) func() # 2在局部空间可以声明一个全局变量
def func():
    global a
    a = 1
# print(a)
func()
print(a)
# nonlocal
# 1,不能操作全局变量
    # 1,不能操作全局变量
a = 2
def func():
    nonlocal a
    print(a)
func()

 

# 2,在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,并且引用的哪层,从那层及以下此变量全部发生改 变。

子名称空间只能引用父名称空间的变量,但是不能修改。
def func1():
    a = 1
    def inner():
        nonlocal a
        a += 1
        print(a)   # a=2
    print(a)    #a=1
    inner()
    print(a) #a=2
func1()

二、函数的嵌套
def func1():
    print(111)
    def func2():
        '''1万行代码'''
        print(222)
    print(333)
    func2()
    print(444)
func1()
# 结果:111 333 222 444
def func1():
    print(111)

def func2():
    print(222)
    func1()


def func3():
    func2()
    print(333)

func3()

三、函数名的运用

1、函数名可以作为普通变量用
def func1():
    print(111)
func1()

# 函数名(函数的内存地址) 特殊的变量
a = 1
b = a
print(b)    #结果出来的是1

print(func1)   #直接打印函数名,函数名对应的就是 函数的内存地址 它是一个特殊的变量
f1 = func1 
f2
= f1
# print(f2) 打印f2就是相当于执行print(func1)就是对应的函数的内存地址
f2()      # 相当于执行func1这个函数,所以结果出来的是111

2、函数名可以作为函数的参数

def func1():
    print(111)

def func2(x):   #x当做一个形参接收。 是func1这个函数名 
    print(x)   #所以打印的func1这个函数名的内存地址
    x()      #执行x()就相当于执行func1函数,所以结果出来的是111
func2(func1)
这就是变量名的交换,我把func1变量名传给了x,我打印x,然后让x执行,就相当于执行func1

3、函数名可以作为函数的返回值
这个有点难度了。
def func1():
    print(111)

def func2(x):
    return x    # 2、我的return x返回值返回给func2(func1) 就相当于返回给 ret,

ret = func2(func1)  # 1、此时我要执行func2这个函数了,然后我把func1传给了x。   3、ret=x  x=func1
ret()        # 4、相当于执行func1

4、函数名可以作为容器类数据类型的参数
a = 1
b = 2
c = 3
l1 = [a,b,c]
for i in l1:
    print(i)

故此我们可以这样:

def func1():
    print(111)

def func2():
    print(222)

def func3():
    print(333)

def func4():
    print(444)
l1 = [func1, func2, func3, func4]
for i in l1:
    i()

不仅如此,我们还可以这样,先写4个函数,然后把函数执行的序号和函数名放到字典中,使用while循环这个可以选择的序号,就可以执行相对应的函数。双击666:

def func1():
    print(111)

def func2():
    print(222)


def func3():
    print(333)


def func4():
    print(444)

dic = {
    1: func1,
    2: func2,
    3: func3,
    4: func4,
}
while 1:
    choice = int(input('请输入数字:'))
    dic[choice]()

 

 
原文地址:https://www.cnblogs.com/wangkaiok/p/9878687.html