Pierwszy projekt w Python' ie. Jakieś uwagi odnośnie kodu?

0

Witam,
Znam już podstawy Pythona i postanowiłem, że napiszę pierwszy, prosty projekt (Szyfr cezara). Prosiłbym o opinie nad czym muszę popracować/co zmienić/czy kod jest przejrzysty itp. (Tak wiem, że jeśli na starcie wpiszę np. słowo "wyraz" i klucz "20", to program w pewnym sensie się wysypie z powodu ost. litery "z", ale nie zwracajcie na to uwagi. W pełni działający skrypt mam na kompie, a aktualnie nie mam do niego dostępu. Ale różni się tylko warunkiem if WprowadzonyTekst >= maks ascii od z)

#Funkcja szyfrowania
def szyfruj(WprowadzTekst, klucz):  
    for i in range(len(WprowadzTekst)):
        if(ord(szyfr[i]) == 32):
            szyfr[i] = " "
        else:
            szyfr[i] = chr(ord(szyfr[i]) + klucz)

#Funkcja deszyfrowania
def deszyfruj(szyfr, klucz):
    for i in range(len(szyfr)):
        if(ord(szyfr[i]) == 32):
            szyfr[i] = " "
        else:
            szyfr[i] = chr(ord(szyfr[i]) - klucz)

#Połącz znaki z listy w jeden wyraz
def listToString(szyfr):  
    str1 = ''   
    return (str1.join(szyfr))

#Wprowadz tekst, który chcesz zaszyfrować
WprowadzTekst = input("Wprowadz tekst: ")

#Utwórz listę (Znaków w string'u nie da się zamienić)
szyfr = list(WprowadzTekst)

#Wprowadz klucz
klucz = int(input("Wprowadz klucz: "))

#Wywołaj funkcję szyfruj i wyświetl zaszyfrowany tekst
szyfruj(WprowadzTekst, klucz)
print(listToString(szyfr))

#Wywołaj funkcję deszyfruj i wyświetl odszyfrowany tekst
deszyfruj(szyfr, klucz)
print(listToString(szyfr))
1

Jak działa to jest ok,. Z takich uwag ogólnych to używaj nazw anglojęzycznych. Ni musisz komentować każdej linijki kodu. Im mniej komentarzy tym lepiej. Zadko kometarze żyją razem z kodem i potem tylko wprowadzają w błąd.

0

To samo co wyżej, a ponadto:

  1. Twój program głośno się wysypie, jak dostanie pusty szyfr lub klucz.
  2. Twoje funkcje polegają w niejawny sposób na zewnętrznym stanie w postaci tablicy szyfr.
1

Funkcja szyfruj modyfikuje globalną to źle
Funkcja deszyfruj modyfikuje lokalny argument szyfr co w tym przypadku jest zbędne
Lepiej byłoby, gdyby żadna z tych funkcji nie modyfikowała, a tworzyła nowy wynik na podstawie argumetnów. W pythonie takie podejście dużo bardziej się zwraca.

1

W Pythonie stosuje się "camel case" tylko do nazw klas (zaczynają się od dużej litery), a w funkcjach rozdzielamy wyrazy podkreśleniem ("underscore"). Czyli:
list_to_string, a nie listToString, ale:
ClassCipher, nie Class_cipher.

1

Jak już masz pisać tego typu komentarze:

# cos tam cos tam
def funkcja():
    pass

lepiej napisz docstring-a, np:

def funkcja(par1):
    """
    funkcja robi to i to

    Parameters
    ----------------
    par1: int
        bla bla bla

    Returns
    ---------
    out: list
        list of ints...

    Examples
    -------------
    >>> funkcja(3)
    [1,2,3]
    """
    return list(range(par1))

Z tego można wygenerować automatycznie dokumentację do HTML. IDE powinno sobie poradzić z docstringiem i podpowiadać programiście co dana funkcja robi. W REPLu po imporcie wystarczy napisać help(funkcja)<ENTER> a w ipython funkcja?<ENTER> żeby wyświetlić dokumentacje do funkcji.

0
def listToString(szyfr):  
    str1 = ''   
    return (str1.join(szyfr))

Ta funkcja jest zbędna. Robi się to po prostu tak ''.join.(szyfr) jest to powszechne i normalne zastosowanie. Na dobrą sprawę Twoja funkcja to tylko zmiana nazwy

0
        if(ord(szyfr[i]) == 32):
            szyfr[i] = " "
        else:
            szyfr[i] = chr(ord(szyfr[i]) + klucz)

Dlaczego ord(szyfr[i]) == 32, a nie szyfr[i] == ' '? Poza tym, gdybyś unikał zmiennych globalnych (tak jak to było wspomniane wyżej), to mógłbyś zrobić

szyfr = [" " if znak == " " else chr(ord(znak) + klucz) for znak in szyfr]

1 użytkowników online, w tym zalogowanych: 0, gości: 1