道場

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進文字列と文字列の変換 - Qiita

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)

参考:

ライブラリの利用

外部ファイルの関数を利用

# 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]

参考: