在while比较表达式中赋值

2 投票
6 回答
8010 浏览
提问于 2025-04-15 18:00

你好,我想知道在代码的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.00,准备在尝试著名的6.001模块之前先把这个学完。

6 个回答

1

随着PEP 572的通过,我们将可以这样做:

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

这个功能会在Python 3.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
1

你在用Python写C语言的代码。

可以试试:

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

或者甚至可以试试:

return target.count(key)
5

如果因为某些原因你不能使用更合适的方法来解决你正在查找的问题,这段代码和你提问时的代码是等价的:

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

不过,写一个迭代器来查找这些匹配项会让你事半功倍,也就是“改造”一下你现在的查找函数:

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))

撰写回答