函数对象、作用域

实例1:通过外部调取内部值
函数对象+作用域(打破函数调用层级,从外部调取内部函数的值)
#正常情况只能通过f1去调用里面函数inner()的值
def f1():
    def inner():
        print('from inner')
    inner()
f1()


#实现外部调取内部函数的输出值
#思路:先调用出内置函数物理地址,再通过物理地址() 再输出内置函数的值
def f1():
    def inner():
        print('from inner')
    return inner
x=f1()
print(x)   #这一步调用inner并输出inner物理地址,返回的是inner的物理地址<function f1.<locals>.inner at 0x05A5E7C8>
x()       #最后 通过物理地址加(),调取函数值

#进而可以实现在其他函数体中调取inner()函数
def bar():
    x()
bar()


实例2:银行转账

#正常的取款方式:
def qukuan():
    print('1:取款')

def zhuanzhang():
    print('2:转账')

def zhifu():
    print('3:支付')

def yuer():
    print('4:查询余额')
 
msg ='''
1.取款
2.转账
3.支付
4.查询余额
5.退出
'''

while True:
    print(msg)
    choice=input("请选择数字1,2,3,4:")
    if choice == '5':
        break
    elif choice == "1":
        qukuan()
    elif choice == "2":
        zhuanzhang()
    elif choice == "3":
        zhifu()
    elif choice == "4":
        yuer()
    else:
        print('none')
  


结合函数改进版:  
def withdraw():
    print('1:取款')

def transfer():
    print('2:转账')

def pay():
    print('3:支付')

def check_balance():
    print('4:查询余额')
def quit():
    print('5.退出')

operate={
    '1':withdraw,         #把函数名当成变量名去用,通过调用key值拿到每个功能的函数名,通过 函数名+() 取出输出结果
    '2':transfer,
    '3':pay,
    '4':check_balance,
    '5':quit

}

while True:
    msg = '''
    1.取款
    2.转账
    3.支付
    4.查询余额
    5.退出
    '''

    print(msg)
    choice=input("请选择数字1,2,3,4:")
    if choice == '5':break
    if choice not in operate:       #in对于字典来说判断的是key
        print('里面没有对应的功能,请重新选择')
        continue
    operate[choice]()     #operate[choice]取到的值是value指,即qukuan、zhuanzhang等等


#思路:
# if循环选择是重复性的操作,而且后面随着新需求的增加,还需要手动去增加很过条目,比较麻烦
# 考虑如何让用户的选择由原来手动的if一一对应1,2,3,4,5 ,改变成让系统自动去对应上每个功能的函数名,最后输出函数结果
#本质就是如何实现在外部调取函数名,从而实现用户的选择输入后,打印相应的函数体结果

猜你喜欢

转载自www.cnblogs.com/yangzhizong/p/9150637.html