Как я могу вернуть несколько значений, таких как печать в Python 3? - PullRequest
0 голосов
/ 25 ноября 2018

Например, если я использую print, это дает мне 101 238 157 и None.

i = 0
while i < 3:
  champion = matchList['matches'][i]['champion']
  i = i + 1
  print(champion)

Но если я использую RETURN, возвращается только 101. Так что я могу сделать?

Ответы [ 4 ]

0 голосов
/ 25 ноября 2018

return может иметь только одно значение (это может быть объект типа списка или что-то еще) ... почему?Просто потому, что return - это значение, которое принимает функция.В данный момент вы делаете присвоение функции, например

def champs()
     return MJ KD LBJ

champ = champs()

Таким образом, число должно быть MJ, KD и LBJ одновременно ... невозможно концептуально.Но мы можем вернуть список!


Прежде всего, используйте цикл for, более компактный для чтения и делайте то же самое:

for i in range(3):
    champion = matchList['matches'][i]['champion']
    print(champion)

Теперь используйте списокчемпионы:

champions = []
for i in range(3):
    champion = matchList['matches'][i]['champion']
    champions.append(champion)
    print (champion)

Более компактно:

champions = []
for i in range(3):
    champions.append(matchList['matches'][i]['champion'])
    print(champions)

теперь вы можете вернуть его в виде функции:

    def getChamp(matchList):
        champions = []
        for i in range(3):
            champions.append(matchList['matches'][i]['champion'])
        return champions

Возможно, вы хотели бы сделатьцикл for более динамичный:

def getChamp(matchList):
        champions = []
        for match in range(len(matchList['matches'])):
            champions.append(matchList['matches'][match]['champion'])
        return champions

Это более питонический способ

def getChamp(matchList):
        for match in matchList['matches']:
            yield match['champion']
        yield None

Надеюсь, это то, что вам нужно было сделать!

0 голосов
/ 25 ноября 2018

Есть несколько способов сделать это, но следующий способ проще использовать range и for loop.Данные будут списком ваших результатов.Вы можете попробовать yeild также

data=[matchList['matches'][i]['champion'] for i in range(3)]
0 голосов
/ 25 ноября 2018

Добавить все значения в одну переменную и вернуть ее.

def get_my_value():
    values = []
    for i in range(3):
        champion = matchList['matches'][i]['champion']
        values.append(champion)
    return values

data = get_my_value()
0 голосов
/ 25 ноября 2018

Вы можете либо собрать все значения и return их сразу, либо yield каждое значение одно за другим :

# initial match list
matchList = {'matches': [{'champion': champ} for champ in (101, 238, 157, None)]}

def all_at_once():
    result = []
    for match in matchList['matches']:
        result.append(match['champion'])
    return result

def one_after_another():
    for match in matchList['matches']:
        yield match['champion']

Оба из них обеспечивают итерацию -вы можете использовать их в for циклах, передавать их в list или деструктурировать их, например:

for item in one_after_another():
    print(item)

print(*all_at_once())

first, second, third, *rest = one_after_another()
print(first, second, third)

Поскольку ваше преобразование отображается непосредственно из одной формы в другую, вы можете выразить обав форме понимания , а также:

all_at_once = [match['champion'] for match in matchList['matches']]
one_after_another = (match['champion'] for match in matchList['matches'])

Хотя оба предоставляют итерируемость, оба не эквивалентны.return означает, что вы строите весь список заранее, тогда как yield лениво вычисляет каждое значение.

def print_all_at_once():
    result = []
    for i in range(3):
        print(i)
        result.append(i)
    return result

def print_one_after_another():
    for i in range(3):
        print(i)
        yield i

# prints 0, 1, 2, 0, 1, 2
for item in print_all_at_once():
    print(item)

# print 0, 0, 1, 1, 2, 2
for item in print_one_after_another():
    print(item)

Когда вы return список, вы также можете повторно использовать его содержимое,Напротив, когда вы yield каждое значение, оно исчезает после использования:

returned = print_all_at_once()  # already prints as list is built
print('returned', *returned)  # prints all values
print('returned', *returned)  # still prints all values

yielded = print_one_after_another()  # no print as nothing consumed yet
print('yielded', *yielded)  # prints all values and value generation
print('yielded', *yielded)  # prints no values
...