<p>只需使用<code>+</code>即可将两个列表或两个元组组合成一个:</p>
<pre><code>can.coords(oval1, *(moveLeft() + addThirty(moveLeft())))
</code></pre>
<p>即使您有不同类型的序列(甚至迭代器),也可以始终转换它们:</p>
<pre><code>can.coords(oval1, *(moveLeft() + tuple(addThirty(moveLeft())))))
</code></pre>
<p>然而,你真的应该退一步,问为什么这需要一行放在首位。它从屏幕的右边缘滚动,需要足够复杂的括号,您必须仔细考虑才能理解它,等等。为什么不这样做:</p>
<pre><code>top, left = moveLeft()
bottom, right = addThirty(moveLeft())
can.coords(oval1, top, left, bottom, right)
</code></pre>
<hr/>
<p>你在评论中说:</p>
<blockquote>
<p>I can't do this because I want the coordinates to change every time I press the button. So the button needs to : execute both functions to modify the coordinates and pass them to can.coords () in one time.</p>
</blockquote>
<p>仅仅把它放在一行是做不到的,甚至有助于使这更容易。按照编写的方式,调用<code>can.coords</code>一次,并将结果返回值作为命令传递。那不是你想要的。您需要传递的是一个<em>函数</em>,它完成所有这些事情。你知道吗</p>
<p>这意味着你肯定想把它分成多行。例如:</p>
<pre><code>def update_coords():
top, left = moveLeft()
bottom, right = addThirty(moveLeft())
can.coords(oval1, top, left, bottom, right)
Button(wind, text = 'Left', command=update_coords)
</code></pre>
<p>因为把它放在一行的唯一方法是用一个等价的<code>lambda</code>或<code>partial</code>,它甚至比一个调用更不可读;比如:</p>
<pre><code>Button(wind, text = 'Left', command=lambda: can.coords(oval1, *(moveLeft() + addThirty(moveLeft()))))
</code></pre>
<hr/>
<p>为了解释传递函数与调用函数及其返回值之间的区别,让我们举一个更简单的例子:</p>
<pre><code>>>> def foo():
... return 2
>>> print(foo)
<function foo at 0x12345678>
>>> print(foo())
2
</code></pre>
<p>在这里,应该很清楚区别是什么。<code>foo</code>是一个表达式,其值是函数<code>foo</code>本身。但是<code>foo()</code>是一个表达式,它的值是通过调用不带参数的<code>foo</code>,然后使用返回的内容(在本例中为<code>2</code>)来确定的。你知道吗</p>
<p>如果我们把事情弄复杂一点,也没什么不同:</p>
<pre><code>>>> def bar(x, y):
... return x+y
>>> print(bar)
<function bar at 0x12345680>
>>> print(bar(2, 3))
6
</code></pre>
<p>所以,很明显,你可以传递<code>bar</code>本身,或者你可以传递<code>6</code>你从<code>bar(2, 3)</code>得到的<code>6</code>…但是如果你想传递一个可以不带参数调用的函数,并返回<code>bar(2, 3)</code>将返回的相同的东西呢?好吧,你没有这样的东西,你必须创造它。你知道吗</p>
<p>您可以通过两种方式完成此操作:创建新函数:</p>
<pre><code>>>> def new_function():
... return bar(2, 3)
</code></pre>
<p>…或部分评估功能:</p>
<pre><code>>>> new_function = partial(bar, 2, 3)
</code></pre>
<p>您的案例增加了一些额外的麻烦:您是从绑定方法而不是函数开始的,您需要确保每次运行新函数时都对参数进行求值(因为每次调用<code>moveLeft()</code>两次而不是仅仅调用一次与每次调用<code>can.coords</code>一样重要),并且您有一堆你的处境很复杂。但这些皱纹都不会让事情变得更困难,你只要看看过去:</p>
<pre><code>>>> def new_function():
... can.coords(oval1, *(moveLeft() + addThirty(moveLeft())))
</code></pre>
<p>(编写partial要困难得多,因为您必须将一系列函数组合在一起才能得到参数,您也需要对这些参数进行partial…但是在Python中,只要partial不是无关紧要的事情,就不要试图弄清楚,只需编写一个显式函数即可。)</p>