我的代码用于Tic Tac Toe游戏并检查绘制状态,但我认为这个问题在一般意义上可能更有用.
我有一个代表董事会的清单,它看起来像这样:
board = [1,2,3,4,5,6,7,8,9]
Run Code Online (Sandbox Code Playgroud)
当一个玩家移动时,他们移动的int被替换为他们的标记('x'或'o'),我已经有检查到位以寻找获胜状态,我不能做的是检查抽签state,其中没有列表值是整数但是尚未设置获胜状态.
我到目前为止的代码:
if any(board) != playerOne or any(board) != playerTwo:
print 'continue'
elif all(board) == playerOne or playerTwo:
print 'Draw'
Run Code Online (Sandbox Code Playgroud)
if语句有效,elif没有,我认为问题是我的'或'运算符,我要检查的是:如果主板上的每个项目都是playerOne标记或playerTwo标记,如果我在哪里做码:
elif all(board) == playerOne or all(board) == playerTwo:
Run Code Online (Sandbox Code Playgroud)
我会检查看板上的每个位置是否为playerOne或者板上的每个位置都是playerTwo,它不会.
那么如何通过playerOne标记和playerTwo标记的组合来检查棋盘是否被占用?
Eri*_*lun 66
all并且any是可迭代的函数并确定...
True:如果该可迭代中的所有值都是非all();any():如果该可迭代中的任何值为非x.在空迭代的情况下,上述定义也是有意义的,否则可以更自然地说bool(x) == False看到所有值是否为真,并且x看到是否有任何值为真.
所以你误解了这些功能的工作原理.因此,以下内容完全不符合您的想法:
if any(foobars) == big_foobar:
Run Code Online (Sandbox Code Playgroud)
...因为bool(x) == True首先会被评估为any(foobars)或者True,然后将该布尔值进行比较False,这通常总是给你big_foobar(除非False碰巧是相同的布尔值).
注意: iterable可以是一个列表,但它也可以是生成器/生成器表达式(≈惰性评估/生成列表)或任何其他迭代器.
你想要的是:
if any(x == big_foobar for x in foobars):
Run Code Online (Sandbox Code Playgroud)
它基本上首先构造一个迭代,产生一个布尔序列 - 对于每个项目big_foobar,它比较项目foobars并将结果布尔值发送到结果序列:
tmp = (x == big_foobar for x in foobars)
Run Code Online (Sandbox Code Playgroud)
然后big_foobar遍历所有项目any并tmp在找到第一个True项目后立即返回.就好像你做了以下事情:
foobars = ['big', 'small', 'medium', 'nice', 'ugly']
big_foobar = 'big'
any(['big' == big_foobar, 'small' == big_foobar, 'medium' == big_foobar, ...])
Run Code Online (Sandbox Code Playgroud)
注意:正如DSM指出的那样,True相当于any(x == y for x in xs)但后者更易读,写得更快,运行速度更快.
一些例子:
any(x > 5 for x in range(4)) # => False
all(isinstance(x, int) for x in range(10)) # => True
any(x == 'Erik' for x in ['Erik', 'John', 'Jane', 'Jim']) # => True
all([True, True, True, False, True]) # => False
Run Code Online (Sandbox Code Playgroud)
我强烈建议简单地在Python shell上使用y in xs和any使用各种输入,或者更好的是,在IPython shell上,在继续编写实际代码之前了解其工作原理.
另见:http://docs.python.org/2/library/functions.html#all