函数对象、函数对象嵌套调用、函数定义、名称空间与作用域以及名称空间的查找顺序

一、函数对象

函数是第一类对象:函数名指向的值可以被当中参数传递

1.1函数名可以被传递

指的是函数名可以被赋值给其他,加括号就可以调用

# name='wuxi'
# x=name
# print(x,id(x))
def func():
    print('from func')
print(func)#内存地址
print(id(func))
f = func
print(f)
f()#加()就可以调用函数
View Code

1.2.函数名可以被当做参数传递给其他函数

def func():
    print('from func')

def index(args):
    print(args)
    args()
    print('from index')
# index(1)
index(func)#指的是两个函数,一个函数调用另外一个函数,该函数内又有被调用函数的方法(加括号)
View Code

1.3.函数名可以被当做函数的返回值

def index():
    print('index')

def func():
    print('func')
    return index#当做返回值
res = func()
print(res)
res()
View Code

1.4.函数名可以被当做容器类型的参数

def func():
    print('func')
print(func())
l = [1,2,func,func()]  # [1,2,<function func at 0x000001F7D79899D8>,None]
print(l)
View Code

循环打印项目功能提示信息 供用户选择 用户选择谁就执行谁

msg="""1 注册 2 登录 3转账"""
def register():
    username=input('姓名').strip()
    pwd=input('密码').strip()
    print('注册完成')
def login():
    print('login...')
def transfer():
    print('transfer...')
l={
    '1':register,
    '2':login,
    '3':transfer
}
while True:
    print(msg)
    choice=input('请输入你想进行的功能:>>>').strip()
    if choice in l:
        l.get(choice)()
View Code

二、函数的嵌套

2.1函数的嵌套调用

嵌套调用:意思就是一个函数里面有另外一个函数。调用该函数就能调用里面那个函数

def max(x,y):
    if x > y:
        return x
    else :
        return y
def my_max(a,b,c,d):
    res=max(a,b)
    res2=max(res,c)
    res3=max(res2,d)
    return res3
print(my_max(1,2,32,4))
View Code

2.2函数的嵌套定义:

def f1():
    def f2():
        def f3():
            print('from f3')
        f3()
    f2()
f1()

三、名称空间和作用域

3.1什么是名称空间?

#名称空间:存放名称与值绑定关系的地方,三种名称空间,(之前遗留的问题x=1,1存放于内存中,那名
字x存放在哪里呢?名称空间正是存放名字x与1绑定关系的地方)

3.2名称空间的三种分类?

   1.内置名称空间:python解释器提前给你定义好的名字(已经存放到内置名称空间中了)
                len
                max
                min

    2.全局名称空间:文件级别的代码
                x = 1

                if 1 ==1 :
                    y = 2
                
                print(y)
                while True:
                    z = 3
                    
                x,y,z都会放到全局名称空间
                if for while 无论嵌套多少层 它们内部所创建的名字都是全局名称空间的
    3.局部名称空间:函数体内创建的名字都属于局部名称空间
            username
View Code

3.3名称空间的加载顺序?

python test.py
#1、python解释器先启动,因而首先加载的是:内置名称空间
#2、执行test.py文件,然后以文件为基础,加载全局名称空间
#3、在执行文件的过程中如果调用函数,则临时产生局部名称空间

3.4名字的查找顺序(总体方向)

局部名称空间--->全局名称空间--->内置名称空间
#需要注意的是:在全局无法查看局部的,在局部可以查看全局的,如下示例

3.5名称空间的生命周期?

内置名称空间:只要python解释器已启动立马创建   关闭python解释器的时候内置名称空间自动销毁
全局名称空间:只要你右键运行py文件会自动创建   py文件程序运行结束自动销毁 
局部名称空间:函数被调用的时候自动创建  函数指向结束立即销毁(动态创建动态销毁)
View Code

四、作用域

#1、作用域即范围
        - 全局范围(内置名称空间与全局名称空间属于该范围):全局存活,全局有效
      - 局部范围(局部名称空间属于该范围):临时存活,局部有效
#2、作用域关系是在函数定义阶段就已经固定的,与函数的调用位置无关,如下
x=1
def f1():
    def f2():
        print(x)
    return f2
x=100
def f3(func):
    x=2
    func()
x=10000
f3(f1())

 2.global、nonlocal

global在局部修改全局的不可变类型数据

x=12231
name='wuxi'
def func():
    global x,name
    x = 44444444
    name = 'qqqqqqqqq'
# func()
func()
print(x)
print(name)

nonlocal  局部修改局部

def func():
    x = 1
    def index():
        nonlocal x
        x = 2
        # print(x)
    index()
    print(x)
func()

global:局部修改全局 如果想修改多个 逗号隔开
nonlocal:局部修局部 如果想修改多个 逗号隔开

猜你喜欢

转载自www.cnblogs.com/ZDQ1/p/11164171.html