Python: вернуть список - PullRequest
       26

Python: вернуть список

0 голосов
/ 25 апреля 2020

Я посмотрел на несколько ответов для функции и возврата, и я не уверен, что получу это. Я получаю возврат заканчивает функцию. Мой возвращает только одну строку, когда их несколько в текстовом файле.

def readList(champs):
    for i in range(len(champs)):
        champ = champs[i]
        return(str(i+93) + " - " + champ)

Под моим main ()

        if command == "see":
            readChamps = readList(champs)
            print(readChamps)

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

93 - Манчестер Юнайтед

94 - Манчестер Юнайтед

95 - Блэкберн Роверс

Текущий результат:

93 - Манчестер Юнайтед

Я понимаю, используя печать для def readList (champs) :, но я хочу понять, как вызывать возврат. Я не мог получить доходность на работу ни.

Ответы [ 4 ]

2 голосов
/ 25 апреля 2020

Когда вы пишете сами, return завершает функцию, поэтому l oop выполняется ровно один раз.

Вы можете использовать понимание списка и enumerate:

def readList(champs):
    return ['{} - {}'.format(i, champ) for i, champ in enumerate(champs, 93)]

Либо создайте список, .append к нему и верните его в конце:

def readList(champs):
    output = []
    for i, champ in enumerate(champs, 93):
        output.append('{} - {}'.format(i, champ))
    return output
2 голосов
/ 25 апреля 2020

У вас есть return внутри вашего l oop, что приводит к завершению функции на первой итерации l oop.

Если вы просто хотите напечатать строки, вы можете сделать следующее:

def readList(champs):
    for i, champ in enumerate(champs):
        print(str(i+93) + " - " + champ)

и в вашем main:

if command == "see":
    readList(champs)

Если вы хотите вернуть значения из readList, вы должны сделать это после завершения sh вашего л oop:

def readList(champs):
    output = []
    for i, champ in enumerate(champs):
        output.append(str(i+93) + " - " + champ)
    return output

# and in your main:
readChamps = readList(champs) 
print(readChamps)

# readChamps is a list of strings. If you want to print it line by line, try:
for i in readChamps:
    print(i)
1 голос
/ 25 апреля 2020

Попробуйте это: -

def readlist(champs):
    champs = [str(i+93) + "-" + champs[i] for i in range(len(champs))]
    return champs
0 голосов
/ 25 апреля 2020

Если вы хотите «вернуть» значение без завершения функции, вы можете использовать yield вместо return. Это делает результат итератором значений вместо одного значения.

def readList(champs):
    for i in range(len(champs)):
        champ = champs[i]
        yield (str(i+93) + " - " + champ)

Затем, чтобы распечатать его, вы можете распаковать итератор с помощью *. Может быть, как

print(*readList(champs), sep='\n')

Или вы можете использовать для l oop как

for line in readList(champs):
    print(line)

Это будет печатать одну строку за раз, а не все сразу, что может быть Вы хотите, если число строк велико.


Этот подход, использующий yield, может быть лучше, чем печать непосредственно внутри функции readList(), поскольку он позволяет избежать побочных эффектов, что означает, что вы можете сделать больше, чем просто напечатать это. Вы также можете сохранить результат в файл, например.

Этот подход также может быть лучше, чем сохранить его в список и вернуть весь список, если количество элементов велико, потому что он может обрабатывать один в время и не нужно сохранять их все в памяти сразу 1025 * для имен функций. Если вы используете enumerate() вместо range(), вам не нужно искать champ самостоятельно каждый l oop с индексом. И вы можете начать считать с 93, так что вам больше не нужно его добавлять. F-строки автоматически преобразуют то, что они интерполируют, поэтому вам не нужно вызывать str() самостоятельно.

...