Софтуерно Инженерство
Loading...
kalintri avatar kalintri 2 Точки

Триъгълник от звездички с for цикъл - разлика в изхода?

Здравейте, 

Играех си със задачата за триъгълник от звездички с for цикъл и стигнах до следния код, който работи:
 

for row in range(0, 10):
    for c in range(0, row+1):
        print("*", end=' ')
    print("\r")

 

Изхода е: 

* * 
* * * 
* * * * 
* * * * * 
* * * * * * 
* * * * * * * 
* * * * * * * * 
* * * * * * * * * 
* * * * * * * * * * 

Гледах едно от видеата и осъзнах, че може стринг да се изпечатва с просто умножение и реших да пробвам следния код:

for row in range(0, 10):
    for c in range(0, row+1):
        print("*"*c)
    print("\r")

Този код изглежда, че работи до някакава степен, но извежда следния резултат:

*


*
**


*
**
***


*
**
***
****


*
**
***
****
*****


*
**
***
****
*****
******


*
**
***
****
*****
******
*******


*
**
***
****
*****
******
*******
********


*
**
***
****
*****
******
*******
********
*********

 

Това, което не мога да си обясня, е защо във втория случай отпечатва всяка итерация на външния цикъл, докато в първия случай не?
Поздрави, 
Калин

Тагове:
svetoslav_0 avatar svetoslav_0 949 Точки
Best Answer

Получава се така, защото behind the scenes умножаването на string само по себе си представлява въртене на цикъл. Нещо, което компилаторът прави. Следния ред:

print("-"*5)

би направил същото, като да завърти следния цикъл:

for row in range(0, 5):
    print('-', end='')

От където можем да напрвим заключение, че във втория посочен от теб пример всъщност се въртят общо 3 цикъла:

   - най-вътрешният:

print("*"*c)

   който печата звездички определен брой пъти

   - по-външният:

for c in range(0, row+1):

   който печата всеки един от редовете

   - най-външният

for row in range(0, 10):

   който печата всяка пирамида при всяко свое завъртане

 

Разбира се, зависи какво точно целиш да постигнеш, но ако идеята е просто да се направи пирамида с определен брой редове, мисля че така би станало най-лесно:

for row in range(0,10):
    print("*"*row)

Надявам се, че успях да обясня :)

 

1
01/01/2019 18:58:28