Python检查错误

时间:2014-02-02 06:02:20

标签: python python-3.x

当我使用代码时:

def Jack():
    global PHand
    if 11 or 24 or 37 or 50 in PHand:
        PHand.remove(11 or 24 or 37 or 50)
        PHand.append("Jack")

我收到一个错误,说list.remove(x)x不在PHand中,我的问题是,if if check是否应该阻止此错误?

3 个答案:

答案 0 :(得分:5)

您基本上是在检查11是否属实。它不为零,因此您的if始终执行。你想要的是:

if 11 in PHand or 24 in PHand or 37 in PHand or 50 in Phand:

当然,由于同样的原因,您的PHand.remove始终会尝试删除11。您无法告诉remove删除中的任何(不确定哪些内容甚至可以使用,它不在我见过的任何文档中),所以你应该结构如此:

if 11 in PHand:
   PHand.remove(11)
   PHand.append("Jack")
if 24 in PHand:
   PHand.remove(24)
   PHand.append("Jack")

......等等。

当然,你最好将它重构为循环甚至是函数,而不是重复所有代码。

答案 1 :(得分:5)

您需要迭代每个元素:

for i in (11, 24, 37, 50):   # assign i to 11, then 24, then 37, then 50
    if i in PHand:           # check each one in PHand
        PHand.remove(i)      # and remove that one
        PHand.append("Jack") # your code
        break                # end the loop. remove this to check all

否则,11 or 24 or 37 or 50 in PHand会输出11。试试吧!

>>> 11 or 24 or 37 or 50 in PHand
11

为什么呢? or的工作方式,检查第一面是否真实。如果是,它不会打扰评估其余部分,因为结果不会改变。如果它不是真的,那么它将继续下一个论点,依此类推。

in PHand是什么?实际上,首先评估的是这样的最后一个数字:

11 or 24 or 37 or (50 in PHand)

但同样,11个短路所有or s。


长话短说:

或始终返回单个值,而不是所有值一次性应用于函数,或者语法暗示。

答案 2 :(得分:1)

使用过滤器解决问题的另一种方法是:

  def Jack():
      T = [11,24,37,50]
      found = filter(lambda x:x in T, PHand)
      if found:
          [PHand.remove(x) for x in found]
          PHand.append('Jack')

  PHand = range(10,55)
  Jack()