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。我只是想进一步说明我正在尝试做什么。
我不认为你可以用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)
在 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 中它是一个语句。