制御構造(ループ)
コマンドを繰り返し実行する方法
Python のスクリプトを作っていると
同じ、または似たようなコマンドを何度も繰り返し実行しなければならない場合がよくあります。
Python においてそのように同じコマンドを繰り返して実行しなければならない場合には for, while などを使用します。
ループを終了するための条件には条件演算子を使用します。
for, while, の文法
- for
-
for 文は一番よく使用されるループの構文です。
for 変数 in オブジェクト:
Python文1
[else:]
[Python文2]
Python文1 と Python文2 はインデントされている必要があります。
オブジェクトには、リスト・タプル・辞書・文字列・ジェネレータなどが使われます。
for 文では以下のように実行が進みます。
- オブジェクトから要素をひとつ取り出します。
- 取り出した要素を変数に代入します。
- Python文1を実行します。
- オブジェクトから次の要素をひとつ取り出します。
- 2. 3. 4. をオブジェクトの要素がなくなるまで繰り返します。
- もし、else があれば for の繰り返しが終わったとき Python文2 を実行します。
- while
-
while 文は以下のような構文になっています。
while(条件式):
Python文
Python文 はインデントされている必要があります。
while では以下のように処理が進みます。
- "条件式" が成り立つかどうか調べます。
成り立っていれば 2. に進みます。
成り立っていなければループを終了します。
- Python 文を実行します。
- 1. に戻ります。
continue と break
ループの途中で処理の流れを変更するために continue と break が使用されます。
- continue
- ループ内の処理を中断して、
ループの最初から処理を実行し直します。
- break
- ループ内の処理を中断して、
ループをただちに終了します。
for 文の場合、else の Python文は部分は実行されません。
条件演算子
上の説明に出てきた条件式の部分には以下のような条件演算子を使用します。
これらの演算子の左右に変数や文字列・数値などのオブジェクトなどや、
グループ化された条件式を書いて条件式を表します。
- ==, is
- 左右が等しい
- !=, is not
- 左右が等しくない
- <
- 左が右より小さい
- >
- 左が右より大きい
- <=
- 左が右より小さいか等しい
- >=
- 左が右より大きいか等しい
- and
- 左右の条件がどちらも成り立つ場合
- or
- 左右の条件がどちらかが成り立つ場合
- not
- 条件の否定
- ( )
- 条件式のグループ化
条件が成り立つ条件
Python において、条件が成り立つというのは以下の場合です。
- True
- 0 と 0.0 以外の数値
- 空ではないリスト・タプル・辞書型
逆に、条件が成り立たないというのは以下の場合です。
- False
- 0 または 0.0
- 空のリスト・タプル・辞書型
条件演算子の例
- i < 10
- i が 10 未満の場合に条件が成り立ちます。
10 を含まないことに注意してください。
- x <= 5
- x が 5 以下の場合に条件が成り立ちます。
5 を含むことに注意してください。
- x >= 7.5
- x が 7.5 以上の場合に条件が成り立ちます。
7.5 を含むことに注意してください。
- y == z
- y と z が等しい場合に条件が成り立ちます。
- y is z
- y と z が等しい場合に条件が成り立ちます。
- s != "test"
- s が文字列 "test" と等しくない場合に条件が成り立ちます。
- not s is "test"
- s が文字列 "test" と等しくない場合に条件が成り立ちます。
- a == b and c == d
- a が b と等しいという条件と、c が d と等しいという条件が
同時に成り立つ場合に条件が成り立ちます。
- e != f or g != h
- e が f と等しくないか、または、g が h と等しくない場合に条件が成り立ちます。
両方の条件のどちらか一方が成り立てばよいのですが、
両方が同時に成り立っていてもかまわないことに注意してください。
Tips
条件演算子を使用して while文を使う場合は、
必ずいつかは条件が成り立たなくなるように条件式を組み立ててください。
そうしないとループが永久に終らなくなり、Maya で他の処理ができなくなってしまいます。
そうなると最悪の場合 Maya を強制終了しなくてはならなくなります。
しかし、時にはわざと永久ループを作る必要がある場合もあります。
そのような場合には、以下のような文を使用します。
for, while の使用例
以下の例では、いづれも変数 i をループの実行回数をかぞえるカウンターとして使っています。
range 関数
range() は、与えられた引数によってリストを作る関数です。
>>> range(5)
[0, 1, 2, 3, 4]
>>> range(5, 10)
[5, 6, 7, 8, 9]
>>> range(1, 10, 2)
[1, 3, 5, 7, 9]
>>> range(10, 5, -1)
[10, 9, 8, 7, 6]
ループの使用例
for 文を使って、
球を原点(0, 0, 0)を中心に半径 rad の円上に
num 個並べる Python スクリプトを作ってみましょう。
- 以下の MEL スクリプトを Python スクリプトに書き直して、
circleSphere1.py という名前で保存してください。
global proc circleSphere1(float $rad, int $num)
{
int $i;
float $r = 0.0;
float $add = 360.0 / $num;
for($i = 0; $i < $num; $i++)
{
sphere;
move $rad 0 0;
rotate -ws -p 0 0 0 0 $r 0;
$r += $add;
}
}
- 以下の Python スクリプトを circleSphere1.py という名前で作ります。
import maya.cmds
def circleSphere1(rad, num):
r = 0.0
add = 360.0 / num
for i in range(num):
maya.cmds.sphere()
maya.cmds.move(rad, 0, 0)
maya.cmds.rotate(0, r, 0, ws=True, p=(0, 0, 0))
r += add
- スクリプト エディタ の によって circleSphere1.py を読み込んで、テンキーの Enter キーなどで実行します。
- スクリプト エディタ のインプットウインドウで circleSphere1(5.0, 6) と打ち込んで実行します。
- 半径1の球が半径 5 の円上に 6 個作られます。
スクリプトの解説
import maya.cmds
- maya.cmds モジュールをインポートします。
def circleSphere1(rad, num):
- 円の半径を表す float の引数(rad)と、
球の個数を表す引数(num)をとる関数です。
r = 0.0
- 球を回転させるための角度を入れておく変数です。
最初は回転させないので 0.0 を代入しておきます。
add = 360.0 / num
- 角度の増分を入れておくための変数です。
360 度(円の 1 周の角度)を球の個数(num)で除算しています。
for i in range(num):
- num 回 for ループを実行します。
以下は for ループ内の処理です。
range(num) は 0 から num - 1 までの数値が並んだリストを作成します。
たとえば、num が 10 を指しているとすると、
range(num) は以下のリストを作成します。
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
maya.cmds.sphere()
- NURBS の球体を作ります。
maya.cmds.move(rad, 0, 0)
- 球を(rad, 0, 0)の位置に移動します。
maya.cmds.rotate(0, r, 0, ws=True, p=(0, 0, 0))
- 移動された球をワールドスペース内で(0, 0, 0)を中心として Y 軸周りに r だけ回転します。
各フラグの意味は以下の通りです。
- 0 r 0
- X軸周りに 0 度、Y 軸周りに r 度、Z 軸周りに 0 度回転させます。
- ws=True
- ワールドスペースで回転させます。
ローカル座標で回転させても意味の無いことに注意してください。
- p=(0, 0, 0)
- 回転の中心を(0, 0, 0)にします。
r += add
- 次の回転角度を求めます。
練習
- 上の circleSphere1.py を参考にして circleSphere2.py という Python スクリプトを作り、球の半径も引数で変えることができるようにしてみましょう。
球の半径を表す引数を 1 番目に追加してください。
circleSphere2(球の半径, 円の半径, 円上の球の個数)
例えば、スクリプト エディタ から読み込んで circleSphere2(3.0, 5.0, 6) を実行すると、半径 3.0 の球が半径 5.0 の円上に 6 個作られるようにします。
- 上の circleSphere2.py を参考にして circleSphere3.py という Python スクリプトを作り、 球が2重に並ぶようにしてみましょう。
ただし、内側と外側の球が接するように並ぶようにし、
内側の球が並ぶ円の半径が 2 番目の引数になるようにしてください。
すべての球は同じ半径にしてください。
circleSphere3(球の半径, 円の半径, 円上の球の個数)
例えば、スクリプト エディタ から読み込んで circleSphere3(2.0, 5.0, 6) を実行すると、以下の図のように球が並ぶようにしましょう。
まとめ
- コマンドの繰り返しにはループを使用します。
ループには
for, while
などの種類があります。
- while ループの続行・終了の判定には条件式を使用します。
条件式は条件演算子によって組み立てられます。
参考
Prev | Next
Home | Contents
Mail