2012-08-10 144 views
0

这是Python的练习,我对Python中的变量范围设定感到困惑。Python中的“for i in range(XX)”的变量范围

“返回真,如果给定的字符串中包含的外观‘XYZ’,其中 的XYZ不是直接由一段preceeded(。),因此‘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并不意味着什么。 为什么?

回答

4

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

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,因此它可以用作if语句中的条件。

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

虽然有效,但这对于这个问题来说是矫枉过正的。它也没有真正回答这个问题,即“为什么我不能在'for'循环中修改'i'的值?”。 – 2012-08-10 05:59:23

+0

哦......对不起,我并没有试图给出一个矫枉过正的答案。你已经解释了为什么我没有按照他的预期运作。试图表明可能有一个更清晰的方式来实现xyz_there。 – 2012-08-10 06:54:21

+0

没问题。我没有投票,只是评论。我也猜测(尽管我不能保证)练习是在诸如codingbat.com之类的网站上进行的,无法为您的解决方案导入模块。都好。 :) – 2012-08-10 14:02:31