道場
Road to Pythonian.
Pythonianを名乗るための基礎的なトピックを並べる予定。
値と変数
定数を使う
- 言語仕様上は定数はない
- 定数として扱う場合、
FOO_VALUE
のように変数名を大文字 + アンダースコアで表すのが標準規約 - 定数を扱うためのクラスを作るテクニックがある
参考:
データ型
型変換
参考:
文字列 <=> 10進数
リファレンス:
# 文字列 => 10進数
int('123') #=> 123
float('123') #=> 123.0
float('-1.23e5') #=> -123000.0
# 10進数 => 文字列
str(123) #=> '123'
str(123.0) #=> '123.0'
str(10-3) #=> 7
str(10-0.1) #=> '9.9'
下記はエラー
int('1e5')
int('10-3')
float('1a')
float('10-0.1')
整数 <=> 16進数文字列
# 整数 => 16進数文字列
format(0xabcd, 'x') #=> 'abcd'
'{:02x}'.format(0xabcd) #=> 'abcd'
'%02x' % 0xabcd #=> 'abcd'
hex(0xabcd) #=> '0xabcd'
# 16進数文字列 => 整数
int('0xabcd', 16) #=> 43981
int('abcd', 16) #=> 43981
文字列 <=> 16進数文字列
# 文字列 => 16進数文字列
import binascii
binascii.hexlify(b'Hello') # => b'48656c6c6f'
binascii.b2a_hex(b'Hello') # => b'48656c6c6f'
binascii.hexlify(u'こんにちは'.encode('utf-8')) # => b'e38193e38293e381abe381a1e381af'
binascii.b2a_hex(u'こんにちは'.encode('utf-8')) # => b'e38193e38293e381abe381a1e381af'
import codecs
codecs.encode(b'Hello', 'hex_codec') # => b'48656c6c6f'
codecs.encode(u'こんにちは'.encode('utf-8'), 'hex_codec') # => b'e38193e38293e381abe381a1e381af'
# 16進数文字列 => 文字列
import binascii
binascii.unhexlify(b'48656c6c6f') # => b'Hello'
binascii.a2b_hex(b'48656c6c6f') # => b'Hello'
binascii.unhexlify(b'e38193e38293e381abe381a1e381af').decode('utf-8') # => 'こんにちは'
binascii.a2b_hex(b'e38193e38293e381abe381a1e381af').decode('utf-8') # => 'こんにちは'
import codecs
codecs.decode(b'48656c6c6f', 'hex_codec') # => b'Hello'
codecs.decode(b'e38193e38293e381abe381a1e381af', 'hex_codec').decode('utf-8') # => 'こんにちは'
16進数文字列 <=> バイト列
import binascii
import codecs
# 16進数文字列 => バイト列
bytes.fromhex('abcd') #=> b'\xab\xcd'
binascii.unhexlify('abcd') # 同上
codecs.decode('abcd', 'hex') # 同上
# バイト列 => 16進数文字列
b'\xab\xcd'.hex() #=> 'abcd'
str(binascii.hexlify(b'\xab\xcd'), 'utf-8') # 同上
codecs.encode(b'\xab\xcd', 'hex') #=> b'abcd'
str(b'abcd', 'utf-8') #=> 'abcd'
文字列処理
文字列検索 in
, not in
word = 'abcde'
'abc' in word #=> True
'x' in word #=> False
'abc' not in word #=> False
'x' not in word #=> True
参考:
正規表現
See library#re
Examples:
import re
# マッチ
content = r'Hello, Python. 123, end.'
pattern = 'Hel'
## compileしない
### re.match ... 先頭からぴったり一致する必要がある
match_result = re.match(pattern, content)
### re.search ... 存在すればOK
search_result = re.search(pattern, content)
## compileしてマッチ
repatter = re.compile(pattern)
match_result = repatter.match(content)
# 置換
re.sub('^H\w+', 'Good morning', 'Hello, world.')
## 大文字小文字を無視
re.sub('test', 'xxxx', 'Testing', flags=re.IGNORECASE)
参考:
- 分かりやすいpythonの正規表現の例 - Qiita
- Pythonで文字列を置換(replace, translate, re.sub, re.subn) | note.nkmk.me
- python — re.compileせずに大文字と小文字を区別しない正規表現?
ライブラリの利用
外部ファイルの関数を利用
# mymodule.py
def foo(a, b):
return a + b
# main.py
import mymodule
c = mymodule.foo(5, 10)
print(c)
参考:
例外処理
例外オブジェクトを文字列として扱うには、 str(e)
のようにする。
参考:
テスト
構文チェック
python -m py_compile foo.py
参考:
オブジェクト指向
# クラス名の取得
obj.__class__.__name__
参考:
ロギング
変数のダンプ
クラスのインスタンスなど、 __dict__
attributeを持つオブジェクトであれば vars
関数で1階層のダンプができる:
class MyClass:
def __init__(self, val1, val2):
self.val1 = val1
self.val2 = val2
mc = MyClass(10, 20)
print(vars(mc)) #=> {'val1': 10, 'val2': 20}
参考:
for文による射影操作
Examples:
keys = [1,2,3,4,5,6,7,8]
newkeys = [(k*2) for k in keys if k % 2 == 0]
参考:
最終更新 2022-05-06: [python/dojo] Add functions: int(), float(), str() (bc71b1180)