英文:
Def is repeating when variables are called outside function
问题
I am trying to allow a user to first select if they want to define their name, then outputting either their chosen name or a randomly selected name.
我正在尝试允许用户首先选择是否要定义他们的名字,然后输出他们选择的名字或随机选择的名字。
I can play with the positioning of the inputs to either get the function to work fine with n or y but not both.
我可以调整输入的位置,要么使函数在选择"n"或"y"时正常工作,但不能同时正常工作。
I want to call the username later on, and when I do so it loops back to ask the user input again.
我想稍后调用用户名,但当我这样做时,它会循环回来再次询问用户输入。
import random
rando_username = ['Yoda', 'Han', 'Luke', 'General Kenobi', 'Mace Windu', 'Padme', 'Anakin', 'Jar Jar Binks']
random_username = random.choice(rando_username)
user_name_choice = input('Would you like to choose your own name for the duel? y/n')
user_choice = input('What shall we call you?')
def username():
if user_name_choice == 'y':
username = user_choice
else:
username = random_username
return username
rando_opponent = ['Darth Vader', 'Darth Sidious', 'Darth Maul', 'Kylo Ren', 'Jabba the Hutt', 'Moff Gideon', 'Jango Fett', 'General Grievous']
random_opponent = random.choice(rando_opponent)
opponent_name_choice = input('Hello there, {}! Would you like to name your enemy? y/n'.format(username()))
opponent_choice = input('What shall we call your enemy?')
def opponent_name():
if opponent_name_choice == 'y':
opponent_name = opponent_choice
else:
opponent_name = random_opponent
return opponent_name
print ('Excellent choice {}, your opponent is {}!'.format(username(), opponent_name()))
英文:
I am trying to allow a user to first select if they want to define their name, then outputting either their chosen name or a randomly selected name.
I can play with the positioning of the inputs to either get the function to work fine with n or y but not both.
I want to call the username later on, and when I do so it loops back to ask the user input again.
import random
rando_username = ['Yoda', 'Han', 'Luke', 'General Kenobi', 'Mace Windu', 'Padme', 'Anakin', 'Jar Jar Binks']
random_username = random.choice(rando_username)
user_name_choice = input('Would you like to choose your own name for the duel? y/n')
user_choice = input('What shall we call you?')
def username():
if user_name_choice == 'y':
username = user_choice
else:
username = random_username
return username
rando_opponent = ['Darth Vader', 'Darth Sidious', 'Darth Maul', 'Kylo Ren', 'Jabba the Hutt', 'Moff Gideon', 'Jango Fett', 'General Grievous']
random_opponent = random.choice(rando_opponent)
opponent_name_choice = input('Hello there, {}! Would you like to name your enemy? y/n'.format(username()))
opponent_choice = input('What shall we call your enemy?')
def opponent_name():
if opponent_name_choice == 'y':
opponent_name = opponent_choice
else:
opponent_name = random_opponent
return opponent_name
print ('Excellent choice {}, your opponent is {}!'.format(username(), opponent_name()))
答案1
得分: 1
你两次调用了 username
。尝试将 username
的值保存到一个变量中。
将用户名(和对手的名字)保存到一个变量中。同时,将 input('What shall we call you?')
放在 username
函数的 if user_name_choice == 'y':
块中,这样只有在用户想要选择自己的名字时才会调用它(对于对手的名字也是同样的情况):
import random
rando_username = ['Yoda', 'Han', 'Luke', 'General Kenobi', 'Mace Windu', 'Padme', 'Anakin', 'Jar Jar Binks']
user_name_choice = input('Would you like to choose your own name for the duel? y/n')
def username():
if user_name_choice == 'y':
username = input('What shall we call you?')
else:
username = random.choice(rando_username)
return username
name = username()
rando_opponent = ['Darth Vader', 'Darth Sidious', 'Darth Maul', 'Kylo Ren', 'Jabba the Hutt', 'Moff Gideon', 'Jango Fett', 'General Grievous']
opponent_name_choice = input('Hello there, {}! Would you like to name your enemy? y/n'.format(name))
def opponent_name():
if opponent_name_choice == 'y':
opponent_name = input('What shall we call your enemy?')
else:
opponent_name = random.choice(rando_opponent)
return opponent_name
print('Excellent choice {}, your opponent is {}!'.format(name, opponent_name()))
一个可能的输出:
Would you like to choose your own name for the duel? y/n
Hello there, Jar Jar Binks! Would you like to name your enemy? y/n
Excellent choice Jar Jar Binks, your opponent is Darth Vader!
(请注意,在这个示例中,这些函数实际上不再是必需的,但我保留它们以防您仍然需要它们)
英文:
You're calling username
twice. Try saving username
's value to a variable.
Save the username (and opponent name) to a variable. Also put the input('What shall we call you?')
in the username
function's if user_name_choice == 'y':
block, so that it is only called if the the person wants to choose their own name (same goes for the opponent name bit):
import random
rando_username = ['Yoda', 'Han', 'Luke', 'General Kenobi', 'Mace Windu', 'Padme', 'Anakin', 'Jar Jar Binks']
user_name_choice = input('Would you like to choose your own name for the duel? y/n')
def username():
if user_name_choice == 'y':
username = input('What shall we call you?')
else:
username = random.choice(rando_username)
return username
name = username()
rando_opponent = ['Darth Vader', 'Darth Sidious', 'Darth Maul', 'Kylo Ren', 'Jabba the Hutt', 'Moff Gideon', 'Jango Fett', 'General Grievous']
opponent_name_choice = input('Hello there, {}! Would you like to name your enemy? y/n'.format(name))
def opponent_name():
if opponent_name_choice == 'y':
opponent_name = input('What shall we call your enemy?')
else:
opponent_name = random.choice(rando_opponent)
return opponent_name
print ('Excellent choice {}, your opponent is {}!'.format(name, opponent_name()))
A possible output:
Would you like to choose your own name for the duel? y/nn
Hello there, Jar Jar Binks! Would you like to name your enemy? y/nn
Excellent choice Jar Jar Binks, your opponent is Darth Vader!
(Note that in this example the functions are no longer really necessary, but I left them in case you still need them)
答案2
得分: 0
以下是已翻译好的内容:
- 首先,请注意,
username
和opponent_name
两个方法实际上执行相同的操作:如果_choice
变量等于y
,它们会返回输入的名称,否则它们将从预定义列表中随机选择一个值。你可以将它们合并成一个方法,但我们暂时不讨论这个问题。 - 你总是设置
random_username
和random_opponent
,即使不需要 - 即当_choice
等于y
时 - 显然,你可以在那里节省一些工作, - 在你的代码中,你利用了
input
方法的同步性质:理论上,你甚至可以不将username
和opponent_name
写成方法,而是可以将所有内容放在一个单块/顺序代码中。 - 请注意,每次你使用
()
时,你都在调用方法:这可能会在某些情况下产生不希望的效果。
鉴于这个背景,我已经重新组织了你的代码:
import random
# 可用的用户名选项列表
random_username = ['Yoda', 'Han', 'Luke', 'General Kenobi', 'Mace Windu', 'Padme', 'Anakin', 'Jar Jar Binks']
# 可用的对手选项列表
random_opponent = ['Darth Vader', 'Darth Sidious', 'Darth Maul', 'Kylo Ren', 'Jabba the Hutt', 'Moff Gideon', 'Jango Fett', 'General Grievous']
def choose_name(your_choice, available_options, you_or_your_enemy):
if your_choice == 'y':
return input(f'What shall we call {you_or_your_enemy}? ')
else:
return random.choice(available_options)
if __name__ == "__main__":
user_name_choice = input('Would you like to choose your own name for the duel [y/n]? ')
username = choose_name(user_name_choice, random_username, "you")
opponent_name_choice = input(f'Hello there, {username}! Would you like to name your enemy [y/n]? ')
opponent_name = choose_name(opponent_name_choice, random_opponent, "your enemy")
print (f'Excellent choice {username}, your opponent is {opponent_name}!')
英文:
There a few things that I would highlight regarding your code:
- First of all, note that the two methods
username
andopponent_name
do exactly the same thing: they return an entered name if the_choice
variables are equal toy
, otherwise they will pick a random value from a prefined list. You should collapse them in one method, but let's not go there for now. - You are always setting a
random_username
andrandom_opponent
, even when is not needed - i.e. when_choice
is equal toy
- clearly, you could save some work there, - In your code, you are taking advantage of the synchronous nature of the
input
method: in theory, you could even avoid writingusername
andopponent_name
as method, but you could have everything in a monolitic/sequential code - Note that everytime you are using the
()
you are calling the method: this could have undesired effects in some situations.
Given this background, I have reorganized your code:
import random
# List of username options
random_username = ['Yoda', 'Han', 'Luke', 'General Kenobi', 'Mace Windu', 'Padme', 'Anakin', 'Jar Jar Binks']
# List of opponents options
random_opponent = ['Darth Vader', 'Darth Sidious', 'Darth Maul', 'Kylo Ren', 'Jabba the Hutt', 'Moff Gideon', 'Jango Fett', 'General Grievous']
def username(user_choice):
if user_choice == 'y':
username = input('What shall we call you?')
else:
# username random selection happens only if needed
username = random.choice(random_username)
return username
def opponent_name(opponent_choice):
if opponent_choice == 'y':
opponent_name = input('What shall we call your enemy?')
else:
# opponent name random selection happens only if needed
opponent_name = random.choice(random_opponent)
return opponent_name
if __name__ == "__main__":
user_name_choice = input('Would you like to choose your own name for the duel [y/n]? ')
# username name method called only once and assigned to VARIABLE username
username = username(user_name_choice)
opponent_name_choice = input(f'Hello there, {username}! Would you like to name your enemy [y/n]? ')
# opponent_name method called only once and assigned to VARIABLE opponent_name
opponent_name = opponent_name(opponent_name)
print (f'Excellent choice {username}, your opponent is {opponent_name}!')
As stressed at the first point, username
and opponent_name
methods do exactly the same thing - you collapse the logic as follows, for example:
def choose_name(your_choice, available_options, you_or_your_enemy):
if your_choice == 'y':
return input(f'What shall we call {you_or_your_enemy}? ')
else:
return random.choice(available_options)
if __name__ == "__main__":
user_name_choice = input('Would you like to choose your own name for the duel [y/n]? ')
username = choose_name(user_name_choice, random_username, "you")
opponent_name_choice = input(f'Hello there, {username}! Would you like to name your enemy [y/n]? ')
opponent_name = choose_name(opponent_name_choice, random_opponent, "your enemy")
print (f'Excellent choice {username}, your opponent is {opponent_name}!')
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论