Pythonの文字列の7つの方法を詳しく理解します

4813 ワード

ほとんどのプログラミング言語では、文字列を最も基礎的で不可欠なデータ型として列挙しています.つなぎ文字列は必須のスキルです.今日、私はみんなと一緒にPythonの文字列の7つの方法を勉強します.
1、C言語からの%方式
print('%s %s' % ('Hello', 'world'))
>>> Hello world

%号フォーマット文字列の方式は古いC言語から継承され、多くのプログラミング言語で類似の実現がある.前の例の%sはプレースホルダであり、文字列が1つだけを表し、接合の実際の内容ではありません.実際の接合内容は単独の%号の後ろにあり、1つのメタグループに置かれています.
同様のプレースホルダには、%d(整数を表す)、%f(浮動小数点数を表す)、%x(16進数を表す)、などがあります.%プレースホルダはこのような接合方式の特徴であると同時に、それぞれのプレースホルダに特定の意味があるため、実際に使用するのは面倒である.
2、format()接合方式
#    
s1 = 'Hello {}! My name is {}.'.format('World', 'Python ')
print(s1)
>>>Hello World! My name is Python .

#      
s2 = 'Hello {0}! My name is {1}.'.format('World', 'Python ')
s3 = 'Hello {name1}! My name is {name2}.'.format(name1='World', name2='Python ')
print(s2)
>>>Hello World! My name is Python .
print(s3)
>>>Hello World! My name is Python .

この方式ではカッコ{}をプレースホルダとして用い,format法で実際の接合値に転入する.実際には%号の接合方式の改善であることがわかりやすい.この方式はPython 2である.6で導入を開始します.
前例では,簡潔版の括弧には内容がなく,順序を間違えやすいのが欠点である.指定席版には主に2種類あり、1つはシーケンス番号を入力し、1つはkey-valueを使用する方法である.実戦では、順番を間違えることなく、直感的に読むことができる後者をお勧めします.
3、()類似メタグループ方式
s_tuple = ('Hello', ' ', 'world')
s_like_tuple = ('Hello' ' ' 'world')

print(s_tuple) 
>>>('Hello', ' ', 'world')
print(s_like_tuple) 
>>>Hello world

type(s_like_tuple) >>>str

なお、前例ではs_like_tupleはメタグループではありません.要素間にはカンマ区切り文字がないため、これらの要素間にはスペース間隔を使用することも、スペースを使用しないこともできます.type()を使用して表示すると、strタイプであることがわかります.何が原因なのかは調べていませんが、括弧の内容がPython最適化で処理されたのではないかと推測しています.
この方法は速く見えますが、カッコ()内には要素が真の文字列であることが要求され、変数を混用することはできないため、柔軟性がありません.
#     ,      
str_1 = 'Hello'
str_2 = (str_1 'world')
>>> SyntaxError: invalid syntax
str_3 = (str_1 str_1)
>>> SyntaxError: invalid syntax
#           
str_4 = (str_1)

4、オブジェクト向けテンプレート接合
from string import Template
s = Template('${s1} ${s2}!') 
print(s.safe_substitute(s1='Hello',s2='world')) 
>>> Hello world!

正直に言うと、私はこのような実現方法が好きではありません.対象思想に毒された臭いが濃い.
あまり言わないでください.
5、よく使う+番号方式
str_1 = 'Hello world! ' 
str_2 = 'My name is Python .'
print(str_1 + str_2)
>>>Hello world! My name is Python .
print(str_1)
>>>Hello world! 

この方式は最もよく使われ、直観的で分かりやすく、入門級の実現方式である.しかし、間違いを犯しやすい場所も2つあります.
まず、新しいプログラミングを始めた学生は間違いを犯しやすく、文字列が可変タイプであることを知らないので、新しい文字列は新しいメモリを独占し、元の文字列は変わらない.前の例では、接合前に2つの文字列があり、接合後に実際に3つの文字列があります.
次に、いくつかの経験のあるベテランプログラマーも間違いを犯しやすく、つなぎ合わせ回数が3を超えない場合、+番コネクタを使用すると他の方法よりも速くなると考えています(ps:多くのPythonチュートリアルはこのように提案されています)が、これは合理的な根拠はありません.
実際、短い字面値をつなぎ合わせると、CPythonの (constant folding)機能により、これらの文字面値は、「a'+'b'+'c'が「abc」に変換され、「hello'+'world」も「hello world」に変換されるなど、より短い形式に変換される.この変換はコンパイル期間中に完了し、実行期間になると継ぎ目操作が発生しないため、全体的な計算速度が速くなります.
定数折り畳み最適化には限界があり,接合結果の長さが20を超えないことが要求される.したがって、結合された最終文字列の長さが20を超えない場合、+番号オペレータの方式は、後述するjoinなどの方式よりもずっと速くなり、+番号の使用回数には関係ありません.
余談:20という数字はよく知っていると思いますか.そう、私たちが前に『Pythonの「特権種族」とは何ですか?」文字列類の特権種族も20に限られる.コンパイル期間と実行期間の違いを示す例もあり、振り返ってみることをお勧めします.
6、join()接合方式
str_list = ['Hello', 'world']
str_join1 = ' '.join(str_list)
str_join2 = '-'.join(str_list)
print(str_join1) >>>Hello world
print(str_join2) >>>Hello-world

strオブジェクトが持つjoin()メソッドは,シーケンスパラメータを受け入れ,接合を実現できる.つなぎ合わせるとき、要素が文字列でなければ、先に変換する必要があります.この方法は、リストなどのシーケンスオブジェクトの要素を接続し、統一されたインターバルを設定するのに適していることがわかります.
この方法は、接合長が20を超える場合に基本的に好ましい.しかし、その欠点は、ばらばらな断片を行うのに適していない、シーケンスの集合にない要素の接合である.
7、f-string方式
name = 'world'
myname = 'python_cat'
words = f'Hello {name}. My name is {myname}.'
print(words)
>>> Hello world. My name is python_cat.

f-string方式はPEP 498(Literal String Interpolation,字面文字列補間)から、Python 3.6バージョンが導入されました.文字列の前にf識別子を付け、文字列の真ん中に他の文字列変数をカッコ{}で包むのが特徴です.
この方式は可読性上format()方式を秒殺し,長い文字列の接合を処理する際にjoin()法に相当する速度である.
それでも、この方法は、f識別子を導入したため、他のいくつかのプログラミング言語に比べて優雅ではない.他のプログラム言語はshellなどより簡潔にできます.
name="world"
myname="python_cat"
words="Hello ${name}. My name is ${myname}."
echo $words
>>>Hello world. My name is python_cat.

まとめてみると、私たちが前に言った「文字列つなぎ」は、実は結果的に理解されています.実現原理から区分すれば、これらの方法を3つのタイプに分けることができます.
フォーマットクラス:%、format()、template
つなぎ合わせクラス:+、()、join()
補間クラス:f-string
文字列リストなどのシーケンス構造を処理する場合はjoin()方式を採用する.継ぎ目の長さが20を超えない場合は、+番号オペレータ方式を選択します.長さが20を超える場合は、高バージョンはf-string、低バージョンはformat()またはjoin()方式を使用します.