<p>这里要知道的关键是,可以将函数作为参数传递给另一个函数(或在列表中)。一旦你明白这个问题变得更容易解决。你知道吗</p>
<p>如果您想要列表:</p>
<pre><code>from operator import add,sub,mul,div
funcs = [add,sub,mul,div]
die = [1,2,3,4,5,6]
results = [f(x,y) if y != 0 else None for x in die for y in [g(z,w) for z in die for w in die for g in funcs] for f in funcs]
</code></pre>
<p>请注意,如果包含“无”,则通常会发生被零除的情况。你知道吗</p>
<p>不过,如果你把它分解成一个函数,会更清楚。它接受两个数字列表和一个操作列表,并返回所有结果:</p>
<pre><code>def results(funcs, xs, ys):
out = []
for f in funcs:
for x in xs:
for y in ys:
try:
out.append(f(x,y))
except ZeroDivisionError:
pass
return out
</code></pre>
<p>在被零除的情况下,这没有任何意义。使用like<code>results(funcs,die,results(funcs,die,die))</code>获得所有结果。你知道吗</p>
<p>这两种方法的结果都有很多重复之处,因此根据您实际想要做的事情,您可能希望使用<code>set</code>而不是<code>list</code>。你知道吗</p>
<p>另外,考虑一下,但是根据您计划做什么,您可以让<code>results</code>返回一个生成器:</p>
<pre><code>def results(funcs, xs, ys):
for f in funcs:
for x in xs:
for y in ys:
try:
yield f(x,y)
except ZeroDivisionError:
pass
</code></pre>
<p>如果您正在处理非常大的结果集,但只想逐个查看它们,这是一个比构建整个列表更好的选择。你知道吗</p>