我应该编写一个掷骰子五次的程序,但是我没有任何冗余,也不能使用任何循环。 我将在练习中粘贴文本。 “构建一个python应用程序,以提示用户输入骰子的边数(地牢和龙样式的骰子!) 之后,它将掷骰子多面五次,并将所有五个结果输出给用户 掷骰子五次将需要五个重复的代码块–通过使用用户定义的函数掷骰子来消除这种冗余
有人可以帮助我吗?
import random
def main():
diceType = int(input("Enter how many sides the dices will have: "))
diceRoll1 = random.randint(1,diceType)
diceRoll2 = random.randint(1,diceType)
diceRoll3 = random.randint(1,diceType)
diceRoll4 = random.randint(1,diceType)
diceRoll5 = random.randint(1,diceType)
print("The dices read", diceRoll1, diceRoll2, diceRoll3, diceRoll4, diceRoll5)
main()
答案 0 :(得分:2)
注意:这是一种糟糕的方法。循环的目的是消除冗余。没有任何形式的循环,所有解决方案都将很笨拙,难以阅读且效率很低。
import random
def roll5(diceType, remaining_roll=5):
if remaining_roll == 0:
return []
retval = roll5(diceType, remaining_roll - 1)
retval.append(random.randint(1,diceType))
return retval
diceType = int(input("Enter how many sides the dices will have: "))
diceRoll1, diceRoll2, diceRoll3, diceRoll4, diceRoll5 = roll5(diceType)
print("The dices read", diceRoll1, diceRoll2, diceRoll3, diceRoll4, diceRoll5)
答案 1 :(得分:1)
使用综合列表
import random
randomList = [random.randint(1,diceType) for _ in range(5)]
diceRoll1, diceRoll2, diceRoll3, diceRoll4, diceRoll5 = randomList
答案 2 :(得分:0)
我将使用itertools
模块。
>>> from itertools import islice, imap, repeat
>>> from random import randint
>>> diceType = 5
>>> list(islice(imap(random.randint, repeat(1), repeat(diceType)), 5))
[5, 5, 4, 5, 4]
repeat
创建1和diceType
的无限序列。 imap
创建调用randint(1, diceType)
的结果的无限序列(每次调用都提取repeat(1)
和repeat(diceType)
的下一个值作为参数。islice
使得迭代器仅接受无限序列的前5个元素,而list
实际上从有限迭代器中获取值。
以下几行(不使用itertools
)(为简单起见,使用了Python 2版本的map
)
map(lambda f: f(1, diceType), [randint]*5)
这将创建一个包含对randint
的5个单独引用的列表,然后在该列表上映射一个在1和diceType
上调用其参数的函数。
(实际上,可以使用相同的方法简化itertools
版本:
list(islice(map(lambda f: f(1, diceType), repeat(randint)), 5))
)
答案 3 :(得分:0)
就个人而言,如果我不能使用任何循环,我将使用一个列表来执行此操作,以跟踪已使用和未使用的内容。
diceType = int(input("Enter how many sides the dices will have: "))
lyst = range(1,diceType+1)
diceRoll1 = random.choice(lyst)
lyst.remove(diceRoll1)
diceRoll2 = random.choice(lyst)
lyst.remove(diceRoll2)
diceRoll3 = random.choice(lyst)
lyst.remove(diceRoll3)
diceRoll4 = random.choice(lyst)
lyst.remove(diceRoll4)
diceRoll5 = random.choice(lyst)
lyst.remove(diceRoll5)
print("The dices read", diceRoll1, diceRoll2, diceRoll3, diceRoll4, diceRoll5)
这不是最优雅的解决方案,但我喜欢它的可读性。您从列表中选择了某项,然后将其删除。然后再执行4次。