We code in Python
Hello! How are you. Today's passage is devoted to loops. We'll start with the while loop. In programming, loops are used to repeat the same instruction multiple times. We would not be exaggerating when we say that loops are one of the most important elements of programming.
What are we going to start from? Maybe a little warm-up? Let's write a short applet that will convert the temperature in Celsius degrees to the temperature in kelvins. As you probably remember from physics lessons, the Kelvin scale is shifted 273 units up from the Celsius scale. So 0° C is 273 K, 10 ° C is 283 K etc. Here is our code:
a = int (input ('Enter the temperature in Celsius degrees:'))
b = a + 273
print ('You entered the temperature ', a, '°C', sep = '')
print ('In kelvins this temperature is:', b)
The program is simple, the syntax of all commands is known to us from previous passages of the series[1].
In the same physics lessons, you should also remember that the temperature of matter cannot be lower than 0 K (absolute zero). This is the temperature corresponding to ‑273° C. We will improve our code by adding a conditional instruction that responds with the message "Incorrect value" to the user entering a temperature lower than ‑273° C
a = int (input ('Enter the temperature in Celsius degrees:'))
if a <-273:
print ('Invalid value')
else:
b = a + 273
print ('You entered the temperature', a, '° C', sep = '')
print ('In kelvins this temperature is:', b)
Run the above script. Works flawlessly. And yet… We can't quite be satisfied, can we? When the user enters an incorrect temperature value, the program will scold him and exit. Is this really how a decent program is supposed to work? Of course not. The program is not allowed to shut down after the user gives the wrong answer, but it should ask the user again and again for the correct answer. Until the proper reaction!
We get to know the loops
The described situation is the bread and butter of programming. We need the program to repeat an action many times. We will achieve this by using loops.
The while loop ("do something while …") is very similar in its construction to the if conditional, with the difference that as after if keyword Python would execute the given statements once, after the while keyword Python would execute them — as they say — "in circle "until the condition is no longer met.
In our example, the condition is: giving an "incorrect" temperature by the user. If the user persists and enters incorrect temperatures again and again, the program will stubbornly inform him that he is making a mistake and ask for the temperature again. The "game" will continue until the user finally enters a temperature higher than ‑273° C.
Let's write the appropriate code.
a = int (input ('Enter the temperature in Celsius degrees:'))
while a<-273:
print ('Invalid value')
a = int(input('Enter the temperature in Celsius degrees:'))
else:
b = a+273
print ('You entered the temperature', a, '°C', sep = '')
print ('In kelvins this temperature is:', b)
The script is not much different than the previous one, based on if-conditional-instruction. It was enough to replace the word "if" with the word "while" — one might say. Almost. In addition to this change, we had to — inside the while loop — repeat the first line of code, the one with the input command. Why? It is quite obvious. To have Python repeat the execution of this line of code multiple times. The statements used after the word while — and indented by four spaces — are the body of the loop and are repeatedly executed.
While loop construction
A while loop consists of two parts: the condition and the loop body. The body of the loop is a set (sequence) of commands. The loop executes the sequence of commands multiple times until the given condition becomes false.
Additionally (as can be seen in the diagram above) there is an alternative part that starts with the else. This alternative part — in the case of the while loop – shows a little trouble, but more on that in a moment. The while loop is executed (potentially) an infinite number of times as long as Python determines that the given condition is True. When the condition becomes False, the loop ends its work (the programme "exits" the loop).
The commands specified after the else are executed once when exiting the loop.
The variable referenced by the while loop must first be defined in the program (before opening the loop) so that it can be reused inside the loop later. Hence — in our example, the line a = int (input ('Enter temperature in degrees Celsius:')) appears twice. First in front of the loop, then inside it. We will come back to this issue …
An example of using the while loop
Let's illustrate a while loop with the simplest possible example, shorter and perhaps easier than our previous example converting from Celsius to Kelvin.
This example prints the value of the variable i, which is initially zero, and increments by 1 each time the loop is run. The loop runs as long as i is less than 5
i = 0
while i <5:
print ('number:', i)
i = i + 1
Output:
number: 0
number: 1
number: 2
number: 3
number: 4
From this example it is clear that the loop — in its first cycle — refers to the value of the variable given before the loop (i = 0) and then reaches for the updated values (after each loop) with the code line i = i + 1, i.e. — otherwise speaking – the values increased by 1 for each circuit. This is the idea behind the while loop: check the initial value in the code before the loop; then update this value and check again. The loop continues to generate print until the value of i <5. Therefore, output (understood as a printout on the screen) covers the numbers from 0 to 4.
Note, however, that within the last cycle of the loop — after generating the string "number: 4" — the value of the variable is increased once again. Finally, the variable i has the value 5.
If you changed the order of the lines in the code and make your script like this:
i=0
while i<5:
i=i+1
print('number:', i)
your loop will generate this output:
number: 1
number: 2
number: 3
number: 4
number: 5
The advantage is that the last printed value of the variable is equal to the current value calculated by the program. The disadvantage, however, boils down to the fact that we do not meet the condition: "print values until they are less than 5". Which version of the program is better? There is no answer to that. It is important that you write code with careful awareness of the result of running it.
Exiting the loop
As we remember, when exiting of the loop (the value of condition = False), Python will execute the block indicated by the word else (the commands following the else keyword and indented by four spaces). Let's extend our program so that — when we exit the loop — we print the message "Good bye!"
i=0
while i < 5:
print('number:', i)
i=i+1
else:
print('Good bye!')
print('And now the rest of the programme.')
Output:
number: 0
number: 1
number: 2
number: 3
number: 4
Good bye!
And now the rest of the programme.
The program executes the loop five times, then executes the alternative code (else), and finally proceeds to execute the commands outside the loop — in the main code (the line "And now the rest of the programme.").
Exercise
Build a script that converts temperature from Celsius to Kelvin. Add a code to count the number of times the user entered an incorrect temperature value. Write down the command, which prints the message at the end of the script: "You have entered the wrong temperature i times." — where, of course, in place of the letter "i", the actual number of incorrect passes will appear.
The Riddle
While browsing (even on the internet) various examples of the use of the while loop in Python, we can find scripts very similar to our script that prints consecutive numbers from 0 to 4.
i = 0
while i <5:
print ('number:', i)
i = i + 1
print ('Good bye!')
print ('And now the rest of the programme.')
Output:
number: 0
number: 1
number: 2
number: 3
number: 4
Good bye!
And now the rest of the programme.
Similar but not the same example as before. The code is slightly different from the previous one, right? The else is missing. The command that followed the else — and was indented by four spaces — is now in the main code. The output, however, is the same as before.
Since the output is identical with "else" and without "else", does it mean that — in the case of a while loop — the else is redundant? The answer is yes. We don't have to use the else, and we can simply place the commands (we want to execute when exiting the loop) in the main code[2].
Let's ask another question: and is the same simplification – that is, placing alternate statements directly in the main code – also applicable to the if statement? The answer is: definitely not. But why exactly? After all, while and if seemed so logically similar to each other …
Well, only "seemed" – unfortunately. Let's try to unravel this mystery.
Where is the difference
At the beginning of our course, we emphasised that learning programming develops your ability to think logically. Time to check it out "in action". Showing that the else has a different role for the if statement than for the while statement is great training for "gray cells" of our brains.
Let's start by drawing a simple diagram. When Python already executed either a conditional if statement or a while loop, it then proceeds to main code statements.
Execution — be it a conditional statement or a while loop — always starts with checking the condition. Python checks to see if, given the current value of a variable, the condition is True or False. We remember this rule, right? The crux of the difference is that in the case of a conditional statement, it is possible to move to subsequent commands in the main code both when the condition is True or False. However, in the case of a loop, the transition to the subsequent commands of the main code is possible only when the condition is False. When the condition is True, Python doesn't reach for any more lines of code. It is spinning in circles (in a loop), that is, it updates the value of the variable and checks whether the condition is True again, and updates again and checks again and again and again.
If the condition were always True, we would loop forever.
Since — in the case of a while loop — the transition to subsequent commands of the main code is possible only when the condition is False, the program must execute the else part of the code (because, by definition, the alternate part of the code is executed when the condition is False).
In case of the while loop, the program proceeds to "subsequent lines of the main code" only if the condition's value becomes False.
And what is the consequence of taking the value False by the condition? Then the alternative command is executed (the code fragment after the word else).
What is the lesson from this? In the case of a while loop (unlike the case of the if statement), it is impossible to skip the execution of an alternate command. It is impossible to exit the loop with condition value = True, that is without executing the else part. In programming, the role of the else keyword is to allow the part of code that follows this keyword (and is indented by four spaces) to be omitted, under a certain condition. Since such omission is not possible, in the case of a while loop the else becomes redundant. The commands we want to execute can be written directly in the main code.
In short, the alternative command is guaranteed to be executed. And since the alternative command will definitely be executed, why write "else" in front of it? So let's repeat: using else keyword with a while loop doesn't make much sense. Most programmers omit the else and simply write the set of commands — to be executed when they exit the loop — in the main code.
Exercise
Write a short program that asks the user the question: 'Do you like candy? y / n ' Use the if… else… conditional statement, which will differentiate the program's response depending on the typing of the letter y or n by the user. For example, when the user presses y, the program will print the message: 'You like candy', and when the user presses n, the message: 'You don't like candy'. Run program and select y. Restart and select n. Observe the effect.
Then make changes to the script, by removing the else keyword, and placing the alternative command in the main code. Run program and select y. Restart and select n. Observe the effect.
Now write a new script that will use a while… else… loop, instead of the if… else… conditional. Run it and make similar test. Make the same changes as before and test again.
Summary
From today's passage, remember:
- Python loops are used to execute a piece of code multiple times
- an example of a loop is a while loop that runs as long as the specified condition is true
- The while loop is similar to the if statement except that while if checks the condition once, while checks the condition multiple times: again and again until it is False.
For this reason, this loop will come in handy when you want to force the user to provide a rational answer to a question asked by the program. Although similar to if, the logic of while is different in the alternate code that follows the word else.
Appendix: With or without a space
The commad:
print ('You entered the temperature ', a, '°C', sep = '')
combines three elements:
- string: 'You entered the temperature '
- variable a (which has a numerical value)
- string: '°C'
We connect these elements (as you can see) with commas. Concatenation using the '+' sign would only be possible if all three elements were of type 'text'. When we combine elements of different types (text and numbers), we have no other choice as to use commas.
Python — when printing — separates the given elements with a space by default.
Let's take a test. Please type in the shell:
print ('You entered the temperature', 10, '°C') – and press Enter.
You should get this effect: You entered the temperature of 10 °C
If you are a perfectionist, you may not be satisfied with the result, because the symbol for Celsius degrees (°C) should not be separated by a space from the number 10. It is correctly spelled: 10°C, not 10 °C.
How do I get rid of unwanted space? Pretty straightforward. While Python defaults to using a space as the separator in the print statement, it allows the programmer to define a different separator, if the programmer wishes.
This is done by writing sep= and quoting the selected separator in quotation marks, e.g. a dash or a period:
sep = '-' # this defines a dash as a separator
When you don't want any separator, write
sep = '' # open quotation and close quotation with nothing in between
Now we know how to print the ten and the Celsius sign without spaces.
Unfortunately, by using sep = '' we will also lose the space after the phrase: 'You entered the temperature'. But this is easy to avoid just by typing 'You entered the temperature ' (put a space before you close the quotation).
Degree symbol
If you are writing code in a regular Windows notepad, you are probably wondering how to insert the degree symbol: °
Here is a quick instruction. Call the character table: to do this, press win+R, the Run box will appear, in which type charmap. The character table appears.
Choose the symbol you are interested in (e.g. degree sign). Click copy. Go to notepad and click paste.
Answers to Exercises
Celsius to kelvin conversion
a=int(input('Enter temperature in Celsius degrees: '))
i=0
while a<-273:
print('Incorrect value')
a=int(input('Enter temperature in Celsius degrees: '))
i=i+1
else:
b=a+273
print('You have entered temperature ', a, '°C', sep='')
print('In kelvins the temperature is', b)
print('Up to now you have entered incorrect temperature', i, 'times.')
Do you like candy
x=input('Do you like candy? y / n ')
if x=='y':
print('You like candy')
else:
print('You do not like candy')
x=input('Do you like candy? y / n ')
if x=='y':
print('You like candy')
print('You do not like candy')
[1] There was only a minor innovation in the third line of code (the sep command; see the Appendix of this article if you want to read a few words of explanation; you will also find a hint on how to insert the degree symbol into your code in the Windows notebook).
[2] the question arises: why then the Python developers came up with a version of the while loop with an alternate part of the code with else keyword. This version of the code may seem useless. But this is not entirely true. When (in the future) you return to the while loop at a more advanced stage of your learning, you will find that in some specific situations, using else has a different effect than using the same statements in the main code.
^
^
^
Odcinek 5: Pętle w Pythonie
Kodujemy w Pythonie
Hello! Jak się macie.
Dzisiejszy odcinek poświęcony jest pętlom. Zaczniemy od pętli while. W programowaniu pętle służą do wielokrotnego powtarzania tej samej instrukcji. Nie przesadzimy twierdząc, że pętle to jeden z najważniejszych elementów programowania.
Od czego zaczniemy? Może mała rozgrzewka? Napiszmy krótki programik, który będzie konwertował temperaturę zapisaną w stopniach Celsjusza na temperaturę zapisaną w Kelvinach. Jak pewnie pamiętasz z lekcji fizyki, skala Kelvina przesunięta jest o 273 jednostki w górę w stosunku do skali Celsjusza. 0°C to zatem 273 K, 10°C to 283 K itd.
Oto nasz kod:
a=int(input('Podaj temperaturę w stopniach Celsjusza: '))
b=a+273
print('Podałeś temperaturę ', a, '°C', sep='')
print('W Kelvinach temperatura ta wynosi:', b)
Program jest prosty, składnia wszystkich poleceń jest nam znana z poprzednich odcinków cyklu[1].
Z tych samych lekcji fizyki powinieneś pamiętać także, że temperatura materii nie może być niższa niż 0 K (zero bezwzględne). Jest to temperatura odpowiadająca ‑273°C. Ulepszymy nasz kod poprzez dodanie instrukcji warunkowej, reagującej komunikatem "Nieprawidłowa wartość" na podanie przez użytkownika temperatury niższej niż ‑273°C
a=int(input('Podaj temperaturę w stopniach Celsjusza: '))
if a<-273:
print('Nieprawidłowa wartość')
else:
b=a+273
print('Podałeś temperaturę ', a, '°C', sep='')
print('W Kelvinach temperatura ta wynosi:', b)
Uruchom powyższy skrypt. Działa bez zarzutu. A jednak… Nie całkiem możemy być zadowoleni, prawda? Gdy użytkownik poda nieprawidłową wartość temperatury, program skarci go i zakończy działanie. Czy rzeczywiście tak ma działać porządny program? Jasne, że nie. Program nie ma prawa się wyłączać po podaniu przez użytkownika błędnej odpowiedzi, lecz powinien prosić go raz za razem o podanie poprawnej odpowiedzi. Do skutku!
Poznajemy pętle
Opisana sytuacja to chleb powszedni programowania. Potrzebujemy, aby program powtarzał czynność wiele razy. Osiągniemy to stosując pętle.
Pętla while ("rób coś dopóki…") jest bardzo podobna w swojej konstrukcji do instrukcji warunkowej if, z tą różnicą, że o ile po if Python wykonywał zadane polecenia jeden raz, po while wykonywał je będzie – jak to się mówi – "w kółko", aż do momentu, gdy warunek przestanie być spełniony. W naszym przykładzie warunkiem jest wpisywanie "niepoprawnej" temperatury przez użytkownika. Jeśli użytkownik uprze się i podawał będzie raz za razem nieprawidłowe temperatury, program uparcie będzie go informował że popełnia błąd i od nowa prosił o podanie temperatury. Zabawa trwała będzie do momentu, aż użytkownik wpisze wreszcie temperaturę wyższą niż ‑273°C.
Napiszmy odpowiedni kod.
a=int(input('Podaj temperaturę w stopniach Celsjusza: '))
while a<-273:
print('Nieprawidłowa wartość')
a=int(input('Podaj temperaturę w stopniach Celsjusza: '))
else:
b=a+273
print('Podałeś temperaturę ', a, '°C', sep='')
print('W Kelvinach temperatura ta wynosi:', b)
Skrypt niewiele się różni od tego z instrukcją warunkową if. Wystarczyło słówko "if" zastąpić słówkiem "while" – rzec by można. No prawie. Oprócz tej zmiany musieliśmy – wewnątrz pętli while – powtórzyć pierwszą linię kodu, tę z poleceniem input.
Dlaczego? Jest to dość oczywiste. Aby Python wielokrotnie powtarzał wykonanie tej linii kodu.
Polecenia użyte po słowie while – i wcięte o cztery spacje – stanowią treść pętli (loop body) i ich wykonanie ma charakter powtarzalny.
Konstrukcja pętli while
Pętla while składa się z dwóch części: warunku i treści pętli (loop body). Treść pętli to zestaw (sekwencja) poleceń. Pętla wykonuje sekwencję poleceń wiele razy, aż podany warunek stanie się fałszywy.
Dodatkowo (jak widać na powyższym schemacie) występuje część alternatywna, rozpoczynająca się od else. Z tą częścią alternatywną jest – w przypadku pętli while – mały kłopot, ale o tym za chwilę.
Pętla while wykonywana jest (potencjalnie) nieskończoną ilość razy, tak długo jak Python stwierdza prawdziwość zadanego warunku. Gdy warunek przyjmuje wartość Fałsz, pętla kończy działanie (mówimy: następuje "wyjście" z pętli).
Polecenia wskazane po else wykonywane są jednorazowo, w sytuacji wyjścia z pętli.
Zmienna, do której odwołuje się pętla while, musi być wcześniej zdefiniowana w programie (przed otwarciem pętli), aby później mogła być ponownie użyta wewnątrz pętli. Stąd – w naszym przykładzie linia a=int(input('Podaj temperaturę w stopniach Celsjusza: ')) pojawia się dwa razy. Najpierw przed pętlą, później wewnątrz niej. Wrócimy jeszcze do tego…
Przykład użycia pętli while
Zilustrujmy pętlę while najprostszym możliwym przykładem, krótszym i chyba łatwiejszym niż nasz wcześniejszy przykład konwertujący stopnie Celsjusza na Kelviny.
Przykład ten drukuje wartość zmiennej i która ma początkowo wartość zero, a za każdym przebiegiem pętli ulega zwiększeniu o 1. Pętla działa tak długo, dopóki wartość i jest mniejsza od 5
i=0
while i<5:
print('numer:', i)
i=i+1
Output:
numer: 0
numer: 1
numer: 2
numer: 3
numer: 4
Z przykładu tego dobrze widać, że pętla – w swoim pierwszym obiegu – odwołuje się do wartości zmiennej podanej przed pętlą (i=0) by następnie sięgać po wartości aktualizowane (za każdym obiegiem pętli) linią kodu i=i+1, czyli – inaczej mówiąc – zwiększane za każdym obiegiem o 1.
Taka jest właśnie idea pętli while: na dzień doby sprawdź wartość początkową, występującą w kodzie przed pętlą; potem aktualizuj tę wartość i ponownie sprawdzaj.
Pętla tak długo generuje polecenie print, dopóki wartość i<5. Dlatego output (rozumiany jako wydruk na ekranie) obejmuje liczby od 0 do 4. Zwróć jednak uwagę, że ostatni obieg pętli – już po wygenerowaniu napisu "numer: 4", niejako na "sam koniec" podnosi wartość zmiennej o kolejną "jedynkę". Finalnie, zmienna i ma zatem wartość 5.
Gdybyś zmienił kolejność linii w kodzie i zapisał skrypt w takiej postaci:
i=0
while i<5:
i=i+1
print('numer:', i)
twoja pętla while wygeneruje następujący output:
numer: 1
numer: 2
numer: 3
numer: 4
numer: 5
Korzyść z tego taka, że ostatnia drukowana wartość zmiennej jest równa aktualnej wartości wyliczonej przez program. Niekorzyść natomiast sprowadza się do tego, że nie spełniamy warunku: "drukuj wartości, dopóki są mniejsze od 5".
Która z wersji programu jest lepsza? Nie ma na to odpowiedzi. Ważne, abyś pisał kod z dokładną świadomością uzyskiwanego rezultatu jego uruchomienia.
A co w sytuacji wyjścia z pętli?
Jak pamiętamy, gdy dochodzi do wyjścia z pętli (warunek przyjmuje wartość False), Python wykona blok wskazany przez słowo else – i następujące po nim polecenia – zapisane z wcięciem o cztery spacje.
Rozbudujmy nasz program, aby – gdy następuje wyjście z pętli – drukowany był komunikat "Good bye!"
i=0
while i < 5:
print('number:', i)
i=i+1
else:
print('Good bye!')
print('A teraz dalszy ciąg programu.')
Output:
number: 0
number: 1
number: 2
number: 3
number: 4
Good bye!
A teraz dalszy ciąg programu.
Komentarz: program wykonuje pętlę pięciokrotnie, następnie wykonuje kod alterantywny (else), wreszcie przechodzi do wykonania poleceń poza pętlą – w kodzie głównym (w naszym przykładzie wygenerowanie napisu "A teraz dalszy ciąg programu.").
Ćwiczenie
Rozbuduj skrypt konwertujący temperaturę ze stopni Celsjusza na Kelviny.
Dodaj kod pozwalający zliczyć, ile razy użytkownik podał nieprawidłową wartość temperatury.
Zapisz polecenie, które na sam koniec wydrukuje komunikat:
"Wcześniej i razy podałeś nieprawidłową wartość temperatury."
- gdzie w miejscu literki i pojawiać się będzie – rzecz jasna – faktyczna liczba nieprawidłowych podań.
Zagadka
Przeglądając (choćby w internecie) rozmaite przykłady zastosowania pętli while w języku Python, trafić możemy na skrypty bardzo podobne do naszego skryptu drukującego kolejne liczby od 0 do 4.
i=0
while i < 5:
print('numer:', i)
i=i+1
print('Good bye!')
print('A teraz dalszy ciąg programu.')
Output:
numer: 0
numer: 1
numer: 2
numer: 3
numer: 4
Good bye!
A teraz dalszy ciąg programu.
Przykład podobny, choć nie taki sam jak poprzednio. Kod skryptu różni się od poprzedniego, prawda? Brakuje else. Polecenie, które następowało po else – i było wcięte o cztery spacje – teraz umieszczone jest w kodzie głównym. Natomiast output jest identyczny jak poprzednio.
Skoro output jest identyczny z else i bez else, to czy to znaczy, że – w przypadku pętli while – else jest zbędne? Tak. Odpowiedź jest twierdząca. Nie musimy korzystać z else, a polecenia, które chcemy realizować przy wyjściu z pętli, możemy umieszczać po prostu w kodzie głównym[2].
A czy takie samo uproszczenie, to znaczy umieszczenie poleceń alternatywnych bezpośrednio w kodzie głównym, możliwe jest do zastosowania w przypadku instrukcji warunkowej if?
Odpowiedź brzmi: zdecydowanie nie.
Ale właściwie dlaczego? Przecież while i if wydawały się logicznie tak do siebie podobne…
No właśnie. Tylko "wydawały się" niestety. Spróbujmy rozwikłać tę zagadkę.
Gdzie tkwi różnica
Na początku naszego kursu stwierdziliśmy, że nauka programowania rozwija zdolność logicznego myślenia. Czas sprawdzić to "w akcji".
Pokazanie, że else spełnia inną rolę w przypadku instrukcji warunkowej if, a inną w przypadku pętli while, to świetny trening dla szarych komórek.
Zacznijmy od narysowania prostego diagramu. Gdy Python zrealizuje czy to instrukcję warunkową if, czy pętlę while, przechodzi następnie do kolejnych poleceń kodu głównego.
Wykonanie – czy to instrukcji warunkowej czy pętli while – zaczyna się zawsze od sprawdzenia warunku (condition). Python sprawdza, czy przy danej wartości zmiennej, warunek przyjął wartość True, czy False. Pamiętamy to, prawda?
Sedno różnicy tkwi w tym, że w przypadku instrukcji warunkowej, przejście do kolejnych poleceń kodu głównego jest możliwe zarówno w sytuacji, gdy warunek przyjął wartość True, jak i False.
Natomiast w przypadku pętli, przejście do kolejnych poleceń kodu głównego jest możliwe tylko gdy warunek przyjął wartość False. W sytuacji, gdy warunek przyjmuje wartość True, Python nie sięga po dalsze linie kodu. Obraca się "w miejscu" (w pętli), to znaczy aktualizuje wartość zmiennej i znowu sprawdza prawdziwość warunku, i znowu aktualizuje, i znowu sprawdza, i tak w kółko. Gdyby warunek bezustannie wykazywał wartość True, obracalibyśmy się w pętli w nieskończoność.
Skoro – w przypadku pętli while – przejście do kolejnych poleceń kodu głównego jest możliwe tylko gdy warunek przyjmie wartość False, program musi wykonać cześć kodu związaną z else (gdyż z definicji część alternatywna kodu wykonywana jest wówczas, gdy warunek przyjmuje wartość False).
W przypadku pętli while przejście przez program do realizacji "kolejnych linii kodu głównego" jest możliwe tylko w przypadku przyjęcia przez warunek wartości False.
A jaka jest konsekwencja przyjęcia przez warunek wartości False? Wówczas wykonywane jest polecenie alternatywne (fragment kodu występujący po słowie else).
Jaki wniosek z tego płynie? W przypadku pętli while (inaczej niż w przypadku instrukcji if) pominięcie wykonania polecenia alternatywnego jest niemożliwe. Niemożliwe jest wyjście z pętli przy wartości warunku True, z pominięciem części else.
W programowaniu zadaniem else jest umożliwienie – pod określonym warunkiem – pominięcia wykonania tej części kodu, która następuje po else i jest wcięta o cztery spacje. Skoro w przypadku pętli while takie pominięcie nie jest możliwe, else staje się zbędne. Polecenia, które chcemy wykonać, mogą być zapisane wprost w kodzie głównym.
Ujmując najkrócej: polecenie alternatywne na pewno zostanie wykonane[3]. A skoro polecenie alternatywne na pewno zostanie wykonane, po co pisać przed nim "else"?
Dlatego powtórzmy: używanie else w przypadku pętli while niespecjalnie ma sens. Większość programistów pomija else i zestaw poleceń do wykonania w przypadku wyjścia z pętli zapisuje po prostu w kodzie głównym.
Ćwiczenie
Napisz krótki program, zadający użytkownikowi pytanie: 'Czy lubisz cukierki? t / n '
Zastosuj instrukcję warunkową if… else…, która zróżnicuje odpowiedź programu zależnie od wciśnięcia przez użytkownika literki t lub n.
Przykładowo gdy użytkownik wciśnie t, program będzie drukował komunikat: 'Lubisz cukierki', zaś gdy wciśnie n, komunikat: 'Nie lubisz cukierków'.
Uruchom program i wybierz t. Uruchom ponownie i wybierz n. Zaobserwuj efekt.
Następnie dokonaj zmian w skrypcie, usuwając słówko else, zaś polecenie alternatywne umieść w kodzie głównym.
Uruchom program i wybierz t. Uruchom ponownie i wybierz n. Zaobserwuj efekt.
Teraz napisz nowy skrypt, który posługiwał się będzie pętlą while… else… , zamiast instrukcją warunkową if… else….
Przetestuj działanie. Dokonaj analogicznych zmian jak poprzednio i znowu przetestuj.
Podsumowanie
Z dzisiejszego odcinka zapamiętaj:
- pętle w Pythonie służą wielokrotnemu wykonaniu fragmentu kodu
- przykładem pętli jest pętla while, która działa tak długo, dopóki określony warunek jest spełniony
- pętla while jest podobna do instrukcji warunkowej if z tą różnicą, że o ile if sprawdza warunek jeden raz, while sprawdza warunek wielokrotnie: raz za razem aż do momentu, gdy przyjmie on wartość False. Z tego powodu pętla ta świetnie przyda Ci się w sytuacji, gdy chcesz wymusić na użytkowniku podanie racjonalnej odpowiedzi na zadane przez program pytanie.
- pomimo podobieństwa do if, logika działania while jest odmienna w zakresie kodu alternatywnego następującego po słowie else
Dodatek: Ze spacją czy bez
Polecenie print('Podałeś temperaturę ', a, '°C') łączy trzy elementy:
- łańcuch znaków: 'Podałeś temperaturę'
- zmienną a (która ma wartość liczbową)
- łańcuch znaków: '°C'
Takie elementy łączymy (jak widać) przecinkami. Łączenie przy użyciu znaku '+' byłoby możliwe tylko jeśli wszystkie trzy elementy byłyby typu 'tekst'. Gdy łączymy elementy różnego typu (tekst i liczby), skazani jesteśmy na przecinki.
Python – dokonując wydruku – domyślnie rozdziela podane elementy znakiem spacji.
Przeprowadź test. Napisz w shellu:
print('Podałeś temperaturę', 10, '°C')
i naciśnij Enter. Powinieneś uzyskać taki efekt:
Podałeś temperaturę 10 °C
Jeśli jesteś perfekcjonistą, uzyskany efekt pewnie Cię nie zadowala, ponieważ symbol stopni Celsjusza (°C) nie powinien być oddzielony spacją od liczby 10.
Prawidłowo zapisuje się: 10°C a nie 10 °C.
Jak pozbyć się niechcianej spacji?
Całkiem prosto. Python co prawda domyślnie używa spacji jako separatora w poleceniu print, jednak pozwala programiście zdefiniować inny separator, jeśli programista ma na to ochotę. Dokonuje się tego pisząc sep= i podając w cudzysłowie wybrany separator, np. myślnik albo kropkę:
sep='-' # taki zapis definiuje myślnik jako separator
Gdy nie życzysz sobie żadnego separatora, napisz sep='' # czyli użyj pustego cudzysłowu
Teraz już wiemy jak wydrukować dziesiątkę i znak stopni Celsjusza bez spacji.
Niestety przy okazji utracimy także spację po frazie: 'Podałeś temperaturę'.
Aby po słowach 'Podałeś temperaturę' mimo wszystko pojawiła się spacja, po prostu wstaw znak spacji zanim zamkniesz cudzysłów.
Zamiast:
Napisz:
Symbol stopnia
Jeżeli piszesz kod w zwykłym notatniku Windows, pewnie zastanawiasz się, jak wstawić symbol stopnia: °
Oto krótka instrukcja. Wywołaj tablicę znaków: w tym celu naciśnij win+R, pojawi się pole Uruchamianie, w którym wpisz charmap. Pojawi się tablica znaków.
Wybierz symbol, który Cię interesuje (np. znak stopnia).
Kliknij kopiuj.
Przejdź do notatnika i kliknij wklej.
Odpowiedzi do ćwiczeń
Konwersja ze stopni celsjusza na kelwiny
a=int(input('Enter temperature in Celsius degrees: '))
i=0
while a<-273:
print('Incorrect value')
a=int(input('Enter temperature in Celsius degrees: '))
i=i+1
else:
b=a+273
print('You have entered temperature ', a, '°C', sep='')
print('In kelvins the temperature is', b)
print('Up to now you have entered incorrect temperature', i, 'times.')
Czy lubisz cukierki
x=input('Do you like candy? y / n ')
if x=='y':
print('You like candy')
else:
print('You do not like candy')
x=input('Do you like candy? y / n ')
if x=='y':
print('You like candy')
print('You do not like candy')
[1] Pojawiła się jedynie drobna innowacja w trzeciej linii kodu (polecenie sep; zajrzyj do Dodatku do tego artykułu, jeśli chcesz przeczytać kilka słów objaśnień; znajdziesz tam również wskazówkę, jak w notatniku Windows wstawić do kodu symbol stopnia).
[2] pytanie, po co w takim razie twórcy Pythona wymyślili wersję pętli while posiadającą część alternatywną w postaci else.
Gdy (w przyszłości) wrócisz do pętli while w bardziej zaawansowanej fazie twojej nauki, dowiesz się, że w pewnych szczególnych sytuacjach, zastosowanie else daje inny efekt niż użycie tych samych poleceń w kodzie głównym.
[3] wykluczając rzecz jasna scenariusz kręcenia się w pętli do końca świata