Python - 在 Lambda 中使用打印/调试语句

Hou*_*ini 6 python lambda filter

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)
Run Code Online (Sandbox Code Playgroud)

有没有办法可以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)
Run Code Online (Sandbox Code Playgroud)

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

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

Tim*_*ker 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
Run Code Online (Sandbox Code Playgroud)

然后做

affy_reader = csv.DictReader(filter(filter_plus_print, file_pointer), 
                             delimiter='\t',
                             fieldnames=affy_column_headers)
Run Code Online (Sandbox Code Playgroud)


Jac*_*oge 5

在 lambda 中打印调试信息而不更改其语义的一般 Python 3.x 技巧:

原来的:

lambda: 4
Run Code Online (Sandbox Code Playgroud)

仪器化:

lambda: (print (3), 4) [1]
Run Code Online (Sandbox Code Playgroud)

解释:

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

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

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

它之所以在 Python 3.x 中特别有效,是因为print它是一个“完全普通”的函数,而在 Python 2.x 中它是一个语句。