Python中“for i in range(XX)”的变量范围

时间:2012-08-10 02:58:34

标签: python variables scoping

这是Python的练习,我对Python中的变量作用域感到困惑。

  

“如果给定的字符串包含”xyz“的外观,则返回True   xyz不是直接在句点(。)之前。所以“xxyz”很重要   但“x.xyz”没有。

     

xyz_there('abcxyz')→真实   xyz_there('abc.xyz')→错误   xyz_there('xyz.abc')→真“

这是我的答案:

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并不意味着什么。 为什么???

3 个答案:

答案 0 :(得分:4)

并非您无法更改i的值。您可以。这里的诀窍是你正在迭代range的返回值的内容。每次循环重置时,您都会从该迭代中获取下一个值,它不会增加i的值来进行循环。

答案 1 :(得分:1)

您是否需要使用for循环?这将是正则表达的好地方。我修改了下面的例子,所以我不只是给你答案......而不是寻找“xyz”,我正在寻找“你好”。我也试图避免看到“?”在那之前“你好”。

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

正则表达式模式包括:

  • .* - 字符串开头的任意数量的非换行符;
  • [^\?] - 在随后的所有内容之前禁止^ a(n转义)问号\?;
  • hello - 确保hello能够出现;
  • .* - 并以任意数量的其他字符结尾。

re.match将返回一个解析为布尔值True的MatchObject,因此它可以用作if语句中的条件。

>>> hello_there("foohellobar")
True
>>> hello_there("foo?hellobar")
False
>>> hello_there("foohello?bar")
True

答案 2 :(得分:0)

最简单的答案是:

unauthorized