Python#2_条件分岐と繰り返し

#Python入門その２

##条件分岐と繰り返し文
今回は3つの文法に触れていきます。
その前におさらいです。

・条件分岐
if文のことです。もし~~だったらだったらどうする、という処理を書きたいときに使います。

・繰り返し文
for文、while文のことです。ある処理を繰り返して行いたい時に使います。

###条件分岐
それでは、実際にif文をpythonで書くとどうなるのかをみてみます。

```php
#pythonの場合
var1 = 10
if var1 == 10:
    print("このva1の値は10です。")
```

このようになります。
それでは、これをunity(c#)で書こうとすると、次のようになります。

```php
//C#の場合
int var1 = 10;
if(var1 == 10){
   Debug.Log("このvar1の値は10です。");
}
```

***重要な異なる点は3つです***
1.条件を囲む()がいらない
2.if文全体を取り囲む{}もいらない
3.ただし、条件の後に:を記述する。

####インデントのお話
ここでpythonについてとても重要な話をします。
上のif文では始まりと終わりの{}がありませんでした。
では、どのように始まりと終わりを判断するのでしょうか？

***pythonでは、if文やfor文の中身を一段下げます。***
例えば、↓をみてください。

```php
var1 = 20
if var1 == 10:
    print("このva1の値は10です。")#①
print("ここはif文の外です。")#②
```

上の文は、①のprintは表示されません。なぜなら、var1は10ではなく、20だからです。
しかし、②のprintは表示されます。なぜなら、これはif文より下の改行の外にいるからです。

このように、文章の行頭に空白を挿入して先頭の文字を右に押しやることを***インデント***と言います。
この***インデント***がpythonを書く上で重要なカギになります。

話を条件分岐(if文)に戻します。
if文にはif...else文とif...else if文もありました。
else文とは、if文の条件を外れていた時に実行するモノです。
pythonの場合とc#の場合を比較してみましょう。

```php
#pythonの場合
var1 = 350
if var1 == 0 :
    MyLayerColor = 'red'
else :
    MyLayerColor = 'blue'
print(MyLayerColor)
```

```php
//c#の場合
int var1 = 350;
if(var1 == 0){
   MyLayerColor = "res";
}else{
   MyLayerColor = "blue";
}
Debug.Log(MyLayerColor);
```

今回もインデントが大事になります。
else文の中身はインデントを下げて、else文から出る時はインデントを戻します。
else...if文は以下のように記述します。

```php
var1 = 0
if var1 == 0 :
    print( "number is 0")
elif var1 == 1 :
    print ("number is 1")
elif var1 == 2 :
    print ("number is 2")
else :
    print ("others")
```

>ex2-1
・ある数字を入力して、その数字が10より大きければ'big'、小さければ'small'と出力するプログラムを書いてみましょう。
n = input()
でnに数字が代入できます。
・ある数字を入力して、その数字が2で割り切れれば偶数、割れなければ奇数と出力するプログラムを書いてみましょう。

###繰り返し文
ここではfor文とwhile文を紹介します。
どちらもc#にあった文法なので、書き方さえわかればできるようになると思います。
ただし、for文はc系統の言語と全然違うので、そっちに慣れていると書くのが若干めんどくさいです笑

####for文

pythonでは、for文を次のように記載します。

```php
#python
for x in range(0,10):
    print (x)
```

これで0から9までの数字が出力されます。
ここでもインデントを一つ下げることでfor文の中身を作っています。
C#だと次のように書きます

```php
//c#
for(int i = 0;i <= 10:i++){
   Debug.Log(i);
}
```

pythonでは、``カウンタ変数 in 範囲``のように書きます。
上では、Xが0から10まで、という意味です。
***pythonでは、ループが一回終わると自動でカウンタが1増えます.***
なので、i++みたいなのを書いていません。
2ずつ増やしたいときは以下のようにします。

```php
for x in range(0,10,2):
    print (x)
```

これだと、2こ飛ばしで加算されます。

####listのすべての要素で繰り返すfor文
プログラムを書いていると、リストをすべて探索したい、というときが訪れます。
その時は次のように記述します。

```php
mylist = [1,2,4,5]

for i in mylist:
    print(i)
```

1,2,4,5が順に出力されます。
例えば、リストの中で’９５’という数字があるかどうが確認したいといったときに使います。

>ex2-2
・0から100までを出力するプログラムを書いてみましょう。
・次は、100から0に向かって、100,99,98,97,,,とカウントするプログラムを書いてみましょう。(ヒント：range(開始,終了,ループ終了時にカウンタに加える数)と書きます。
・上のループを改造して、100から2こ飛ばしで0までカウントするプログラムを書いてみましょう。

####while文
while文は、実はそんなに使われません。でも重要なのでやります。
こんなふうに書きます。

```php
#python
var1 = 0
while var1 < 10:
    var1 = var1 + 1
    print (var1)
print ("ループ終了")
```

これで、上記のfor文と同じように0から9までカウントします。
みて分かる通り、for文より書くのに手間がかかります。
C#だとこんな感じです。

```php
//c#
int var1 = 0;
while(var1 < 10){
    var1 = var1 + 1;
    Debug.Log(var1);
}
Debug.Log("ループ終了");
```

while文は、特に永久にループさせたい時に使用されます。
下のように永久ループは使います。

```php
while True:
    n = input()
    if n == 10:
        break
print "end"
```

``変数名=input()``で数字を変数名の中に入れることができます。
上のプログラムでは、10と入力するまで永久にループし続け、10が入力されると、breakによってwhileの外に出ます。

####ネストについて
***ネストとは、あるものの中に、それと同じ種類か似たものが入っている構造のこと***を言います。
こう書くと、非常にむずかしそうですが、例えば、二重になっったfor文や、for文のなかにif文が入っている状態のことを指します。
上の永久ループの例がそれです。

####入力について
後々詳しくはやりますが、入力は`変数名=input()`で***数字が***入力できると言ってきました。
それでは、文字を入力したいときはどうすれば良いでしょうか？
※※※pythonのバージョンによって異なります！！
`変数名＝input()`が文字列の場合もあります。ややこしいですね。
そういうときは`変数名=int(元の変数)`で数値化できます。

文字を入力したいときは、`変数名=raw_input()`で入力させます。実際に確かめてみましょう。

```php
n = raw_input()
s = input()
print(type(n))
print(type(s))
```

以下のように出力されると思います。

```php
<type 'str'>
<type 'int'>
```

strとは文字型、intとは整数型のことです。


>ex2-3
・永久ループを使うプログラムを書きます。'hello'と入力されるまで終わらないプログラムを書いてください。
・while文を用いて、先ほどのex2-2の100から0までカウントするプログラムを書いてみてください。

>ex2-4
・0から100まで、2で割り切れる数のみ出力するプログラムを書きましょう。ただし、`for x in range(0,100,2)`は使わず、for文（またはwhile）とif文を組み合わせて書いてみましょう。
・掛け算九九を出力してみましょう。（ヒント：for文を二重に回します。）

##引用
[https://developer.rhino3d.com/guides/rhinopython/]