3

報告された「@」記号の位置から条件付きで文字列をスライスしたい状況があります。条件は次のとおりです。「@」が存在する場合は文字列をスライスし、それ以外の場合はそのままにします。関数を使用する方法と、インライン条件式を使用する方法の2つの方法を考えました。最もPythonicな方法はどれですか?

関数を使用する

>>> def slice_from_at(inp):
...     res = inp.find('@')
...     if res == -1:
...         return None
...     else:
...         return res     
>>> c = 'agent_address@agent_address'
>>> c[:slice_from_at(c)]
... 'agent_address'

インライン条件式の使用

>>> c = 'agent_address@agent_address'
>>> c[:None if c.find('@') == -1 else c.find('@')]
... 'agent_address'

インライン条件式の使用はより簡潔であり、より経済的であると主張する人もいるかもしれません-関数メソッドはより読みやすいのでよりPythonicですか?

4

6 に答える 6

5

関数が読みやすくなるだけでなく、再利用も可能です。

インライン式はc.find('@')2回呼び出す可能性があり、これは非効率的です。

Uselessがコメントで述べているように、これを行うための関数がすでに組み込まれています。この場合、実際には独自の関数を定義する必要はありません。

agent,_,address = c.partition('@')

ちなみに、コールバックは引数として渡され、後で呼び出される関数です。後で呼び出されないため、コールバックはありません。関数と呼べばいいと思います。

于 2011-11-07T09:45:41.163 に答える
3

最もPythonic?

車輪の再発明をしないで、使用するstr.partition()

def slice_from_at(inp):
    if '@' in inp:
        return inp.partition('@')[2]
    return inp

読みやすさよりも速度に関心がある場合は、次のことを試してくださいstr.rsplit()

def slice_from_at(inp):
    return inp.rsplit('@', 1)[-1]

どちらの例にも「コールバック」は含まれていません。また、そうすべきではありません。

1つのことを実行し、その1つのことをうまく実行する名前の付いた関数は、Pythonicとほぼ同じです。単体テストでバックアップされている場合は、はるかに優れています。

于 2011-11-07T09:50:05.437 に答える
0

私はこのようにコーディングします:

if '@' in c:
    c = c[:c.find('@')]

ほとんどの場合、2行のコードを関数を分離するために移動しません。

于 2011-11-07T11:32:54.257 に答える
0

代わりにこれはどうですか?

c.split('@')[0]
于 2011-11-07T09:46:51.360 に答える
0

[存在するが、自分で記述した可能性がある]のAPIが低レベルである、.partition()またはそれ.rsplit()よりもクリーンであるという文体的な理由:指定された文字列にインデックスを返しますが、そのインデックスはカットする意味があります文字列なので、文字列の目的のフラグメントを直接返しませんか?c[:slice_from_at(c)]slice_from_at()

一般に、シーケンスへのインデックスは、インデックスへの露出を減らす組み込みヘルパーの量が増えていることから明らかなように、より高いレベルの代替が存在する場合は非Pythonであると見なされます。頭に浮かぶ特定の例:

  • zip()ループの必要性をenumerate()減らします。for i in range(len(seq)):
  • substring in string、、、str.split()次にstr.partition()
于 2011-11-07T11:15:35.113 に答える
0

簡単に作業できる場合は文字列メソッドを好む傾向がありますが、完全を期すために、正規表現について言及する必要があります。

re.sub('^.*@', '', c)
于 2011-11-07T11:18:25.780 に答える