0

Pythonのドキュメントによると:

str.endswith(サフィックス[, 開始[, 終了]])

文字列が指定されたサフィックスで終わる場合は True を返し、そうでない場合は False を返します。suffix は、検索するサフィックスのタプルにすることもできます。オプションの開始では、その位置からテストを開始します。オプションの end では、その位置で比較を停止します。

バージョン 2.5 で変更: タプルをサフィックスとして受け入れます。

次のコードは を返すはずですが、Python 2.7.3Trueでは返されます。False

"hello-".endswith(('.', ',', ':', ';', '-' '?', '!'))

str.endswith()4 番目のタプル要素を超えるものは無視されるようです。

>>> "hello-".endswith(('.', ',', ':', '-', ';' '?', '!'))
>>> True
>>> "hello;".endswith(('.', ',', ':', '-', ';' '?', '!'))
>>> False

バグを見つけましたか、それとも何か不足していますか?

4

3 に答える 3

10

または私は何かを逃していますか?

';'タプルの の後にコンマがありません:

>>> "hello;".endswith(('.', ',', ':', '-', ';' '?', '!'))
                                         #    ^
                                         # comma missing
False

このため、;?が連結されています。したがって、この場合はで終わる文字列;?が返されます。True

>>> "hello;?".endswith(('.', ',', ':', '-', ';' '?', '!'))
True

コンマを追加すると、期待どおりに機能します。

>>> "hello;".endswith(('.', ',', ':', '-', ';', '?', '!'))
True
于 2013-08-09T00:06:12.677 に答える
0

隣接する文字列リテラルが連結されていることはすでに指摘されていますが、もう少し情報とコンテキストを追加したかったのです。

これは、C と共有 (および借用) された機能です。

さらに、これは「+」のような連結演算子のようには機能せず、追加のオーバーヘッドなしでソース内で文字通り一緒に結合されているかのように同じように扱われます。

例えば:

>>> 'a' 'b' * 2
'abab'

これが便利な機能なのか迷惑なデザインなのかは意見の問題ですが、文字列リテラルを括弧内にカプセル化することで、文字列リテラルを複数の行に分割することができます。

>>> print("I don't want to type this whole string"
          "literal all on one line.")
I don't want to type this whole stringliteral all on one line.

このタイプの使用法 (#defines と共に使用されることと一緒に) が、最初は C で有用であり、その後 Python に持ち込まれた理由です。

于 2013-08-09T04:25:10.920 に答える
0

タプルを次のように書くと

>>> tuple_example = ('.', ',', ':', '-', ';' '?', '!')

タプルは次のようになります

>>> tuple_example
('.', ',', ':', '-', ';?', '!')
                          ^
                   # concatenate together 

そのため、False を返します

于 2013-08-09T00:15:08.240 に答える