4

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

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 

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

test.csv 的内容:

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

3 回答 3

5

正如其他回答的人所说,您可以将结果累积到一个列表中并返回。但是,另一种方法是替换returnyieldwhich 会导致您的函数返回一个可迭代类型对象,该对象会在您决定稍后迭代它时生成您产生的项目(可能使用 for 循环)。

请参阅:Python 中的“yield”关键字有什么作用?

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

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()生成下一个用户名,而不必生成所有用户名。

于 2013-01-03T03:48:16.883 回答
2

当您调用时return,它会自动退出函数,因此在到达return语句后它不会处理任何内容。

您可能希望append将结果放到一个列表中,然后return是列表。

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

return [row[0] for row in spamreader]
于 2013-01-03T03:45:41.773 回答
1

一个函数只能返回一次。当它回来时,它就结束了。当你的函数第一次返回时,它就结束了,所以它只返回一个值。

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

于 2013-01-03T03:44:39.843 回答