制御構造(ループ)

コマンドを繰り返し実行する方法

Python のスクリプトを作っていると 同じ、または似たようなコマンドを何度も繰り返し実行しなければならない場合がよくあります。
Python においてそのように同じコマンドを繰り返して実行しなければならない場合には for, while などを使用します。
ループを終了するための条件には条件演算子を使用します。

for, while, の文法

for
for 文は一番よく使用されるループの構文です。
for 変数 in オブジェクト:
    Python文1
[else:]
    [Python文2]
Python文1 と Python文2 はインデントされている必要があります。
オブジェクトには、リスト・タプル・辞書・文字列・ジェネレータなどが使われます。
for 文では以下のように実行が進みます。
  1. オブジェクトから要素をひとつ取り出します。
  2. 取り出した要素を変数に代入します。
  3. Python文1を実行します。
  4. オブジェクトから次の要素をひとつ取り出します。
  5. 2. 3. 4. をオブジェクトの要素がなくなるまで繰り返します。
  6. もし、else があれば for の繰り返しが終わったとき Python文2 を実行します。
while
while 文は以下のような構文になっています。
while(条件式):
    Python文
Python文 はインデントされている必要があります。
while では以下のように処理が進みます。
  1. "条件式" が成り立つかどうか調べます。
    成り立っていれば 2. に進みます。
    成り立っていなければループを終了します。
  2. Python 文を実行します。
  3. 1. に戻ります。

continue と break

ループの途中で処理の流れを変更するために continuebreak が使用されます。

continue
ループ内の処理を中断して、 ループの最初から処理を実行し直します。
break
ループ内の処理を中断して、 ループをただちに終了します。
for 文の場合、else の Python文は部分は実行されません。

条件演算子

上の説明に出てきた条件式の部分には以下のような条件演算子を使用します。
これらの演算子の左右に変数や文字列・数値などのオブジェクトなどや、 グループ化された条件式を書いて条件式を表します。

==
左右の値が等しい
is
左右のオブジェクトが等しい
!=
左右の値が等しくない
is not
左右のオブジェクトが等しくない
<
左の値が右の値より小さい
>
左の値が右の値より大きい
<=
左の値が右の値より小さいか等しい
>=
左の値が右の値より大きいか等しい
and
左右の条件がどちらも成り立つ場合
or
左右の条件がどちらかが成り立つ場合
not
条件の否定
( )
条件式のグループ化

条件が成り立つ条件

Python において、条件が成り立つというのは以下の場合です。

逆に、条件が成り立たないというのは以下の場合です。

条件演算子の例

i < 10
i が 10 未満の場合に条件が成り立ちます。
10 を含まないことに注意してください。
x <= 5
x が 5 以下の場合に条件が成り立ちます。
5 を含むことに注意してください。
x >= 7.5
x が 7.5 以上の場合に条件が成り立ちます。
7.5 を含むことに注意してください。
3 < x < 8
x が 3 以上、8 以下の場合に条件が成り立ちます。
y == z
yz の値が等しい場合に条件が成り立ちます。
y is z
yz のオブジェクトが同じ場合に条件が成り立ちます。
s == "test"
s が文字列 "test" と等しい場合に条件が成り立ちます。
s is "test" でも結果は同じです。
not s is "test"
s が文字列 "test" と等しくない場合に条件が成り立ちます。
a == b and c == d
ab と等しいという条件と、cd と等しいという条件が 同時に成り立つ場合に条件が成り立ちます。
e != f or g != h
ef と等しくないか、または、gh と等しくない場合に条件が成り立ちます。
両方の条件のどちらか一方が成り立てばよいのですが、 両方が同時に成り立っていてもかまわないことに注意してください。

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 スクリプトを作ってみましょう。

  1. 以下の 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;
    	}
    }
    
  2. 以下の 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
    
  3. スクリプト エディタ の ファイル → スクリプトのロード によって circleSphere1.py を読み込んで、テンキーの Enter キーなどで実行します。
  4. スクリプト エディタ のインプットウインドウで circleSphere1(5.0, 6) と打ち込んで実行します。
  5. 半径1の球が半径 5 の円上に 6 個作られます。
    [circleSphere1(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):
numfor ループを実行します。
以下は 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
次の回転角度を求めます。

練習

まとめ

参考


Prev | Next
Home | Contents
Mail