【问题标题】:'Return' keyword returns only one element from a loop?'Return' 关键字只返回循环中的一个元素?
【发布时间】:2012-12-17 10:48:15
【问题描述】:

我有一个简单的函数来读取 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 

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

test.csv 的内容:

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

【问题讨论】:

    标签: python return


    【解决方案1】:

    正如其他回答的人所说,您可以将结果累积到一个列表中并返回。不过,另一种方法是将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(),这将生成下一个用户名,而不必生成所有用户名。 p>

    【讨论】:

    • +1 用于提及生成器。尽管可迭代类型并没有真正“包含”这些项目,因为它们是按需生成的,而不是实际存储的。
    • 是的,如果不提出惰性求值之类的问题,很难准确解释它是如何工作的。我将编辑我的答案以更好地反映这一点。
    • 可能想添加一个示例代码的 sn-p —— 使用生成器比理解它们容易得多:)
    • 它返回生成器对象。我怎样才能产生所有元素?
    • 谢谢!欣赏它! :)
    【解决方案2】:

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

    您可能希望append 将结果添加到列表中,然后return 列表。

    在你的情况下,你甚至可能想使用list comprehension,所以不要使用for循环,而是使用这个:

    return [row[0] for row in spamreader]
    

    【讨论】:

      【解决方案3】:

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

      如果你想返回所有的值,将它们累积成一个列表并返回列表。

      【讨论】:

      • 当你写一个答案时很烦人,而其他人写了完全相同的东西并在你面前提交他的答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-13
      • 1970-01-01
      • 1970-01-01
      • 2020-05-07
      • 1970-01-01
      • 2021-11-05
      • 1970-01-01
      相关资源
      最近更新 更多