1. 程式人生 > >函數對象、作用域

函數對象、作用域

back 內部 返回 轉賬 int str 輸出 true 操作

實例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 ,改變成讓系統自動去對應上每個功能的函數名,最後輸出函數結果
#本質就是如何實現在外部調取函數名,從而實現用戶的選擇輸入後,打印相應的函數體結果

函數對象、作用域