オブジェクトに「ティックを追加」するメソッドを書いています。(「目盛りを追加する」という意味は私の質問には関係ありません。私のコードサンプルでは「バッチ」変数を無視することもできます。)すべての目盛りは同じ幅と長さになりますが、目盛りの位置は異なります。呼び出しごとに可変数のティックにすることができます。現在、私の方法は次のようになります。
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)])
つまり、範囲を作成し、リスト内包表記を介してそれをリストに変換し、呼び出し時にそのリストをアンパックして、メソッドがタプルとしてパックされたリストを受け取ることができるようにします。それは機能しますが、コードを読んでいる他の人にとっては少し面倒で混乱する可能性があります。
私の質問は次のとおりです。
- 経験豊富な Python プログラマーは、私のようにその構造につまずくでしょうか?
- 同じ効果を達成するためのより良い方法はありますか?
- メソッドのシグネチャを変更する必要がありますか? に置き換えることができることはわかっています
*ticks
がtickList
、それを呼び出すたびに、目盛りの値をリストで囲む必要があり、それは私にはうるさいようです。
(これは 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 だと思いますか?