注目記事

2013年9月23日月曜日

Python講座 第2回〜文字列の扱い〜

今回はPythonでの文字列の扱いをみていきます。

前回みてきた通り、
"¥n"は"改行"を意味します。

では"¥t"はなんでしょう?
答えは"tab"です。
この二つはよく使いますので、覚えておいて下さい。

また、Pythonでは文字列を括る際、
"ダブルクオテーション"か'シングルクオテーション'に差はありません。

では、¥nを「改行を表す特殊文字」ではなく「文字列」として見なしたい場合はどうすればよいでしょう?

こういった"記号"をそのまま文字列として扱いたい場合には、
どの言語でも"エスケープ処理"をしてあげるのが基本です。

エスケープは、Windowsなら"¥"を、macなら" \ (バックスラッシュ)"を使います。
(macではキーボードの"¥"を打ちましょう)

# coding: UTF-8
tabe = "Hello¥tWorld"
no_tabe = "Hello¥¥t"
print tabe # 実行結果:Hello    World
print no_tabe # 実行結果:Hello¥¥t

また、以下ではSyntax error(文法間違い)のメッセージが出ます。
error = 'it's a pen'
ok1 = 'it\'s a pen'
ok2 = "it's a pen"
print error
実行結果
File "test.py", line 1
error = 'it's a pen'
^
SyntaxError: invalid syntax

it'sを短縮形として表したいのに、文字列を括る'シングルクオテーション'のせいで、
'it'として、itだけを括ってるとコンピュータに思われているのです。

文字列は必ず"ダブルクオテーション"か'シングルクオテーション'で括らなければいけません。
なので「s a pen'」が括ってないよ、と怒られるのです。

そこでok1のように、シングルクオテーションをエスケープさせてあげましょう。
すると実行結果は、
it's a pen
となって、解決します。

あるいはok2のように初めから"ダブルクオテーション"で括れば、
途中のシングルクオテーションを「文字列の終わり」としてみなされることはなくなります。

基本的には、「'」などの記号の前では、必ずエスケープさせる癖をつけましょう。

え?それはいちいち面倒くさ過ぎるって?

……しょうがないなぁ。
そんな横着なあなたのことも、Pythonは見捨てません。
print """<html lang="ja">
<body style="color:yellow">
</body>
</html>"""
このように"""または'''とクオテーション3つで括ってやると、
なんとエスケープいらず!
しかも改行もみとめて表示してくれます!

そんな具合にPythonの懐の広さを知ったところで、
次は文字の連結などを学びましょう。
print """<html lang="ja">
# coding: UTF-8
# 文字の連結は、"+"で繋ぐ
print "やら" + "ないか" # 実行結果:やらないか 
 
# 文字の繰り返しは"*(かける)"
print "やら" * 5 + "ないか" # 実行結果:やらやらやらやらやらないか
 
# 文字数カウントは len("")←関数
print len("ABCDE") # 実行結果:5 
print len(u"やらないか") # 実行結果:5
最後の
print len(u"やらないか")
について補足します。

文字列"やらないか"の前にuを付けないと、実行結果は15となります。
これはlen関数が、中の文字列のbyte数を表示しているためです。

byteとはプログラミングの本質、つまり0と1の表記の単位です。
1byte=8bit
これは2進数8桁分、つまり0~255(16進数:0x00~0xFF)を表します。

半角英数字は1文字1byteです。
例えば、Aは16進数で"0x41"。
つまり"00100001"という0と1の並びが、プログラム上で"A"と表されるのです。

print len("ABCDE")
の実行結果は、1byteが5つなので、5です。

が、ひらがなや漢字、つまり日本語は、
1文字2byteなのです。
さらに今回は
# coding: UTF-8
と一行目で宣言しているため、
文字はUTF-8でunicodeされた状態。
この状態の日本語は、1文字3byteとなります。

従って
print len("やらないか")
の結果は、3byteが5つなので、15となります。

これじゃ困りますよね。5文字なのだから、5と出して欲しい。
その解決法が日本語の前に付けるおまじない、"u"なのです。

最後に、文字列に便利な関数をもう少し見てみましょう。
# coding: UTF-8
strings = "abcdefghi"

# 文字列の切り出し
# 変数名の後に[n]をつけると、n番目の文字を返してくれる
# 先頭は0、2番目は1、……と表記。末尾は-1とも表記可
print strings[0] # 実行結果:a
print strings[8] # 実行結果:i
print strings[-1] # 実行結果:i
# 範囲指定 [start:end]
# start番目からend番目の手前の文字までを返す
print strings[1:3] # 実行結果:bc
print strings[1:-1] # 実行結果:bcdefgh
# start、endは省略可
# 省略すると、それまで:それ以降の「残り全て」が返される
print strings[5:] # 実行結果:fghi
print strings[:3] # 実行結果:abc
 
# 検索 .find("検索文字列")
# 指定文字列の開始番号を返す。なければ-1
print strings.find("a") # 実行結果:0
print strings.find("ef") # 実行結果:4
print strings.find("ij") # 実行結果:-1
ただしこれらは、日本語だとunicodeエラーが起きるようです。

0 件のコメント:

コメントを投稿

修正や突っ込みはご遠慮なく!