Return 循环中的多个列表值

Return Multiple List Values in Loop

这是我使用的代码:

import csv
    
my_list = ['a', 'b','c','d']
    
def listIterations(inputcsv):
    for i in inputcsv:
        x = str(i)
        return x

print(listIterations(my_list))

这是输出:a

这是所需的输出:

a
b
c
d

我希望它遍历列表并分别输出每个元素。

最终我将使用此函数将列表提供给另一个函数。

请记住,return x 的意思是“结束函数,并传递值 'x'”,因此 return x 行在循环的第一次迭代中结束您的函数,并传递任何值'x' 是。这就是为什么您只得到 a,列表中的第一项。

一般来说你说的是Generator。使用生成器,您可以通过这段代码实现这一点:

def listIterations(inputcsv):
    for i in inputcsv:
        yield str(i)

或更短:

def listIterations(inputcsv):
    yield from inputcsv

有关更详细的答案,请参阅 this question

然而,在您描述的特定情况下,也可以通过功能结构来实现。

map(lambda x: print(x), my_list)

通常 map 用于将一个 iterable 中的值替换为根据输入值计算的其他值,但如果您只是将所有值映射到 None 并作为副作用打印它们。但是请注意,这被认为是在函数运算符(如 map)中引起副作用的不良做法,它与函数式编程的基本概念非常矛盾(感谢 @C.Nivs 指出这一点)。

return 替换为 yield 以将您的函数转换为生成器函数。当您调用它时,它 returns 一个生成器对象,您可以在空闲时对其进行迭代以一次生成您想要的结果:

def listIterations(inputcsv):
    for i in inputcsv:
        yield str(i)
>>> listIterations(my_list)
<generator object listIterations at 0x00000237062CC350>

您将只能使用此对象一次。由于您的输入是一个列表,您总是可以多次调用 listIterations 来获得一个新的生成器。要打印,请对生成器执行 star-expand:

print(*listIterations(my_list), sep='\n')

将生成器扩展到参数列表中会 运行 它,并将每个元素传递给 print。如果你想永久记录生成的值,将它们展开成一个列表:

generated_values = list(listIterations(my_list))

或一个元组:

generated_values = tuple(*listIterations(my_list))

您可以用同样的方式打印隐藏值:

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

综上所述,如果您只需要一个列表迭代器,您可以使用内置 iter:

获得一个
iter(my_list)

这等同于(对于列表):

def listIterations(somelist):
    yield from somelist
listIterations(my_list)