最終投稿日:2022年6月18日
目次
○ Pythonの基本
[Pythonの基本]
○ 数値・ビット
[2進数、8進数、16進数][ビット演算子]
○ モジュールとパッケージ
[モジュール][パッケージ][特殊変数]
○ データ型
[演算子][型変換][リスト型][タプル型][セット型][辞書型]
○ 関数
[コメント][基本][関数はオブジェクトとして扱える]
[関数を返す関数][無名関数][文字列を関数名として実行する]
○ クラス
[関数を返す関数][無名関数][文字列を関数名として実行する]
[基本][サンプルClass1][サンプルClass2][サンプルClass3]
[クラスの継承][クラスの多重継承][スペシャルメソッド]
○ ジェネレータ
[クラスの継承][クラスの多重継承][スペシャルメソッド]
[ジェネレータとは][サブジェネレータ][途中で値を受け取るジェネレータ]
[ジェネレータの戻り値][サブジェネレータの返却する値を受け取る]
○ コンテキストブロック
[ジェネレータの戻り値][サブジェネレータの返却する値を受け取る]
[コンテキストブロック][contextlibを使ったコンテキストマネージャの作成][デコレータ]
○ ファイル操作
[ファイル操作の基本][ディレクトリ操作][パスの操作]
○ 正規表現
[正規表現][正規表現で文字列を置換する][正規表現色々]
○ 日付と時刻
[日付と時刻][タイムゾーン][日時の文字列表現]
○ 例外処理・ログ
[例外処理基本構文][例外を定義する][ログの基本]
[ハンドラーとフォーマット][ロガーをファイルから読み込む]
○ テスト
[ハンドラーとフォーマット][ロガーをファイルから読み込む]
[DocTest][UnitTest]
Pythonの基本
基本構文
○ 値渡しと参照渡し
Pythonはデータの型によって【値渡し】【参照渡し】が決まります。
● 値渡し
int, float, str, tuple, bytes, frozenset ● 参照渡し
list, dict, set, bytearray 例)
● 値渡し
int, float, str, tuple, bytes, frozenset ● 参照渡し
list, dict, set, bytearray 例)
a = []
b = a
b.append(10)
print(a) ※[10]となる
def hoge( a ):
a.append(20)
print( a )
c = [5] print( c ) ※[5]となる
hoge( c ) ※[5, 20]となる(メソッド内のprint)
print( c ) ※[5, 20]となる
● やりがちなミス1b = a
b.append(10)
print(a) ※[10]となる
def hoge( a ):
a.append(20)
print( a )
c = [5] print( c ) ※[5]となる
hoge( c ) ※[5, 20]となる(メソッド内のprint)
print( c ) ※[5, 20]となる
例)
● やりがちなミス2
a = [[]] * 2
print(a) ※[ [], [] ]となる
a[0].append(1) ※0番目のリストだけに追加したいのに。。
print(a) ※[ [[ 1 ], [ 1 ]]となる
b = [[] for i in range(2)] ※内包表記を使うと回避できる
print(b)
b[0].append(1)
print(b) ※[ [ 1 ], [] ]となる
print(a) ※[ [], [] ]となる
a[0].append(1) ※0番目のリストだけに追加したいのに。。
print(a) ※[ [[ 1 ], [ 1 ]]となる
b = [[] for i in range(2)] ※内包表記を使うと回避できる
print(b)
b[0].append(1)
print(b) ※[ [ 1 ], [] ]となる
例)
● コメント文字
class hoge:
def __init__(self, a = []):
self.foo = a
b = hoge()
print( b.foo ) ※[]となる
b.foo.append(10)
print(b.foo) ※[ 10 ]となる
c = hoge()
print( c.foo ) ※[ 10 ]となる ※デフォルトの引数「def __init__(self, a = []):」部分はクラスが定義された際に1度しか初期化されない。
そのため「b」「c」は違うインスタンスなのに「foo」の値を共有してしまう現象が起きてしまう。
これを回避するには以下の様に定義する
def __init__(self, a = []):
self.foo = a
b = hoge()
print( b.foo ) ※[]となる
b.foo.append(10)
print(b.foo) ※[ 10 ]となる
c = hoge()
print( c.foo ) ※[ 10 ]となる ※デフォルトの引数「def __init__(self, a = []):」部分はクラスが定義された際に1度しか初期化されない。
そのため「b」「c」は違うインスタンスなのに「foo」の値を共有してしまう現象が起きてしまう。
これを回避するには以下の様に定義する
例)
class hoge:
def __init__(self, a = None):
if a is None:
self.foo = []
b = hoge() ※[]となる
print( b.foo )
b.foo.append(10)
print(b.foo) ※[ 10 ]となる
c = hoge()
print( c.foo ) ※[]となる
c.foo.append(20)
print(c.foo) ※[ 20 ]となる
print(b.foo) ※[ 10 ]となる
def __init__(self, a = None):
if a is None:
self.foo = []
b = hoge() ※[]となる
print( b.foo )
b.foo.append(10)
print(b.foo) ※[ 10 ]となる
c = hoge()
print( c.foo ) ※[]となる
c.foo.append(20)
print(c.foo) ※[ 20 ]となる
print(b.foo) ※[ 10 ]となる
[#]
# この行はコメントです。
["""]~["""]
"""
この行はコメントです。
この行もコメントです。
"""
[''']~[''']
'''
この行はコメントです。
この行もコメントです。
'''
● 四則演算子(Python独自(珍しい)使用法)# この行はコメントです。
["""]~["""]
"""
この行はコメントです。
この行もコメントです。
"""
[''']~[''']
'''
この行はコメントです。
この行もコメントです。
'''
8 // 6 ⇒ 1 ※[//]は、割り算の結果の小数点を切り捨てる
'hoge' + 'foo' ⇒ hogefoo ※文字列結合は[+]を使用する
'hoge' * 2 ⇒ hogehoge ※文字列に対して[* n]すると、その分文字列結合する
[例]
str1 = 'hoge'
str2 = 'foo'
str3 = str1 * 2 + str2 ※str3は、[hogehogefoo]となる
a,b = 6,9 ※カンマ区切りで複数の変数に対し値を代入できる(a = 6 と b = 9 と同じ)
a,b = b,a ※変数の値を入れ替える事が可能となる
'hoge' + 'foo' ⇒ hogefoo ※文字列結合は[+]を使用する
'hoge' * 2 ⇒ hogehoge ※文字列に対して[* n]すると、その分文字列結合する
[例]
str1 = 'hoge'
str2 = 'foo'
str3 = str1 * 2 + str2 ※str3は、[hogehogefoo]となる
a,b = 6,9 ※カンマ区切りで複数の変数に対し値を代入できる(a = 6 と b = 9 と同じ)
a,b = b,a ※変数の値を入れ替える事が可能となる
IF文
hoge = 100
if hoge > 100:
# 好きな処理
elif hoge == 100: ※よく見かける[elseif]は、[elif]となるので注意!!
# 好きな処理
else:
# 好きな処理< if type(v) is str: ※変数のタイプを判断する(文字列なら)
if type(v) in (str, int): ※変数のタイプを判断する(文字列か数値なら)
※isinstance() メソッドとかもある
if not name: ※変数 name が空の場合
if hoge > 10 and foo == 5:
if hoge > 10 or foo == 5:
if 5 <= hoge <= 10: ※特殊な記述。hoge は、5以上10以下で True となる ●三項演算子
if hoge > 100:
# 好きな処理
elif hoge == 100: ※よく見かける[elseif]は、[elif]となるので注意!!
# 好きな処理
else:
# 好きな処理< if type(v) is str: ※変数のタイプを判断する(文字列なら)
if type(v) in (str, int): ※変数のタイプを判断する(文字列か数値なら)
※isinstance() メソッドとかもある
if not name: ※変数 name が空の場合
if hoge > 10 and foo == 5:
if hoge > 10 or foo == 5:
if 5 <= hoge <= 10: ※特殊な記述。hoge は、5以上10以下で True となる ●三項演算子
Pythonの三項演算子は特殊です。
(変数) = (条件がTrueのときの値) if (条件) else (条件がFalseのときの値)
例)
n = 'OK'
x = 10 if n == 'OK' else 5 ※[x]には[10]が入ります
(変数) = (条件がTrueのときの値) if (条件) else (条件がFalseのときの値)
例)
n = 'OK'
x = 10 if n == 'OK' else 5 ※[x]には[10]が入ります
WHILE文
i = 1
while i < 10: ※[while]の後に条件を記述する
print(i)
i += 1
i = 1
while True: ※[True]は頭が大文字となるので注意!!
print(i)
i += 1
if i > 10:
break ※[break]でループを抜ける事が出来る
【メモ】ユークリッドの互除法
2つの数値に対して[最大公約数]を求める
m = 1071
n = 1029
while n != 0: ※[n]がゼロになるまで処理する
m,n = n,m % n ※[m]を[n]とし、[n]を[m / n]の余りとする
print(m)
【余談】上記を再帰関数にする
while i < 10: ※[while]の後に条件を記述する
print(i)
i += 1
i = 1
while True: ※[True]は頭が大文字となるので注意!!
print(i)
i += 1
if i > 10:
break ※[break]でループを抜ける事が出来る
【メモ】ユークリッドの互除法
2つの数値に対して[最大公約数]を求める
m = 1071
n = 1029
while n != 0: ※[n]がゼロになるまで処理する
m,n = n,m % n ※[m]を[n]とし、[n]を[m / n]の余りとする
print(m)
【余談】上記を再帰関数にする
[index.py]
【メモ】実は[else]文が使える
-------------------------------------
import hoge
m = 1071
n = 1029
x = hoge.foo( m, n )
print('最大公約数:{0}'.format(x))
#ついでに最小公倍数も求める
y = ( m if m < n else n ) // x ※絶対に割り切れるので[//]で整数にする
y = ( m if m > n else n) * y
print('最小公倍数:{0}'.format(y))
-------------------------------------
[hoge.py]import hoge
m = 1071
n = 1029
x = hoge.foo( m, n )
print('最大公約数:{0}'.format(x))
#ついでに最小公倍数も求める
y = ( m if m < n else n ) // x ※絶対に割り切れるので[//]で整数にする
y = ( m if m > n else n) * y
print('最小公倍数:{0}'.format(y))
-------------------------------------
-------------------------------------
def foo( m, n ) ※関数作成
if n == 0:
return m
else:
return foo( n, m % n )
-------------------------------------
def foo( m, n ) ※関数作成
if n == 0:
return m
else:
return foo( n, m % n )
-------------------------------------
例)
a = 0
while a < 10:
print(a)
a += 1
if a == 5:
break ※強制的に抜けると else は呼ばれない
continue ※スキップの場合は else は呼ばれます
else:
print('終わり~') ※while 文が正常に終了すると呼ばれる
while a < 10:
print(a)
a += 1
if a == 5:
break ※強制的に抜けると else は呼ばれない
continue ※スキップの場合は else は呼ばれます
else:
print('終わり~') ※while 文が正常に終了すると呼ばれる
FOR文
for i in range(10):
print(i) ※0~9が表示される
for i in range( 3, 10 ):
print(i) ※3~9が表示される
hoge = [ 1, 2, 3, 4, 5 ]
for i in hoge:
print(i) ※1~5が表示される
for i in reversed(hoge)
print(i) ※5~1が表示される
hoge = {'hoge':'aaa','foo':'bbb','bar':'ccc'}
for k, v in hoge.items():
print('k={0}:v={1}'.format(k,v)) ※キーと値を参照できる
hoge = [ 'hoge', 'foo', 'bar' ]
for i, v in enumerate( hoge ):
print('今{0}番目:{1}'.format(i,v)) ※[i]に処理要素のindexを格納する
【メモ】実は[else]文が使える
print(i) ※0~9が表示される
for i in range( 3, 10 ):
print(i) ※3~9が表示される
hoge = [ 1, 2, 3, 4, 5 ]
for i in hoge:
print(i) ※1~5が表示される
for i in reversed(hoge)
print(i) ※5~1が表示される
hoge = {'hoge':'aaa','foo':'bbb','bar':'ccc'}
for k, v in hoge.items():
print('k={0}:v={1}'.format(k,v)) ※キーと値を参照できる
hoge = [ 'hoge', 'foo', 'bar' ]
for i, v in enumerate( hoge ):
print('今{0}番目:{1}'.format(i,v)) ※[i]に処理要素のindexを格納する
【メモ】実は[else]文が使える
例)
for i in range(10):
print(i)
if i == 5:
break ※強制的に抜けると else は呼ばれない
continue ※スキップの場合は else は呼ばれます
else:
print('終わり~') ※for 文が正常に終了すると呼ばれる
print(i)
if i == 5:
break ※強制的に抜けると else は呼ばれない
continue ※スキップの場合は else は呼ばれます
else:
print('終わり~') ※for 文が正常に終了すると呼ばれる
内包表記
● リスト内包表記
mylist = [ i * 2 for i in range(10) ]
print( mylist ) ※[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]となる
mylist = [ [ 1, 2, 3 ] for i in range(3) ]
print( mylist ) ※[[1, 2, 3], [1, 2, 3], [1, 2, 3]]となる
mylist = [ [ 1, 2, 3 ] for i in range(3) if i % 2 == 0 ]
print( mylist ) ※[[1, 2, 3], [1, 2, 3]]となる(if文の内容を1行で記述できる)
mylist = []
for i in range(10):
if i % 2 == 0:
mylist.append( i )
else:
mylist.append( str( i ) )
print( mylist ) ※[0, '1', 2, '3', 4, '5', 6, '7', 8, '9']となる
l1 = ('a','b','c')
l2 = [7,8,9]
myzip = zip(l1,l2) ※イテレータオブジェクトへ変換
myDict = { k:v * 2 for k, v in myzip }
print(myDict) ※{'b': 16, 'c': 18, 'a': 14}となる
print( mylist ) ※[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]となる
mylist = [ [ 1, 2, 3 ] for i in range(3) ]
print( mylist ) ※[[1, 2, 3], [1, 2, 3], [1, 2, 3]]となる
mylist = [ [ 1, 2, 3 ] for i in range(3) if i % 2 == 0 ]
print( mylist ) ※[[1, 2, 3], [1, 2, 3]]となる(if文の内容を1行で記述できる)
mylist = []
for i in range(10):
if i % 2 == 0:
mylist.append( i )
else:
mylist.append( str( i ) )
print( mylist ) ※[0, '1', 2, '3', 4, '5', 6, '7', 8, '9']となる
l1 = ('a','b','c')
l2 = [7,8,9]
myzip = zip(l1,l2) ※イテレータオブジェクトへ変換
myDict = { k:v * 2 for k, v in myzip }
print(myDict) ※{'b': 16, 'c': 18, 'a': 14}となる
● ジェネレータ内包表記
def gen_123():
yield 1
yield 2
yield 3 g = ( i * 2 for i in gen_123() ) print( next( g ) ) ※2となる
print( next( g ) ) ※4となる
print( next( g ) ) ※6となる
yield 1
yield 2
yield 3 g = ( i * 2 for i in gen_123() ) print( next( g ) ) ※2となる
print( next( g ) ) ※4となる
print( next( g ) ) ※6となる




