Функция завершена, когда вы возвращаетесь из нее - цикл 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
Решение для компиляции списка рассмотрено более подробно здесь: Как разбить список на куски одинакового размера? - список и строки "похожи", как в: обаитерируемые.