我在Python3中有一个filter
,我正在使用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)
是否有一种方法,我可以从这个lambda函数内打印row
的值?我想我需要这样做因为row
只作用于。例如,如果这是一个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。我只是想进一步说明我要做的是什么
我不认为你可以用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)
通用Python在lambda中打印调试信息而不改变其语义的X技巧:
原始:lambda: 4
检测:
lambda: (print (3), 4) [1]
解释:
元组的两个参数都将被求值。
左边的一个,print (3)
在这个例子中,完全依赖于一个副作用,即在这种情况下,它将打印一些东西。你可以在这里调用任何函数,因为任何Python函数都会返回一个值。如果缺少返回语句,该值将是Python预定义的值None
。这并不重要,因为返回值不会在任何地方使用。
第二个参数,在示例中是4
,可以是任何表达式,包括函数调用或对functor(带重载圆括号的对象)的调用。此参数由lambda函数通过选择[1]
返回,即元组的第二个元素(Python中的索引从0开始)。
这在Python 3中特别起作用的原因。x是print
在这里是一个"非常普通"的函数,而在Python 2中。
您可以直接打印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)
python无法在匿名函数中执行多条语句。我建议将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)
问题是print(row)
返回None
,您必须对它做些什么。