澄清简单的功能

时间:2012-12-10 21:43:45

标签: python

字符串的优点遵循以下两条规则:

  • 包含一个或多个'u'的字符串的优点是0
  • 否则,字符串的优点等于字符串中的'g'的数量

“gbbgb”是2
“gubgb”是0

#I understand this function
def goodness(s):
    if s.count('u') > 0:
       return 0 
    else:
       return s.count('g') 

#But not this one.
def best_slice(s, k):
    ''' s is str, k is an integer such that 0 <= k <= len(s). Return the starting index of the length-k slice of s with highest goodness. If k is zero, return -1.'''
    stop = len(s) - k  # ?
    best_start = -1 # ?
    best_goodness = 0  
    for i in range(stop + 1):
       cur_slice = s[i:i+k]
       slice_goodness = goodness(cur_slice)
       if slice_goodness > best_goodness:
          best_start = i
          best_goodness = slice_goodness
    return best_start

有人可以帮我解释一下,我不明白。

3 个答案:

答案 0 :(得分:2)

该代码不是特别pythonic。请考虑一下:

def goodness(s):
    return 0 if 'u' in s else s.count('g')

def substrings(s, length):
    "Generate all substrings of given length."
    for i in range(len(s) - length + 1):
        yield s[i:i+length]

print list(substrings('abcdefgh', 3)) # ['abc', 'bcd', 'cde', 'def', 'efg', 'fgh']   

def best_slice(s, length):
    """Return the 'best' substring."""
    return max(substrings(s, length), key=goodness)

print best_slice('abcgabgoguffg', 3) # 'gog'

如果您在理解这一点时遇到问题,请告诉我们。

答案 1 :(得分:2)

函数第一行的解释总结得非常好,但让我们一行一行解释发生了什么。

def best_slice(s, k):
    ''' s is str, k is an integer such that 0 <= k <= len(s). Return the starting index of the length-k slice of s with highest goodness. If k is zero, return -1.'''

好吧,所以我们有一个遍历字符串的函数,找到具有最高“goodness”的字符串切片。 s表示字符串,k是切片的长度。

    stop = len(s) - k  # ?

此行告诉我们何时停止循环s的切片。我们不需要走得更远,因为len(s) - k是字符串中最后一个可能的长度为k的起始切片索引。

    best_start = -1 # ?

best_start是我们在for循环中slice_goodness永远不会超过best_goodness时返回的内容。因此,如果k小于0,则函数返回-1。

    best_goodness = 0

我们将其设置为0,因此我们可以循环遍历所有切片,检查高于0的优点。严格来说,此变量不是必需的,但在循环中最好有一个命名变量而不是幻数0 。它增加了清晰度,但技术上并不需要。

    for i in range(stop + 1):
       cur_slice = s[i:i+k]
       slice_goodness = goodness(cur_slice)

现在我们通过功能获得切片的优点。

    if slice_goodness > best_goodness:
        best_start = i
        best_goodness = slice_goodness

    return best_start

如果切片是我们最好的切片,我们保存它以针对更多切片进行测试,并保存它的索引以便在它是最佳切片的情况下返回。

答案 2 :(得分:0)

为什么best_start = -1? 阅读规范。它说如果k = 0返回-1,那么将会发生什么。

除此之外,它正在尝试每个可能的长度k片段。

例如,

string:“asgeksv” k = 5

然后,尝试“asgek”,“sgeks”和“geksv”以获得最佳的善意价值。