'return'关键字只返回循环中的一个元素?

时间:2013-01-03 03:42:13

标签: python return

我有一个简单的函数来读取csv文件并从中提取第一个coloum:

import csv 

def pass_username():
    with open('test.csv', 'r') as csvfile:
        spamreader = csv.reader(csvfile, delimiter=',')
        for row in spamreader:
            return row[0]

当我将此功能称为:

a = pass_username()
print a 

这只打印第一个元素。但是,当我将return单词替换为print作为print row[0]并将该函数调用为pass_username()时,它会打印所有元素。我想将该函数分配给变量,因此我想使用return。如何解决?

test.csv的内容:

"test@gmail.com","rockon"
"hello@gmail.com","hey"
"hithere@gmail.com","ok"
"hellosir@gmail.com","password"

3 个答案:

答案 0 :(得分:5)

正如其他回答的人所说,你可以将结果累积到列表中并返回。另一种方法是将return替换为yield,这会导致函数返回一个可迭代的类型对象,当你决定稍后迭代它时(可能带有for循环),它会产生你产生的项目

请参阅:What does the "yield" keyword do in Python?

以下是如何在代码中使用它:

import csv 

def pass_username():
    with open('test.csv', 'r') as csvfile:
        spamreader = csv.reader(csvfile, delimiter=',')
        for row in spamreader:
            yield row[0]

username_generator = pass_username()

# iterate through the usernames with a for loop
for name in username_generator:
    print name
# call the list constructor which causes it to produce all of the names
print list(pass_username())

请记住,用户名是根据需要生成的 ,因此您可以执行username_generator.next()生成下一个用户名而无需生成所有用户名。

答案 1 :(得分:2)

当你致电return时,它会退出函数,因此它在到达return语句后不会处理任何内容。

您可能希望append将结果列入列表,然后return列表。

在您的情况下,您甚至可能想要使用list comprehension,因此请使用以下代码而不是for循环:

return [row[0] for row in spamreader]

答案 2 :(得分:1)

您只能从某个功能返回一次。当它返回时,它就结束了。函数第一次返回时,它结束,因此它只返回一个值。

如果要返回所有值,请将它们累积到列表中并返回列表。