2

オブジェクトに「ティックを追加」するメソッドを書いています。(「目盛りを追加する」という意味は私の質問には関係ありません。私のコードサンプルでは「バッチ」変数を無視することもできます。)すべての目盛りは同じ幅と長さになりますが、目盛りの位置は異なります。呼び出しごとに可変数のティックにすることができます。現在、私の方法は次のようになります。

    def addTicks(self, batch, (w,l), *ticks):
        for tick in ticks:
             # create Tick at location tick with width 'w' and length 'l'

これは、次のように呼び出すとうまく機能します。

self.addTicks(self.tickBatch, (3,10), 5, 15, 25, 35, 45, 55)

しかし、0 から 59 までのすべての整数位置に目盛りを追加したい場合、すべての数字を入力したくありません。現在、私は次のように呼んでいます:

self.addTicks(self.tickBatch, (2,7), *[i for i in range(0,60)])

つまり、範囲を作成し、リスト内包表記を介してそれをリストに変換し、呼び出し時にそのリストをアンパックして、メソッドがタプルとしてパックされたリストを受け取ることができるようにします。それは機能しますが、コードを読んでいる他の人にとっては少し面倒で混乱する可能性があります。

私の質問は次のとおりです。

  1. 経験豊富な Python プログラマーは、私のようにその構造につまずくでしょうか?
  2. 同じ効果を達成するためのより良い方法はありますか?
  3. メソッドのシグネチャを変更する必要がありますか? に置き換えることができることはわかっています*tickstickList、それを呼び出すたびに、目盛りの値をリストで囲む必要があり、それは私にはうるさいようです。

(これは Python 2.7 用です)


編集:ユーザーフリークは、 *range(0,60) が機能するという答えをくれました。機能していることはわかりますが、どう説明すればよいかわかりません。「イテレータをアンパック」しましたが、何が得られるのでしょうか? これはリストではなく、タプルでもありません。「イテレータの要素」とだけ言いますか? (Python は問題なくプログラムできますが、話すのが難しいだけです)。


編集:さて、リストに切り替えました(そして、幅と長さのペアの展開を停止しました)。私のメソッドは次のようになりました

def addTicks(self, batch, tickDimensions, ticks):

これは、次のように呼び出していることを意味します。

self.addTicks(self.tickBatch, (2,7), range(0,60))
self.addTicks(self.tickBatch, (3,10), [15, 25, 35, 45, 55, 5])

range私の最初の本能は、範囲外のリストを作成することですが、リストと同じくらい反復可能であるため、直接渡すことができることに気付くのは Pythonic だと思いますか?

4

1 に答える 1

2

オプション(3)を使用し、最初から目盛りをリストに保存します。私の意見では、余分に入力する必要があることは大きな問題ではなく、 Zen of Python[]から離れた観点から見ると、リストを持つことにはいくつかの利点があります。

  • リストを受け取る関数は、可変引数関数よりも単純です。
  • 可変引数の代わりにリストを使用すると、ティックがシーケンスであることがより明確になります。
  • リストを使用する場合、ティックを関数に渡す明白な方法は 1 つだけです。一方、varargs を使用する場合、(この質問の存在が示すように) 物事はあまり明白ではありません。

考慮すべき別の可能性は、関数をループ内で呼び出すaddTicks関数に変更することで、問題を完全に回避することです。addTick(関数が実際にどのように機能するかによって、これは良い考えかもしれませんし、そうでないかもしれません)

于 2016-07-02T00:51:45.953 に答える