6

filter在 Python3 中有一个使用 lambda 函数应用的。这是我的功能:

affy_reader = csv.DictReader(filter(lambda row:
                                    not row[0].startswith('#') and
                                    str(row[0]).isdigit(),
                                    file_pointer), 
                             delimiter='\t',
                             fieldnames=affy_column_headers)

有没有办法可以打印row这个 lambda 函数中的值?我认为我需要这样做,因为row仅在 lambda 范围内。例如,如果这是一个 LISP Lambda 程序,我相信我可以这样做:

affy_reader = csv.DictReader(filter(lambda row: print(row) 
                                    not row[0].startswith('#') and
                                    str(row[0]).isdigit(),
                                    file_pointer), 
                             delimiter='\t',
                             fieldnames=affy_column_headers)

因为print()是在线读取和执行的。Python中有什么方法可以做到这一点吗?或者如果没有,我看到这个值的好方法是什么?谢谢!

*我意识到我的“LISP”示例是 Python 而不是 LISP。我只是想进一步说明我正在尝试做什么。

4

5 回答 5

6

我不认为你可以用lambda. 只需定义一个辅助函数。这样,您还可以显示某行是否要被过滤:

def filter_plus_print(row):
    result = not row[0].startswith('#') and str(row[0]).isdigit()
    print("Keeping:" if result else "Removing:", row)
    return result

然后做

affy_reader = csv.DictReader(filter(filter_plus_print, file_pointer), 
                             delimiter='\t',
                             fieldnames=affy_column_headers)
于 2013-06-06T18:03:23.923 回答
4

在不改变其语义的情况下,在 lambda 中打印调试信息的通用 Python 3.x 技巧:

原来的:

lambda: 4

仪表化:

lambda: (print (3), 4) [1]

解释:

元组的两个参数都将被评估。

在这个例子中,左边print (3)的那个纯粹依赖于副作用,即在这种情况下它会打印一些东西。你可以在这里调用任何函数,因为任何 Python 函数都会返回一个值。None如果缺少 return 语句,此值将是 Python 预定义的值。这无关紧要,因为返回值不会在任何地方使用。

在示例中,第二个参数4可以是任何表达式,包括函数调用或对仿函数的调用(带有重载圆括号的对象)。该参数由 lambda 函数通过选择返回[1],即元组的第二个元素(Python 中的索引从 0 开始)。

这在 Python 3.x 中特别有效的原因是它print是一个“非常普通”的函数,而在 Python 2.x 中它是一个语句。

于 2017-02-13T12:40:14.110 回答
0

您可以file_pointer通过直接打印来查看其中的值。

print(file_pointer)
affy_reader = csv.DictReader(filter(lambda row:
                                    not row[0].startswith('#') and
                                    str(row[0]).isdigit(),
                                    file_pointer), 
                             delimiter='\t',
                             fieldnames=affy_column_headers)
于 2013-06-06T18:04:55.007 回答
0

没有 Pythonic 方法可以在匿名函数中执行多个语句。我建议将 lambda 分解为一个命名函数,如下所示:

def relevant(row):
    print(row)
    return not row[0].startswith('#') and str(row[0]).isdigit()

affy_reader = csv.DictReader(filter(relevant, file_pointer), 
                             delimiter='\t',
                             fieldnames=affy_column_headers)
于 2013-06-06T18:06:11.223 回答
0

问题是print(row)返回None,你必须对它做点什么。在大多数情况下相当不愉快。

于 2013-06-06T18:06:15.507 回答