【问题标题】:How to solve this Python problem using functions? [duplicate]如何使用函数解决这个 Python 问题? [复制]
【发布时间】:2019-03-01 16:37:14
【问题描述】:
import json

def get_stored_username():
    """Get stored username if available."""
    filename = 'username.json'
    try:
        with open(filename) as f_obj:
            username = json.load(f_obj)
    except FileNotFoundError:
        return None
    else:
        return username

def get_new_username():
    """Prompt for a new username."""
    username = input("What is your name? ")
    filename = 'username.json'
    with open(filename, 'w') as f_obj:
        json.dump(username, f_obj)
    return username

def greet_user():
    """Greet the user by name."""
    username = get_stored_username()
    if username:
        correct = input("Are you " + username + "? (y/n) ")
        if correct == 'y':
            print("Welcome back, " + username + "!")
            return

    # We got a username, but it's not correct.
    # Let's prompt for a new username.
    username = get_new_username()
    print("We'll remember you when you come back, " + username + "!")


greet_user()

上面代码中的函数greet_user()应该根据下面的文字重写:

唯一需要解决的是嵌套的if 语句。这可以通过将检查用户名是否正确的代码移动到单独的函数来清除。如果您喜欢这个练习,您可以尝试创建一个名为 check_username() 的新函数,看看是否可以从 greet_user() 中删除嵌套的 if 语句。

这是我试图解决这个问题的尝试:

def greet_user():
    """Greet the user by name."""
    username = get_stored_username()
    if username:
        check_username()
    username = get_new_username()
    print("We'll remember you when you come back, " + username + "!")

def check_username():
    correct = input("Are you " + username + "? (y/n) ")
    if correct == 'y':
        print("Welcome back, " + username + "!")
    username = get_new_username()
    print("We'll remember you when you come back, " + username + "!")

这是 IDLE 的输出:

Traceback (most recent call last):
  File "C:\Users\Documents\python_work\files and exceptions\JSON\remember_me.py", line 41, in <module>
    greet_user()
  File "C:\Users\Documents\python_work\files and exceptions\JSON\remember_me.py", line 29, in greet_user
    check_username()
  File "C:\Users\Documents\python_work\files and exceptions\JSON\remember_me.py", line 34, in check_username
    correct = input("Are you " + username + "? (y/n) ")
UnboundLocalError: local variable 'username' referenced before assignment

程序应该是这样工作的:

What is your name? eric
We'll remember you when you come back, eric!

Are you eric? (y/n) y
Welcome back, eric!

Are you eric? (y/n) n
What is your name? ever
We'll remember you when you come back, ever!

Are you ever? (y/n) y
Welcome back, ever!

【问题讨论】:

  • 我确实尝试过自己做。
  • 我的尝试已发布。
  • 预期输出是什么,当前输出是什么?
  • 由于您的问题不取决于读取文件,因此只需对该输入进行硬编码。除非您的问题直接涉及阅读输入,否则不应有任何手动输入:不要让我们进行多余的输入。
  • UnboundLocalError: local variable 'username' referenced before assignment - 了解scoping-rules

标签: python json python-3.x function pep


【解决方案1】:

您在该范围内没有变量 username。您在great_user 中有一个同名的局部变量,但您还没有将它传递给check_username。只需添加该参数/参数。

def greet_user():
    """Greet the user by name."""
    username = get_stored_username()
    if username:
        check_username(username)
    username = get_new_username()
    print("We'll remember you when you come back, " + username + "!")

def check_username(username):
    correct = input("Are you " + username + "? (y/n) ")
    if correct == 'y':
        print("Welcome back, " + username + "!")
    username = get_new_username()
    print("We'll remember you when you come back, " + username + "!")

另外,您的流量控制很不舒服。 check_username 应该只做这么多,返回其状态,并让新用户的注册保留已为此目的编写的函数。

【讨论】:

  • 用你的代码我得到这个输出:
  • Traceback (most recent call last): File "C:\Users\luka.ivankovic\Documents\python_work\files and exceptions\JSON\remember_me.py", line 41, in &lt;module&gt; greet_user('luka') TypeError: greet_user() takes 0 positional arguments but 1 was given
  • 我明白了。感谢您的宝贵时间。
猜你喜欢
  • 2021-07-06
  • 2021-10-14
  • 1970-01-01
  • 1970-01-01
  • 2020-06-12
  • 2019-02-08
  • 1970-01-01
  • 1970-01-01
  • 2021-02-24
相关资源
最近更新 更多