第 8 章: Python の文字列
1. 文字列の常駐メカニズム
1.1 文字列
文字列は Python の基本的なデータ型であり、不変の文字のシーケンスです。
1.2 文字列常駐メカニズムとは
- 同じ不変文字列のコピーは 1 つだけ保存されます。異なる値は文字列の常駐プールに保存されます。Python の常駐メカニズムでは、同じ文字列のコピーが 1 つだけ保持されます。後で同じ文字列が作成されると、新しいスペースを開きますが、文字列のアドレスを新しく作成した変数に割り当てます。
アイコン
コードデモ
"""
字符串的驻留机制
"""
a = 'Python'
b = "Python"
c = '''Python'''
print(a, id(a)) # 内存地址相同
print(b, id(b))
print(c, id(c))
1.3 常駐メカニズムのいくつかの状況 (対話モード)
sys の intern メソッドは、2 つの文字列が同じオブジェクトを指すように強制します
PyCharmは文字列を最適化します
- 文字列の長さが0または1の場合
- 識別子に一致する文字列
- 文字列はコンパイル時にのみ常駐し、実行時には常駐しません。
- [-5,256] の間の整数
次に、文字列の一般的な操作
2.1 文字列クエリ操作
一般的な方法
メソッド名 | 効果 |
---|---|
索引() | 部分文字列が最初に出現する位置を検索します。検索された部分文字列が存在しない場合は、例外 ValueError がスローされます。 |
rindex() | 部分文字列が最後に出現した位置を検索します。検索された部分文字列が存在しない場合は、例外 ValueError がスローされます。 |
探す() | 最初に出現する部分文字列を検索します。検索された部分文字列が存在しない場合は、-1 を返します。 |
rfind() | 部分文字列が最後に出現する位置を検索します。検索された部分文字列が存在しない場合は、-1 を返します。 |
コードデモ
s = 'hello,hello'
print('1.', s.index('lo'))
print('2.', s.find('lo'))
print('3.', s.rindex('lo'))
print('4.', s.rfind('lo'))
# print('5.', s.index('lo0')) # 抛出异常
print('6.', s.find('lo0'))
print('7.', s.rfind('lo0'))
2.2 文字列の大文字と小文字の変換
新しい文字列オブジェクトを生成します
変換された文字列は以前と同じでも、ID は依然として異なります
メソッド名 | 効果 |
---|---|
アッパー() | 文字列内のすべての文字を大文字に変換します |
より低い() | 文字列内のすべての文字を小文字に変換します |
スワップケース() | 文字列内のすべての大文字を小文字に変換し、すべての小文字を大文字に変換します。 |
大文字化() | 最初の文字を大文字に変換し、残りを小文字に変換します |
タイトル() | 各単語の最初の文字を大文字に変換し、残りの 1 文字を小文字に変換します。 |
コードデモ
s = 'hello,python'
print('0.', s, id(s))
a = s.upper()
print('1.', a, id(a))
b = s.lower()
print('2.', b, id(b))
s2 = 'hello,Python'
c = s2.swapcase()
print('3.', c)
d = s2.title()
print('4.', d)
2.3 文字列の内容の操作
メソッド名 | 効果 |
---|---|
中心() | Center は 最初のパラメータの幅を指定し、2 番目のパラメータはフィラーを指定します (オプション、デフォルトはスペースです)。 設定された幅が実際の幅より小さい場合は、元の文字列が返されます。 |
ライト() | 左揃え 最初のパラメータは幅を指定し、2 番目のパラメータはフィラーを指定します (オプション、デフォルトはスペースです)。 設定された幅が実際の幅より小さい場合は、元の文字列が返されます。 |
rjust() | 右揃え 最初のパラメータで幅を指定し、2 番目のパラメータでフィラーを指定します (オプション、デフォルトはスペース) 設定され た幅が実際の幅より小さい場合は、元の文字列が返されます |
zfill() | 左を揃え、 右を 0 で埋めます。このメソッドは、文字列の幅を指定するために使用されるパラメータを 1 つだけ受け入れます。設定された幅が 文字列の長さ以下の場合は、元の文字列が返されます。 。 |
コードデモ
s = 'hello,Python'
print('原字符:', s)
print('中对齐:', s.center(20, '*'))
print('中对齐:', s.center(10, '*'))
print('左对齐:', s.ljust(20, '*'))
print('右对齐:', s.rjust(20, '*'))
print('右对齐:', s.zfill(20))
2.4 文字列コンテンツの分割操作
メソッド名 | 効果 |
---|---|
スプリット() | 文字列の左側から分割を開始します。デフォルトの分割文字はスペース文字列で、戻り値はリストです。分割文字はパラメータで指定できます。分割の最大数はパラメータで指定できます。最大 分割 sep 数の maxslpit 後分割数、残りの部分文字列は、分割の一部として単独で取得されます。 |
rsplit() | 文字列の右側から分割を開始します。デフォルトの分割文字はスペース文字列で、戻り値はリストです。分割文字はパラメータで指定でき、分割の最大数はパラメータで 指定 sep できます maxslpit 。分割数、残りの部分文字列は、分割の一部として単独で取得されます。 |
コードデモ
s = 'hello world Python'
lst = s.split()
print(lst)
s1 = 'hello|world|Python'
print(s1.split(sep='|'))
print(s1.split(sep='|', maxsplit=1))
print('-------------------------------')
'''rsplit()从右侧开始劈分'''
print(s.rsplit())
print(s1.rsplit('|'))
print(s1.rsplit(sep='|', maxsplit=1))
2.5 文字列の判定演算
メソッド名 | 効果 |
---|---|
isidentifier() | 指定された文字列が有効な識別子であるかどうかを判断します |
isspace() | 指定された文字列がすべて空白文字 (キャリッジ リターン、ライン フィード、水平タブ) で構成されているかどうかを判断します。 |
アルファ() | 指定された文字列がすべて文字で構成されているかどうかを判断します |
is10進数() | 指定された文字列がすべて 10 進数で構成されているかどうかを判断します |
数値() | 指定された文字列が完全に数字で構成されているかどうかを判断します |
isalnum() | 指定された文字がすべて数字で構成されているかどうかを判断します |
コードデモ
s = 'abc%'
s1 = 'hellopython'
print(s.isidentifier()) # False
print(s1.isidentifier()) # True
print('\t'.isspace()) # True
print('abc'.isalpha()) # True
print('abc1'.isalpha()) # False
print('张三'.isalpha()) # True
print('123'.isdecimal()) # True
print('123四'.isdecimal()) # False
print('123'.isnumeric()) # True
print('123四'.isnumeric()) # True
print('IIIIIIIV'.isnumeric()) # False
print('abc123'.isalnum()) # True
print('123张'.isalnum()) # True
print('123!'.isalnum()) # False
2.6 文字列に対するその他の一般的な操作
関数 | メソッド名 | 効果 |
---|---|---|
文字列の置換 | 交換する() | 最初のパラメータは置換する部分文字列を指定し、2 番目のパラメータは部分文字列を置換する文字列を指定します。 このメソッドは置換後に取得した文字列を返します。置換前の文字列は変更されません。 このメソッドを呼び出すときに 3 番目のパラメータを渡すことができます。 . 置換の最大数を指定します。 |
文字列の結合 | 参加する() | リストまたはタプル内の文字列を 1 つの文字列に結合します |
コードデモ
s = 'hello,Python'
print(s.replace('Python', 'Java'))
s1 = 'hello,Python,Python,Python'
print(s1.replace('Python', 'Java', 2))
lst = ['hello', 'java', 'Python']
print('|'.join(lst))
print(''.join(lst))
t = ('hello', 'Java', 'Python')
print(''.join(t))
print('*'.join('Python'))
第三に、文字列の比較
- オペレーター
> >= < <= == !=
-
比較ルール
- まず 2 つの文字列の最初の文字を比較し、等しい場合は次の文字の比較を続け、2 つの文字列の文字が等しくなくなるまで順番に比較します。比較結果は 2 つの文字列の比較結果になります。 2 つの文字列の後続の文字はすべて比較されなくなります。
-
比較原理
- 2 つの文字を比較する場合、順序値 (元の値) が比較され、
ord
組み込み関数を呼び出すことで指定された文字の順序値を取得できます。 - 組み込み関数 ord に対応するのは組み込み関数です
chr
。組み込み関数 chr を呼び出すときに、序数値を指定して対応する文字を取得します。
- 2 つの文字を比較する場合、順序値 (元の値) が比較され、
-
コードデモ
rint('apple' > 'app') # True
print('apple' > 'banana') # False ,相当于97>98 >False
print(ord('a'), ord('b'))
print(ord('魏'))
print(chr(97), chr(98))
print(chr(39759))
'''
== 与is的区别
== 比较的是 value 是否相等
is 比较的是 id 是否相等
'''
a = b = 'Python'
c = 'Python'
print(a == b) # True
print(b == c) # True
print(a is b) # True
print(a is c) # True
print(id(a)) # 2204259933168
print(id(b)) # 2204259933168
print(id(c)) # 2204259933168
4番目、文字列のスライス操作
文字列は不変型です。
追加、削除、変更の操作はありません
スライス操作により新しいオブジェクトが生成されます
コードデモ
s = 'hello,Python'
s1 = s[:5] # 由于没有指定起始位置,所以从0开始切
s2 = s[6:] # 由于没有指定结束位置,所以切到字符串的最后一个元素
s3 = '!'
newstr = s1 + s3 + s2
print(s1)
print(s2)
print(newstr)
print('--------------------')
print(id(s))
print(id(s1))
print(id(s2))
print(id(s3))
print(id(newstr))
print('------------------切片[start:end:step]-------------------------')
print(s[1:5:1]) # 从1开始截到5(不包含5),步长为1
print(s[::2]) # 默认从0 开始,没有写结束,默认到字符串的最后一个元素 ,步长为2 ,两个元素之间的索引间隔为2
print(s[::-1]) # 默认从字符串的最后一个元素开始,到字符串的第一个元素结束,因为步长为负数
print(s[-6::1]) # 从索引为-6开始,到字符串的最后一个元素结束,步长为1
5、フォーマット文字列
文字列をフォーマットする 2 つの方法
コードデモ
"""第一种:% 占位符"""
name = '小米'
age = 20
print('我叫%s,今年%d岁' % (name, age))
"""第二种方法 {} 占位符 """
print('我叫{0},今年{1}岁'.format(name, age))
"""第三种方法 f-string方法"""
print(f'我叫{
name},今年{
age}岁')
精度の表現
print('%10d' % 99) # 10表示宽度
print('%f' % 3.1415926)
# 保留三位小数
print('%.3f' % 3.1415926)
# 同时设置宽度和精度:总宽度为10,小数点为3位
print('%10.3f' % 3.1415926)
print('{0}'.format(3.1415936))
print('{0:.3}'.format(3.1415936)) # .3表示一共是三位
print('{0:.3f}'.format(3.1415936)) # .3f表示是三位小数
# 同时设置宽度和精度:总宽度为10,小数点为3位
print('{0:10.3f}'.format(3.1415926))
6. 文字列エンコード変換
- 文字列エンコード変換が必要な理由
-
エンコードとデコードの方法
- エンコーディング: 文字列をバイナリデータ (バイト) に変換します。
- デコード: バイト型データを文字列型に変換します。
-
コードデモ
クローラー部分が適用されます
s = '天涯共此时'
# 编码
print(s.encode(encoding='GBK')) # 在GBK格式中 一个中文占2个字节
print(s.encode(encoding='UTF-8')) # UTF-8格式中,一个中文占3个字节
# 解码(解码格式 要和 编码格式 相同)
# byte代表一个二进制数据(字节类型数据)
byte = s.encode(encoding='GBK')
print(byte.decode(encoding='GBK'))
# print(byte.decode(encoding='UTF-8'))# 报错