函数对象,名称空间,作用域

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

 

# 1.函数名可以被传递

# name = 'jason'

# x = name

# print(x)

# print(id(x))

# def func():

#     print('from func')

# # print(func)

# print(id(func))

# f = func

#

# func()

# print(f)

# f()  # 其实指向的也是函数func指向函数体代码的内存地址

 

 

 

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

# def func():

#     print('from func')

#

# def index(args):

#     print(args)

#     args()

#     print('from index')

# # index(1)

# index(func)

 

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

# def index():

#     print('index')

#

#

# def func():

#     print('func')

#     return index

# res = func()

# print(res)

# res()

 

 

 

 

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

 

# def func():

#     print('func')

# print(func())

# l = [1,2,func,func()]  # [1,2,<function func at 0x000001F7D79899D8>,None]

# print(l)

 

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

def register():

    username = input('username>>>:').strip()

    pwd = input('password>>>:').strip()

    print(username,pwd)

    print('register ...')

def login():

    print('login ...')

def transfer():

    print('transfer ...')

def shopping():

    print('shopping...')

def pay():

    print('pay ...')

 

msg = """

1 注册

2 登陆

3 转账

4 购物

5 支付

"""

func_dict = {

    '1':register,

    '2':login,

    '3':transfer,

    '4':shopping,

    '5':pay,

}

while True:

    print(msg)

    choice = input('请现在你想要执行的功能>>>:').strip()

    if choice in func_dict:

        func_dict.get(choice)()  # 函数名()

 

    # if choice == '1':

    #     register()

    # elif choice == '2':

    #     login()

    # elif choice == '3':

    #     transfer()

    # elif choice == '4':

    #     shopping()

    # elif choice == '5':

    #     pay()

    else:

        print('你输入的功能暂时没有')

# 在函数内部调用其他函数

# 可以将复杂的逻辑简单化

# def index():

#     func()

#     print('index')

#

# def func():

#     # index()

#     print('func')

# index()

 

 

def my_max(x,y):

    if x > y:

        return x

    return y

 

def my_max4(a,b,c,d):

    res1 = my_max(a,b)

    res2 = my_max(res1,c)

    res3 = my_max(res2,d)

    return res3

print(my_max4(1,2,10,4))

#函数的嵌套定义:

#函数内定义函数,应用场景
#一个函数
#该函数可以通过传参数的不同控制函数执行不同的功能

def all_func(type):
    def regiter():
        print('regiter')
    def login():
        print('login')
    def shopping():
        print('shopping')
    def pay():
        print('pay')

    if type == '1':
        regiter()

    elif type == '2':
        login()
    elif type == '3':
        shopping()
    elif type == '4':
        pay()
    else:
        print('没有你输入的功能')

all_func('2')

3.名称空间

# 名称空间是什么?

# 就是放名字的地方

# 详细解释:存放的是变量名与变量值的内存地址得绑定关系的地方

# 要想访问一个变量的值 必须先去名称空间中拿到对应的名字 才能够访问变量的值

 

# name = 'jason'

# print(name)

 

 

 

x = 1

 

if 1 ==1 :

    y = 2

 

# print(y)

# while True:

#     z = 3

for i in [1,2,3]:

    print(i)

print(i)

 

def func():

    username = 'jason'

print(x)

func()

 

 

名称空间的分类

    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

    

    

    

    生命周期:

        

        内置名称空间:只要python解释器已启动立马创建   关闭python解释器的时候内置名称空间自动销毁

        全局名称空间:只要你右键运行py文件会自动创建   py文件程序运行结束自动销毁 

        局部名称空间:函数被调用的时候自动创建  函数指向结束立即销毁(动态创建动态销毁)

 

名称空间的查找顺序

 

名字的查找 (******)

    1.需要先确定你当前在哪(大前提)

        1.站在全局:  全局 >>> 内置

        2.站在局部:  局部 >>> 全局 >>> 内置

 

 

 

# x = 111

# def f1():

#     x = 222

#     def f2():

#         x = 333

#         def f3():

#             # x = 444

#             def f4():

#                 # x = 555

#                 print(x)

#             x = 777  # 纯粹为了教学演示

#             f4()

#             x = 777  # 纯粹为了教学演示

#         f3()

#     f2()

# f1()

 

 

 

# def func():

#     x = 1

#     def index():

#         print(x)  # 获取全局找x

#     return index

#

# res = func()

# x = 999

# res()

 

 

函数在定义阶段查找名字的顺序就已经固定了 不会因为函数的调用位置变化而改变(******)

 

 

# x=111

# def outer():

#     def inner():

#         print('from inner',x)

#     return inner

# f=outer()

# x = 222

# f()

 

 

 

 

 

 

# x=111

# def outer():

#     def inner():

#         print('from inner',x)

#     return inner

# f=outer()

# def func():

#     x=333

#     f()

# func()

 

 

 

 

 

# x=111

# def outer():

#     def inner():

#         print('from inner',x)

#         x = 66666666

#     return inner

# f=outer()

# f()

#函数的作用域

# global 在函数内()局部,修改全局的变量

# nonlocal 局部修改局部

x = 1
y = 2
def func():
    global x,y
    x = 999
    y = 666
func()
print(x,y)


def func1():
    a = 1
    def func2():
        nonlocal a

        a = 2
    func2()
    print(a)

func1()

 

 

 

 

 

        

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

猜你喜欢

转载自www.cnblogs.com/chendaodeng/p/11184904.html
0条评论
添加一条新回复