Почему цикл while не работает в этом коде?

#python

#питон

Вопрос:

Я хочу напечатать следующий шаблон, но цикл while для длины не выполняется. Когда я запускаю код, он печатает только один треугольник Под кодом, ожидаемый вывод и фактический вывод :

 height = int(input("Enter height ? "))
length = int(input("Enter length ? "))
spaces  = height-1
spaces2 = 0
while length > 0:
    for n in range(height):
        for i in range(spaces):
            print(' ',end="")
        print('/',end="")
        for j in range(spaces2):
            print(' ',end="")
        print('\',end="")
        for k in range(spaces):
            print(' ', end="")
        print('')
        height-=1
        spaces-=1
        spaces2 =2
    length-=1
  

Ожидаемый результат :

высота = 5 длина = 3

     /        /        /        
   /        /        /        
  /        /        /        
 /        /        /        
/        /        /        
  

Вывод при выполнении кода :

высота = 5 длина = 3

     /           
   /            
  /           
 /         
/        
  

Ответ №1:

while Цикл работает. Но при первом выполнении while цикла ваш код изменяет значения height , spaces2 и spaces . Во второй раз через while цикл все эти значения равны нулю, поэтому for циклы ничего не делают. Чтобы показать это, добавьте строку print(length) чуть ниже строки length -= 1 . Вы увидите отчет о 3 итерациях while цикла.

Ответ №2:

здесь причина в том, что первый цикл for изменяет переменную height на ноль, поэтому этот for и другой for во вторых итерациях цикла while не работают (повторяются в течение нулевого времени)

Ответ №3:

Хотя на вопрос уже был дан ответ, публикую другое решение (поскольку я немного поиграл с проблемой и, следовательно, применил немного другой подход).

code.py:

 #!/usr/bin/env python3

import sys


def _triangle(height, bk_char=chr(0x20)):
    for i in range(height):
        yield "".join([bk_char * (height - i - 1), '/', bk_char * (2 * i), '\', bk_char * (height - i - 1)])


def triangles(height, count):
    for line in _triangle(height):
        yield line * count

def main():
    print("n".join(triangles(7, 5)))


if __name__ == "__main__":
    print("Python {:s} on {:s}n".format(sys.version, sys.platform))
    main()
    print("Done.")
  

Примечания:

  • Используются генераторы
  • _triangle:
    1. Генерирует строковые строки вместо того, чтобы просто печатать их
    2. Для каждой строки он также включает в себя «невидимые» символы ПРОБЕЛА, которые идут после правого края (поэтому в конце он генерирует прямоугольник, содержащий (прямоугольники) треугольник)
  • треугольники:
    • Просто умножает треугольник по горизонтали (строка за строкой). Это возможно из-за # 2 последнего маркера. элемент

Вывод:

 [cfati@CFATI-5510-0:e:WorkDevStackOverflowq055810531]> "e:WorkDevVEnvspy_064_03.07.03_test0Scriptspython.exe" code.py
Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)] on win32

      /            /            /            /            /
     /            /            /            /            /  
    /            /            /            /            /    
   /            /            /            /            /      
  /            /            /            /            /        
 /            /            /            /            /          
/            /            /            /            /            
Done.