質問: Python3(3.5.2)で引数を1つとり、その引数に応じてfor文のステップ数を変更する方法をご教示ください。 具体的には以下動作です。(以下は考えの説明をするための疑似コードです。実際には機能しません) コマンドラインにて python ./test.py 100 と実行した場合 引数が50までは以下のような1ずつ増分するfor文処理を実施します。 ``` for i in range(0, args[0], 1): #50まで *hogehoge* ``` 50からは以下のような0.5ずつ増分するfor文処理を実施します。 ``` for i in range(50, args[0], 0.5): *hogehoge* ``` つまりこの例では、*hogehoge*処理は、全部で150回実施されます。 (0から50が50回、50から100が100回) このとき、*hogehoge* 部分の処理は同じです。 if文で分割すれば処理可能ですが、*hogehoge*部分の処理が同じであり、 可能ならば1つのfor文で簡潔に表現したいと考えております。 ご教示ください。 以上
回答: hogehoge部分の処理が共通しているからといって,異なるステップ幅のfor文をひとつにまとめるのはお勧めしません.なぜならfor文は共通した処理をまとめるためのものではないからです. 共通した処理をまとめるPythonの機能として関数があります. なので,二つのfor文でhogehogeを実行する関数を呼び出すようにするのがこの場合は適切でしょう. 次のようにします. ``` def do_hogehoge(): *hogehoge* for i in range(0, 50, 1): do_hogehoge() for i in range(50, args[0], 0.5): do_hogehoge() ``` [追記] `range`のステップ幅はintegerである必要がありました.なので上のコードは動きません. ``` range(50, args[0], 0.5) ``` を ``` [0.1*t for t in range(500, args[0]*10, 5)] ``` などとするか,`numpy.arange`を使って ``` numpy.arange(50, args[0], 0.5) ``` などとする必要があります.ただし`args[0]`はintegerと仮定しています.