Zadanie

Bazując na podanej sentencji stwórz nową w której każdy wyraz będzie miał naprzemiennie wielką i mała literę. Czyli przykładowy tekst:

Jeśli człowiek da z siebie wszystko, to co mu jeszcze zostanie?
Zostanie zamieniony na:
JeŚlI CzŁoWiEk dA Z SiEbIe wSzYsTkO, tO Co mU JeSzCzE ZoStAnIe?

Rozwiązanie

Range i slice

tekst = 'Jeśli człowiek da z siebie wszystko, to co mu jeszcze zostanie?'

indeksy_do_zmiany = range(len(tekst))[::2]
index = 0
nowy_tekst = ''

for litera in tekst:
    if index in indeksy_do_zmiany:
        nowy_tekst += litera.upper()
    else:
        nowy_tekst += litera
    index += 1

print(nowy_tekst)

Output:

JeŚlI CzŁoWiEk dA Z SiEbIe wSzYsTkO, tO Co mU JeSzCzE ZoStAnIe?

W tym rozwiązaniu postanowiliśmy stworzyć listę wszystkich indeksów znaków, które należałoby zamienić na wielkie. Aby to zrobić posłużyliśmy się funkcją range. Funkcja ta zwraca nam kolekcję liczb z zadanego zakresu. W naszym przypadku były to liczby od 0 do 63 bo tyle ma właśnie znaków nasz tekst. Następnie dzięki mechanizmowi slice pobraliśmy z naszej kolekcji co drugą liczbę.

[ : : 2] czytamy następująco od początku kolekcji, aż do samego końca pobierz co drugi element

Warto zauważyć, że zmienne tekstowe (str) w Pytonie można traktować podobnie do listy. Oczywiście str to nie lista ale dla naszych obecnych potrzeb takie uproszczenie będzie pomocne. Zatem do elementów zmiennej tekstowej czyli do liter można odwoływać się za pomocą [].

>>> 'Lubie czytac'[2]
'b'

Z uwagi, że elementy numerujemy od zera to pod indeksem 2 kryje się literka ‚b’

Idąc dalej, po zmiennych tekstowych można iterować się za pomocą pętli for

>>> for litera in 'Lubie czytac':
...     print(litera)
... 
L
u
b
i
e
 
c
z
y
t
a
c

Wróćmy teraz do naszego przykładu.

Mamy już listęindeksami liter które należałoby zamienić na wielkie. Teraz wystarczy przeliterować się po naszym tekście i poddać odpowiednie znaki ”powiększaniu” :). Brakuje nam jeszcze informacji jakie indeksy mają sprawdzane przez nas znaki. Aby naprawić ten problem wprowadziliśmy nową zmiennąindex”, która serwuje tą informację, Ważne by nie zapomnieć o zwiększaniu naszego licznika ”index” po każdym obiegu pętli. Jak już mamy wszystkie potrzebne komponenty możemy sprawdzić, czy indeks obecnie sprawdzanego znaku jest na liście znaków do ”powiększania”. Jeśli tak zamieniamy dany znak na wielki używając metody uppr(). Jeśli nie, dodajmy dany znak do naszego nowego ciągu znaków tak jak jest, czyli bez zmiany jego wielkości.

Funkcja modulo

tekst = 'Jeśli człowiek da z siebie wszystko, to co mu jeszcze zostanie?'

nowy_tekst =''
for i in range(len(tekst)):
    if i % 2 == 0:
        nowy_tekst += tekst[i].upper()
    else:
        nowy_tekst += tekst[i]

print(nowy_tekst)

Output:

JeŚlI CzŁoWiEk dA Z SiEbIe wSzYsTkO, tO Co mU JeSzCzE ZoStAnIe?

W tym rozwiązaniu użyliśmy operacji matematycznej modulo czyli reszty z dzielenia. Znowu za pomocą funkcji range stworzyliśmy kolekcję indeksów po której się iterujemy. Następnie dzięki funkcji modulo sprawdzamy każdy indeks.

>>> 1 % 2
1
>>> 2 % 2
0
>>> 3 % 2
1
>>> 4 % 2
0
>>> 

Dzięki temu możemy rozróżnić, który indeks jest parzysty by wtedy zmienić literę pod tym indeksem na wielką.

Enumerate

tekst = 'Jeśli człowiek da z siebie wszystko, to co mu jeszcze zostanie?'

nowy_teskt = []
for i, litera in enumerate(tekst):
    if i % 2 == 0:
        nowy_teskt.append(litera.upper())
    else:
        nowy_teskt.append(litera)

print(''.join(nowy_teskt))

Output:

JeŚlI CzŁoWiEk dA Z SiEbIe wSzYsTkO, tO Co mU JeSzCzE ZoStAnIe?

Pythonie nie ma powodu by ręcznie tworzyć indeksy. Zamiast tego można użyć ”enumerate”. Funkcja ta zwraca nam generator serwujący tuple zawierające kolejne elementy z kolekcji wraz z ich indeksami. Potem do akcji wchodzi znana nam już operacja modulo.

Generator expression

print(''.join(
        litera.upper() if i % 2 == 0
        else
        litera
        for i, litera in enumerate(tekst)
    )
)

Output:

JeŚlI CzŁoWiEk dA Z SiEbIe wSzYsTkO, tO Co mU JeSzCzE ZoStAnIe?

Jak zwykle na koniec naszych zmagań do akcji wkraczają kolekcje składane. Pamiętajcie, że narzucane przez Pythona wymagania dotyczące formatowania kodu nie dotyczą kolekcji składanych. Warto zatem zadbać by w tym przypadku nasz generator składany był zapisany w sposób zwiększający czytelność.