代码之家  ›  专栏  ›  技术社区  ›  Sam

在while比较表达式中赋值

  •  1
  • Sam  · 技术社区  · 15 年前

    嗨,我想知道是否可以在代码的while比较部分中分配一个值。

    下面是当前代码的一个示例

    startIndex = find(target, key, startIndex)
    while( startIndex != -1):
        matchesFound += 1
        startIndex = find(target, key, startIndex + 1)
    return matchesFound
    

    我要做的是将startindex=find(target,key,startindex)移动到while比较表达式中,这样它看起来就像这样

    while( (startIndex = find(target, key, startIndex)) != -1):
        matchesFound += 1
        startIndex + 1
    return matchesFound
    

    如果不是,那么更好的重构是什么?

    谢谢

    编辑 在我尝试著名的6.001模块之前,我正在通过麻省理工学院开放式课件6.00学习。

    6 回复  |  直到 6 年前
        1
  •  3
  •   Roger Pate    15 年前

    如果出于某种原因,您无法从正在搜索的内容中使用更合适的方法,则这相当于问题中的工作代码:

    start = 0
    count = 0
    for match in iter(lambda: find(target, key, start), -1):
      count += 1
      start = match + 1
    return count
    

    但是,编写一个迭代器来查找这些匹配项,可以获得最大的好处,“转换”当前的find函数:

    def findall(target, key, start=0):
      for match in iter(lambda: find(target, key, start), -1):
        yield match
        start = match + 1
    

    然后从中计数:

    count = sum(1 for m in findall(target, key))
    
        2
  •  1
  •   retracile    15 年前

    您正在用python编写C。

    尝试:

    startIndex = -1
    while True:
        startIndex = find(target, key, startIndex + 1)
        if startIndex < 0:
            break
        matchesFound += 1
    return matchesFound
    

    甚至可能是:

    return target.count(key)
    
        3
  •  0
  •   3lectrologos    15 年前

    不,在Python中不能这样做。我认为python不允许这样做的主要原因是为了避免由于混淆的赋值和相等性检查而导致的频繁错误。

    python声称以可读代码为主要准则,所以我认为您的原始代码很好。不需要重构…

        4
  •  0
  •   ghostdog74    15 年前

    我想这样做

    startIndex=0
    while 1:
        startIndex = find(target, key, startIndex+1)
        if startIndex == -1: break
        matchesFound += 1
    

    你可以在while循环中加入更多的条件。

    编辑:@op,以后要统计字符串匹配,只需使用count

    >>> mystring = "abc defabc fgh ijkabc blah"
    >>> mystring.count("abc")
    3
    >>>
    
        5
  •  0
  •   S.Lott    15 年前

    编辑。

    我们像这样重构它。

    matches = [ k for k in range(len(target)-len(key)) if target[k:].startswith(key) ]
    matchesFound = len(matches)
    

    我们不需要C样式的条件和分配合并。

    你很少只需要计数;实际位置是免费的。

        6
  •  0
  •   ramazan polat    6 年前

    PEP 572 如果被接受,可以这样做:

    while (startIndex := find(target, key, startIndex)) != -1:
        matchesFound += 1
        startIndex + 1
        return matchesFound
    

    它将包含在Python3.8中。

    这种更改将使python代码更小。考虑以下标准库代码:

    while True:
        line = fp.readline()
        if not line:
            break
        m = define_rx.match(line)
        if m:
            n, v = m.group(1, 2)
            try:
                v = int(v)
            except ValueError:
                pass
            vars[n] = v
        else:
            m = undef_rx.match(line)
            if m:
                vars[m.group(1)] = 0
    

    它将改进如下:

    while line := fp.readline():
        if m := define_rx.match(line):
            n, v = m.group(1, 2)
            try:
                v = int(v)
            except ValueError:
                pass
            vars[n] = v
        elif m := undef_rx.match(line):
            vars[m.group(1)] = 0