10 Programowanie Obiektowe II

Metoda __init__
Zwana konstruktorem, wywoływana podczas tworzenia obiektu.


1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
class Noga:
    def __init__(self, ktora):
        self.ktora=ktora
    def pokaz(self):
        print(self.ktora)


x=Noga("prawa")
y=Noga("lewa")

x.pokaz()
y.pokaz()
Wynik:

prawa
lewa

Jak widać dzięki metodzie __init__ możemy przekazać parametr, już podczas tworzenia obiektu.



Dodawanie atrybutu z zewnątrz klasy:

1
2
x.kolor="Czerwona"
y.kolor="Biała"


Jednak teraz polecenie x.pokaz() dalej wyświetla tylko "prawa".

Teoretycznie wystarczy zmienić metodę pokaz i dodać w niej wyświetlanie atrybutu koloru:

1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
class Noga:
    def __init__(self, ktora):
        self.ktora=ktora
    def pokaz(self):
        print(self.kolor+ " " +self.ktora)    


x=Noga("prawa")    #tworzymy obiekty
y=Noga("lewa")

x.kolor="Czerwona"     #dodajemy atrybut koloru
y.kolor="Biała"

x.pokaz()
y.pokaz()
wynik:
Czerwona prawa
Biała lewa

...czyli działa, jednak wystarczy że stworzymy kolejny obiekt np
z=Noga("środkowa") i nie dodamy mu atrybutu koloru...podczas uruchomienia metody pokaż dostaniemy błąd informujący o braku atrybutu kolor w obiekcie z.

Problem możemy rozwiązać, sprawdzając w słowniku obiektu __dict__ czy istnieje w nim określenie "kolor". Jeśli istnieje, znaczy, że ktoś dodał atrybut i można go wyprintować.
Jeśli nie, pokażemy tylko self.ktora.

Teraz metoda pokaz wygląda tak:

1
2
3
4
def pokaz(self):
        if "kolor" in self.__dict__:
            print(self.kolor,end=" ")
        print(self.ktora)

a przykład całego kodu z obiektem z, który nie ma dodanego atrybutu koloru:

1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
class Noga:
    def __init__(self, ktora):
        self.ktora=ktora
    def pokaz(self):
        if "kolor" in self.__dict__:
            print(self.kolor,end=" ")
        print(self.ktora)

x=Noga("prawa")
y=Noga("lewa")
z=Noga("Środkowa")

x.kolor="Czerwona"
y.kolor="Biała"

x.pokaz()
y.pokaz()
z.pokaz()
wynik:
Czerwona prawa
Biała lewa
Środkowa




Metoda __str__
Jeśli po stworzeniu obiektu spróbujemy go wyświetlić za pomocą print(x)  a nie uruchomić jego metodę x.pokaz

1
 2
 3
 4
 5
 6
 7
 8
 9
10
class Noga:
    def __init__(self, ktora):
        self.ktora=ktora
    def pokaz(self):
        print(self.ktora)

x=Noga("prawa")
y=Noga("lewa")

print(x)
to jako wynik dostaniemy komunikat:

<__main__.Noga object at 0x02F21E10>


Dzięki metodzie __str__ możemy określić co obiekt ma w takim przypadku zwrócić.

Dopisujemy metodę:
1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
class Noga:
    def __init__(self, ktora):
        self.ktora=ktora
    def pokaz(self):
        print(self.ktora)
    def __str__(self):
        return "obiekt klasy Noga"

x=Noga("prawa")
y=Noga("lewa")

print(x)
wynik:

obiekt klasy Noga





Dokumentowanie:
Klasy i metody można dokumentować tak jak funkcje:

1
 2
 3
 4
 5
 6
 7
 8
 9
10
class Noga:
    "Klasa do opisu nogi"
    def start(self, ktora):
        "Metoda pobierająca rodzaj nogi"
        self.ktora=ktora
    def pokaz(self):
        "Metoda pokazjuąca która noga"
        print(self.ktora)

help(Noga)
wynik:

1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
Help on class Noga in module __main__:

class Noga(builtins.object)
 |  Klasa do opisu nogi
 |  
 |  Methods defined here:
 |  
 |  pokaz(self)
 |      Metoda pokazjuąca która noga
 |  
 |  start(self, ktora)
 |      Metoda pobierająca rodzaj nogi
 |  





Moduły:
Klasy umieszczone w modułach warto wyposażyć w kod testujący który będzie uruchamiany tylko przy samodzielnym uruchomieniu konkretnego moduły.  Po imporcie modułu mamy dostęp tylko do klas, ale jeśli samodzielnie uruchomimy moduł to uruchomi się main().

1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Noga:
    "Klasa do opisu ręki"
    def __init__(self, ktora):
        self.ktora=ktora
    def pokaz(self):
        if "kolor" in self.__dict__:
            print(self.kolor,end=" ")
        print(self.ktora)

def main():
    x=Noga("prawa")
    y=Noga("lewa")
    z=Noga("Środkowa")

    x.kolor="Czerwona"
    y.kolor="Biała"

    x.pokaz()
    y.pokaz()
    z.pokaz()

if __name__ == "__main__" :
    main()




9 Programowanie Obiektowe I

Tworzenie klasy:

1
2
3
4
5
class Noga:
    def start(self, a):
        self.ktora=a
    def pokaz(self):
        print(self.ktora)

klasa Noga ma dwie metody, 'start' gdzie poprzez zmienną 'a' przekazuje parametr do zmiennej self.ktora ...

Zwyczajowo powinno to być zapisane tak:
1
2
3
4
5
class Noga:
    def start(self, ktora):
        self.ktora=ktora
    def pokaz(self):
        print(self.ktora)

ale przykład pierwszy bardziej obrazowo przedstawia,  że to zmienna podana w nawiasie po self czyli a,  przenosi parametr do zmiennej nazwanej self.ktora. W dalszej części będę pisać tak jak w drugim przykładzie.


po co mamy self? o tym za chwilę po stworzeniu obiektu

Druga metoda 'pokaz' wyświetla nam zmienną odebraną przez 'start'.




Tworzenie Obiektu

Teraz na bazie tej tej klasy tworzymy 2 obiekty nazwane pierwsza i druga:
pierwsza = Noga()
druga = Noga()


Stworzyliśmy obiekty, możemy wywoływać metody.



Wywołanie metody

nazwaobiektu.metoda(parametr)

Poprzez wywołanie metody 'start' pierwszemu obiektowi nadajemy parametr PRAWA, drugiemu LEWA. (to za pomocą zmiennej 'a' z pierwszego przykładu, parametry w tym przypadku stringi "PRAWA" i "LEWA" przekazywane są do zmiennej self.ktora wewnątrz obiektu)

1
2
pierwsza.start("PRAWA")
druga.start("LEWA") 



Teraz wywołujemy metodą 'pokaz' dla jednego i drugiego obiektu.(bez parametrów)

1
2
pierwsza.pokaz()
druga.pokaz()

czego wynikiem jest wyświetlenie
PRAWA
LEWA

Poprzez stworzenie jednej klasy, możemy w łatwy sposób tworzyć dowolną ilość różnych obiektów, które posiadają cechy klasy,mają indywidualne zmienne którym nadajemy różne wartości.

Jak dostać się do tych indywidualnych zmiennych z obiektu?
Tutaj wyjaśnia się czym jest self...referencją do nazwy obiektu. Aby dostać się do zmiennej self.która obiektu 'pierwsza', w miejsce self wpisujemy nazwę obiektu,
czyli:

1
print(pierwsza.ktora)

wydrukuje nam:
PRAWA

tym samym tworząc w klasie jedną zmienną  self.ktora, poprzez tworzenie kolejnych obiektów tworzymy kolejne zmienne o nazwie nazwaobiektu.ktora w sposób łatwy i szybki.

Co najważniejsze teraz poprawiamy kod w jednym miejscu. Poprawka w klasie wpływa na wszystkie obiekty które z niego powstały.

Realizujemy zasadę DRY czyli don't repeat yourself.


8 Funkcje

zasada ogólna:

1
2
def nazwa():
    kod

by wywołać tą funkcję
nazwa()

funkcja musi być zdefiniowana przed wywołaniem!

przykład:

1
2
3
4
5
6
7
8
9
def komunikat():
    print('Proszę, podaj następną daną')

komunikat()
a = int(input())
komunikat()
b = int(input())
komunikat()
c = int(input())
w przypadku zmiany komunikatu, zmieniamy go tylko w funkcji.


Funkcja z parametrami:

1
2
3
4
5
6
7
def powitanie(imie,nazwisko):
   print('Dzień dobry, nazywam się ' + \
   nazwisko + '... ' + imie + ' ' + \
   nazwisko + '...')

powitanie('Janusz', 'Pospolity')
powitanie('Zenon', 'Kotwica')

Zmienna parametru z funkcji nie będzie dostępna poza funkcją, jesli jest taka sama jak inna zmienna w programie na czas wykonywania funkcji "przysłania" ją.

Funkcje można przekazywać podając określoną zmienna, wtedy nie trzeba zachowywać kolejności.

1
2
3
4
5
6
7
def powitanie(imie,nazwisko="Nowak"):
   print('Dzień dobry, nazywam się ' + \
   nazwisko + '... ' + imie + ' ' + \
   nazwisko + '...')

powitanie(nazwisko='Bond', imie='James')
powitanie(imie='Skarabeusz',nazwisko='Młotek')
Funkcji można nadać domyślny parametr (nazwisko Nowak) który zostanie nadany w przypadku nie określenia parametru podczas wywołania.

Powyższe przykłady funkcji mają efekt (napis na ekranie). Funkcja może jednak zwracać wynik:

return wyrażenie

przykład:

1
2
3
4
5
def prosta_funkcja():
    return 13

x = prosta_funkcja()
print('Funkcja przekazała swój wynik:', x)


return może zwracać także True/False

1
2
3
4
5
6
def czyparzysta(n):
   if(n % 2 == 0):
     return True

print(czyparzysta(2))
print(czyparzysta(1))

czego wynikiem będzie
True
None

Czemu None? bo return w przypadku niespełnienia warunku nie dostał żadnego parametru


Jako parametr może być przekazana lista:

1
2
3
4
5
6
7
def sumalisty(l):
   suma = 0
   for el in l:
     suma += el
   return suma

print(sumalisty([5,4,3]))

Wynik
12

Polecenie global sprawia, że zmienna staje się globalna i nie jest przysłaniana.

1
2
3
4
5
6
7
8
def funkcja():
   global zmienna
   print("Czy ja znam tę zmienną? ", zmienna)
   zmienna=2

zmienna = 1
funkcja()
print(zmienna)

Wynik:
Czy ja znam tę zmienną? 1
2

czyli zmienna ustawiona poza funkcją (1) dzięki global dostała się do funkcji, a także ustawiona w funkcji na 2, wydostała się poza funkcję


Kolejny przykład:

1
2
3
4
5
6
7
8
def funkcja(n):
   print('Dostałam',n)
   n += 1
   print('Policzyłam sobie',n)

zmienna = 3
funkcja(zmienna)
print(zmienna)
Wynik:
Dostałem 3
Policzyłem sobie 4
3

pokazuje, że bez polecenia global, zmianna zwiększona w funkcji do 4 poza funkcją pozostaje 3



Powyższe nie dotyczy list przekazywanych jako parametr funkcji.
Nawet bez polecenia global:

1
2
3
4
5
6
7
def funkcja(l):
   print(l)
   del l[0]

lista = [1,2,3]
funkcja(lista)
print(lista)
Wynik:
[1,2,3]
[2,3]

Czyli usunięcie elementu listy w funkcji wypływa na listę poza funkcją. Przysłonięta zmienna odwołuje się do tego samego obszaru pamięci w którym mamy listę, co zmienna nieprzysłonięta, dlatego zmiana dokonuje się.


7 Stringi ...;-)

a="Niech się napisze"
print(len(a))                        jak widać funkcja len() działa również na stringach
                                            (zwraca długość łańcucha)


jeśli łańcuch ma zawierać znak "  bądź '
to zaczynasz jednym by wstawić drugi
"To jest przykladowy'napis"

backslash - \    do cytowania znaków szczególnych

"To jest przykładowy\"napis"

\ również do zapisu białych znaków
np.
\t    - odpowiada tabulatorowi 
napis=:"To\tciagle\tprzykladowy\tnapis"

\b     BackSpace

\r     powrót do początku lini

\n    nowa linia


Przeciążanie operatora - gdy ten sam operator wykonuje inna czynność na liczbach, inna na napisach.

+  plus łączy napisy w jeden napis

"ponie"+"działek"
     wynik - poniedziałek


* gwiazdka  powiela dając nowy napis

"pon"*2      wynik - ponpon


ord(x)    funkcja zmienia znak na odpowiadający mu kod ASCII


chr(x)   funkcja zmiania kod ASCII na odpowiadający mu znak

print(chr(65))     wynik - A


Co ważne łańcuchy w Pythonie są niezmienne (immutable). Instrukcja del nie działa na znaki w napisach, nie mają również znanej z list  metody append() i insert().

Działają jednak wycinki...operator IN 


min(napis)    funkcja podaje najmniejszy element sekwencji (A ma mniejszy kod ASCI niż a)

max(napis)    funkcja podaje największy element sekwencji 


napis.index(elem)   metoda podaje położenie elementu w napisie 
np
print("abcde".index("c"))     wynik 2 (bo trzecia z kolei 0 1 2  )


napis.count(elem)   metoda zlicza wystąpienie elementu w napisie


Metody i funkcje tylko dla łańcuchów

napis.capitalize()    zwraca kopie łańcucha z pierwszą literą dużą


napis.center(szer)   zwraca kopię wycentrowanego łańcucha w polu o szer


napis.find(frag)   szuka fragmentu w napisie i podaje pozycje albo -1  
(jeśli tylko sprawdzasz czy jest użyj IN)

napis.find(frag,start,meta)   szuka od określonej pozycji do mety


napis.isalnum()   sprawdza czy łańcuch zawiera wyłącznie litery i cyfry (True False)


napis.isalpha()   sprawdza czy łańcuch zawiera wyłącznie litery


napis.islower()   sprawdza czy łańcuch zawiera wyłącznie małe litery


element.join(lista)   łączy listy w jeden napis rozdzielając je elementem


lista-=list(napis)   tworzy listę zawierającą kolejno wszystkie znaki z napisu jako kolejne elementy


napis.lower()   zwraca kopię łańcucha ze wszystkimi literami zamienionymi na małe


napis.lstrip(co)  zwraca kopię łańcucha z usuniętymi znakami co


napis.replace(stary,nowy)    zwraca kopię łańcucha z zamienionymi fragmentami stary na nowy


napis.split()   zwraca listę łańcuchów powstałych z podzielenia łańcucha białymi znakami


Porównywanie łańcuchów: łańcuchy można porównywać należy jednak pamiętać o tym, że porównujemy wartości kodów ASCII. 
Sortowanie napisów odbywa się z zgodnie z regułami języka) 

sorted()  funkcja zwraca posortowaną kopię oryginalnej sekwencji 


Metoda Sort()   - każda sekwencja ją ma


liczby=[5,4,3,2,1]
liczby.sort()
print(liczby)

1,2,3,4,5           zamienia oryginalną listę


Konwersja liczna do łańcuch

str(10)   wynik łańcuch "10"


Łańcuch cyfr na liczbę...

int() lub float()

Liczbę szesnastkową na dziesiętną (zmienna z liczbą szesnastkową - szes)

decc=int(szes,16)




6 GitHub

Założenie konta na GitHub mam za sobą ponieważ konto było potrzebne do rejestracji w konkursie DSP. Jednak samo założenie konta to trochę mało. Pierwszy kontakt ze stroną i chęć zrozumienia "jak to działa" skończył się ...

zakupem książki:  GitHub.Przyjazny przewodnik.



Książka na 120 stronach opisuje podstawy obsługi GitHub w zakresie przekraczającym moje potrzeby (opis sposobu pracy wielu programistów nad jednym projektem). Obsługa oparta jest na programie GitHub którego ...nawet nie zainstalowałem.

Przeglądając blogi DSP trafiłem jednak na stronę:

http://poznajprogramowanie.pl/git-tutorial-jak-zaczac-z-git/

która opisuje instalację i konfigurowanie programu SourceTree czyli narzędzia zapewniającego graficzny interfejs użytkownika do pracy z systemem kontroli wersji Git.

Tradycyjnie Git obsługiwany jest z konsoli, jednak na początek postanowiłem popracować z interfejsem graficznym i udało się.

Do mojego repozytorium załadowałem prostą wersję gierki którą napisałem. Kod gry będzie wyjaśniony na łamach bloga jednak zanim do niej dojdziemy czeka mnie stworzenie wpisów o:

7 Łańcuchach

8 Funkcjach

i kilka wpisów o programowaniu obiektowym


Grę zostawiam w repozytorium już teraz. Link:


To nie jest finalna gra, tylko podsumowanie rozdziałów do programowania obiektowego. 
Następnie przyjdzie czas na poznanie programowania efektów graficznych i główny projekt, czyli grę z grafiką. 





5 Listy

lista=[]

lista=[0] * 5    - stworzy listę z 5 zerami, nie mnoży a POWIELA

elementy numerowane(indeks), pierwszy 0 ostatni ilosc-1

lista[4]   - uzyskiwanie dostępu, w tym przypadku do 5 elementu listy
lista[-1]  - ostatni element (-2 przedostatni, i tak dalej)

uzyskiwanie dostępu przykłady:
b=lista[a]    do b element listy o indeksie równym a
c=lista[2*2]    czyli index 4
d=lista[lista2[0]]   do 'd' element listy o indeksie równym wartości zapisanej w liscie2 na indeksie 0
e=lista[int(input())]   użytkownik sam poda indeks

lista[2]=a   do trzeciego! elementu listy wpisz wartość zmiennej a

jeśli się odwołujemy, element o podanym indeksie musi istnieć !
jak dodać jesli nie istnieje ? za chwilę ...

Przykład z zastosowaniem listy:

lista=[1,2,3,4,5]
suma=0
for i in range(5):
   suma=suma+lista[i]
print(suma)

zmienna 'i' będzie przybierać wartości od 0 do 4, dlatego po wstawieniu 'i' w miejsce indeksu listy w pętli sumować będziemy kolejne elementy listy
ale...
po pierwsze:
możemy skrócić sumę do:
suma+=lista[i]

a po drugie:
zapisanie warunków for w taki sposób

for i in lista:

sprawi, że pętla wykona się 5 razy(5 elementów listy)  a za każdym razem zmienna 'i' będzie przyjmowała wartości kolejnych elementów listy
pozostaje jeszcze zmienić sposób sumowania na
suma=suma+i
czyli skrótowo
suma+=i



lista=[1,2,3,4,5]
suma=0
for i in lista:
   suma+=i
print(suma)



operator IN:         czy wartość występuje, lub nie występuje na liście, wynik True - False
lista=[1,2,3,4,5]
print(5 in lista)
print(5 not in lista)

wynik:
True
False



wycinki listy:

lista[skąd : dokąd]   jednak podobnie jak w range maksymalna wartość to jest pierwsze NIE pobierana

lista=[1,2,3,4,5]
lista2=lista[1:3]
print(lista2)

wynik:
[2,3]              czyli nie wyświetla 4 pomimo, że ma indeks 3

lista[ : ] - wycinek od początku do końca



określanie długości listy:
len(lista)     - wynik: długość listy

czyli:

lista[skąd: ]
równoważne

lista[skąd:len(lista)]

ale
lista2=lista[ : ]            (do listy 2 przypisuje WARTOŚCI z podanego wycinka)

to nie to samo co:
lista2=lista                   (lista i lista2  teraz odwołują się do tej samej listy, zmień 1 lement ;-)


usuwanie elementu listy:
del lista[0]                          z listy usunie zerowy element (pierwszy stanie się zerowym)

można usuwać wycinki
ale

del lista    usunie całą listę a nie tylko pozostawi pustą !!!


Dodawanie elementu do listy:

metoda append  (różnica pomiędzy funkcją a metodą patrz post nr 4)
lista.append(element)    dodaje na końcu listy element



metoda insert
lista.insert(gdzie,element)   'gdzie' jest indeksem

lista.insert(len(lista),10)      w tym przypadku wstawi na końcu wartość 10
można podać bardzo dużą wartość indeksu, wstawi na końcu, dużą z minusem, na początku



4 Podstawowe Funkcje i Instrukcje



print     niby znasz, ale:
print("zielony")
print("domek")
wyświetli:
zielony
domek

natomiast
print("zielony",end=" ")    
print("domek")
wyświetli:
zielony domek
jeśli dasz end=""  to wyświetli:
zielonydomek


input()  - pobieranie danych od użytkownika do zmiennej 'tekst'
tekst=input("Podaj tekst")

jeśli chcesz wczytać nie tekst a liczby całkowite dokonaj konwersji na int
ile=int(input())

bądź na liczbę rzeczywistą
ile=float(input())

Importowanie całego modułu math:
import math

Importowanie tylko jednej funkcji z modułu math:
from math import sqrt

i mamy funkcję
sqrt(x) czyli pierwiastkowanie
y=sqrt(4) 

import time
albo: from time import sleep

time.sleep(3600)
odczeka godzinę :-)

import random

random.randint(0,10)  
losuje liczbę całkowitą z przedziału    


Funkcja a Metoda:

funkcja(argument)           otrzymuje argument, zwraca wynik

dana.metoda(argument)     otrzymuje argument, modyfikuje daną



instrukcja IF
if warunek1:   #(określane poziomem wcięcia!, koniec wcięcia, koniec instr. if)
     kod1
elif warunek2:    #(elif może występować wielokrotnie)
     kod2
else:                      #(else tylko raz)
     kod3

Pętle:

instrukcja WHILE
while  warunek1:  #jeśli war1 False przed 1 wykonaniem, kod1 pominiety)
    kod1
else:
   kod2


sterowanie wykonaniem pętli:
break   - jeśli chcesz wcześniej opuścić pętle
continue   - jeśli chcesz wcześniej rozpocząć następny obrót pętli

pętla FOR
for x in range(min,max):   #(jeśli range masz (0,max) możesz napisać range(max)
   kod1
else:              
   kod2                            #(kod2 wykona się gdy zakres się wyczerpie)

odwracanie kolejności:
for x in reversed(range(0,5)):      #(odlicza od 5 do 0)

http://hilite.me/
monokai

3 Typy zmiennych

Typy proste:

int  -Typ całkowity skończony, czterobajtowy,  obejmuje liczby od -2 ** 31  do  2 **31-1

long   -Typ całkowity nieskończony, Python automatycznie konwertuje z typu int na typ long po przekroczeniu zakresu

float  - Typ zmiennoprzecinkowy

bool  -Typ logiczny, wartości zmiennej typu logicznego to True i False

str  -Napis, ogranicznikiem napisów mogą być: apostrofy, cudzysłowy, Potrójnych ograniczników używamy gdy chcemy napis umieścić w kilku wierszach. Napisy możemy łączyć za pomocą +.


2 Operatory

Lista operatorów działań matematycznych:

+    dodawanie
-     odejmowanie
*    mnożenie
/     dzielenie
**  potęgowanie
//    dzielenie całkowite  oblicza całkowity iloraz lewego i prawego argumentu
%    modulo  oblicza resztę z dzielenia ze swojego lewego argumentu przez prawy argument
        10%3  wynik 1

operatory stosują się do priorytetów, jedne przed innymi, identyczne od lewej do prawej

priorytety:
**
*  /  %  //
+  -

Operatory bitowe:

bin(x)   x liczba całkowita, zwraca postać binarną
hex(x)  zwraca postać szesnastkową

Operatory
negacji bitowej (tylda):
~  odwraca 0 na 1   a 1 na 0

iloczynu bitowego (ampersand):
&  tylko 1 + 1  da 1, inna kombinacja 0

suma bitowa (bar):
|  tylko  0 + 0  da 0, inna kombinacja 1

suma wykluczająca (caret):
^ 0 + 0 = 0
   0 + 1=1
   1+0=1
   1+1=0

operator przesuwania bitowego w lewo  <<
a<<b   przesuń bity a o b pozycji w lewo

w prawo >>

Operatory Relacyjne:
>    większe
>=  większe równe
<    mniejsze
<+  mniejsze równe
== równe  (nie równa się, "=" to przypisanie nie porównanie ;-)
!=  różne

Operatory logiczne:
not  - zamienia True w False i odwrotnie
and - tylko dwa True dadzą True reszta False
or   - tylko dwa False dadzą False reszta True



1 START

Witam




Z dniem 12 marca startuje mój blog "Od zera do programisty". Zainspirowany konkursem "Daj się Poznać" postanowiłem napisać prostą grę w Pythonie.

Czy znam Pythona ?
Nie, ale uczę się go i blog będzie zapisem tego czego już się nauczyłem, jednocześnie będzie pełnić zbiór notatek  potrzebnych do utrwalania nauki.

Nie będę się starał szczegółowo wyjaśniać komend czy poleceń, książek które to robią nie brakuje. Będzie to raczej zapis poznanego materiału z krótkimi opisami.

Celem jest opisanie takiego zakresu Pythona, by pod koniec konkursu napisać prostą graficzną grę.

a więc...S T A R T.

ps.
Nie zaczniemy od "Witaj świecie" to już pewnie potrafisz....;-)


kod tworzonej gry zacznie się pojawiać tu:
https://github.com/JanosikOpryszek/pythonowagra