在循环时,尝试except和其他有问题的函数

2024-09-30 22:19:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用python创建一个bingo/housie票据创建者。票有9行3列。这意味着9*3网格上有27个空间。垂直方向为9行,水平方向为3列。每行只能容纳3个随机数。第一行可以容纳1,9中的随机数。第二行可以容纳10,19之间的随机数。第三行可以容纳20,29之间的随机数。第四行可以容纳30,39之间的随机数。第五行可以容纳40,49之间的随机数。第六行可以容纳50,59之间的随机数。第七行可以容纳60,69之间的随机数。第八行可以容纳70,79之间的随机数。第九行可以容纳80,90之间的随机数。这是车票的参考图片Here is a reference image 我计划用python创建一个随机票证。这是我为它创建的脚本。为了更好地理解,它有所有的评论

import random

# print("Script is ready") 

# Variables
global numOfNums # This tells that only 15 numbers can be added to the ticket
numOfNums = 15
global allNum # this is the list containing all 90 numbers
global numToBedone # this is just for adding nums to the list
allNum = []
numToBedone = 1
global row1, row2, row3, row4, row5, row6, row7, row8, row9 # all the rows
row1, row2, row3, row4, row5, row6, row7, row8, row9 = [], [], [], [], [], [], [], [], [] 
global row1Num, row2Num, row3Num, row4Num, row5Num, row6Num, row7Num, row8Num, row9Num # all the nums row can have 

# Filling the List
while numToBedone<91:  
    allNum.append(numToBedone)
    numToBedone = numToBedone+1 

# Generating number for row 1
def ranRow1NumGen():
    global numOfNums
    row1Num = random.randint(1,9)
    try:
        allNum.remove(row1Num)
    except:
        ranRow1NumGen()
    row1.append(row1Num)
    numOfNums = numOfNums - 1

# Generating number for row 2
def ranRow2NumGen():
    global numOfNums
    row2Num = random.randint(10,19)
    try:
        allNum.remove(row2Num)
    except:
        ranRow2NumGen()
    row2.append(row2Num)
    numOfNums = numOfNums - 1

# Generating number for row 3
def ranRow3NumGen():
    global numOfNums
    row3Num = random.randint(20,29)
    try:
        allNum.remove(row3Num)
    except:
        ranRow3NumGen()
    row3.append(row3Num)
    numOfNums = numOfNums - 1

# Generating number for row 4
def ranRow4NumGen():
    global numOfNums
    row4Num = random.randint(30,39)
    try:
        allNum.remove(row4Num)
    except:
        ranRow4NumGen()
    row4.append(row4Num)
    numOfNums = numOfNums - 1

# Generating number for row 5
def ranRow5NumGen():
    global numOfNums
    row5Num = random.randint(40,49)
    try:
        allNum.remove(row5Num)
    except:
        ranRow5NumGen()
    row5.append(row5Num)
    numOfNums = numOfNums - 1

# Generating number for row 6
def ranRow6NumGen():
    global numOfNums
    row6Num = random.randint(50,59)
    try:
        allNum.remove(row6Num)
    except:
        ranRow6NumGen()
    row6.append(row6Num)
    numOfNums = numOfNums - 1

# Generating number for row 7
def ranRow7NumGen():
    global numOfNums
    row7Num = random.randint(60,69)
    try:
        allNum.remove(row7Num)
    except:
        ranRow7NumGen()
    row7.append(row7Num)
    numOfNums = numOfNums - 1

# Generating number for row 8
def ranRow8NumGen():
    global numOfNums
    row8Num = random.randint(70,79)
    try:
        allNum.remove(row8Num)
    except:
        ranRow8NumGen()
    row8.append(row8Num)
    numOfNums = numOfNums - 1

# Generating number for row 9
def ranRow9NumGen():
    global numOfNums
    row9Num = random.randint(80,90)
    try:
        allNum.remove(row9Num)
    except:
        ranRow9NumGen()
    row9.append(row9Num)
    numOfNums = numOfNums - 1

# Main function for creating a ticket
def ticketGen():

    global row1, row2, row3, row4, row5, row6, row7, row8, row9
    global numOfNums
    
    #Adding 1 number to all the rows
    ranRow1NumGen()
    ranRow2NumGen()
    ranRow3NumGen()
    ranRow4NumGen()
    ranRow5NumGen()
    ranRow6NumGen()
    ranRow7NumGen()
    ranRow8NumGen()
    ranRow9NumGen()
    
    # After we put 1 number in each row we have to put the rest in the random rows
    # I cant understand how to do that
    # I used this way but it has some issues
    # sometimes a row can get more than 3 num which isnt possible in the ticket
    # also some numbers repeat but I cant understand how as I have a try except statement
    u = 0
    while u < 6:
        randomNumGiver = random.randint(1,9)
        if numOfNums > 0:
            if randomNumGiver == 1 and len(row1) < 3:
                ranRow1NumGen()
            elif randomNumGiver == 2 and len(row2) < 3:
                ranRow2NumGen()
            elif randomNumGiver == 3 and len(row3) < 3:
                ranRow3NumGen()
            elif randomNumGiver == 4 and len(row4) < 3:
                ranRow4NumGen()
            elif randomNumGiver == 5 and len(row5) < 3:
                ranRow5NumGen()
            elif randomNumGiver == 6 and len(row6) < 3:
                ranRow6NumGen()
            elif randomNumGiver == 7 and len(row7) < 3:
                ranRow7NumGen()
            elif randomNumGiver == 8 and len(row8) < 3:
                ranRow8NumGen()
            elif randomNumGiver == 9 and len(row9) < 3:
                ranRow9NumGen()
            else:
                pass
        u = u+1

    # printing all the rows and the remaining numbers in the list
    print(row1, row2, row3, row4, row5, row6, row7, row8, row9)
    pass

ticketGen()

我得到了一些混合输出: 代码给出的输出不正确:

[8] [14] [21, 25, 21] [32] [42, 47, 42] [55] [60, 66, 60] [76] [82]

正确的方式和代码给出的输出:

[7, 2] [16, 14] [28] [34] [40] [59, 56, 52] [68, 61, 64] [77] [83]

正如您所看到的,它的输出是混合的。第一个输出的问题是数字不能重复,并且一行不能超过3个数字。我无法找到这个bug是如何发生的,因为我为重复设置了一个try-except语句,为少于3个数字设置了一个if语句。如果您能发现任何问题并知道解决方法,请这样做。这对我来说意义重大。多谢各位

编辑-代码现在已经根据第一个答案进行了更改,但我得到了这些结果。还有一点很明显,它一行有3个以上的数字,它们是重复的数字。想不出办法请帮忙


Tags: andthenumberfordefrandomglobalrow
1条回答
网友
1楼 · 发布于 2024-09-30 22:19:40

在while循环中,更改以下内容-

while u < 6:
        randomNumGiver = random.randint(1,9)
        if randomNumGiver == 1 and numOfNums > 0 and row1.__len__() < 3:
            ranRow1NumGen()
        elif randomNumGiver == 2 and numOfNums > 0 and row2.__len__() < 3:
            ranRow2NumGen() ..........

至-

while u < 6:
    randomNumGiver = random.randint(1,9)
    if numOfNums > 0:
        if randomNumGiver == 1 and len(row1) < 3:
            ranRow1NumGen()
        elif randomNumGiver == 2 and len(row2) < 3:
            ranRow2NumGen()
        elif randomNumGiver == 3 and len(row3) < 3:
            ranRow3NumGen()
        elif randomNumGiver == 4 and len(row4) < 3:
            ranRow4NumGen()
        elif randomNumGiver == 5 and len(row5) < 3:
            ranRow5NumGen()
        elif randomNumGiver == 6 and len(row6) < 3:
            ranRow6NumGen()
        elif randomNumGiver == 7 and len(row7) < 3:
            ranRow7NumGen()
        elif randomNumGiver == 8 and len(row8) < 3:
            ranRow8NumGen()
        elif randomNumGiver == 9 and len(row9) < 3:
            ranRow9NumGen()
        else:
            pass
    u = u+1

numOfNums行设为公共行,然后改用len(),因为最好不要使用.__len__()

结果:(没有重复,当我多次尝试任何错误结果时超过3次)

Script is ready
2 is selected for row1
12 is selected for row2
22 is selected for row3
35 is selected for row4
48 is selected for row5
56 is selected for row6
64 is selected for row7
75 is selected for row8
90 is selected for row9
[2] [12] [22] [35] [48] [56] [64] [75] [90]
19 is selected for row2
60 is selected for row7
39 is selected for row4
55 is selected for row6
53 is selected for row6
56 is selected for row6
[2] [12, 19] [22] [35, 39] [48] [56, 55, 53] [64, 60] [75] [90]
[1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 20, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 36, 37, 38, 40, 41, 42, 43, 44, 45, 46, 47, 49, 50, 51, 52, 54, 57, 58, 59, 61, 62, 63, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89]

相关问题 更多 >