您好我想知道是否可以在代码的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比较expresion中,这样看起来像这样
while( (startIndex = find(target, key, startIndex)) != -1):
matchesFound += 1
startIndex + 1
return matchesFound
如果没有,那么更好的重构会是什么?
谢谢
修改 在我试用着名的6.001模块
之前,我正在完成麻省理工学院开放课件6.00答案 0 :(得分:3)
如果由于某种原因你无法使用任何你正在搜索的方法,这相当于你问题中的工作代码:
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 :(得分: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)
答案 2 :(得分:0)
不,你不能用Python做到这一点。我认为Python不允许这样做的主要原因是避免因混淆赋值和等式检查而导致的频繁错误。
Python声称可读代码作为主要指南,因此我认为您的原始代码很好。无需重构...
答案 3 :(得分:0)
我会这样做
startIndex=0
while 1:
startIndex = find(target, key, startIndex+1)
if startIndex == -1: break
matchesFound += 1
你可以在while循环中加入更多条件。
编辑:@OP,将来计算字符串匹配,只需使用计数
>>> mystring = "abc defabc fgh ijkabc blah"
>>> mystring.count("abc")
3
>>>
答案 4 :(得分:0)
编辑。
我们像这样重构它。
matches = [ k for k in range(len(target)-len(key)) if target[k:].startswith(key) ]
matchesFound = len(matches)
我们不需要C风格的条件和分配合并。
你很少想要数数;实际的位置是免费的。
答案 5 :(得分:0)
在接受PEP 572的情况下,可以这样做:
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
它将包含在Python 3.8中。
此更改将使python代码更小。考虑以下标准库代码:
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
将对此进行改进:
SELECT CC.[CreditCardId],
CC.[ActivityId],
LJ.[TransactionDateTime],
FROM dbo.[CreditCard] CC WITH(NOLOCK)
Left Join (Select * From dbo.[CreditCard] Where [ActivityID] = 6 ) As LJ WITH(NOLOCK)
On CC.[CreditCardId] = LJ.[CreditCardId]
And CC.[HistoryId] = LJ.[HistoryId]
WHERE CC.[ActivityId] = 66
AND CC.[VANTransactionDateTime] >= @ReportStartDate
AND CC.[VANTransactionDateTime] < @ReportEndDate