Day07 · 字符串(一) – 小嘉游戏

Day07 · 字符串(一) – 小嘉游戏


ステージ: ステージ 1 · コアの基礎 |前提条件: Day06 |技術ベースライン: Python 3.15.0

学習目標

  • 文字列を定義する 3 つの方法 (一重引用符、二重引用符、三重引用符) をマスターする
  • 文字列を理解する不変性「文字列を変更すると、実際には新しい文字列が生成される」ということを知ってください。
  • よく使用されるエスケープ文字を覚えて、オリジナルの文字列を使用できるようにする r'' パスと正則化について説明する
  • マスターインデックス作成 (ポジティブおよびネガティブ) とスライス s[start:end:step]負のステップサイズで逆順序を実行できます
  • 使用します len() 文字列が次と同じであることを認識して長さを取得します。 +、* 運用ルール

1. 文字列とは

文字列 (str) は文字列であり、Python で最も一般的に使用されるテキスト データ型です。それはに属しますシーケンスタイプ(シーケンス)——列に順番に並べて、1枚ずつ取り出すことができます。

2. 文字列の定義: 3 種類の引用符

2.1.一重引用符と二重引用符

Python の一重引用符 '...' と二重引用符 "..." 完全に同等なので、どちらかを選択してください。どちらを使用するかを選択するための実際的なルールは、文字列内に表示する必要がある他の種類の引用符を使用することです。

# Author: XiaoJia
s1 = 'Hello Python'        # 单引号
s2 = "Hello Python"        # 双引号,效果相同
s3 = '他说:"你好"'          # 内部有双引号,外面用单引号
s4 = "it's a book"         # 内部有单引号,外面用双引号

print(s1, s2, s3, s4, sep="\n")

出力:

Hello Python
Hello Python
他说:"你好"
it's a book

2.2.三重引用符: 複数行の文字列

3 つの引用符 """...""" または '''...''' できる線を越えて改行とインデントを保持するため、テキスト、SQL、HTML、ドキュメントのコメントの大部分を記述するのに非常に適しています。

poem = """床前明月光,
疑是地上霜。
举头望明月,
低头思故乡。"""
print(poem)

html = """
    Hello Python
"""
print(html)

ヒント: Day04 では、関数/クラスの先頭にある 3 つの引用符で囲まれた文字列がドキュメント文字列 (Docstring) であり、本質的には通常の文字列であると述べました。

3. 文字列は不変です

文字列が作成されると、その場で変更することはできません。いわゆる「文字列を変更する」ということは、実際には新しい文字列を作成することを意味します。

s = "hello"
# s[0] = "H"     # TypeError: 'str' object does not support item assignment

# 正确做法:造一个新字符串
s2 = "H" + s[1:]
print(s)           # hello    原串没变
print(s2)          # Hello    新串

覚えておいてください: すべての文字列メソッドは新しい文字列を返す元の文字列を変更せずに。

4. エスケープ文字

一部の文字には特別な意味があるため (引用符、改行など)、それらを表すにはバックスラッシュを使用する必要があります。 \ 逃げる。

エスケープ文字 意味
\n 改行
\t 水平タブ文字(Tab)
\\ バックスラッシュ
\' 一重引用符
\" 二重引用符
\r Enter(カーソルが行頭に戻ります)
\b バックスペース (前の文字を削除)
\uXXXX Unicode 文字 (コード ポイントによる)
print("他说:\"你好\"")        # 他说:"你好"
print('it\'s a book')         # it's a book
print("第一行\n第二行")        # \n 换行
print("姓名\t年龄")            # 姓名    年龄
print("C:\\Users\\XiaoJia")   # C:\Users\XiaoJia

4.1.エスケープ文字はどのような問題を解決しますか?

「入力」したい一部の文字は、Python では別の意味を持っています。たとえば、文字列が二重引用符で囲まれており、その中にさらに二重引用符がある場合、インタプリタは「文字列はここで終了する」と誤って認識します。次に、バックスラッシュを使用する必要があります \ 通訳者に「次の文字は単なる普通の文字です。文法記号として扱わないでください。」と伝えます。

# 不加转义会怎样?下面这行会报 SyntaxError
# print("他说:"你好"")     # 第二个 " 被当成字符串结尾

# 加了转义就正常
print("他说:\"你好\"")    # 他说:"你好"

\n、\t これらはその逆です。バックスラッシュが通常の文字になる「非表示の制御文字」です。 n 「改行」というアクションになります。一般的なものは、 \u Unicode 文字を表すには、4 つの 16 進数を追加します。

print("\u4f60\u597d")     # 你好    按 Unicode 码点输出
print("\u2605")           # ★      一颗星

5. 元の文字列 r”

Windows パスまたは正規表現を記述するときは、各バックスラッシュを次のように記述する必要があります。 \\とても面倒です。引用符の前に r(生)、バックスラッシュは「表示されているものが得られるもの」であり、エスケープされなくなりました。

path1 = "C:\\Users\\XiaoJia\\python"   # 普通写法,每个 \ 都要转义
path2 = r"C:\Users\XiaoJia\python"     # 原始字符串,直接写路径

print(path1)          # C:\Users\XiaoJia\python
print(path2)         # C:\Users\XiaoJia\python
print(path1 == path2)  # True

# 正则场景也常用 r
import re
print(re.findall(r"\d+", "编号123abc456"))   # ['123', '456']

注: 元の文字列では最後の文字を単一のバックスラッシュにすることはできません(r"\" バックスラッシュが依然として引用符をエスケープしているため、エラーが報告されます)。パスの末尾にバックスラッシュが必要な場合は、次のように記述します。 r"C:\path\\" または path + "\\"。

6. インデックス: を押して文字を選択します

文字列の左端が 0 番目で、右に +1 です。負の数値を使用して右から左に数えることもできます。右端の数値は -1 です。

# Author: XiaoJia
s = "Hello Python"
#  索引:0123456789...(H=0, e=1, ..., P=6, ...)

print(s[0])        # H
print(s[6])        # P
print(s[-1])       # n   最后一个字符
print(s[-7])       # 空格(第 6 位)

長さは L 文字列、最後の文字の添字は L-1;国境を越えたレポート IndexError。

# print(s[100])    # IndexError: string index out of range

7. スライス: セクションを切り取る

スライス構文 s[start:end:step]、から start 得る end 前に(端を除く)、ステップサイズが利用可能です。 3 つのパラメータはすべて省略できます。

s = "Hello Python"
print(s[0:5])      # Hello    [0,5)
print(s[:5])       # Hello    省略 start = 从 0 开始
print(s[6:])       # Python   省略 end = 到最后
print(s[-6:])      # Python   负数从右数
print(s[::2])      # HloPto   步长 2,隔一个取
print(s[::-1])     # nohtyP olleH   步长 -1,字符串反转!
print(s[0:100])    # Hello Python   切片越界不报错,自动截到末尾

スライスのヒント:left が含まれ、right が含まれない場合、省略された場合は終了になります。歩幅が負の場合は、右から左に進みます。

# 实用小例:去首尾、取奇偶位
word = "abcdefg"
print(word[1:-1])      # bcdef    去掉首尾
print(word[::2])       # aceg     偶数位(0,2,4,6)
print(word[1::2])      # bdf      奇数位(1,3,5)

5.1.インデックス作成とスライスによくある落とし穴

初心者はインデックスのスライスで 3 つの間違いを犯すことがよくあります。 Xiaojia はそれらを一度にわかりやすく説明します。

  1. 添字は 1 ではなく 0 から始まります: 最初の文字は s[0]、いいえ s[1]。
  2. スライスの右端を取得できません:s[0:5] 下付き文字を取得します 0、1、2、3、4含まない 5したがって、長さは正確に等しいです 5 - 0 = 5。
  3. 負のインデックスは -1 から始まります:最後の文字は s[-1]、いいえ s[-0](-0 等しい 0)。
# Author: XiaoJia
word = "Python"
# 下标: P  y  t  h  o  n
# 正数: 0  1  2  3  4  5
# 负数:-6 -5 -4 -3 -2 -1

print(word[0])       # P     第一个
print(word[5])       # n     最后一个
print(word[-1])      # n     最后一个(等价写法)
print(word[0:6])     # Python  左含右不含,长度 6
print(word[:3])      # Pyt    省略 start
print(word[3:])      # hon    省略 end

直感に反しますが、有益な点がもう 1 つあります。スライスが境界を越えてもエラーは報告されませんが、インデックスが境界を越えるとエラーが報告されます。。

s = "abc"
print(s[1:100])      # bc    切片自动截到末尾,不报错
# print(s[100])      # 索引越界 → IndexError

8. len()、+、および *

8.1. len() は長さを受け取ります

print(len("Hello"))      # 5
print(len(""))           # 0
print(len("你好"))        # 2   中文一个字算 1 个字符

8.2.文字列の結合 + と繰り返し *

s1 = "Hello"
s2 = "World"
print(s1 + " " + s2)     # Hello World
print("=" * 30)          # ==============================
print("Ha" * 3)           # HaHaHa

ルール:

  • + 追加できる文字列は 2 つだけです。文字列と数値を最初に追加する必要があります str() 変換する。
  • * のもう 1 つのオペランドは、繰り返し回数を表す整数でなければなりません。
  • 操作結果はすべて新しい文字列元の文字列は変更されません。
# 常见错误:字符串和数字直接相加
# print("年龄:" + 18)        # TypeError
print("年龄:" + str(18))     # 年龄:18
# 常见错误:字符串和数字直接相加
# print("年龄:" + 18)        # TypeError
print("年龄:" + str(18))     # 年龄:18

# 乘 0 或负整数会得到空串
print("Ha" * 0)               # 空串
print("ab" * -3)              # 空串

+ そして * 元の文字列は変更されませんが、新しい文字列が返されます。これは、Day06 で述べた「文字列の不変性」と同じものです。ここで見られるすべての文字列操作は、基本的に「古い文字列を読み取り、新しい文字列を作成する」ことです。

8.3.文字列や数値を追加するとエラーが表示されるのはなぜですか?

初心者がよく書きます print("第" + 1 + "名")結果が報告される TypeError: can only concatenate str (not "int") to str。理由は簡単です。+ 文字列では、これは「接合」を意味し、両側が文字列である必要があります。そして 1 整数ですが、型が一致しません。 Python はそれを自動的に変換しません (これは Day01 で「強力な型指定」について話していることです)。解決策はまずそれを使うことです str() 数値を文字列に変換するか、単に f-string を使用します。

# 错误:str + int
# print("第" + 1 + "名")      # TypeError

# 对:先转字符串
print("第" + str(1) + "名")     # 第1名

# 更推荐:f-string,自动处理类型
print(f"第{1}名")                # 第1名

この落とし穴は本質的に「文字列は不変であり、+ 「文字列のみを認識する」ルールの拡張です。型の境界を理解すれば、エラー メッセージはもう怖くなくなります。

9. 総合例:手こすり「大文字」

Day07 で学んだ知識を組み合わせて、小さな問題を解決できます。 "hello python" なる "Hello Python"既製品とは呼ばないでください title()自分でスライスしてつなぎ合わせて実装しました。

# Author: XiaoJia
s = "hello python"

# 第一步:把第一个单词首字母大写
result = s[0].upper() + s[1:6]      # "Hello "
# 第二步:找到第二个单词,把它的首字母大写
space_pos = s.find(" ")            # 6
result = result + s[space_pos + 1].upper() + s[space_pos + 2:]
print(result)                       # Hello Python

この例では、「スライスはセクションを取り、upper() ケースを変更して、+ スプライシング、find() 「空間を配置する」という4つの知識が紐づいています。 Day08で学びます split()、join()この要件はより簡潔に記述されますが、考え方は同じです。変更したい断片を切り出し、変更後に元に戻します。。

Xiaojia 氏は次のように注意します。文字列は不変であるため、「古い文字列を変更する」のではなく、常に「新しい文字列を作成する」ことになります。これを理解しておけば、後でリスト(変数)を学ぶときに、両者の本質的な違いに気づくことができます。

10. この章の境界: 今日は話すことは何もありません

あまり欲張らないように、Day07では「文字列を定義する・文字を取得する・スライスする方法」の3つだけを解決します。弦フォーマットされた出力(%、.format()、fストリング)、エンコードとデコード、同様に find/replace/split/join 数十のメソッドがすべて Day08 に追加されるまで待ちます。今日覚えておくべきことは 2 つだけです。

  • 文字列は、引用符で定義された不変の文字列です。
  • ほとんどの基本的な操作は、「値のインデックス付けとセグメントのスライス」によって完了できます。

この 2 点を理解すれば、Day08 のメソッドは非常にスムーズに習得できます。これらのメソッドは、本質的には「スライスによる処理」です。

練習問題

  1. 3 種類の引用符 (英語の二重引用符を含む文字列、英語の一重引用符を含む文字列、および 3 行にわたる文字列) を使用して文字列を記述し、個別に出力します。
  2. 与えられた s = "PythonProgramming"スライスして取り出す "Python"、"Programming"次に文字列全体を反転します。
  3. 生の文字列を使用して Windows パスを書き込みます D:\文档\教材\Pythonそして使用します print 印刷、観察、通常の筆記の違い。
  4. 「文字列の不変性」を検証するコードを作成します: 試してください s[0]="x" どのようなエラーが報告されているかを確認し、再試行してください。 + そしてスライスして、最初の文字を大文字にした新しい文字列を作成します。
  5. 与えられた word = "abcdefgh"スライスを使用して偶数文字と奇数文字をそれぞれ削除します。
  6. 考えられる質問:s[::-1] 文字列を反転できるのはなぜですか?ステップサイズが負の場合 start そして end デフォルトではどちらの端を指すのでしょうか?

まとめ

  • 文字列の場合 '...'、"..." 定義、三重引用符 """...""" 行をまたぐことができます。一重引用符と二重引用符は同等です。「内部引用符がある場合は別のパッケージを使用する」をクリックします。
  • 文字列は不変です: できません s[i]=xすべてのメソッドは新しい文字列を返します。
  • エスケープ文字 \n \t \\ \' \" 等;元の文字列 r"..." パスや正規表現に適した、表示されているものと同じものが得られますが、最後を単一にすることはできません。 \。
  • インデックスは 0 から始まり、負の数は右から数えられます (-1 が最後です)。範囲外のインデックスについては IndexError が報告されますが、範囲外のスライスについてはエラーは報告されません。
  • スライス s[start:end:step]:左の部分には右の部分が含まれており、含まれていません。省略した場合は終了します。[::-1] 文字列を反転します。
  • len() 長さを取得します(漢字は 1 としてカウントされます)。+ スプライシング、* 繰り返すと新しい文字列が生成されます。文字列を数値に直接追加することはできません。

さらに読む



Source link

Leave a Reply

Your email address will not be published. Required fields are marked *