Python 列表理解中的多重打印功能

Python 列表理解中的多重打印功能,python,python-2.7,python-3.x,for-loop,list-comprehension,Python,Python 2.7,Python 3.x,For Loop,List Comprehension,这篇文章的目标是在列表理解中加入多个打印函数,以直观地了解列表中发生的事情 重要提示: 此不应用于除教育目的和试图理解代码以外的任何目的 如果您使用的是Python2.x,则需要添加将来的导入(在我粘贴的代码中),否则打印将无法工作。只有函数在列表理解中起作用。在2.x中打印不作为功能运行。或者…切换到Python3.x 这是最初的问题: ## Using future to switch Print to a function from __future__ import

这篇文章的目标是在列表理解中加入多个打印函数,以直观地了解列表中发生的事情

重要提示:

  • 不应用于除教育目的和试图理解代码以外的任何目的
  • 如果您使用的是Python2.x,则需要添加将来的导入(在我粘贴的代码中),否则打印将无法工作。只有函数在列表理解中起作用。在2.x中打印不作为功能运行。或者…切换到Python3.x
这是最初的问题:

    ## Using future to switch Print to a function
    from __future__ import print_function 

    reg = []
    for x in [1,2,3]:
        for y in [3,1,4]:
            print('looping through',x,'then',y)
            if x == y:
                print('success',x,y)
                reg.append((x,y))
    print(reg)
这是没有打印语句的等效列表理解

    from __future__ import print_function 
    comp = [(x,y) for x in [1,2,3] for y in [3,1,4] if x == y] 
    print(comp)
那么,有没有办法放入一堆打印语句,以便两个代码都打印相同的内容


使用原始问题的解决方案进行编辑: 使用评论中的方法-我已经弄明白了

假设你想转换这个

    from __future__ import print_function 

    x = 1
    y = 2
    z = 1
    n = 2

    [[a,b,c] for a in range(x+1) for b in range(y+1) for c in range(z+1) if a + b + c != n]
添加打印语句以打印每个循环,显示循环是否失败

    from __future__ import print_function 

    x = 1
    y = 2
    z = 1
    n = 2

    [
        [a,b,c] for a in range(x+1) for b in range(y+1) for c in range(z+1) if 
        (print('current loop is',a,b,c) or a + b + c != n)
        and
        (print('condition true at',a,b,c) or True)
    ]
实际上,唯一改变的是最后的条件

    (a + b + c != n) 


其他信息: 因此,在评论部分有一些好东西,我认为也会帮助其他人。我是一个视觉学习者,所以这个网站很棒


(归功于Tadhg McDonald Jensen)

我认为您不应该在列表理解中运行调试代码,也就是说,如果您想这样做,您可以将代码封装在如下函数中:

from __future__ import print_function


def foo(x, y):
    print('looping through', x, 'then', y)
    if x == y:
        print('success', x, y)
        return (x, y)

comp = [foo(x, y) for x in [1, 2, 3] for y in [3, 1, 4] if x == y]
print(comp)

介绍了列表理解,其中说明:

建议允许有条件地构造列表文本 使用for和if子句。它们将以相同的方式嵌套循环 如果语句现在嵌套

列表理解的设计目的是替换仅使用
for
循环、
if
条件和
方法形成列表的结构。每次迭代一次追加
方法。任何附加结构在列表理解中都是不可能的,因此除非您将打印内容粘贴到允许的组件中,否则无法添加它们

也就是说,在条件语句中添加打印语句(虽然技术上可行)是非常不推荐的

[a for a in x if print("this is a bad way to test",a)]

您需要评估
print
函数,但返回值没有用处,因为它总是
None
。您可以使用
/
将其与另一个表达式组合

comp = [(x,y) for x in [1,2,3] for y in [3,1,4] if (print('looping through',x,'then',y) or x == y) and (print('success', x, y) or True)]

我真的希望你这样做只是为了教育目的,因为这太难看了。仅仅因为你能做某事并不意味着你应该做。

不要使用列表理解来产生副作用,比如打印东西。如果你不能浏览列表理解并理解发生了什么,你就不应该使用列表理解(使用显式循环)。我实际上没有编写任何代码-当我从高级程序员那里读取代码时,我需要它。然后使用调试器并逐步完成代码。如果您想了解关系(和转换)在长手循环和理解之间,可以直观地看到两者之间的关系。是的,我实际上尝试过这一点-如果我可以保留原始条件,并添加打印语句,这将非常有用…作为奖励,在其他地方添加打印语句,看看其他地方会发生什么。我回答的全部要点是,你不能添加额外的打印语句,因为列表理解不是这样工作的。你不应该像我展示的代码那样添加打印语句..在发布的三个答案中,这是唯一一个真正回答了问题“有没有办法放入一堆打印语句以便两个代码打印相同的内容?”。奇怪的是,@jhub1接受了BPL的答案,但实际上并没有打印相同的内容。我得到了纠正。在那次漫长的讨论中,没有人提到任何错误,所以我接受了它,认为这是最接近我所寻找的。
comp = [(x,y) for x in [1,2,3] for y in [3,1,4] if (print('looping through',x,'then',y) or x == y) and (print('success', x, y) or True)]