Почему он не сломается?

#python #loops #input #while-loop #break

#python #циклы #ввод #цикл while #сломать

Вопрос:

Итак, я работаю над фрагментом кода, который мне дали в качестве задания. У меня возникли проблемы со второй частью кода else. Когда входные данные нечетные, они переходят к этой части кода и не прерываются при перезапуске цикла. Я знаю, что в этой части есть недостаток, и мне было интересно, может ли кто-нибудь помочь мне увидеть это. (Извините, если этот код кажется очень любительским, я учусь.

Я пытался изменить местоположение для ввода, но безрезультатно.

def part1c():

     def get_int(prompt):
            while True:
                    try:
                            return int(butt(prompt))
                    except ValueError:
                            pass

    def get_ch(prompt):
            while True:
                    res = butt(prompt).strip()
                    if res:
                            return res[:1]


    def make_row(w , edge, center):
            return edge*(w>0)   center*(w-2)   edge*(w>1)

    import time

    def print_rectangle(h, w, c):
            top_row = make_row(w, c, c)
            mid_row = make_row(w, c, ' ')
            rows = [top_row]*(h>0)   [mid_row]*(h-2)   [top_row]*(h>1)
            print('n'.join(rows))
            while True:
                    print_rectangle(h, w, c)
                    time.sleep(2)



    def main():
            h = get_int('Size of box in rows? ')
            w = get_int('Size of box in columns? ')
            c = get_ch('Character to use: ')
            print_rectangle(h, w, c)

    while True:
            print('Draw boxes:(Enter 0 to stop)')
            butt=int(input('If box has an odd number(s), type it.'  
                     ' If not, type the even number(s):') )
            if butt == 0:
                    print('Thank you, next')
                    break
            else:

                    if butt % 2== 0:
                            pass


                            rows=int(input('Size of box in rows? '))
                            cols= int(input('Size of box in columns? '))
                            for r in range(rows):
                                    for c in range(cols):
                                            print('*', end='')
                                    print()

                    else:
                            butt_is_zero = True
                            while butt_is_zero:
                                    import sys

                                    # Python 2/3 compatibility shims
                                    if sys.hexversion >= 0x3000000:
                                        butt = input
                                        rng = range
                                    else:
                                        butt = raw_input
                                        rng = xrange


                                    if __name__=="__main__":
                                            main()
                                    if butt==1:
                                            butt_is_zero = False

                                    get_int()
                                    get_ch()
                                    make_row()
                                    print_rectangle()
                                    part1c()
  

часть 1c()

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

1. Не определяйте функции в циклах

2. Это исправило проблему, я не думал, что это произойдет! Спасибо!

Ответ №1:

единственное, что вы можете попробовать, это изменить

   else:
      while True:
          import sys
  

Для

   else:
      butt_is_zero = True
      while butt_is_zero:
          import sys
  

затем, чтобы прервать цикл while

       if butt==1:
          butt_is_zero = False
  

Также приведенное выше сообщение ^^ не определяет функции внутри цикла, вместо этого размещайте их вне цикла и вызывайте их по мере необходимости.

пример

 import time    

def print_rectangle(h, w, c):
    top_row = make_row(w, c, c)
    mid_row = make_row(w, c, ' ')
    rows = [top_row]*(h>0)   [mid_row]*(h-2)   [top_row]*(h>1)
    print('n'.join(rows))




while True:

    print_rectangle(h, w, c)
    time.sleep(2)
  

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

1. Итак, я попробовал это и вывел функции из цикла, хотя при импорте времени конечный результат печатает одно и то же поле бесконечное количество раз, и цикл все равно не прерывается. Я обновил код. Еще раз спасибо. Я бы дал вам более потрясающий соус, если бы вы могли помочь мне снова найти в нем что-то неправильное.