2

わかりましたので、python 暗号化コードを書いています。コードが必要以上に長くなったので、一部を関数に切り替えました。これをやり始めるとすぐに、変数が見つからないと言われました。これを修正するために、変数をグローバルに設定しました。ただし、それでも機能せず、次のエラーが表示されます。

Traceback (most recent call last):
  File "C:/Users/Alex/Desktop/Encryptor.py", line 272, in <module>
    startup()
  File "C:/Users/Alex/Desktop/Encryptor.py", line 257, in startup
    encrypt()
  File "C:/Users/Alex/Desktop/Encryptor.py", line 44, in encrypt
    maincrypt(2)
  File "C:/Users/Alex/Desktop/Encryptor.py", line 12, in maincrypt
    print newtext
UnboundLocalError: local variable 'newtext' referenced before assignment

これが私のコードです:

letters = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
def maincrypt(num):
    print otext
    print textlist
    print newtextlist
    print newtext
    print times
    print i
    add = times + num
    while add > 25:
        add = add - 25
        if ord(i) >= 65 and ord(i) <= 90:
            newtext += letters[add].uppercase
        else:
            newtext += letters[add]
def encrypt():
    global otext
    global textlist
    global newtextlist
    global newtext
    global times
    global i
    otext = raw_input("Text?")
    textlist = []
    newtextlist = []
    newtext= ""
    times = 0
    for i in otext:
        textlist.append(i)
    for i in textlist:
        if i == 'a' or i == 'A':
            maincrypt(0)
        elif i == 'b' or i == 'B':
            maincrypt(1)
        elif i == 'c' or i == 'C':
            maincrypt(2)
        elif i == 'd' or i == 'D':
            maincrypt(3)
        elif i == 'e' or i == 'E':
            maincrypt(4)
        elif i == 'f' or i == 'F':
            maincrypt(5)
        elif i == 'g' or i == 'G':
            maincrypt(6)
        elif i == 'h' or i == 'H':
            maincrypt(7)
        elif i == 'i' or i == 'I':
            maincrypt(8)
        elif i == 'j' or i == 'J':
            maincrypt(9)
        elif i == 'k' or i == 'K':
            maincrypt(10)
        elif i == 'l' or i == 'L':
            maincrypt(11)
        elif i == 'm' or i == 'M':
            maincrypt(12)
        elif i == 'n' or i == 'N':
            maincrypt(13)
        elif i == 'o' or i == 'O':
            maincrypt(14)
        elif i == 'p' or i == 'P':
            maincrypt(15)
        elif i == 'q' or i == 'Q':
            maincrypt(16)
        elif i == 'r' or i == 'R':
            maincrypt(17)
        elif i == 's' or i == 'S':
            maincrypt(18)
        elif i == 't' or i == 'T':
            maincrypt(19)
        elif i == 'u' or i == 'U':
            maincrypt(20)
        elif i == 'v' or i == 'V':
            maincrypt(21)
        elif i == 'w' or i == 'W':
            maincrypt(22)
        elif i == 'x' or i == 'X':
            maincrypt(23)
        elif i == 'y' or i == 'Y':
            maincrypt(24)
        elif i == 'z' or i == 'Z':
            maincrypt(25)
        else:
            newtext += i
        times += 1
    print newtext

def decrypt():
    otext = raw_input("Text?")
    textlist = []
    newtextlist = []
    newtext= ""
    times = 0
    for i in otext:
        textlist.append(i)
    for i in textlist:
        if i == 'a' or i == 'A':
            add = 0 - times
            while add < 0:
                add = add + 25
            newtext += letters[add]
        elif i == 'b' or i == 'B':
            add = 1 - times
            while add < 0:
                add = add + 25
            newtext += letters[add]
        elif i == 'c' or i == 'C':
            add = 2 - times
            while add < 0:
                add = add + 25
            newtext += letters[add]
        elif i == 'd' or i == 'D':
            add = 3 - times
            while add < 0:
                add = add + 25
            newtext += letters[add]
        elif i == 'e' or i == 'E':
            add = 4 - times
            while add < 0:
                add = add + 25
            newtext += letters[add]
        elif i == 'f' or i == 'F':
            add = 5 - times
            while add < 0:
                add = add + 25
            newtext += letters[add]
        elif i == 'g' or i == 'G':
            add = 6 - times
            while add < 0:
                add = add + 25
            newtext += letters[add]
        elif i == 'h' or i == 'H':
            add = 7 - times
            while add < 0:
                add = add + 25
            newtext += letters[add]
        elif i == 'i' or i == 'I':
            add = 8 - times
            while add < 0:
                add = add + 25
            newtext += letters[add]
        elif i == 'j' or i == 'J':
            add = 9 - times
            while add < 0:
                add = add + 25
            newtext += letters[add]
        elif i == 'k' or i == 'K':
            add = 10 - times
            while add < 0:
                add = add + 25
            newtext += letters[add]
        elif i == 'l' or i == 'L':
            add = 11 - times
            while add < 0:
                add = add + 25
            newtext += letters[add]
        elif i == 'm' or i == 'M':
            add = 12 - times
            while add < 0:
                add = add + 25
            newtext += letters[add]
        elif i == 'n' or i == 'N':
            add = 13 - times
            while add < 0:
                add = add + 25
            newtext += letters[add]
        elif i == 'o' or i == 'O':
            add = 14 - times
            while add < 0:
                add = add + 25
            newtext += letters[add]
        elif i == 'p' or i == 'P':
            add = 15 - times
            while add < 0:
                add = add + 25
            newtext += letters[add]
        elif i == 'q' or i == 'Q':
            add = 16 - times
            while add < 0:
                add = add + 25
            newtext += letters[add]
        elif i == 'r' or i == 'R':
            add = 17 - times
            while add < 0:
                add = add + 25
            newtext += letters[add]
        elif i == 's' or i == 'S':
            add = 18 - times
            while add < 0:
                add = add + 25
            newtext += letters[add]
        elif i == 't' or i == 'T':
            add = 19 - times
            while add < 0:
                add = add + 25
            newtext += letters[add]
        elif i == 'u' or i == 'U':
            add = 20 - times
            while add < 0:
                add = add + 25
            newtext += letters[add]
        elif i == 'v' or i == 'V':
            add = 21 - times
            while add < 0:
                add = add + 25
            newtext += letters[add]
        elif i == 'w' or i == 'W':
            add = 22 - times
            while add < 0:
                add = add + 25
            newtext += letters[add]
        elif i == 'x' or i == 'X':
            add = 23 - times
            while add < 0:
                add = add + 25
            newtext += letters[add]
        elif i == 'y' or i == 'Y':
            add = 24 - times
            while add < 0:
                add = add + 25
            newtext += letters[add]
        elif i == 'z' or i == 'Z':
            add = 25 - times
            while add < 0:
                add = add + 25
            newtext += letters[add]
        else:
            newtext += i
        times += 1
    print newtext

def startup():
    upass = raw_input("Password: ")
    if upass == "astrocrypt":
        print """Welcome!
1: Encrypt
2: Decrypt
3: Credits
4: Quit"""
        try:
            choice = input()
        except SyntaxError:
            print "Oops! That's not a valid number! Try again!"
            startup()
        except NameError:
            print "Oops! That's not a valid number! Try again!"
            startup()
        if choice == 1:
            encrypt()
            startup()
        elif choice == 2:
            decrypt()
            startup()
        elif choice == 3:
            print "Made by Alex Taber"
            startup()
        elif choice == 4:
            pass
        else:
            print "Unknown number"
            startup()
    else:
        print "Incorrect password!"
startup()
4

2 に答える 2

3

まず、非常に強力で事実上解読不可能な暗号化アルゴリズムがあり、そのうちのいくつかは、hmac などの python にあらかじめパッケージ化されています。

import hmac

def Hash_string(ref):
        cypher = hmac.new('you secret word', 'plain-text')
        return cypher.hexdigest()

使用するのに十分シンプルで、はるかに強力です。デフォルトでは python が付属していませんが、セットアップは簡単です。

コードに移りましょう。Python でグローバル変数を使用する方法は次のとおりです。

# declare variables as global
global num1
global num2
num2=22    # give initial value to num2

def foo():
   # bind variable names to the ones in global scope
   global num2
   print num2   # output: 22
   num2 = 88
   print num2   # output: 88
   global num1
   num1 = num2

def bar():
   print num1   # output: 88
   print num2   # output 88

foo()
bar()

したがって、 newtext を gobal として宣言されたものにバインドする必要があります

また、encrypt を次のように書き直すことをお勧めします。

alpha = ['a','b','c','d','e','f','g','h','i','j','k','l' ,'m','n','o','p','q','r','s','t','u','v','w','x',' y','z']

数値 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23 ,24,25]

def map (ch):
   chr = ch.lower()
   return numeric[alpha.index(chr)]

これにより、数字とアルファベットの間のマッピングが作成されるため、elif の長いリストは必要ありません。

お役に立てれば。

編集 global キーワードを使用してグローバルにアクセスできますが、それらを変更する場合は、変更する前にまずグローバル変数にバインドする必要があります。

編集は return numeric[index(chr)] を return numeric[alpha.index(chr)] に変更しました 間違いで申し訳ありません:)

于 2013-05-11T14:12:26.580 に答える
2

プログラマーをグローバルから保護するために、グローバルは で宣言するまで関数内に存在するとは見なされませんglobal variablename。maincrypt では、割り当てによってglobal newtextローカルを宣言したり作成したりしませんnewtext。+= 演算子では、左辺が既に存在している必要があります。まだ存在していないため、例外がスローされます。

ところで、このプログラムを他の場所で再利用する予定がある場合は、グローバルではなくクラス変数を使用することをお勧めします。そのため、1) 他の誰かが同じグローバル名を使用しても問題ありません。2) 暗号化プログラムのインスタンスを 2 つ持つことができます。 /decryptor コードを実行し、異なるスレッド上で並行して、互いのグローバルを破壊することなく、異なるものを暗号化/復号化します。

また、このコード: ord(i.upper()) - ord('A')'a' と 'A' の場合は 0、'b' と 'B' の場合は 1、'c' と 'C' の場合は 2... などなので、必要ありません。そのような巨大な if/elif チェーン。(これが機能する理由は、'A'、'B'、'C' などが ASCII で連続しているためです。したがって、'B' - 'A' は 1 などです)

于 2013-05-11T14:03:33.253 に答える