該程序計算一個字符串在一個較大字符串中重疊出現次數。調試並運行給出不同的輸出python
輸入:
較大的字符串(VAR名稱:search_space)< < ABABABA
小串(VAR名稱:SEARCH_STRING)< < ABA
回答在Pycharm 2016.3:中使用'調試代碼'
搶答Pycharm 2016.3使用 '運行代碼':7
預期的答案:3
我的代碼:
import sys
def count_substring(search_space, search_string):
search_space = search_space.lower()
search_string = search_string.lower()
if search_space:
search_space = search_space.split('\n')[0]
if search_string:
search_string = search_string.split('\n')[0]
lower = 0
upper = len(search_string)
curr = ' '
count = 0
for curr in search_space:
selected = search_space[lower:upper]
if search_string == selected:
count += 1
lower += 1
upper += 1
if upper > len(search_space):
break
return count
if __name__ == '__main__':
s = sys.stdin.read()
t = sys.stdin.read()
occurance_count = count_substring(s, t)
sys.stdout.write(str(occurance_count))
的代碼進行了修改,以幫助闡明錯誤:
for idx, curr in enumerate(search_space):
print(idx, curr)
print(count)
selected = search_space[lower:upper]
Outpu T使用 '調試代碼':(按預期運行)
>? abababa <ENTER>
>? aba <ENTER>
0 a
0
1 b
1
2 a
1
3 b
2
4 a
2
3
輸出使用 '運行代碼':
abababa
aba
^D
0 a
0
1 b
1
2 a
2
3 b
3
4 a
4
5 b
5
6 a
6
7
注: ^ d即按Ctrl + d,按下因爲運行期間按ENTER插入換行符。 Ctrl + D是我設法讓剩餘代碼運行的唯一方法。但即使沒有CTRL + D,在完成代碼的遠程測試時(這是自我導向的非證書課程的一部分),仍然存在差異。
注意:我必須在本練習中使用標準輸入和輸出。
在我看來,使用for curr in search_space:
正在使循環在search_space的整個長度內迭代,因此比它應該更多次。
爲什麼Break命令不起作用?
我的問題:
- 這究竟是爲什麼?
- &我會閱讀哪些概念以瞭解並預見此類事件?
- 爲什麼調試和運行模式中的差異?
- 我如何在未來的代碼中預見和防止這個錯誤?
- 有沒有比Ctrl + D更好的運行方式?這個粗略的技巧在終端或IDLE中不起作用。
您從標準輸入讀取兩次:'sys.stdin.read()'。該方法從該流中讀取直到其結束(而不是像在「運行」示例中那樣結束行)。它只能被調用一次,之後你不應該觸碰stdin。 –
謝謝埃爾瑪! 我意識到一些錯誤,因爲len(search_string)爲零。 readline()會更好嗎? 如果我確實使用read(),我如何在s和t之間分配輸入? –
是的,或者使用'readline()'或者之後用'split(「\ n」)將輸入拆分成幾行' –