関数引数について
pythonにおいて関数引き数は参照型であるため引数で渡した値が対象の関数内で書き換わること期待したが、
pythonの基本型はimmutableであり、関数の呼び出し前後でオブジェクトが変わっており、期待する振る舞いではなかった。
下記例において、add関数内で変数cntが再度生成されたというように考えるべきであり、引数のcntは単純な読み取り専用となっている。
品質的にはそれが好ましいと感じている。
def add(cnt:int) -> int:
print('--------------------------------')
print('cntのid 加算前 = {0}'.format(id(cnt)))
cnt = cnt + 1
print('cntのid 加算後 = {0}'.format(id(cnt)))
return cnt
counter : int = 0
print('--------------------------------')
print('関数呼び出し前')
print('counter = {0}'.format(counter))
# add関数の呼び出し
ret = add(counter)
print('--------------------------------')
print('関数呼び出し後')
print('counter = {0}'.format(counter))
print('ret = {0}'.format(ret))
--------------------------------
関数呼び出し前
counter = 0
--------------------------------
cntのid 加算前 = 2572282626256
cntのid 加算後 = 2572282626288
--------------------------------
関数呼び出し後
counter = 0
ret = 1
リスト、タプル、辞書、セット
忘れるので...
# リスト
data = ['a','b','c','d']
print('-----------------------------------------------')
print('List')
print("dataのtype = {0}".format(type(data)))
# 追加可能(最もシンプルな1例)
data.append('e')
# タプル
data = ('a','b','c','d')
print('-----------------------------------------------')
print('Tuple')
print("dataのtype = {0}".format(type(data)))
# 追加不可
# data.append('e')
# 辞書
data = {'a': 0,'b': 1,'c': 2,'d': 3}
print('-----------------------------------------------')
print('Dictionary')
print("dataのtype = {0}".format(type(data)))
# 追加可能(最もシンプルな1例)
data['e'] = 4
# セット
data = {'a','b','c','d'}
print('-----------------------------------------------')
print('Set')
print("dataのtype = {0}".format(type(data)))
# 追加可能(最もシンプルな1例)
data.add('e')
-----------------------------------------------
List
dataのtype = <class 'list'>
-----------------------------------------------
Tuple
dataのtype = <class 'tuple'>
-----------------------------------------------
Dictionary
dataのtype = <class 'dict'>
-----------------------------------------------
Set
dataのtype = <class 'set'>
セイウチ演算子
Python 3.8からの新機能
変数に値を割り当てる新しい構文
詳細はこちら
data = [i for i in range(10)]
if (n:=len(data)) <11:
print(n)
10
ジェネレータ関数
def generator(offset :int) -> int:
yield offset + 1
yield offset + 2
gen = generator(0)
for n in gen:
print(n)
#error
#gen.__next__()
1
2
リスト内包表記
リスト作成の簡単な手段として提供
詳細はこちら
data = list(map(lambda x: x**2, range(10)))
print(data)
data = [x**2 for x in range(10)]
print(data)
## 条件を付けることも可能
data = [x**2 for x in range(10) if x%3==0 ]
print(data)
## 複数のfor句をつけることも可能
data = [( x, y, x*y) for x in range(3) for y in range(3, 0, -1) ]
print(data)
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
[0, 9, 36, 81]
[(0, 3, 0), (0, 2, 0), (0, 1, 0), (1, 3, 3), (1, 2, 2), (1, 1, 1), (2, 3, 6), (2, 2, 4), (2, 1, 2)]