W słowniku znajduje się hasło: iteracja / iterować . Jeżeli nie do końca rozumiesz, czym jest iterowanie, przeczytaj ten wpis zanim przejdziesz do kodu w Pythonie.
Jak wspomniałam w podlinkowanym haśle, iteracja w Python odbywa się na największym elemencie typu obiektu, który iterujemy. Co to znaczy w praktyce? Odrobinka prostego kodu na typach tekstowych i liczbach
iteracja przez tekst
W zmiennej tekstowej (tutaj a) przechowamy ciąg znaków. Zmienne tekstowe czyli ciągi znaków, tzw. stringi 😀 (z ang. string) są iterowalne.
a = "Ala ma kota" # type to wbudowana metoda Pythona służąca, jak się trudno domyśleć ;), # do sprawdzenia typu obiektu. Spacje nie są potrzebne. Ja tak sobie # lubię wcisnąć niepotrzebną spację. Bo mogę. Ignoruj je. print( type(a) ) # dla każdej litery w a for letter in a: # coś wykonaj - tutaj 'wydrukuj' każdą literkę 3 razy # tutaj wcięcie w tekscie akurat jest potrzbne i wynosi 4 spacje. # Wcięć nie ignoruj bo Python się wścieknie. print(letter * 3) # świetnie Magda, dzięki Twoim komentarzom ten kod jest niezwykle # czytelny.
Co da w efekcie, poza oczopląsem:
typ (klasę) tekstowy i wydruk każdego znaku (z uwzględnieniem spacji) 3 x
Czy można iterować przez liczby ?
W Pythonie są typy iterowalne i nie-iterowalne, czyli takie, po których nie można “przechodzić” element po elemencie.
b = 123 for item in b: print(item)
Jeżeli w podobny sposób stworzymy zmienną b, przypisując jej wartość 123 nie otrzymamy w efekcie type error, czyli błąd typu.
‘Int’ object is not iterable oznacza, że nie można wykonać jakiejś operacji na wartości liczbowej. Mimo, że pozornie składa się z jakiś elementów ( 1, 2 i 3) to nie można kolejn się do nich dostać. Dzieje się tak, ponieważ, aby obiekt (np. zmienna – u nas b ) był iterowalny, musi zawierać metodę __next__() (wbudowaną do swojego typu/klasy), która pozwala na przejście do kolejnego elementu. Wartości liczbowe – zarówno int`y jak i liczby zmiennoprzecinkowe: float`y jej nie mają.
Jeżeli z jakiś niewiadomych przyczyn (; chcemy się dostać do każdej kolejnej cyferki liczby 123, można to oczywiście obejść np. zmieniając jej typ na string. Python pozwala swobodnie zmieniać typy zmiennych.
b = 123 def add_one_to_str_elem( num ): # .format to wygodne formatowanie string`ów # pozwala na wklejanie różnych wartości do ciągu znaków print('Typ b (num) przed zmianą: {}'.format( type(num) ) ) # zmieniamy b na string str_num = str(num) print('Typ b (str_num) po zmianie: {}'.format( type(str_num) ) ) # pusta wartość tekstowa empty_str = '' for number in str_num: # dodaj do każdego elementu 1 # w tym celu zamień na liczbę, a całość zamień z powrotem na tekst, # bo chcemy to jeszcze z powrotem złożyć number = str( int(number)+1 ) empty_str += number print('empty_str w kolejnej iteracji pętli wygląda: {}'.format(empty_str)) result = int(empty_str) print('Typ b (result) po zmianie na int i pętli: {}'.format(type(result))) return result # wywołujemy funkcję b = add_one_to_str_elem( b ) b
Nie trzeba było oczywiście tworzyć tylu zmiennych w funkcji, można było je nadpisywać, ale chciałam pokazać, że to klasa/typ dokładnie tej wartości. W efekcie dostaniemy:
Są oczywiście różne fajniejsze sposoby na takie zadania, więc jeśli jesteś zaawansowanym Pythonowcem to nie krępuj się z podaniem fajniejszych rozwiąń w komentarzu (:.
Jesteś początkujący? Poćwicz sobie :-).
Analogiczne, bardzo proste ćwiczenia dla Ciebie. Nie kopiuj kodu, napisz go sama – a może wpadniesz na lepszy sposób wykonania zadań, bo w Pythonie jest przynajmniej kilkadziesiąt sposobów, na które można wykonać każde zadanie.
- Spróbuj przeiterować przez wartość zmiennoprzecinkową np. przez 33.33, albo 123.99 (tak ma się nie udać (; )
- Stwórz zmienną zawierającą wartość 1410 i stwórz liczbę, której każda kolejna cyfra jest 2 razy większa.
- Wymyśl więcej zadań dla innych, to je dopiszę (;