Привет, мне было интересно, можно ли присвоить значение в разделе сравнения кода.
Ниже приведен пример кода
startIndex = find(target, key, startIndex)
while( startIndex != -1):
matchesFound += 1
startIndex = find(target, key, startIndex + 1)
return matchesFound
Что я хочу сделать, это переместить startIndex = find (target, key, startIndex) в выражение сравнения, чтобы оно выглядело примерно так.
while( (startIndex = find(target, key, startIndex)) != -1):
matchesFound += 1
startIndex + 1
return matchesFound
Если нет, то какой будет лучший рефактор?
Спасибо
изменить Я работаю через учебные курсы MIT Open 6.00, прежде чем попробовать знаменитый модуль 6.001.
Если по какой-либо причине вы не можете использовать более подходящий метод из того, что вы ищете, это эквивалентно вашему рабочему коду из вопроса:
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))
Вы пишете C на Python.
Try:
startIndex = -1
while True:
startIndex = find(target, key, startIndex + 1)
if startIndex < 0:
break
matchesFound += 1
return matchesFound
Или, возможно, даже:
return target.count(key)
startIndex
нужно увеличивать на 1 при вызовах после первого.
Нет, вы не можете сделать это на Python. Я думаю, что основная причина, по которой Python запрещает это, заключается в том, чтобы избежать частых ошибок, возникающих в результате запутывания задания и проверки равенства.
Python утверждает, что читаемый код является основным ориентиром, поэтому я думаю, что ваш оригинальный код в порядке. Нет необходимости в рефакторе...
я сделал бы это так:
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
>>>
startIndex
передается в 1 на вызовы после первого.
Изменить.
Мы реорганизуем это так.
matches = [ k for k in range(len(target)-len(key)) if target[k:].startswith(key) ]
matchesFound = len(matches)
Нам не нужно условие C-стиля и контировка присваивания.
Редко вы просто хотите подсчет; фактические места доступны бесплатно.
find
сначала сstartIndex
, тогда как во втором вы вызываете его сstartIndex+1
.