プログラミング未経験者がpythonを学んでみる Part2 ~基本文法編2~
概要
プログラミング未経験者がpythonを学ぶ第2弾
前回はこちら
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
真偽型同士の演算に使う論理演算について
複数の真偽型の組み合わせに関する演算を論理演算
と言う
真偽型は2つある時、それが真と偽のどちらであるかを求める演算
関数 | 説明 |
---|---|
a or b | a あるいは b のどちらかであれば真、それ外であれば偽 |
a and b | a と b の両方が真ならば真、それ以外であれば偽 |
not a | aが真ならば偽、偽ならば真 |
and演算は、2つの値が共にTrueである時のみTrueを返し
それ以外はFalseを返す
>>> 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を返す
>>> 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 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)
と指定し、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(開始値,終了値, ステップ値)
②③のように、②つ以上の値を指定している場合は、実際には終了値+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()
実行結果
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()
実行結果
繰り返し中止の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