Как написать функцию, которая возвращает цикл? - PullRequest
0 голосов
/ 28 августа 2018

Я хотел бы знать, может ли функция возвращать цикл?

Мой код выглядит следующим образом:

def looping():
    a = [25,50,75,100, 200, 300]
    for x in a:
        return x
print(looping())

Когда я распечатал его, он вернул:

Выход:

[25]

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

25
50
75
100
200
300

Возможно ли это?

Ответы [ 3 ]

0 голосов
/ 28 августа 2018

Во-первых, проблема с вашим существующим кодом заключается в том, что после того, как вы return, функция закончена. Итак, вы просто возвращаете первое значение и все готово.


Функция не может вернуть цикл, потому что цикл не является своего рода значением.

Функция может возвращать итерируемый , который является значением, которое может быть зациклено. Есть несколько способов сделать это:


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

Но yield внутри цикла это просто неуклюжий способ сделать yield from, так что на самом деле, вы должны просто сделать это:

def looping():
    a = [25, 50, 75, 100, 200, 300]
    yield from a
for x in looping():
    print(x)

Вместо этого вы можете вернуть итератор напрямую:

def looping():
    a = [25, 50, 75, 100, 200, 300]
    return iter(a)
for x in looping():
    print(x)

Или, проще всего: последовательность, такая как список, так же итеративна, как итератор. Итак, если у вас есть список, просто верните его:

def looping():
    a = [25, 50, 75, 100, 200, 300]
    return a
for x in looping():
    print(x)

Пока мы на этом, вам даже не нужен явный цикл там. Вы можете вызвать функцию, которая скрывает цикл внутри, например join:

print('\n'.join(looping()))

Или вы можете даже разделить итерацию прямо на print:

print(*looping(), sep='\n')

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

0 голосов
/ 28 августа 2018

Это можно сделать без цикла, используя только join и map:

>>> print('\n'.join(map(str,a)))

Но, если вы ищете цикл, то использование return - неправильный путь, поскольку return вернет управление из функции в самом первом столкновении.

Вместо этого используйте yield или yield from:

Выход из итерируемого по сути является просто сокращенной формой for item in iterable: yield item

>>> def looping(): 
        a = [25,50,75,100, 200, 300] 
        yield from a

>>> for ele in looping(): 
        print(ele)

# значения драйвера:

IN : a = [25,50,75,100, 200, 300]
OUT: 25
     50
     75
     100
     200
     300
0 голосов
/ 28 августа 2018

Если вы просто хотите вывести содержимое списка, вы можете использовать функцию .join().

print("\n".join([str(x) for x in a]))

Если вы хотите использовать циклы, используйте генератор и напишите цикл снаружи, как показано.

def looping():
    a = [25, 50, 75, 100, 200, 300]
    for x in a:
        yield x

for x in looping():
    print(x)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...