Kod ASCII - zaszyfrowanie słowa

0

Chodzi o to, że if używa kodu ASCII do tego, żeby litery pomięzy A, a - Z, żeby zamienić litery na myślniki. Mógłby ktoś powiedzieć jak to poprawić, żeby nie wyrzucało błędu ?

0

W pythonie stringi sa immutable, wiec nie mozesz podmienic literki pod danym indeksem, ale mozesz zbudowac nowego stringa

Tylko co wlasciwie chciales osiagnac w tej petli?

1

Po pierwsze, piszesz w Pythonie, a kod wygląda jak z C. Zamiast for i in range(0, len(tekst)): znacznie wygodniej jest pisać for char in tekst:. W takim wypadku masz od razu dostęp do każdego znaku.

Po drugie, masz coś nie tak z warunkiem. Brakuje znaków nierówności dla małych liter oraz zakresy są przesunięte o 1 w złą stronę. Dodatkowo, jeśli to nie jest wymóg, prościej (i przejrzyściej) jest sprawdzić, czy litera jest w string.ascii_letters (trzeba zaimportować moduł string). Dzięki temu warunek będzie wyglądał tak if tekst[i] in string.ascii_letters: w Twojej wersji lub tak if letter in string.ascii_letters: w mojej.

Po trzecie, jak już @stivens wspomniał, stringi są immutable, więc przydałoby się zbudować nowego. Można przykładowo stworzyć pustą listę przed pętlą, a następnie dodawać do niej litery. Po wszystkim łączysz listę za pomocą "".join(lista) i masz gotowego nowego stringa. Teoretycznie da się zamiast listy stworzyć pustego stringa i dodawać do niego po kolei litery, ale jest to mało wydajne, ponieważ z każdym dodawaniem jest tworzony nowy obiekt string.

Tak więc trochę bardziej Pythonowy kod wyglądałby tak:

temp = []
for char in tekst:
    if (65 <= ord(char) <= 90) or (97 <= ord(char) <= 122): # Lub char in string.ascii_letters
        temp.append('-')
    else:
        temp.append(char)
tekst = "".join(temp)

A jeszcze bardziej

import string
tekst = "".join(['-' if char in string.ascii_letters else char for char in tekst])
1

Jeszcze można bez pętli, z użyciem re.sub() i wyrażenia regularnego.

1

@maciekniewielki:
jeszcze lepsza wersja warunku:

if 'A' <= char <= 'Z' or 'a' <= char <= 'z':
0

@enedil

if 'a' <= char.lower() <= 'z':
0

Jest jeszcze jedna metoda:

#Przykład
>>> "".join(lett for lett in "abccde23432" if lett.isdigit())
'23432'

#Użycie warunku lewostronnie jeśli nie chcesz pomijać elementów.
>>> text = input("Wpisz coś: ")
Wpisz coś: A tutaj podajemy twój tekst do 'wymyślnikowania'.
>>> "".join('-' if 'a' <= char.lower() <= 'z' else char for char in text)
"- ----- -------- --ó- ----- -- '----ś----------'."

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