Что я должен сделать, чтобы мой код не печатался "Нет"? - PullRequest
0 голосов
/ 09 июня 2019

В этом вопросе я должен обернуть текст в соответствии с заданным значением ширины. Все идет хорошо до последней части, где программа выводит «None» в конце.

Я пытался составить новый список и добавить его, но это не сработало. Вот код:

import textwrap

def wrap(string, max_width):
    i = max_width
    j=0
    length = len(string)
    while j<length:    
        word = string[j:i]
        i = i+max_width
        j = j + max_width
        print(word)
string, max_width = input(), int(input())
result = wrap(string, max_width)
print(result)

Цель состоит в том, чтобы сделать правильную функцию. Все нормально, пока программа не напечатает «Нет» в конце.

Пример ввода ABCDEFGHIJKLIMNOQRSTUVWXYZ 4

Пример вывода
ABCD
EFGH
IJKL
IMNO
QRST
UVWX
YZ

МОЙ ВЫХОД:
ABCD
EFGH
IJKL
IMNO
QRST
UVWX
YZ
Ни один

1 Ответ

0 голосов
/ 09 июня 2019

Функция завершена, когда вы возвращаетесь из нее - цикл while не имеет смысла - если он входит в цикл while, он возвращает слово - он не зацикливается.

def wrap(string, max_width):
    i = max_width
    j=0
    length = len(string)
    while j<length:    
        word = string[j:i]
        i = i+max_width
        j = j + max_width
        return word             # leaves as soon as it reaches this
    # if j not < length returns None implicitly

Если он не входит в цикл while, вы ничего не возвращаете, поэтому ваша функция возвращает неявно None.


Если вы хотите вернуть несколько результатов из вашей функции, вы можете сделать ее генератором и yield результаты:

def wrap(text,width):
    start = 0
    lentext = len(text)
    while start < lentext:  # while still stuff to yiled
        yield text[start:start+width]
        start += width   # next time start +width further to the right

string, max_width = "ABCDEFGHIJKLIMNOQRSTUVWXYZ", 4

print(*wrap(string,max_width), sep="\n")

Вывод:

ABCD
EFGH
IJKL
IMNO
QRST
UVWX
YZ

Вы можете заключить текст, используя представление списка:

string, max_width = "ABCDEFGHIJKLIMNOQRSTUVWXYZ", 4
result = [string[i:i+max_width] for i in range(0,len(string),max_width)]


print(*result, sep="\n")

Вывод:

ABCD
EFGH
IJKL
IMNO
QRST
UVWX
YZ

Решение для компиляции списка рассмотрено более подробно здесь: Как разбить список на куски одинакового размера? - список и строки "похожи", как в: обаитерируемые.

...