Присвоение значения в выражении сравнения while - PullRequest
1 голос
/ 14 января 2010

Привет, мне было интересно, можно ли присвоить значение в разделе сравнения 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

если нет, то каким будет лучший рефакторинг?

Спасибо

редактировать Я работаю с учебным программным обеспечением MIT Open 6.00, прежде чем опробовать знаменитый модуль 6.001

Ответы [ 6 ]

3 голосов
/ 14 января 2010

Если по какой-то причине вы не можете использовать более подходящий метод из того, что ищете, это эквивалентно вашему рабочему коду из вопроса:

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))
1 голос
/ 14 января 2010

Вы пишете C на Python.

Попытка:

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

Или, может быть, даже:

return target.count(key)
0 голосов
/ 01 октября 2018

Принимая 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
0 голосов
/ 14 января 2010

Изменить.

Мы рефакторинг это так.

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

Нам не нужно совпадение условий и назначения в стиле C.

Редко вы просто хотите считать; фактические местоположения доступны бесплатно.

0 голосов
/ 14 января 2010

я бы так сделал

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

вы можете поставить больше условий внутри цикла while.

Edit: @OP, в будущем, чтобы посчитать совпадение строки, просто используйте count

>>> mystring = "abc defabc fgh ijkabc blah"
>>> mystring.count("abc")
3
>>>
0 голосов
/ 14 января 2010

Нет, вы не можете сделать это в Python. Я думаю, что главная причина, по которой Python запрещает это, состоит в том, чтобы избежать частых ошибок, возникающих из-за запутанного присваивания и проверки на равенство.

Python утверждает, что в качестве основного руководства используется читаемый код, поэтому я думаю, что ваш оригинальный код в порядке. Нет необходимости в рефакторинге ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...