Kod ASCII - zaszyfrowanie słowa

Kod ASCII - zaszyfrowanie słowa
H9
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 4 lata
  • Postów:15
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 ?

  • 120.png (24 KB) - ściągnięć: 750
stivens
  • Rejestracja:ponad 8 lat
  • Ostatnio:około godziny
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?


λλλ
maciekniewielki
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 4 godziny
  • Lokalizacja:Warszawa
  • Postów:36
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:

Kopiuj
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

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

"The most important step a person can take is always the next one." - Brandon Sanderson
edytowany 1x, ostatnio: maciekniewielki
Spine
  • Rejestracja:około 22 lata
  • Ostatnio:około 2 godziny
  • Postów:6693
1

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


🕹️⌨️🖥️🖱️🎮
enedil
  • Rejestracja:prawie 12 lat
  • Ostatnio:6 dni
  • Postów:1027
1

@maciekniewielki:
jeszcze lepsza wersja warunku:

Kopiuj
if 'A' <= char <= 'Z' or 'a' <= char <= 'z':
edytowany 1x, ostatnio: enedil
Spine
  • Rejestracja:około 22 lata
  • Ostatnio:około 2 godziny
  • Postów:6693
0

@enedil

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

🕹️⌨️🖥️🖱️🎮
edytowany 1x, ostatnio: Spine
vpiotr
  • Rejestracja:prawie 14 lat
  • Ostatnio:prawie 3 lata
1
Guaz
  • Rejestracja:około 8 lat
  • Ostatnio:ponad 4 lata
  • Lokalizacja:Częstochowa
  • Postów:221
0

Jest jeszcze jedna metoda:

Kopiuj
#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)
"- ----- -------- --ó- ----- -- '----ś----------'."

Linux Mint
Arduino / Python 3.5.2
edytowany 3x, ostatnio: Guaz
MO
Nie no... można schabowego pałeczkami do sushi. Tylko po co ryzykować "kuchnię postmodernistyczną" jak jest "tradycyjna polska" :) Czytelność intencji rzecz istotna.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.