2012-08-10 17 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