2017-07-19 166 views
0

我正在Python中製作一個加密工具,並且這個過程的一部分是用加密位置重新分配每個位置。該代碼是指在此通過該代碼來實現每個字符運行加密:for循環不夠循環 - Python

for pos in range (0, len(plaintext)-1): 
    print("pos is %s" % (pos)) 

下面的代碼應該是不相關的,但可以被提供。 當這個代碼運行,輸出,

pos is 0 
pos is 1 

環路從未達到2,儘管「明文」是3的長度如果我要刪除「-1」部分(包括作爲長度和最後的位置是不一樣的),我遇到一個錯誤,以下代碼超出範圍(以下代碼在我眼裏不需要改變,但可以提供)。

任何人都可以理解或解釋我的問題?

的Python 2.7.11 視窗8.1

編輯:

以下循環開始如下的代碼,

for pos in range (0, len(plaintext)-1): 
    print("pos is %s" % (pos)) 
    for k in range (0, key): 
     if(plaintext[pos] == "z"): 
      crypt = "%s%s%s" % (crypt[:pos], "a", crypt[pos+1:]) 
     else: 
      crypt = "%s%s%s" % (crypt[:pos], abc[abc.index(plaintext[pos])+1], crypt[pos+1:]) 

誤差是由於所述切片是 隱窩[凸起pos + 1:]

因爲你不能在2.7.11中分配一個位置,所以我的解決方法是concatenat在我的位置的任何一側,圍繞新加密的密鑰。

+1

如果您需要此幫助,請向我們顯示'plaintext' – jacoblaw

+7

'range()'不包含'stop'值,所以'range(len(明文))'就足夠了。注意:'對於pos,枚舉中的char(明文):'可能更好。 – AChampion

+0

'範圍(len(明文))' –

回答

0

range(lower, upper)返回一個包含從lower開始到upper-1結束的值的列表。如果len(plaintext) == 3,那麼您的列表正確包含元素01

至於你的錯誤,你還沒有包括相關的代碼。

+1

我不知道如果值得回答,本來會更好的評論。 –

0

range(3)爲您提供了序列[0, 1, 2],因此在您的示例中,您希望擁有range(len(plaintext))(無論如何,下限默認爲零)。

但是,遍歷字符串中每個字符的pythonic方法(假設這是您的實際目標)將是for c in plaintext。也有一個枚舉(同時獲得該字符和索引)使用方法:

for i, c in enumerate(plaintext): 
    print('pos is %s" % (i)) 
0

如果plaintext長度爲3,那麼當你做len(plaintext)-1這等於2.設置一個範圍內range(0,2)總是會導致只有0和1。您可以測試,使用該行:

print(list(range(0, len(plaintext)-1))) 

這將只輸出[0,1]

換句話說,第二個參數range是上限,但本身並不包含

現在,對於你的第二部分 - 看起來當你達到2時,在你的代碼的其餘部分有一些東西被訪問,其中只有2個項目,所以給它一個索引2就是搜索第三個項目(因爲我們開始索引在0)然後你得到你的錯誤抄寫(索引超出範圍)。我無法確切知道爲什麼沒有看到您的代碼。

0

正如其他人所說,該範圍的末尾是排他性的,這意味着正確for循環是:

for pos in range(len(plaintext)): 

在您的代碼的第二部分,假定plaintextcrypt具有相同的長度, crypt[pos+1:]在最後一個循環上返回一個錯誤。例如,如果plaintext的長度爲3,pos在最後一個循環中爲2,並且crypt[3]索引超過了字符串的末尾。爲了解決這個問題,你可以使用一個三元操作符:

end = crypt[pos+1:] if pos < len(crypt) else "" 
crypt = "%s%s%s" % (crypt[:pos], abc[abc.index(plaintext[pos])+1], end) 

這就使crypt[pos+1:]如果pos < len(crypt)時,纔會執行。