从循环中返回元素,一次一个

Jay*_*Jay -3 python dictionary

我有一个简单的函数来解析.csv,如下所示

def grabber3(datafile):

with open(datafile, 'rb') as f:
    r =csv.DictReader(f)
    for line in r:
        del line['thisthing']
        print line
Run Code Online (Sandbox Code Playgroud)

这样可以正确地打印每条dict线,大约50行,如

{'NetworkStatus': '1', 'ID': '1469'}
{'NetworkStatus': '1', 'ID': '1470'}
etc etc
Run Code Online (Sandbox Code Playgroud)

但是我想在调用函数时返回这个,所以我将print语句更改为return as

def grabber3(datafile):

with open(datafile, 'rb') as f:
    r =csv.DictReader(f)
    for line in r:
        del line['thisthing']
    return line
Run Code Online (Sandbox Code Playgroud)

但它只返回第一行

{'NetworkStatus': '1', 'ID': '1469'}
Run Code Online (Sandbox Code Playgroud)

如何返回循环/所有dict行的每一行而不是第一行?

sha*_*aan 7

这样做的有效方法是使用yield:

def grabber3(datafile):
    with open(datafile, 'rb') as f:
        r =csv.DictReader(f)
        for line in r:
            del line['thisthing']
            yield line
Run Code Online (Sandbox Code Playgroud)

然后在调用此函数的代码中,您可以执行以下操作:

dict_generator = grabber3(a_file)
Run Code Online (Sandbox Code Playgroud)

然后迭代这个dict_generator:

for a_dict in dict_generator:
    print a_dict
Run Code Online (Sandbox Code Playgroud)

更多关于yield和发电机在这里:

  1. https://wiki.python.org/moin/Generators
  2. "yield"关键字在Python中的作用是什么?