0

これはPythonの演習であり、Pythonの変数スコープについて混乱しています。

「指定された文字列に「xyz」の外観が含まれ、xyzの前にピリオド(。)が直接付いていない場合は、Trueを返します。したがって、「xxyz」はカウントされますが、「x.xyz」はカウントされません。

xyz_there('abcxyz')→True
xyz_there('abc.xyz')→False xyz_there('xyz.abc')→True "

これが私の答えです:

def xyz_there(str):
   for i in range(len(str)-2):
        if str[i]=='.':
           i+=1
           continue
        elif str[i:i+3]=='xyz':
           return True
   return False

そしてそれは間違っています。xyz_there('abc.xyz') → False常に戻りTrueます。変数iは常に0,1,2...であるため、i+=1これは何の意味もありません。なぜ???

4

3 に答える 3

4

の値を変更できないわけではありませんi。あなたはできる。ここでの秘訣は、の戻り値の内容を反復処理することですrange。ループがリセットされるたびに、その反復可能ファイルから次の値を取得しますがi、ループを進めるためにの値はインクリメントされません。

于 2012-08-10T03:04:56.660 に答える
1

forループを使用する必要がありますか?これは、正規表現に最適な場所です。以下の例を変更したので、答えを出すだけではありません...「xyz」を探す代わりに、「hello」を探しています。そして、私も「?」を見ないようにしています。その「こんにちは」の前に。

import re
def hello_there(str):
    if re.match("(.*[^\?])?hello.*", str):
        return True
    return False

正規表現パターンは次のもので構成されます。

  • .*-文字列の先頭にある任意の数の非改行文字。
  • [^\?]^-後続のすべての前に(n個のエスケープされた)疑問符を禁止\?します。
  • hellohello-それが出現することを保証します。
  • .*-そして他の任意の数の文字で終わります。

re.matchは、ブール値Trueに解決されるMatchObjectを返すため、ifステートメントの条件として使用できます。

>>> hello_there("foohellobar")
True
>>> hello_there("foo?hellobar")
False
>>> hello_there("foohello?bar")
True
于 2012-08-10T04:10:47.097 に答える
0

最も簡単な答えは次のとおりです。

def xyz_there(str):
    for i in range(len(str)-2):
        if str[i:i+3] == "xyz" and str[i-1] != ".":
            return True
    return False 
于 2021-01-14T04:05:44.110 に答える