当我使用代码时:
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是否应该阻止此错误?
答案 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()