Почему часть моего кода не выполняется в конце функции?

#python

#python

Вопрос:

Я создаю программу, которая генерирует случайную серию символов канала для создания блока каналов. В конце моей функции ranPipe() есть импровизированный конвертер, который изменяет текст, представляющий символ канала, на символ. По какой-то причине это, похоже, не выполняется — тестирование с помощью print () s как внутри цикла for преобразователя, так и снаружи (только в конце функции), похоже, что это не выполняется (или, по крайней мере, не печатается).

Я не могу просто создать новую функцию для преобразования, поскольку она зависит от переменных, используемых в ranPipe(), и я не очень хорош в объявлениях глобальных переменных, поэтому это вызывает больше проблем, чем решает. Это также должна быть точка ссылки функции ranPipe (), потому что она должна выполняться после проверок, рассмотренных ранее в коде.

Почему это должно быть и как я могу это исправить? (Код ниже)

 import random

finCheck = 0
pipeNums = {
    ##Note: Structure of values is icon, upcon, downcon, leftcon, rightcon
    "vertCon": "║1100",
    "horiCon": "═0011",
    "leftCornUpper": "╔0101",
    "rightCornUpper": "╗0110",
    "leftCornLower": "╚1001",
    "rightCornLower": "╝1010",
    "vertConMidL": "╠1101",
    "vertConMidR": "╣1110",
    "horiConMidN": "╦0111",
    "horiConMidS": "╩1011",
    "cross": "╬1111"
}

def ranPipe(north, south, left, right):
    ##Generates a random piece
    curPipe = random.choice(list(pipeNums))

    ##Resets piece check
    finCheck = 0

    ##Start of piece check looop
    while finCheck < 3:
        ##If the piece doesn't match previous piece, regen.
        while (curPipe[1] == "1" and prePipe[2] == "0") or (curPipe[3] == "1" and prePipe[4] == "0") or (curPipe[4] == "1" and prePipe[3] == "0"):
            curPipe = random.choice(list(pipeNums))
        ##Adds to check total when this completes
        finCheck  = 1

        ##Additional checks for edge pieces.
        while True:
            if north == 1:
                while curPipe[1] == "1":
                    curPipe = random.choice(list(pipeNums))
                return curPipe
            elif south == 1:
                while curPipe[2] == "1":
                    curPipe = random.choice(list(pipeNums))
                return curPipe
            elif left == 1:
                while curPipe[3] == "1":
                    curPipe = random.choice(list(pipeNums))
                return curPipe
            elif right == 1:
                while curPipe[4] == "1":
                    curPipe = random.choice(list(pipeNums))
                return curPipe
            break

        ##Adds to check total when this completes
        finCheck  = 1

        ##Runs one more general check. Adds if it passes, otherwise all check points are removed and it repeats.
        while True:
            if (curPipe[1] == "1" and prePipe[2] == "0") or (curPipe[3] == "1" and prePipe[4] == "0") or (curPipe[4] == "1" and prePipe[3] == "0"):
                finCheck = 0
                curPipe = random.choice(list(pipeNums))
            else:
                finCheck  = 1
                break

    ##Converts the value of the current pipe to its value rather than its name    
    conChart = ['║', '═', '╔', '╗', '╚', '╝', '╠', '╣', '╦', '╩', '╬']
    for x in range(conChart):
        if curPipe == pipeNums[x]:
            curPipe = conChart[x]

def digDig(length, width):
    print("What length do want your pipes to be?")
    length = int(input("Note: The length and width of your creation may vary, as it is counted in number of characters rather than a definite measure.n"))
    width = int(input("And the width?n"))

    ##Start of code, top corner
    prePipe = random.choice(list(pipeNums))
    print(prePipe)

    ##Top line
    for x in range(length):
        print(ranPipe(1, 0, 0, 1))
  

(Я ценю, что мой код (а) местами не очень похож на python и (б) неполон. Хотя я всегда ценю помощь в повышении эффективности моего кода, я специально прошу помощи в решении проблемы с моим конвертером и предпочел бы, чтобы основное внимание уделялось этому, а не моему запутанному коду).

Комментарии:

1. В коде перед последней частью много return s. Если выполняется один из них, выполнение функции на этом заканчивается.

2. вы пробовали вызывать digDig ? глупый вопрос, я знаю … просто хотел убедиться.

3. Ваш опубликованный код определяет две переменные и две функции, а затем завершает работу. Код совсем не минимальный, и вы не отследили поток управления ranPipe. Обычно вы выходите из while True цикла, выходя из функции, поэтому вы не доходите до кода преобразования.

Ответ №1:

Чтобы ответить на ваш вопрос, вы вызываете ranPipe с параметром north=1 , поэтому, когда вы переходите к третьему циклу while, у вас есть строка, if north == 1: которая принимает значение true, что приводит к выполнению возврата и завершению функции.

Просто как дополнение к тому, что я увидел, просматривая ваш код: вы используете prePipe в своей функции ranPipe , но не определили ее в этой функции; вы определили ее только в digdigи вы используете for x in range(conChart) , но range функция принимает целое число: вам нужно указать len(conChart) .