奇怪的python语法,或在print语句中

时间:2015-07-23 23:09:05

标签: python syntax

我找不到任何相关内容,所以我不得不在这里问。对于那些熟悉python的人来说,我确信这是一个简单的问题。

python 2:

print raw_input() == 0 or hash(tuple(map(int, raw_input().split(' '))))

python 3:

print(input()==0 or hash(tuple(map(int,input().strip().split()))))

我试图理解为什么'或'在打印声明中。 有问题的代码在print语句中有一个布尔运算符,比较boolean和int。这就是我需要向我解释的内容。它显然特定于python。在input()== 0返回true的情况下,代码会打印什么?我们如何比较布尔值和散列值,再次,我们在print语句中进行布尔比较的是什么?

3 个答案:

答案 0 :(得分:2)

在Python中,与orand的比较使用了两个功能:

  1. Truthy and falsey values
  2. Short-circuiting
  3. 所以,当你有这样的事情时:

    print(input()==0 or hash(tuple(map(int,input().strip().split()))))
    

    它将遵循操作顺序,检查input()是否返回0。由于or是下一个词,如果它是真的,那么下一个词对结果没有影响,也不会被评估。如果发生这种情况,它会打印True,因为这是input()==0返回的内容。

    如果这是假的,它将评估下一部分,获取输入,将其映射为整数,将其转换为元组,并对其进行散列。然后它将返回该哈希值,无论它是否为真值(0以外的数字,包含内容的序列或集合等)。

答案 1 :(得分:1)

Python将首先评估input()==0是否为True。如果是,则Python将打印它并忽略该行的其余部分。如果输入不等于0并且评估为False,那么它将被忽略,并且无论其如何评估,都将打印的其余部分。因此,即使该行的其余部分评估为False,Python也会打印其结果。

更清晰的例子是根据用户输入设置某些内容的名称,并要求默认值。

name = raw_input("What is your name?")
print ("So your name is...")
print (name or "John Smith")

name将被评估为TrueFalse。由于空字符串将被视为False,如果用户输入任何内容,则Python将在or运算符后打印默认名称。

答案 2 :(得分:0)

我猜你的代码是Python3,否则input()的结果不太可能有strip方法。

以下是代码的长形式,并附有解释。

# Read a line of input. Returns a string.
a = input()
# Compare to integer 0, always False.
# Effectively, this ignores the first line of input.
b = a == 0
# Separate function to represent lazy evaluation.
def y():
    # Get a second line of input, as a string.
    c = input()
    # Strip leading and trailing whitespace, still a string.
    # This line is useless since split() with no argument does this.
    d = c.strip()
    # Split the line by any runs of whitespace. Returns a list of strings.
    e = d.split()
    # For each string in the list, convert it to an integer in base 10.
    # Return an iterator (not list) of ints.
    # Most people would write (int(s) for x in e) for a generator
    # comprehension, or [int(s) for x in e] for a list comprehension.
    m = map(int, e)
    # Consume the iterator into a tuple of ints.
    # Note that it can't be a list, because lists aren't hashable.
    t = tuple(m)
    # Hash the tuple, returning a single int.
    return hash(t)
# If b is truthy, set x to it. Otherwise, evaluate y() and set x to that.
# Unlike many languages, the arguments to or are *not* coerced to bool.
# Since b is False, y() will be evaluated.
x = b or y()
# Print the result of y().
# i.e. the hash of the tuple of ints on the second line.
# This is essentially a meaningless number.
print(x)