函数对象+函数嵌套+闭包-练习

1、函数对象优化多分支if的代码练熟

def login():
    print("登录功能")

def register():
    print("注册功能")

def transfer_accounts():
    print("转账功能")

def check_banlance():
    print("查询功能")

def withdraw_deposit():
    print('提现')

def recharge():
    print('充值')

# func_dic = {
#     '0': ('退出', exit),
#     '1': ('登录', login),
#     '2': ('注册', register),
#     '3': ('转账', transfer_accounts),
#     '4': ('查询', check_banlance),
#     '5': ('提现', withdraw_deposit),
#     '6': ('充值', recharge),
# }

# 利用字典生成式生成
func_list = [
    ('退出', exit),
    ('登录', login),
    ('注册', register),
    ('转账', transfer_accounts),
    ('查询', check_banlance),
    ('提现', withdraw_deposit),
    ('充值', recharge)
]
func_dic = {key: value for key, value in zip(range(len(func_list)), func_list)}
# print(func_dic)

def run():
    while True:
        for key, value in func_dic.items():
            print(f'{key}:{value[0]}')
        cmd = input("输入命令编号>>:").strip()
        if not cmd.isdigit():
            print('请输入数字实现命令')
            continue
        if cmd not in func_dic:
            print("输入命令不存在")
            continue
        func_dic[cmd][1]()

2、编写计数器功能,要求调用一次在原有的基础上加一(订正)

"""
温馨提示:
    I:需要用到的知识点:闭包函数+nonlocal
    II:核心功能如下:
        def counter():
            x+=1
            return x
# 要求最终效果类似
        print(couter()) # 1
        print(couter()) # 2
        print(couter()) # 3
        print(couter()) # 4
        print(couter()) # 5
"""

"""
def outer(number):
    init_number = 0
    def counter():
        nonlocal init_number
        init_number = number + init_number
        return init_number
    return counter

counter = outer(1)  # 这里把counter局部的内存地址声明成全局, func_counter全局共享
print(counter())  # 1
print(counter())  # 2
print(counter())  # 3
print(counter())  # 4
print(counter())  # 5
"""
# 订正: 通过调用outer的参数number实现这种累加操作, 因为outer只需要调用传值一次, 接下来调用的都是counter这个函数.
# 要理解闭包函数只需要传值一次, 在调用以后会返回里面被包裹的函数的内存地址, 之后的计算都是在执行里面的函数. 闭包只是在调用传值阶段包给了内层函数所需要的一个固定的值.
def outer(number):
    # number = 0
    def counter():
        nonlocal number
        number += 1
        return number
    return counter

counter = outer(0)   # 注意: 理解闭包函数只需要包一次值给内层函数, 内层函数就可以基于这个包给它的值进行运算
print(counter())  # 1
print(counter())  # 2
print(counter())  # 3
print(counter())  # 4
print(counter())  # 5
posted @ 2020-03-20 19:37  给你加马桶唱疏通  阅读(143)  评论(0编辑  收藏  举报