2 つのリストまたは 2 つのタプルをいつでも 1 つに組み合わせることができます+
:
can.coords(oval1, *(moveLeft() + addThirty(moveLeft())))
異なるタイプのシーケンス (または反復子) がある場合でも、いつでもそれらを変換できます。
can.coords(oval1, *(moveLeft() + tuple(addThirty(moveLeft())))))
ただし、実際には一歩下がって、そもそもなぜこれが 1 行である必要があるのかを尋ねる必要があります。画面の右端からスクロールし、理解するために考えなければならないほど複雑な括弧が必要です。なぜこれをしないのですか:
top, left = moveLeft()
bottom, right = addThirty(moveLeft())
can.coords(oval1, top, left, bottom, right)
コメントでは、次のように言います。
ボタンを押すたびに座標を変えたいので、これはできません。したがって、ボタンは次のことを行う必要があります: 両方の関数を実行して座標を変更し、一度に can.coords () に渡します。
1 行に入れるだけでは、そうはなりません。あなたが書いた方法では、can.coords
一度呼び出して、結果の戻り値をコマンドとして渡します。それはあなたが望むものではありません。渡す必要があるのは、これらすべてを行う関数です。
つまり、間違いなく複数の行に分割する必要があります。例えば:
def update_coords():
top, left = moveLeft()
bottom, right = addThirty(moveLeft())
can.coords(oval1, top, left, bottom, right)
Button(wind, text = 'Left', command=update_coords)
それを 1 行に収める唯一の方法は、同等のlambda
orpartial
を使用することになるため、呼び出しよりもさらに読みにくくなります。何かのようなもの:
Button(wind, text = 'Left', command=lambda: can.coords(oval1, *(moveLeft() + addThirty(moveLeft()))))
関数を渡すことと、関数を呼び出してその戻り値を渡すことの違いを説明するために、もっと簡単な例を見てみましょう。
>>> def foo():
... return 2
>>> print(foo)
<function foo at 0x12345678>
>>> print(foo())
2
ここで、違いが何であるかはかなり明確なはずです。foo
値が関数foo
自体である式です。しかし、引数なしfoo()
で呼び出すことによって値が決定される式であり、foo
返されたもの (この場合は2
) を使用します。
もう少し複雑にしても、違いはありません。
>>> def bar(x, y):
... return x+y
>>> print(bar)
<function bar at 0x12345680>
>>> print(bar(2, 3))
6
したがって、それbar
自体をどのように渡すことができるか、または6
取得したものをどのように渡すことができるかは明らかですbar(2, 3)
が、引数なしで呼び出すことができる関数を渡し、返されるものと同じものを返したい場合はどうすればよいbar(2, 3)
でしょうか? まあ、あなたはそのようなものを持っていません。作成する必要があります。
これは 2 つの方法で行うことができます: 新しい関数を作成する:
>>> def new_function():
... return bar(2, 3)
…または関数を部分的に評価する:
>>> new_function = partial(bar, 2, 3)
あなたのケースはいくつかの余分なしわを追加します:関数ではなくバインドされたメソッドから始めているため、新しい関数が実行されるたびに引数が評価されることを確認する必要があります( moveLeft()
1回ではなく毎回2回呼び出すためです)毎回呼び出すのと同じくらい重要can.coords
です)、複雑な方法で取得する引数がたくさんあります。しかし、これらのしわのどれも物事を難しくしません。あなたはそれらを過ぎて見る必要があります:
>>> def new_function():
... can.coords(oval1, *(moveLeft() + addThirty(moveLeft())))
(パーシャルは書くのがずっと難しくなります。パラメータを取得するためだけに一連の関数を一緒に構成する必要があり、これもパーシャルにする必要があります…しかし、パーシャルが Python で自明でない場合は常に、しようとしないでください。それを理解して、明示的な関数を書くだけです。)