4

誰かが私たちが書く文字列を結合したいときになぜPythonで私に説明できますか?

'delim'.join(list)

文字列を分割したいときは、次のように記述します。

str.split('delim')

Javaから来ているのは、Javaで次のように記述しているため、これらの1つが逆方向になっているようです。

//split:
str.split('delim');
//join
list.join('delim');

編集:
あなたは正しいです。joinはリストを取ります。(質問は変わりませんが)

誰かがこのAPIの背後にある理論的根拠を私に説明できますか?

4

3 に答える 3

4

参加は、ある種の反復可能なものに参加する場合にのみ意味があります。ただし、イテラブルには必ずしもすべての文字列が含まれているとjoinは限らないため、イテラブルにメソッドとして配置することは意味がありません。(結果はどうなると思います[1,"baz",my_custom_object,my_list].join("foo")か?)それを置く他の唯一の場所は、反復可能オブジェクトのすべてが文字列になることを理解した文字列メソッドとしてです。さらに、join文字列メソッドとして配置すると、タプル、リスト、ジェネレーター、反復をサポートするカスタムオブジェクト、さらには文字列など、任意の反復可能なメソッドで使用できます。

また、文字列を結合するのと同じ方法で、文字列を完全に自由に分割できることにも注意してください。

list_of_strings='this, is , a, string, separated, by , commas.'.split(',')

もちろん、ここでのユーティリティはそれほど簡単にはわかりません。

于 2012-07-13T17:05:54.000 に答える
2

http://docs.python.org/faq/design.html#why-is-join-a-string-method-instead-of-a-list-or-tuple-method

ソースから:

join()は文字列メソッドです。これを使用する場合、区切り文字列に一連の文字列を反復処理し、隣接する要素の間にそれ自体を挿入するように指示しているためです。このメソッドは、自分で定義する可能性のある新しいクラスを含め、シーケンスオブジェクトのルールに従う任意の引数で使用できます。

これは文字列メソッドであるため、Unicode文字列だけでなくプレーンASCII文字列でも機能します。join()がシーケンスタイプのメソッドである場合、シーケンスタイプは、セパレータのタイプに応じて、返す文字列のタイプを決定する必要があります。

于 2012-07-13T17:09:39.113 に答える
1

そのため、作成するすべてのシーケンスタイプに対して結合操作を再実装する必要はありません。Pythonは、主要な動作パターンとしてタイプではなくプロトコルを使用するため、既存のシーケンスクラスから派生していなくても、すべてのシーケンスが同じように動作することが期待できます。

于 2012-07-13T17:07:17.123 に答える