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

use*_*957 4 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]
Run Code Online (Sandbox Code Playgroud)

当我将此函数称为:

a = pass_username()
print a 
Run Code Online (Sandbox Code Playgroud)

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

test.csv的内容:

"test@gmail.com","rockon"
"hello@gmail.com","hey"
"hithere@gmail.com","ok"
"hellosir@gmail.com","password"
Run Code Online (Sandbox Code Playgroud)

Wes*_*Wes 5

正如其他回答说的那样,你可以将结果累积到一个列表中并返回.但另一种方式,将取代returnyield引起你的函数返回产生当你决定后遍历它(可能带有for循环),你得到的物品可迭代类型的对象.

请参阅:"yield"关键字在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())
Run Code Online (Sandbox Code Playgroud)

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