見出し画像

pythonプログラム初歩の初歩2

pythonプログラム初歩の初歩2
文字列の使い方を知ろう。

こんにちはmakokonです。
まだまだpython初心者なので、こんな基本的なことも知らなかったなあという話。
今日は文字列の取り扱いについて、報告します。


文字列の代入

文字列の代入には、シングルクォーテーション('')、ダブルコーテーション("")、トリプルクォーテーション(""" """)が使われます。これの使い分けをしばらく知りませんでした。知らなくてもだいたい使えますしね。
しかしまあ、確認しておきましょう。

  1. シングルコーテーション('')とダブルコーテーション("")は基本的には同じ役割を果たします。どちらを使っても一行の文字列を定義することができます。
    ただし、文字列内にシングルコーテーションやダブルコーテーションを含めたい場合、それぞれが役立ちます。シングルコーテーションの文字列内では、ダブルコーテーションをエスケープせずに使用できますし、逆も然りです。

  2. トリプルクォーテーション(""" """)は、複数行にわたる文字列を定義するために使用されます。
    また、トリプルクォーテーションはdocstring(ドキュメンテーション文字列)の作成にも使用されます。

確認コードと結果がこれ

#lesson02
#文字列の使い方あれこれ

# 引用符の使い分け
s1 = 'Hello, World!'
s2 = "Hello, World!"
print('s1:',s1)
print("s2:",s2)

s1 = "She said, 'Hello, World!'"
s2 = 'She said, "Hello, World!"'
print('s1:',s1)
print("s2:",s2)

s3 = """
Hello,
World.
"""
print("s3:",s3)

s4 = """
s1 = "She said, 'Hello, World!'"
s2 = 'She said, "Hello, World!"'
"""
print("s4:",s4)

"""
シングルコーテーション('')とダブルコーテーション("")は基本的には同じ役割を果たします。
どちらを使っても一行の文字列を定義することができます。
ただし、文字列内にシングルコーテーションやダブルコーテーションを含めたい場合、それぞれが役立ちます。
シングルコーテーションの文字列内では、ダブルコーテーションをエスケープせずに使用できますし、逆も然りです。
"""

$ python lesson02.py
s1: Hello, World!
s2: Hello, World!
s1: She said, 'Hello, World!'
s2: She said, "Hello, World!"
s3:
Hello,
World.

s4:
s1 = "She said, 'Hello, World!'"
s2 = 'She said, "Hello, World!"'

シングルコーテーションとダブルコーテーションはまあ同じですね。
文字列の中にそれぞれ、ダブルコーテションとシングルコーテーションを含めることができるので、自分の中でスタイルを統一しておくと後々わかりやすくなります。
トリプルコーテーションは便利ですね。LLMを使っていると、長々とプロンプトやロールを書くことが多いので必須です。プログラムドキュメントやヘルプをこれで書いておくと、後で、変数に入れて表示も可能なのでありがたいです。

なお、シングルコーテション、ダブルコーテーションで複数行を扱うことも可能です。こんな感じ


s1 = 'Hello,\
 World!'
print('s1:',s1)

s2 = 'Hello,\nWorld!'
print('s2:',s2)


s1: Hello, World!
s2: Hello,
World!

入力するときにバックスラッシュ(\)で行を分けることができますが、改行コードは入らないので、出力すると1行です。
改行コード(\n)を入力すれば、実際に、複数行の文字列にできます。しかし、定数文字列では面倒ですね。

文字列のランダムアクセス

文字列の中の文字や、短い文字列を自由に取り出すことができます。
文字列"abcdefg"の長さを調べて、前から3文字目、後ろから3文字目のもじを表示し、更に前から2文字目から後ろから3文字目までの文字列を取り出します。


# 文字列を定義
s = "abcdefg"
print(s)
# 文字列の長さを調べる
length = len(s)
print("Length of the string: ", length)

# 前から3文字目を表示
print("3rd character from the beginning: ", s[2])  # インデックスは0から始まるため

# 後ろから3文字目を表示
print("3rd character from the end: ", s[-3])  # 負のインデックスは末尾から数える

# 前から2文字目から後ろから3文字目までを取り出す
print("Substring from 2nd character to 3rd from the end: ", s[1:-2])  
# スライスの開始インデックスは含まれ、終了インデックスは含まれないため

abcdefg
Length of the string: 7
3rd character from the beginning: c
3rd character from the end: e
Substring from 2nd character to 3rd from the end: bcde

前から数えるときはインデックスが0から、後ろから数えるときはインデックスが-1から数えるんですね。
もちろんs[ー1]のかわりにs[len(s)-1]でも構いません。-1が共通でわかりやすい。
そして、範囲を切り出すときはs[begin:end]の用に使い、beginは範囲に含まれるけど、endは含まれません。数字の範囲でも以上未満で数えるのはプログラマの修正みたいなものかなあ。

文字列の結合

文字列の結合はpythonの場合、とても簡単です。2つほど紹介します。
+を使って繋ぐ方法と、f-string(フォーマット済み文字列リテラル)を使う方法です。下のコードはどちらも"abcdef"を作ります。


s1 = "abc"
s2 = "def"
s3 = s1 + s2
print("+: ",s3)  # "abcdef"
s1 = "abc"
s2 = "def"
s3 = f"{s1}{s2}"
print("f: ",s3)  # "abcdef"

これらの方法はそれぞれ異なる状況で有用です。

  • +を使う方法はシンプルで、小さな文字列の結合に便利です。しかし大量の文字列の結合には性能上の問題があります。なぜなら、Pythonの文字列はイミュータブル(不変)であるため、+で結合するたびに新しい文字列が作られ、メモリが大量に使用されるからです。

  • f-stringはPython 3.6以上で利用でき、文字列内に変数を直接埋め込むことができます。これはコードの可読性を高め、タイプミスを防ぐ助けになります。また、大量の文字列の結合にも性能上有利です。

案外長くなってしまった。今回はこれで終わり。
次は多分リストの話

まとめ

pythonで文字列を扱う方法として、
変数に文字列を代入する際の引用符の違いを説明しました。シングルコーテーション、ダブルコーテーションは1行の、トリプルコーテーションは複数行の文字列を定義します。それぞれの引用符は自分と異なる引用符を文字列の中に入れることができます。
変数の中から任意の位置の文字を取り出す方法を説明しました。範囲指定して文字列を取り出すときは、左端と右端で扱いが異なることに注意しました。
変数を繋ぐ方法を2つ紹介しました。+演算子を使う方法とf-stringを使う方法です。

付録 イミュータブル

イミュータブル(不変)なので性能上の問題が云々と言いました。
イミュータブルとはどういうことでしょうか
s="abc"
s+="d"
としたときに、見た目上はsの中身が"abc"から"abcd"に書き換えられたように見えますが、実は、"abcd"という新しいsが別に作られ、古い中身がが"abc"のsは、後でメモリ上から捨てられます。この一旦新しくと、後で捨てるのコンビネーションが、cpuとメモリに大きな負担をかけるかもしれないなあということです。めったに経験しないかもしれませんが、例えば"abc"が百万回繰り返す文字列を作ろうとして、下のようなコードを書くと一気にメモリを消費するかもしれません。(最終文字列だけでなく、途中に作られた文字列のメモリもしばらく消費される、最悪50万倍?)。もし、更に下のようなリストを使う方法なら、最終文字列分と最終リスト分のメモリ(大体2倍)だけですみます。

s = ""
for i in range(1000000):
    s += "abc"
s = []
for i in range(1000000):
    s.append("abc")
s = "".join(s)

おまけ タイトル画の説明 by GPT-4V

この画像は、豊かな色彩で描かれたイラストです。中心には、苦悩するような表情をした男性が広げた手から放たれるようにして文字と数字が飛び散っています。その文字たちは様々なフォントやスタイルで表現され、カラフルで動的な背景を形成しています。このイラストは、おそらくコミュニケーションの難しさや情報の過多を表すメタファーとして解釈されるかもしれません。

この記事が気に入ったらサポートをしてみませんか?