プログラミング未経験者がpythonを学んでみる Part2 ~基本文法編2~

プログラミング未経験者がpythonを学んでみる Part2 ~基本文法編2~

# 概要
プログラミング未経験者がpythonを学ぶ第２弾
前回はこちら
https://qiita.com/n_oshima/items/1153329469e0c3bda943

# 基本的な文法2

## ユーザーから入力を得る方法

### ユーザに値を入力してもらう

ユーザーから入力を得たい場合は、`input()`関数を使用する

```:簡単な例
$ cat 001.py
name = input("名前は？")
print(name+"さん、こんにちわ")

$ python 001.py
名前は？マルフォイ　⬅️（キーボードで入力後、Enter）
マルフォイさん、こんにちわ
```

### 型を合わせる
pythonでは、計算を行う場合は`数値と数値`、
文字を結合する場合は`文字列と文字列`ではなくてはならない
もし、数値と文字列といった型の違うデータを処理する場合は
どちらかの型に変換する必要がある。

|関数          |説明          |
|:---------|:---------|
|   str(v)       | vを文字列型に変換       |
|   float(s)       |    sを浮動小数点数型に変換    |
|   int(s)       |   sを整数型に変換     |
|          |        |


### 変数の型を調べる

変数の型を調べるための`type()`関数が用意されている

```
>>> v = 1234.567
>>> type(v)
<class 'float'>
>>> 
>>> s = "test"
>>> type(s)
<class 'str'>
```

### カラットをグラムに変換するスクリプトを作ってみる

```
$ cat 002.py
per_ct = 0.2
user = input("何カラットですか？")
ct = float(user)
g = ct * per_ct
print(f"{ct}カラット =  {g}グラムです")

$ python 002.py
何カラットですか？5  ⬅️（キーボードで入力後、Enter）
5.0カラット =  1.0グラムです
```

テキストでは最後の行はformatメソッドを使用していますが
前回の記事のコメントで教えていただいた
`f-strings(書式化済み文字列リテラル)`を使ってみました。便利！


### 時給計算スクリプトを作ってみる

```
$ cat 003.py
user = input("時給はいくらですか？")
jikyu = int(user)

user = input("何時間働きましたか？")
jikan = int(user)

kyuryo = jikyu * jikan

print(f"時給{jikyu}円で{jikan}時間働いたので、給料は{kyuryo}円です")

$ python 003.py
時給はいくらですか？800   ⬅️（キーボードで入力後、Enter）
何時間働きましたか？5   ⬅️（キーボードで入力後、Enter）
時給800円で5時間働いたので、給料は4000円です
```

## 制御構文(1) 分岐条件について

### 分岐条件とは
制御構文の中でも`条件分岐` は最も基本的な構文である
日本語で例えるなら

もし＊＊＊であれば＊＊＊する
そうでなければ＊＊＊する

と言うことができる。

### 分岐条件if構文の使い方

Pythonで分岐条件を使う時は`if`構文を使う
ある条件を元にして、その条件が正しい時(真の時)と
正しくない時(偽の時)で、プログラムの動作を変更することができます。
この時`else:`以下の部分については、省略することも可能
そして、if構文の比較式の部分には、条件を比較するための式を書く

比較式に使用できる比較演算子は以下の通り

|関数          |説明          |
|:---------|:---------|
|   a == b       |  aとbが等しい      |
|    a != b     |  aとbが等しくない      |
|  a > b        |  aがbより大きい      |
|   a >= b       |  aがb以上      |
|   a < b       |    aがbより小さい    |
|   a <= b       |    aがb以下    |

比較演算子を使うと、数値の大小を比較する事ができる

```
>>> 5 == 5
True
>>> 5 != 5
False
>>> 
>>> 5 > 1
True
>>> 
>>> 5 < 1
False
>>> 
>>> 5 >= 6
False
>>> 
>>> 5 >= 4
True
```

また、文字列を比較することも可能


```
>>> s = "test"
>>> 
>>> s == "tesy"
False
>>> 
>>> s == "test"
True
```

### インデントについて
pythonでは、インデント(文字下げ)が重要な意味を持ち
同じスペース数でインデントされている部分は同じブロックと見なされる
インデントはスペース4文字を使う事が推奨されている

```
$ cat 004.py

num = int(input("数字を入力"))
if num % 2 == 0: # 入力された数値を2で割って余りが0ならば
	print("偶数です")
else: #それ以外(余りが1)であれば
	print("奇数です")

$ python 004.py
数字を入力2 ⬅️（キーボードで数値を入力後、Enter）
偶数です

```

### 真偽型(bool型)について

真(True)と偽(False)の2つだけの値をもつ`真偽型(bool型)`がある
`真偽型(bool型)`は、他の文字列型や整数型と同じようにデータ型の一種である

そして、if構文の条件式には、この真偽型の値か比較式を指定することになっている
言い換えると、比較式の返す値は真偽型になっていると言う事

```
>>> a = 100
>>> a >=10
True
```

### 真偽型同士の演算に使う論理演算について
複数の真偽型の組み合わせに関する演算を`論理演算`と言う
真偽型は２つある時、それが真と偽のどちらであるかを求める演算

|関数          |説明          |
|:---------|:---------|
|   a or b       |  a あるいは b のどちらかであれば真、それ外であれば偽      |
|   a and b      |    a と b の両方が真ならば真、それ以外であれば偽    |
|   not a       |  aが真ならば偽、偽ならば真      |



and演算は、2つの値が共にTrueである時のみTrueを返し
それ以外はFalseを返す

```:and演算の例
>>> True and True
True
>>> 
>>> True and False
False
>>> 
>>> False and Flse
False
>>> 
>>> a = 100
>>> (30 <= a) and (a < 50) # 30以上50未満か
False
>>> 
>>> a = 40
>>> (30 <= a) and (a < 50) # 30以上50未満か
True
```

or演算は、2つの値のどちらかが真であればTrueを返す

```:or演算の例
>>> True or True
True
>>> 
>>> True or False
True
>>> 
>>> False or False
False
>>> 
>>> a = 100
>>> (a <= 30) or (a >= 50) # 30以下か50k以上か
True
>>> 
>>> a = 40
>>> (a <= 30) or (a >= 50) # 30以下か50k以上か
False
```


not演算は、TrueであればFalse、FalseであればTrueを返す

```:not演算の例
>>> not True
False
>>> 
>>> not False
True
>>> 
>>> not (10 > 1)
False
>>> 
>>> not (10 < 1)
True
>>> 
```

### if構文を入れ子にする
 
pythonでは、インデントの深さによって、ブロックを区別している
以下のプログラムでは2つのif構文を入れ子状態にしており
インデントレベルのあっているifとelseがそれぞれに対応している


```
$ cat 005.py

num = int(input("数値を入力"))

if num % 2 == 0:
    if num >= 30:
        print(str(num) + "は偶数で30以上")
    else:
        print(str(num) + "は偶数で30より小さい")
else:
    print(str(num) + "は奇数。")

$ python 005.py
数値を入力50
50は偶数で30以上です。
```

### 順に条件を判定していくelifについて
ifelを使用する事で、条件を直列的に判定できるようになる

```
$ cat 006.py

num = int(input("数値を入力"))

if num < 10: # 10より小さければ
    print(str(num) + "は10より小さい数字")
elif 10 <= num and num <50: # 50より大きければ
    print(str(num) + "は10以上、50より下の数字")
else: # それ以外であれば
    print(str(num) + "は50以上の数字")
    
$ python 006.py
数値を入力30
30は10以上、50より下の数字
```

### 何もしないpass文
if構文で真だった場合は何もせず、偽の場合のみ処理を行いたい場合は
`pass`をしようする事ができる

```
num = int(input("数値を入力"))

if num == 10:
	pass
else:
	print("10ではありません")
```

## 短文のif構文について
条件が真のみ、かつ処理が単文の場合は、
インデントを使わず、`:` で繋げて1行で表現することも可能

```
num = int(input("数値を入力"))

if num == 10: print("10です")
```

## 制御構文(2) 繰り返しについて

### 条件つき繰り返しwhile構文について

pythonにはいくつかの繰り返し構文があるが
`while`はその中でも単純な繰り返しの構文である
ある条件式を与えると、その条件が真の間処理を繰り返す

if構文で`else`を省略できたように、while構文でも`else`を省略可能
以下プログラムは、ガソリンがある間は車が走ると言うプログラム

```
$ cat 007.py
gas = 3
while gas > 0:
    print("+ 走る")
    print("| ガソリン =", gas)
    gas -= 1
else:
    print("ガソリンが切れました")

$ python 007.py
+ 走る
| ガソリン = 3
+ 走る
| ガソリン = 2
+ 走る
| ガソリン = 1
ガソリンが切れました
```

プログラム5行目の`gas -= 1`は、変数gasの値を1つ減らして
gasに代入するろいった意味になり、`gas = gas - 1` と同義となる


|          |説明          |
|:---------|:---------|
|  変数 += 1	        |  変数の値を1つ増やす      |
|   変数 -= 1       |   変数の値を1つ減らす     |


### 何度も繰り返したい場合

while構文に与えた値が条件式において常に真であれば、プログラムは繰り返される
そのため、繰り返し実行したい場合は、while構文を使うことで繰り返し実行する事できる

```
$ cat 008.py
while True:
    m = int(input("メートルは？"))
    yd = m * 1.0936
    print(f"{m}メートルは、{yd}ヤードです")

$ python 008.py
メートルは？10
10メートルは、10.936ヤードです
メートルは？20
20メートルは、21.872ヤードです
メートルは？30
30メートルは、32.808ヤードです
メートルは？
```

### 無限ループに注意

上記プログラムの場合、終了させる為には`Ctrl+c`で強制終了させる必要がある
その為、ユーザがコマンド入力によって終了できるよう改良する

```
$ cat 009.py

while True:
    m = (input("メートルは？"))
    if m == "" or m == "q": break
    m = int(m)
    yd = m * 1.0936
    print(f"{m}メートルは、{yd}ヤードです")

$ python 009.py
メートルは？2
2メートルは、2.1872ヤードです
メートルは？3
3メートルは、3.2807999999999997ヤードです
メートルは？q

```

`braek`を挿入する事で、`while`の繰り返しから脱出する事ができる

### 範囲つき繰り返しのfor構文について

for構文は以下の書式で利用ができる
こちらも`else`は省略可能


```
for ループ変数 in 範囲:
	# 繰り返す処理
else:
	# 繰り返し後の処理
```

for構文の範囲には色々な値を指定できるが、ここでは数値で範囲を指定する`range()`関数を使用してみる

以下は`range(5)`と指定し、５回処理を繰り返す方法
特に指定がなければ、処理は0からスタートする

```
$ cat 010.py
for i in range(5):
	print(i)

$ python 010.py
0
1
2
3
4
```

### 1から10までを足す

ここでは、for構文を利用して1から10までを順番に足していくプログラムについて説明する
先ほど利用したrange関数では、開始値を終了値を指定する事ができる

```:range関数の使い方
① range(回数)
② range(開始値, 終了値)
③ range(開始値,終了値, ステップ値)
```

②③のように、②つ以上の値を指定している場合は、実際には終了値+1を指定する必要がある
例えば、1から10であれば `range(1, 11)` と指定する
③のステップ値を指定すると、2ずつ増やしたり、-1などを指定して値を減らすことも可能

```
$ cat 011.py
v = 0
for i in range(1, 11):
    v = v + i
    print(i, "を足すと", v)
print("1から10を足すと", v)

$ python 011.py
1 を足すと 1
2 を足すと 3
3 を足すと 6
4 を足すと 10
5 を足すと 15
6 を足すと 21
7 を足すと 28
8 を足すと 36
9 を足すと 45
10 を足すと 55
1から10を足すと 55
```

### 画面に繰り返し描写してみる
ここでは、for構文と`tkinter`というモジュールを使用して
画像に線を300本引く処理を説明する

以下は、3ピクセル毎に縦線を300本引くプログラム

```
# グラフィックライブラリを取り込む
from tkinter import *

# 画像の初期化
w = Canvas(Tk(), width=900, height=400)
w.pack()

# 線を引く
for i in range(300):
    x = i * 3
    w.create_line(x, 0, x, 400, fill="#FF0000")

# 画面を表示して待機
mainloop()
```

実行結果

<img width="909" alt="スクリーンショット 2018-05-20 1.25.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/255236/b50e9fa1-9bfb-5ad5-89be-a7b27212292a.png">


`tkinter`モジュールはpythonからGUIを構築・操作すすための標準ライブラリ
`Canvas()`や`Tk()`を使うと、グラフィカルな画面を表示する事ができ、
`create_line()`メソッドで線を描写する事が可能


以下は、赤と青の線を交互に引くプログラム

```
# グラフィックライブラリを取り込む
from tkinter import *

# 画像の初期化
w = Canvas(Tk(), width=900, height=400)
w.pack()

# 線を引く
for i in range(100):
    x = i * 9
    if i % 2 == 0:
        c = "#ff0000"
    else:
        c = "#0000FF"
    w.create_line(x, 0, x, 400, fill=c)

# 画面を表示して待機
mainloop()
```

実行結果

<img width="905" alt="スクリーンショット 2018-05-20 1.36.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/255236/494c185c-a2d7-2a90-5f08-0fef08d5aa5a.png">


## 繰り返し中止のbreakと継続のcontinue

繰り返し処理を実行している途中で、何かしらの理由で処理を中断したい場合は、`break`を利用する

以下は、10回繰り返し処理の中で3回目の繰り返しで処理を中断するプログラム

```
$ cat 012.py
for i in range(10):
    print(i)
    if i == 2 : break

$ python 012.py
0
1
2
```

### continuについて
繰り返し処理の中で、ある部分だけを繰り返したい場合に使うのが`continue`

`continu`を使う事で、1つ目の処理を終えた時点でそれ以降の処理を実行せず、スキップして次の繰り返し処理を始める事ができる

以下は、iが2の時のみ`hello`を出力しないプログラム

```
$ cat 013.py
for i in range(5):
    print("i =", i)
    if i == 2 : continue
    print("hello")

$ python 013.py
i = 0
hello
i = 1
hello
i = 2
i = 3
hello
i = 4
hello
```

### FizzBazzゲームを書いてみる
Qiitaでも度々目にするが、FizzBuzzとは英語圏でパーティなどで行われるゲームである

ルールは、何人かが順々に1,2,3,4...と数字をカウント指定き、3で割り切れる場合は`Fizz`、5で割り切れる場合は`Buzz`、3でも5でも割り切れる場合は`FizzBazz`と発言するゲーム

以下は、FizzBazzの答えを表示するプログラム

```
$ cat 014.py
for i in range(1, 21):
    if i % 15 == 0:
        print("Fizz Bazz")
        continue
    if i % 3 == 0:
        print("Fizz")
        continue
    if i % 5 == 0:
        print("Buzz")
        continue
    print(i)

$ python 014.py
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
Fizz Bazz
16
17
Fizz
19
Buzz
```