我是Python新手,为了一个学校的项目,我创建了一个“钓鱼模拟器”。基本上,这是一种随机的使用。我知道我的代码最终是重复的,但我不知道如何简化它。
import time
import random
fishing = True
a = b = c = d = e = 0 #define multiple variables as same thing
print ("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
print ("Welcome to Lake Tocowaga")
print ("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
time.sleep(1)
name = input("What is your name fisherman?")
answer = input("Would you like to go fishing, " + name + "?")
if answer.lower() == "no":
fishing == False
while fishing == True:
time.sleep(1)
answer = input("Throw out your line, or go home?")
if answer == "go home":
fishing = False
er = float(e / (a + b + c + d))
print("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
print("Thanks for playing " + name + "!")
print("You caught:", str(a), "cod, ", str(b), "salmon, ", str(c), "shark, ", str(d), "wildfish. \nEfficiency Rate: ", str(er), ".")
else:
t = random.randrange(1, 7)
if t == 1:
a += 1
print("You caught a cod!")
elif t == 2:
b += 1
print("You caught a salmon!")
elif t == 3:
c += 1
print("You caught a shark!")
elif t == 4:
d += 1
print("You caught a wildfish!")
elif t >= 5:
e += 1
print("You caught nothing!")发布于 2019-04-13 01:01:17
欢迎来到CodeReview。养成良好的编码习惯永远不会太早,而回顾您的代码是最好的方法。
首先,祝贺您编写了一个干净、直观的程序。虽然您确实有一些问题(下面),但它们不是主要问题,您的程序似乎适合它的级别。
现在,就问题而言;)
Python要求您使用水平空格。但是,您还应该使用垂直空格(也称为“空白行”)将代码的不同部分组织成段落。
这个巨大的街区:
import time
import random
fishing = True
a = b = c = d = e = 0 #define multiple variables as same thing
print ("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
print ("Welcome to Lake Tocowaga")
print ("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
time.sleep(1)
name = input("What is your name fisherman?")
answer = input("Would you like to go fishing, " + name + "?")
if answer.lower() == "no":
fishing == False
while fishing == True: 如果它像这样被拆开的话,会读得更好:
import time
import random
fishing = True
a = b = c = d = e = 0 #define multiple variables as same thing
print ("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
print ("Welcome to Lake Tocowaga")
print ("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
time.sleep(1)
name = input("What is your name fisherman?")
answer = input("Would you like to go fishing, " + name + "?")
if answer.lower() == "no":
fishing == False
while fishing == True: 我所做的只是添加了几行空白行,但我试图表明,“这些事情一起进行”和“这些事情是顺序的,但没有关系”。
这其中哪一个是鲨鱼?
a = b = c = d = e = 0我没有头绪。但如果你给它们取了合适的名字:
cod = shark = wildfish = salmon = nothing = 0我肯定会知道!
这一行出现了三次:
print ("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")除非您正在复制/粘贴,否则很可能很难得到正确数量的倾斜字符。如果你这么做,可能会很痛苦。相反,为倾斜体创建一个名称。按照惯例,常量用大写拼写。(它实际上不是一个常量,但是由于常量是用大写拼写的,所以如果用大写命名它,就会知道不要修改它。)
H_LINE = "~" * 32
print(H_LINE)
print("Welcome to Lake Tocowaga")
print(H_LINE)所有的东西都有个地方。一切都应该在它的位置上。打印摘要的地方将在底部。
您对while fishing:循环有一个很好的想法。但是,不要在响应用户输入时立即打印摘要,只需更改变量并让循环失败,然后将摘要打印在底部。它更“自然”(它使你的循环更容易阅读!)
while fishing == True:
time.sleep(1)
answer = input("Throw out your line, or go home?")
if answer == "go home":
fishing = False
er = float(e / (a + b + c + d))
print("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
print("Thanks for playing " + name + "!")
print("You caught:", str(a), "cod, ", str(b), "salmon, ", str(c), "shark, ", str(d), "wildfish. \nEfficiency Rate: ", str(er), ".")
else:
...变成:
while fishing == True:
time.sleep(1)
answer = input("Throw out your line, or go home?")
if answer == "go home":
fishing = False
else:
...
er = float(e / (a + b + c + d))
print(H_LINE)
print("Thanks for playing " + name + "!")
print("You caught:", str(a), "cod, ", str(b), "salmon, ", str(c), "shark, ", str(d), "wildfish. \nEfficiency Rate: ", str(er), ".")您正在调用不需要调用的函数。整数之间“真”除法的结果是浮点数。你不需要打电话给float(e / (a + b + c + d))。如果你真的需要这么做的话,那就太迟了!
同样,print知道如何处理整数和浮点数。当你可以做的时候,你不需要print(..., str(a), ...):print(..., a, ...)。
发布于 2019-04-13 00:47:48
一些简单的事情。
a = b = c = d = e = 0这有几个原因是不好的:
c的位置。当我能够确定我正在寻找确切的c = ...时,找到它要容易得多。但是,当它被宣布为一条线的一半时,很难找到它。在这两种情况下,您都是为了简洁而牺牲可读性。除非你是在打高尔夫球,否则不要这么做。可读性几乎优先于其他一切。
fishing = True是您文件中的第三行,但是您要到以后才会使用它。除非它是常量,否则最好在第一次使用变量的地方声明变量。当有人正在阅读您的代码并希望看到fishing的定义时,如果他们只需要查找一两行而不需要滚动到文件的顶部,它就会更高效。
while fishing == True:可以简单地编写为while fishing:。
你真的有个窃听器。fishing == False应该是fishing = False。
只需检查第一个字母,if answer.lower() == "no":就可以写得更“宽容”(但不太准确):
if answer.lower().startswith("n"):现在,像"nope“这样的输入也会起作用。不过,不管你是否想要这种行为,都是另一回事。如果你有其他的答案,要求"n“作为第一个字母,显然这会破坏事物。
发布于 2019-04-13 08:48:40
这是使用字典的另一种改进。目前,您的所有数据都是硬编码的,并且分布在代码中的某个地方。如果您想要添加另一个fish,您必须添加一个变量f,扩展random.randint (这样就不会减少什么机会),最后将它添加到if条件和打印中。
多加一条鱼,这是一项很大的工作。相反,我建议使用一本字典,列出可能的捕鱼结果及其被捕获的机会。然后,您可以将它与random.choices一起使用,它接受一个详细说明概率的weights参数。
pond = {'cod': 1, 'salmon': 1, 'shark': 1, 'wildfish': 1, 'nothing': 2}概率在这里是相对的,random.choices为你规范了它们。所有的鱼都有相同的概率,而得到任何东西的概率都是任何一条鱼的两倍。
您的循环也根本不需要fishing变量,只需要在用户钓鱼时使用break变量。
每当您需要计算某件事时,使用collections.Counter可能是个好主意。它基本上像字典一样工作,并且有一个很好的特性,它假设所有元素都有一个计数为零。
在Python3.6中,引入了一种格式化字符串的新方法,即f-string。
from collections import Counter
from random import choices
from time import sleep
POND = {'cod': 1, 'salmon': 1, 'shark': 1, 'wildfish': 1, 'nothing': 2}
name = input("What is your name fisherman? ")
caught = Counter()
while True:
keep_fishing = input("Throw out your line, or go home? ")
if keep_fishing == "go home":
break
sleep(1)
result = choices(list(POND), weights=POND.values(), k=1)[0]
print(f"You caught: {result}")
caught[result] += 1
print(f"\nThanks for playing, {name}!")
print("You caught:")
for fish, n in caught.most_common():
if fish != "nothing":
print(n, fish)https://codereview.stackexchange.com/questions/217357
复制相似问题