文字列編

p.83-109 文字列

最初の表だけであらかた事足りてる気もする。

「'''」で囲むとブロック文字列。「'」だと改行不可。
>>> hoge = '''hoge
... hoge
... hoge
... '''
>>> hoge
'hoge\nhoge\nhoge\n'
>>> hoge = 'hoge
  File "<stdin>", line 1
    hoge = 'hoge
               ^
SyntaxError: EOL while scanning string literal

で、これを利用してよくコメントを書いたりするわけですね。よく見る。

スライシング便利だけど、ちょっと直感に反する
>>> hoge[2:10]
'ge\nhoge\n'

2文字目から10文字ではなくて、2文字目から10文字目の前までなのが罠。

ケツから2文字なら下記。考えたらわかるけど。

>>> hoge[-2:]

ここは何度も間違いそう。

なんで hoge.length じゃなくて len(hoge) なんだろう。

多分あちこちで言われてると思うので、一応あとで調べる。

エスケープシーケンスについて

「/」に続く文字がエスケープシーケンスではない場合文字列扱いになるが、明示的に「//」を使うべき。
或いは raw 文字列を使う。

r'C:\hoge\hoge'

※raw 文字列は正規表現書く時にきっと使うので覚えておく!!

p.90 この辺からムズい Unicode 文字列の話と思いきや、詳しく書いてくれてない・・・

encode, decode 周りはネズミ本使わずに要復習。

i18n の意味。今まで3回くらい何だっけ?ってなって都度ググってる気がする。今回もきっと忘れるけど、↓ってことですよ、と。
>>> i18n = 'internationalization'
>>> len(i18n[1:len(i18n)-1])
18
文字列についても in とか for とか使えるので注意が必要。スライシングできること考えれば道理。

'h' in "hoge" とか
[v for v in "hoge"] とかできるので注意が必要と。

オブジェクトのコピーは [:] で行う。

これは結構重要そう。

>>> l = [1,2]
>>> l.append(l)
>>> l
[1, 2, [...]]
>>> m = l
>>> n = l[:]
>>> l[1] = 100
>>> m
[1, 100, [...]]
>>> n
[1, 2, [1, 100, [...]]]

はいはいはい、わかるわかる。

p.96 スライシングには3つ目のインデックスが指定可能。

せっかくなので、今まででできたのを利用して fizzbuzz 問題を解いてみた。

>>> n = range(0,100)
>>> ['fizzbuzz' if v in n[0:len(n):3*5] else 'fizz' if v in n[0:len(n):3] else 'buzz' if v in n[0:len(n):5] else v for v in n]
['fizzbuzz', 1, 2, 'fizz', 4, 'buzz', 'fizz', 7, 8, 'fizz', 'buzz', 11, 'fizz', 13, 14, 'fizzbuzz', 16, 17, 'fizz', 19, 'buzz', 'fizz', 22, 23, 'fizz', 'buzz', 26, 'fizz', 28, 29, 'fizzbuzz', 31, 32, 'fizz', 34, 'buzz', 'fizz', 37, 38, 'fizz', 'buzz', 41, 'fizz', 43, 44, 'fizzbuzz', 46, 47, 'fizz', 49, 'buzz', 'fizz', 52, 53, 'fizz', 'buzz', 56, 'fizz', 58, 59, 'fizzbuzz', 61, 62, 'fizz', 64, 'buzz', 'fizz', 67, 68, 'fizz', 'buzz', 71, 'fizz', 73, 74, 'fizzbuzz', 76, 77, 'fizz', 79, 'buzz', 'fizz', 82, 83, 'fizz', 'buzz', 86, 'fizz', 88, 89, 'fizzbuzz', 91, 92, 'fizz', 94, 'buzz', 'fizz', 97, 98, 'fizz']

こういうもっと何とかなりそう感がある場合は確実にもっと何とかなる。目標に「Python でスタイリッシュに fizzbuzz 解く」を追加する。

文字列オブジェクトは変更不可。変更するには新たにつくり直す必要があるので、文字列操作時はパフォーマンスに注意。
フォーマット(like sprintf) には dict を使用可能。これは知らんかった。
>>> 'say %(num)d times %(what)s' % {'test':'nothing', 'num':100, 'what': 'hello!'}
'say 100 times hello!'

超使いそう。

p.101 vars() はよく使うって書いてたけどほんとに使うんだろうか。
直感ではデバッグ意外に使いたくない。

てことで、サラッと読むつもりが案外大変でした。