Python基礎
Python概要
- インタプリタ言語(コンパイルを必要としない)
- Webアプリ,データ処理など様々分野で利用
注意点
- 説明ではPython3を対象とする(Python2系とPython3系はほぼ別物なので注意)
Hello World
print('Hello, World!')
-
print関数で文字列を出力 - Pythonではセミコロンや中括弧は不要(インデントでブロックを表現)
- Pythonのファイルは拡張子
.pyをつけるpython hello.py
型
- コンピュータ上ではデータが
0と1の数字で表現されるため「何」を表しているか決めるため「型」の考え方がある- 例
01000001は,型「整数」としてみると65,型「文字」としてみるとA,型「小数」(符号1ビット, 指数部3ビット,仮数部4ビット)としてみると17.0
- 例
Pythonにおける型
- 基本型
- int: 整数値
- float: 小数
- bool: 論理値(True/False)
- str: 文字列
- 基本型以外も使うことができる
print(type(1))
print(type(1.0))
print(type(True))
print(type('hello'))
<class 'int'>
<class 'float'>
<class 'bool'>
<class 'str'>
解説
-
type関数は与えられた変数の型(厳密にはクラス)を返す - 「書き方」によって型が決まる
- int:
1,-4などの小数点なしの数値 - float:
1.0,-4.0,4e+2などの小数点ありの数値もしくはeを使った指数表現 - bool:
TrueもしくはFalse - str: シングルもしくはダブルクオーテーションで囲まれた文字(どちらも同じ)
- int:
変数
- データやプログラムの実行状態を記録する場所
- 値(int, float, bool, str)を入れる「箱」
- 例
- 十歩進んだら右に曲がる
進んだ歩数を記録する必要がある
- 十歩進んだら右に曲がる
Pythonにおける変数
- プログラミング言語の大原則「どの「型」の値が入った箱か区別する必要がある」
- 整数の値が入った箱を小数と勘違いすると違う値になる
- 動的型付け言語(プログラムを実行する時に型が決まる)のため型の指定が必要ない
- 変数にはどんな「型」の値でも入る
- 入っている値を正しく読める(「型」がわかっている)
a = 1
print(a, type(a))
a = 1.0
print(a, type(a))
a = True
print(a, type(a))
a = 'hello'
print(a, type(a))
1 <class 'int'>
1.0 <class 'float'>
True <class 'bool'>
hello <class 'str'>
解説
- 変数
aに「値」が代入できている - 変数
aの「値」を参照(読み出し)できている - 変数
aの型を指定していない点に注意 - 変数
aにいろんな型を代入できている点に注意
演算子
- 四則演算(足し算
+,引き算-,かけ算*,割り算/)- int, float に対して適用可能(一応 str にも・・)
- 特殊な演算(整数除算
//,剰余%,べき乗**)- 整数除算と剰余は int に対して適用することが多い(floatに対しても適用できるけどfloatにはほとんど使わない)
- 文字列連結
+- str の足し算
文字列をつなげる
- str の足し算
a = 1/3
print(a)
a = 6/3
print(a) # 割り切れるけどfloatになることに注意
a = 10//3
print(a)
a = 'abc' + 'def'
print(a)
0.3333333333333333
2.0
3
abcdef
- 比較演算子(
==,!=,<,<=,>,>=)- 値が同じか違うか(int, float, str)
- 数値の大小比較(int, float)
- 結果はbool型で返る
print(1 == 1)
print(1 != 1)
print('abc' == 'abc')
print(1 < 3)
print(1 > 3)
print(1 <= 3)
print(3 <= 3)
print(3 < 3)
True
False
True
True
False
True
True
False
- 代入演算子(
=,+=,-=,*=,/=)- 基本動作:左辺に置かれた「変数」に値を代入する
-
=: 右辺の値をそのまま -
+=,-=,*=,/=: 左辺に置かれた「変数」の値を変更(更新)するa += 5 # a = a + 5 と同じ a -= 5 # a = a - 5 と同じ a *= 5 # a = a * 5 と同じ a /= 5 # a = a / 5 と同じ
- 論理演算子:論理値に対して「かつ」「または」「ではない」の演算を行う
- 否定
not.例:not x == 1 - 論理和
or.例:x == 1 or y == 1 - 論理積
and.例:x == 1 and y == 1
- 否定
型変換
- 原則:同じ「型」の演算しかできない
- int, float の四則演算は適切に変換(暗黙的に型が変換されている)
1 + 1.0 # 結果は 2.0 (float型)になる - おおまかなルール
- 表現力が大きいものにあらかじめ変換して演算する
- 明示的に型を変換する
- int, float, str は互いに変換可能
- 関数 int(x): 文字列xを整数へ変換.変換できない文字列が与えられた時はエラー
- 関数 float(x): 文字列xを浮動小数点へ変換.変換できない文字列が与えられた時はエラー
- 関数 str(x): x を文字列へ変換
- int, float, str は互いに変換可能
- 変数
a = 'abc',b = 10から文字列'abc10'を作りたいa + b # エラー a + str(b) # b を int から str に変えてから文字列の足し算(連結)
s = '1'
print(type(s))
a = int(s)
print(type(a))
a = float(s)
print(type(a))
a = 10
print(str(a))
<class 'str'>
<class 'int'>
<class 'float'>
<class 'str'>
制御文
- 基本
- 条件分岐: if文
- 繰り返し: for文,while文
- 「いま」の条件で処理するプログラムを変える
- 「お腹がすいたらご飯を食べる.お腹がすいてなかったら遊ぶ」
(いま)「お腹がすいていたら」->「ご飯を食べる」処理をする
(いま)「お腹がすいてなかったら」->「遊ぶ」処理をする
- 「お腹がすいたらご飯を食べる.お腹がすいてなかったら遊ぶ」
- 「条件を満たすまでつづける」
- 「壁にあたるまで前に進む」
(いま)「壁に当たっている」->「止まる」
(いま)「壁に当たっていない」->「一歩進む」
- 「壁にあたるまで前に進む」
if文
- ifの後に条件を記述
- ifの最後にコロン
:が必要(コロンは「いまからブロック(ひとまとまりの処理)が始まりますよ」と言う指示) - ブロック定義をインデント(字下げ)で行うことに注意
- 二つ以上の分岐 if-elif-else を使う
if x == 1:
print(x)
elif x == 2:
print(x+5)
else:
print(100)
Pythonのブロック定義に関する注意
- コロン以降で字下げが開始されているところから同じ数の字下げが行われいるところまでが一つのブロック
if x == 1: # コロンがあるので次の行からブロックが始まることを期待
処理1 # 字下げ(行頭に一つ以上の半角スペース)があるためブロック開始と認識
処理2 # 同じ数の字下げなのでブロックが継続
処理3 # 字下げの数が違う!(エラー)
while文
- whileのあとに繰り返しを継続する条件を書く
- whileの最後にコロン
:が必要 - ブロック定義をインデント(字下げ)で行う
x = 10
while x != 0:
print(x)
x -= 1
-
break: いまの繰り返し(ループ)を強制的に終了する -
continue: 次のループにすすむ
x = 10
while x != 0:
if x == 5:
break
print(x)
x -= 1
x = 10
while x != 0:
if x == 5:
continue
print(x)
x -= 1
リスト(配列)
- 複数のデータをまとめる
- 例:「クラス5人のテストの得点の平均を計算する」 ```python score1 = 45 score2 = 100 score3 = 21 score4 = 89 score5 = 94
total = (score1 + score2 + score3 + score4 + score5) / 5 print(total)
```python
score = [45, 100, 21, 89, 94]
total = (score[0] + score[1] + score[2] + score[3] + score[4]) / 5
print(total)
- カギ括弧で複数要素を一つの変数名で扱う
- 「仕切り」のある箱
- 各「仕切り」には番号がついている(0からスタート)
- Pythonのリストの場合は各「仕切り」毎に型を持つ(違う型が混ざったリストを作ることができる)
a = [1, 2.0, `abc`] print(a[0], type(a[0])) print(a[1], type(a[1])) print(a[2], type(a[2])) - Pythonのリストは可変長(配列の要素を後から追加・削除できる)
リストの長さを変えない例
a = [10, 20, 30] # カギ括弧でリストを定義
print(a[0]) # 最初の要素にアクセス
print(a[1]) # 二番目の要素にアクセス
a[0] = 100 # 最初の要素を変更
print(a)
リストの長さを変える例
a = [10, 20, 30] # リストを定義
a.append(100) # 要素を追加
print(a)
a.append(200) # 要素を追加
print(a)
a.append(300) # 要素を追加
print(a)
- Pythonではカギ括弧でリストを表す
- 最初から要素を入れても良いし,空のリスト
[]を作ることもできる - 要素はどんな型でも良い.例えば
a=[1, 10.0, True, 'abc']としても良い - リストの要素をリストにすることもできる.
a = [[1,2], [3,4]] - リストに要素を追加する場合は
appendメソッドを使う.書式はピリオド.を利用してリスト.append(追加要素)のように書く
for 文
- リストのような集合要素に対して,各要素を頭から順番に変数に代入してブロック内部の処理を実行する
- 書式
for 変数 in リスト:
変数に対する処理(ブロック)
例:1から5までのループ
a = [10, 20, 30, 40, 50]
for x in a:
print(x)
score = [45, 100, 21, 89, 94]
total = 0
for x in score:
total += x
print(total)
- Pythonのfor文は他の言語でforeachと呼ばれるもので「リストの各要素に何の処理をするか」と言う観点で記述する
- for文とあわせて
rangeやlenをよく使う -
rangeはrange(start,stop)と書くと,start<=i<stopの範囲を表す -
range(start,stop,step)と書くと,start<=i<stopの範囲をstartからstepずつ増加する値になる
例:rangeの使用
a = [10, 20, 30, 40, 50]
for i in range(5): # range(5)は[0,1,2,3,4]のリストを作る
print(a[i])
例:rangeとlenの使用
a = [10, 20, 30, 40, 50]
for i in range(len(a)): # len(a)はリストaの長さを返す
print(a[i])
関数
- よく使う処理をひとまとめにする
- ある与えられた入力に対する処理をして対応する出力を返す
y = f(x) - 例:二次方程式 $ax^2+bx+c=0$ の実数解を返す関数
- 入力値:係数
a,b,c - 出力値:実数解(二つの解,重解,解なし)
- 入力値:係数
- Pythonでは
defを使って関数を定義する - 関数定義に際して,引数および戻り値の型は特に指定しない(動的型付け)
- 関数の内部処理はブロックで記述する
- 戻り値は
returnで指定する
def f(a, b, c):
d = b**2 - 4*a*c
if d > 0:
x0 = (-b + d**0.5) / (2*a)
x1 = (-b - d**0.5) / (2*a)
return [x0, x1]
elif d == 0:
return -b / (2*a)
else:
return None
print(f(1, -3, 2))
print(f(1, -2, 1))
print(f(1, -1, 1))
- Pythonの
defは引数および戻り値に型がない(なんでも受け取り,なんでも返せる)ため,二次関数の解を求める例では判別式dの値によって異なる型を戻り値としている - 引数に対しても型指定がないので,a,b,cをint, floatのいずれで与えてもきちんと動作する
- Pythonにおける
Noneは特殊な値 -
**はべき乗の演算子.平方根は0.5乗
まとめ
- Pythonは動的型付け言語であり、変数の型を明示的に指定する必要がない
- 基本的な文法はシンプルで、インデントによるブロック定義が特徴
- リストや関数などの基本的なデータ構造と制御文を理解することで、Pythonのプログラミングが可能になる