Python 对于范围内的x,仅工作5次

Python 对于范围内的x,仅工作5次,python,Python,我正在做学校作业,遇到了一个问题。当我输入希望抽奖行的次数时,程序最多只执行五次。你知道为什么会这样吗 import random from time import sleep rivi = [] seen = set(rivi) voittorivi = [7, 9, 10, 25, 31, 39, 40] while True: try: rvnro = input('kuinka monta riviä pelataan?: ') rvnro1 = int(rvnro

我正在做学校作业,遇到了一个问题。当我输入希望抽奖行的次数时,程序最多只执行五次。你知道为什么会这样吗

import random
from time import sleep
rivi = []
seen = set(rivi)
voittorivi = [7, 9, 10, 25, 31, 39, 40]

while True:
  try:
    rvnro = input('kuinka monta riviä pelataan?: ')
    rvnro1 = int(rvnro)
    print('pelataan', rvnro, 'riviä')
    break
  except ValueError:
    print('käytäthän vain numeroita.')
print(' ')
for x in range (rvnro1):
  while len(rivi) < 7:
    
    numero = random.randint(1,40)
    if numero not in seen:
      seen.add(numero)
      rivi.append(numero)
    else:
      u=0
  rivi.sort()
  if rivi == voittorivi:
    print('Voitit pääpalkinnon! Onneksi olkoon!')
  print(rivi)
  print(' ')
  sleep(0.1)
  rivi.clear()

随机导入
从时间上导入睡眠
里维埃=[]
SEED=设置(rivi)
voittorivi=[7,9,10,25,31,39,40]
尽管如此:
尝试:
rvnro=输入('kuinka monta riviäpelatan?:')
rvnro1=int(rvnro)
打印('Pelatan',rvnro',riviä')
打破
除值错误外:
打印('käytäthän vain numeroita.”)
打印(“”)
对于范围内的x(rvnro1):
而len(rivi)<7:
numero=random.randint(1,40)
如果看不到数字:
见。添加(数字)
附加(数字)
其他:
u=0
rivi.sort()
如果rivi==voittorivi:
打印('Voitit päpalkinnon!Onneksi olkoon!')
打印(rivi)
打印(“”)
睡眠(0.1)
rivi.clear()
修复程序

它还将帮助您结束算法,因为它在len(rivi)时陷入了无尽的循环中 修复程序


它还将帮助您结束算法,因为它陷入了无休止的循环中,因为len(rivi)您从未重置
seen
,所以在1到40之间的7个数字的5轮之后,您就没有更多的数字来填充另一行7。在第六轮,在5个数字之后,你涵盖了所有40个选项,剩下的2个选项没有更多的数字。因此,当len(rivi)<7:循环时,您会被困在
中(因为
rivi
永远不会到达7个元素)

通过在循环中使用而不是调用
random.randint
,并检查号码是否已被选中,可以简化此过程:

number=列表(范围(1,41))
对于范围内的x(rvnro1):
rivi=已排序(随机。样本(数字,7))
如果rivi==voittorivi:
打印('Voitit päpalkinnon!Onneksi olkoon!')
打印(rivi)
打印(“”)
睡眠(0.1)

您从未重置
所见
因此,在1到40之间的7个数字的5轮之后,您没有更多的数字来填充另一行7。在第六轮,在5个数字之后,你涵盖了所有40个选项,剩下的2个选项没有更多的数字。因此,当len(rivi)<7:
循环时,您会被困在
中(因为
rivi
永远不会到达7个元素)

通过在循环中使用而不是调用
random.randint
,并检查号码是否已被选中,可以简化此过程:

number=列表(范围(1,41))
对于范围内的x(rvnro1):
rivi=已排序(随机。样本(数字,7))
如果rivi==voittorivi:
打印('Voitit päpalkinnon!Onneksi olkoon!')
打印(rivi)
打印(“”)
睡眠(0.1)

您是否知道
范围(6)给出了[0,1,2,3,4,5]上的迭代器
?请阅读。你也可以使用它来帮助一步一步地可视化代码的执行。你永远不会重置
seen
,因此在1到40之间的5轮7个数字之后,你就没有更多的数字可以感觉到另一行7了…@Tomerikoo很好地解释了这个问题!另外,还可以查看一种不使用循环和集合生成7个随机数的方法。您是否知道
range(6)在[0,1,2,3,4,5]上提供了一个迭代器?
?请阅读。你也可以使用它来帮助一步一步地可视化代码的执行。你永远不会重置
seen
,因此在1到40之间的5轮7个数字之后,你就没有更多的数字可以感觉到另一行7了…@Tomerikoo很好地解释了这个问题!另外,还可以看看使用
list.clear()
set.clear()
生成7个随机数而不使用循环和setIMO的方法。clear()创建新的list和set对象并在原始对象上分配它们比创建新的list和set对象更好ones@Adam.Er8将修复it@Tomerikoo行@亚当:为什么?如果需要保留别名关联,请确定。否则,只做新的就可以了(通常更便宜,至少对于
列表
s,其中
=[]
避免了函数调用开销)
rivi=[]
非常好
seen=set()
是。。。meh(我很恼火没有真正的空
set
literal,独眼猴子操作,
{*()}
是…meh)。@ShadowRanger你是对的,甚至没有理由在循环之外定义它们,然后在每次迭代结束时清除它们,通常你只有一次空的初始化,在loop.IMO开始时,使用
list.clear()
set.clear()
比创建新的list和set对象并将它们分配给原始对象更好ones@Adam.Er8将修复it@Tomerikoo行@亚当:为什么?如果需要保留别名关联,请确定。否则,只做新的就可以了(通常更便宜,至少对于
列表
s,其中
=[]
避免了函数调用开销)
rivi=[]
非常好
seen=set()
是。。。meh(我很恼火没有真正的空
set
literal,独眼猴子操作,
{*()}
是…meh)。@ShadowRanger你是对的,甚至没有理由在循环外定义它们,然后在每次迭代结束时清除,通常在循环开始时只有一次空初始化。
  sleep(0.1)
  rivi.clear() # reinitiating the list
  seen.clear() # reinitiating the set