为什么`letter ==“A”或“an”`总是评估为True?

时间:2010-12-05 17:15:56

标签: python if-statement syntax or-operator

请查看代码。我正在用一辆机器人汽车画一个字母,在这段代码中,当我输入b时,它仍会画一个小盒子。

import create

# Draw a:
def drawa():
 #create robot
 robot = create.Create(4)
 #switch robot to full mode
 robot.toFullMode()
 for i in range(1280):
  robot.go(20,30)
 robot.stop()
 robot.move(-40,20)

# Draw b:
def drawb():
 #create robot
 robot = create.Create(4)
 #switch robot to full mode
 robot.toFullMode()
 robot.move(-100,20)
 for i in range(1270):
  robot.go(20,-30)
 robot.stop()

# Draw c:
def drawc():
 #create robot
 robot = create.Create(4)
 #switch robot to full mode
 robot.toFullMode()
 for i in range(700):
  robot.go(20,30)
 robot.stop()

# Define Main Function
def main():
 # While loop
 while(True):
  # Prompt user to enter a letter
  letter = raw_input("Please enter the letter you want to draw: ")
  # If user enters the letter a, draw a
  if letter=="A" or "a":
   drawa()
  # If user enters the letter b, draw b
  elif letter=="B" or "b":
   drawb();
  # If user enters the letter c, draw c
  elif letter=="C" or "c":
   drawc();
  # If user enters anything other than a letter from a-z,
  # ask them to enter a valid input
  else:
   print("Please enter a letter from a-z.")

main()

请帮忙。

6 个答案:

答案 0 :(得分:8)

这是因为你的条件。当你说...

if letter == "A" or "a"

......你实际上在说......

if it's true that 'letter' equals 'A', or is true that 'a'

...和"a",作为非空字符串,始终计算为true。您不是在letter的右侧or询问任何内容。这样做:

if letter == "A" or letter == "a"

或者,因为我们在python:

if letter in ["A", "a"]

干杯!

答案 1 :(得分:1)

if letter=="A" or "a":不正确。使用if letter == "A" or letter == "a":

您的代码求值为if yourcondition or True(布尔上下文中的非空strng为true),这基本上意味着if True

同样适用于其他条件。

答案 2 :(得分:0)

你不需要Python中的分号。

另外,请执行letter = letter.lower(),以便将案例简化为if letter = 'a':

这对我有用 -

# Define Main Function
def main():
 # While loop
 while True:
  # Prompt user to enter a letter
  letter = raw_input("Please enter the letter you want to draw: ").lower()

  # If user enters the letter a, draw a
  if letter == "a":
    print "in A: %s" % letter
  # If user enters the letter b, draw b
  elif letter == "b":
    print "in B: %s" % letter
  # If user enters the letter c, draw c
  elif letter == "c":
    print "in C: %s" % letter
  # If user enters anything other than a letter from a-z,
  # ask them to enter a valid input
  else:
    print("Please enter a letter from a-z.")

main()

答案 3 :(得分:0)

letter == "B" or "b"

不符合您的想法。它询问字母是否等于“B”,如果不是,则返回'b'。

请改为:

letter.lower() == 'b'

答案 4 :(得分:0)

 if letter in ('A', 'a'):
  drawa()
 # If user enters the letter b, draw b
 elif letter in ('B', 'b'):
  drawb()

这是你应该如何写它,原因已经给出。请注意,它最好是元组('A', 'a')而不是列表。

答案 5 :(得分:0)

问题在于您的if/elif语句 - 例如,由于operator precedence,第一个letter=="A" or "a"逻辑表达式的评估方式与此((letter=="A") or ("a"))一样,因此将始终评估为{ {1}}即使该字母不等于True"A"部分始终为True ,因为or "a"不是空字符串) 。有很多方法可以解决这个问题 - 最简单的方法可能只是将表达式更改为遵循此模式"a",这个模式的评估方式与letter=="A" or letter=="a"类似。

您可以使用我[有点争议] answer中显示的技术大大简化((letter=="A") or (letter=="a"))逻辑到类似的问题。将它应用于您正在执行的操作可能会产生以下内容:

if/elif/else