如何修复一个高阶函数来模拟一个联合银行帐户?

2024-09-29 06:23:50 发布

您现在位置:Python中文网/ 问答频道 /正文

Q.

Suppose that our banking system requires the ability to make joint accounts. Define a function make_joint that takes three arguments.

  1. A password-protected withdraw function,

  2. The password with which that withdraw function was defined, and

  3. A new password that can also access the original account.

The make_joint function returns a withdraw function that provides additional access to the original account using either the new or old password. Both functions draw down the same balance. Incorrect passwords provided to either function will be stored and cause the functions to be locked after three wrong attempts.

Hint: The solution is short (less than 10 lines) and contains no string literals! The key is to call withdraw with the right password and interpret the result. You may assume that all failed attempts to withdraw will return some string (for incorrect passwords, locked accounts, or insufficient funds), while successful withdrawals will return a number.

Use type(value) == str to test if some value is a string:

解决方案

def make_withdraw(balance, password):
    """Return a password-protected withdraw function.

    >>> w = make_withdraw(100, 'hax0r')
    >>> w(25, 'hax0r')
    75
    >>> w(90, 'hax0r')
    'Insufficient funds'
    >>> w(25, 'hwat')
    'Incorrect password'
    >>> w(25, 'hax0r')
    50
    >>> w(75, 'a')
    'Incorrect password'
    >>> w(10, 'hax0r')
    40
    >>> w(20, 'n00b')
    'Incorrect password'
    >>> w(10, 'hax0r')
    "Your account is locked. Attempts: ['hwat', 'a', 'n00b']"
    >>> w(10, 'l33t')
    "Your account is locked. Attempts: ['hwat', 'a', 'n00b']"
    """
    incorrect_password_list = []
    count = 0
    def withdraw(amount, input_passwd):
        nonlocal count
        if count < 3:
            if input_passwd == password:
                nonlocal balance
                if  amount < balance:
                    balance -= amount
                    return balance          
                else:
                    return "Insufficient funds"
            else:
                nonlocal incorrect_password_list
                incorrect_password_list.append(input_passwd)
                count += 1              
                return "Incorrect password"
        else:
            return "Your account is locked. Attempts: ['{0}', '{1}', '{2}']".format(incorrect_password_list[0], incorrect_password_list[1], incorrect_password_list[2])
    return withdraw




def make_joint(withdraw, old_passwd, new_passwd):
    """
    >>> w = make_withdraw(100, 'hax0r')
    >>> w(25, 'hax0r')
    75
    >>> make_joint(w, 'my', 'secret')
    'Incorrect password'
    >>> j = make_joint(w, 'hax0r', 'secret')
    >>> w(25, 'secret')
    'Incorrect password'
    >>> j(25, 'secret')
    50
    >>> j(25, 'hax0r')
    25
    >>> j(100, 'secret')
    'Insufficient funds'
    """
    value = withdraw(0, old_passwd)
    if type(value) == str:
        return "Incorrect password"
    else:
        def joint_withdraw(balance, input_passwd):
            if (input_passwd ==  old_passwd) or (input_passwd ==  new_passwd):
                return withdraw(balance, old_passwd)
        return joint_withdraw

我的问题:

除了上述解决方案make_joint的docstring中提到的测试用例之外,下面的附加测试用例还没有通过,请提供一个修改make_joint的提示,以满足这些给定的附加测试用例(如下所示)。在

^{pr2}$

Tags: thetomakereturnthatisfunctionpassword
1条回答
网友
1楼 · 发布于 2024-09-29 06:23:50

我们只关注以下几行:

def joint_withdraw(balance, input_passwd):
    if (input_passwd ==  old_passwd) or (input_passwd ==  new_passwd):
        return withdraw(balance, old_passwd)

input_passwd既不是old_passwd也不是{}时会发生什么?你的函数give什么也不做,也不给出响应。在

请注意,您已经有了响应错误密码的代码。如何定义joint_withdraw来重用该功能?在

按照我所暗示的方式解决这个问题,您应该能够使j2(5, 'hax0r')工作。在

相关问题 更多 >