Lesson 5
文字列
1. 文字列
文字列は、関数input()
を使用して標準入力から読み取るか、一重引用符または二重引用符で定義することができます。 2つの文字列を連結することができます。整数をn倍した文字列を繰り返すこともできます。
print('>_< ' * 5) # > _ <> _ <> _ <> _ <> _ <
Pythonの文字列は一連の文字です。関数len(some_string)
は、文字列内にいくつの文字があるかを返します。
print(len('abcdefghijklmnopqrstuvwxyz')) # 26
Pythonのすべてのオブジェクトはstr(some_object)
関数を使って文字列に変換できます。だから、数値を文字列に変換することができます:
s = str(2 ** 100) print(s) # 1267650600228229401496703205376 print(len(s)) # 31
2. スライス:1文字
スライスは、指定された文字列から1文字またはいくつかのフラグメント:サブストリングまたはサブシーケンスを与えます。
スライスには3つの形式があります。スライスの最も単純な形式:1文字スライスS[i]
は文字列のi
番目の文字を与えます。つまり、
、
、
、
、
、
。 Pythonでは、文字列の文字には別の型はないことに注意してください。 S[i]
は、元の文字列と同じようにstr
型も持ちます。
S[i]
番号i
はインデックスと呼ばれます 。
負のインデックスを指定すると、数値-1
から始まる最後からカウントされます。すなわち、
、
、
、
。
テーブルにそれを要約しましょう:
文字列S | H | e | l | l | o |
---|---|---|---|---|---|
インデックス | S [0] | S [1] | S [2] | S [3] | S [4] |
インデックス | S [-5] | S [-4] | S [-3] | S [-2] | S [-1] |
スライスS[i]
のインデックスがlen(S)
以上、または-len(S)
未満の場合、次のエラーが発生します-len(S)
IndexError: string index out of range
です。
3. スライス:部分文字列
2つのパラメータを持つスライスS[a:b]
の長さのサブストリングを返しb - a
、インデックスの文字で始まるa
とインデックスで文字まで持続b
最後のものは含みません。たとえば、 S[1:4] == 'ell'
とすると、 S[-4:-1]
を使って同じ部分文字列を得ることができます。 S[1:-1]
は、文字列の最初と最後の文字がない部分文字列です(スライスはインデックス1の文字で始まり、インデックスで終わります)。正のインデックスと負のインデックスを同じスライスに混在させることができます。 -1、それを含まない)。
2つのパラメータを持つスライスは、 IndexError
発生IndexError
ません。たとえば、 S == 'Hello'
、スライスS[1:5]
は文字列'ello'
返し、2番目のインデックスが非常に大きい場合でもS[1:100]
と同じ結果が返されます。
2番目のパラメータを省略しても(コロンをそのままにしておくと)、スライスは文字列の最後に移動します。たとえば、最初の文字を文字列から削除するには(そのインデックスは0)スライスS[1:]
取ります。同様に、最初のパラメータを省略すると、Pythonは文字列の先頭からスライスを取得します。つまり、文字列から最後の文字を削除するには、スライスS[:-1]
使用できます。スライスS[:]
は文字列S
自体と一致します。
4. スライス:文字列の不変性
文字列のスライスは新しい文字列を作成し、元の文字列を変更しません。 Pythonの文字列は不変です。つまり、オブジェクトとして変更することはできません。変数は新しい文字列にのみ割り当てることができますが、古い文字列はメモリに残ります。
実際にはPythonでは変数はありません。どのオブジェクトにも関連付けられている名前のみが存在します。最初に名前を1つのオブジェクトに関連付け、次に別のオブジェクトに関連付けることができます。いくつかの名前を1つの同じオブジェクトに関連付けることができます。
それを実証しよう:
s = 'Hello' t = s # sとtは同じ文字列を指します t = s[2:4] # 今度は新しい文字列'll 'を指します print(s) # sが変更されていないので 'Hello'を出力する print(t) # プリントする 'll'
5. スライス:サブシーケンス
3つのパラメータS[a:b:d]
を持つスライスを指定した場合、3番目のパラメータは関数range()
と同じ手順を指定します。この場合、次のインデックスを持つ文字だけが取り出されます: a
a + d
、 a + 2 * d
など、インデックスb
持つ文字まで。 3番目のパラメータが2の場合、スライスは1秒ごとに文字を取り、スライスのステップが-1
に等しい場合、文字は逆の順序になります。たとえば、次のような文字列を反転することができますS[::-1]
。例を見てみましょう:
s = 'abcdefg' print(s[1]) print(s[-1]) print(s[1:3]) print(s[1:-1]) print(s[:3]) print(s[2:]) print(s[:-1]) print(s[::2]) print(s[1::2]) print(s[::-1])
range()
3番目のパラメータと似ていることに注意してください。s = 'abcdefghijklm' print(s[0:10:2]) for i in range(0, 10, 2): print(i, s[i])
6. 文字列メソッド:find()とrfind()
メソッドは、オブジェクトにバインドされた関数です。メソッドが呼び出されると、そのメソッドがオブジェクトに適用され、それに関連する計算が実行されます。メソッドはobject_name.method_name(arguments)
として呼び出されobject_name.method_name(arguments)
。たとえば、 s.find("e")
、文字列メソッドfind()
が文字列s
に1つの引数"e"
適用されます。
メソッドfind()
は、それが呼び出された文字列の中で引数として渡された部分文字列を検索します。この関数は、部分文字列が最初に出現したときのインデックスを返します。部分文字列が見つからない場合、このメソッドは-1を返します。
s = 'Hello' print(s.find('e')) # 1 print(s.find('ll')) # 2 print(s.find('L')) # -1
同様に、 rfind()
メソッドは、部分文字列が最後に出現したときのインデックスを返します。
s = 'abracadabra' print(s.find('b')) # 1 print(s.rfind('b')) # 8
s.find(substring, left, right)
という3つの引数を指定してfind()
を呼び出すと、スライスs[left:right]
内側で検索が実行されます。あなたは2つだけの引数などを指定した場合s.find(substring, left)
、検索がスライスで行われるs[left:]
、つまり、インデックスの文字で始まるleft
文字列の末尾に。メソッドs.find(substring, left, right)
は、スライスではなく、文字列s
全体に相対的な絶対インデックスを返します。
s = 'my name is bond, james bond, okay?' print(s.find('bond')) # 11 print(s.find('bond', 12)) # 23
7. 文字列メソッド:replace()
replace()
メソッドは、指定された部分文字列のすべての出現箇所を別の部分文字列に置き換えます。構文: s.replace(old, new)
、文字列の取りS
し、サブストリングのすべての出現置き換えるold
部分文字列でnew
。例:
print('a bar is a bar, essentially'.replace('bar', 'pub')) # 「パブは本質的にパブです」
s.replace(old, new, count)
ように、3番目の引数のcount
渡すことができます。それはreplace()
を使って最初のcount
だけを置き換えてから停止します。
print('a bar is a bar, essentially'.replace('bar', 'pub', 1)) # 「パブは本質的にバーです。
8. 文字列メソッド:count()
このメソッドは、別の文字列内の1つの文字列の出現回数をカウントします。最も単純な形式は、 s.count(substring)
です。オーバーラップしていないオカレンスのみが考慮されます。
print('Abracadabra'.count('a')) # 4 print(('aaaaaaaaaa').count('aa')) # 5
3つのパラメータ
を指定した場合、カウントはスライスs[left:right]
内で実行されます。