Почему мой оператор возврата не показывает никаких результатов? - PullRequest
0 голосов
/ 20 июня 2020

Я пытался решить следующую задачу: Нарисуйте узор звезды, который увеличивается с каждым шагом (1-й шаг: 1 звезда, 2-й шаг: 2 звезды). Например,

*
**

Я не уверен, почему мой код не показывает никаких результатов, когда я пишу return? Когда я пишу print, он дает мне звездный результат, но также дает мне None. Могу ли я узнать, почему return или print не работают должным образом? Я использую Python 3.7. Мой код:

def string(inp):
    for i in range (inp):
        return  i*"*"

print (string(5))

Ответы [ 4 ]

1 голос
/ 20 июня 2020

Я переведу код на простой английский sh так подробно, как смогу:

Here are the rules that take a value `inp` and compute the `string` of that `inp`:
    Letting `i` take on each integer value from 0 up to but not including `inp`:
        We are done. The `string` of `inp` is equal to the string '*' repeated `i` times.

Compute the `string` of `5` and display it.

Надеюсь, проблема очевидна: мы можем выполнить задачу только один раз, и i в этот момент равно 0, поэтому наше вычисленное значение представляет собой пустую строку.

Когда я пишу print, он выдает мне звезду, но также дает мне None

Исходя из описанного поведения, я предполагаю, что вы имеете в виду, что вы пытались заменить слово return в своем коде на print, давая:

def string(inp):
    for i in range (inp):
        print(i*"*")

print (string(5))

Это дает треугольник , конечно, за исключением того, что

  • Поскольку i будет равно 0 в первый раз через l oop, печатается пустая строка; и поскольку i будет равно 4 время последнее через l oop, строки ***** нет.
  • В конце, None печатается, как вы описываете. Это происходит потому, что значение, вычисленное с помощью string, является специальным значением None, которое затем print ed, потому что вы просили его напечатать (print(string(5))).

In Python, каждый вызов функции будет возвращать значение, когда оно возвращается, независимо от того, используете ли вы return и указываете ли вы значение return. По умолчанию используется это специальное значение None, которое является уникальным объектом своего типа. При печати он отображается с текстом None, но отличается от строки с этим текстом (точно так же, как целое число 5 отличается от строки "5").

Могу ли я узнать, почему return или print не работают должным образом?

Они работают точно так, как задумано. return определяет результат вызова функции и может произойти только один раз для каждой функции и не вызывает ничего для отображения. print отображает то, что ему дано.

Если вы используете несколько значений от sh до return в вызове, вам нужно обойти это ограничение - либо с помощью генератора вместо этого (как в ответах @ MadPhysicist или @ wjandrea) или с использованием какого-то одного структурированного элемента данных, который содержит все эти значения (например, список или кортеж).

1 голос
/ 20 июня 2020

Использование return не выводит результат, используйте что-то вроде этого:

def string(inp):
  for i in range (inp):
    print(i*"*")

string(5)

также будет напечатано только 4, если вы его сделаете

for i in range(inp + 1):

Он будет работать как предназначен, надеюсь, это поможет!

1 голос
/ 20 июня 2020

range начинается с 0, а return завершает функцию, что означает, что string всегда будет возвращать пустую строку.

Вот один из возможных вариантов получения ожидаемого результата:

def stars(n):
    for i in range(1, n+1):  # Add one to start and stop
        print(i * "*")  # Print inside the function

stars(2)  # Don't print outside the function

Вывод:

*
**

Если вам нужно печатать вне функции, вы можете использовать генератор :

def stars(n):
    for i in range(1, n+1):
        yield i * "*"  # "yield" is like "return" but can be used more than once

for s in stars(2):
    print(s)  # Print each string that gets yielded

# Or print all at once, using the "splat" unpacking operator
print(*stars(5), sep='\n')
0 голосов
/ 20 июня 2020

Повторяющаяся функция, которая сохраняет состояние между вызовами, является генератором. Чтобы создать функцию генератора, измените ключевое слово return на yield:

def string(n):
    for i in range(n):
        yield (i + 1) * '*'

. Вызов этой версии string вернет генератор, который выдает новую строку желаемого результата на каждой итерации.

Чтобы напечатать:

for line in string(5):
    print(line)

Чтобы напечатать все сразу:

print('\n'.join(string(5)))
...