Python -在Lambda中使用print/debug语句



我在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,您必须对它做些什么。

最新更新