TI/Python - powtórzenie/Zajęcia 1

Z Brain-wiki
Wersja z dnia 08:51, 23 maj 2015 autorstwa Jarekz (dyskusja | edycje) (Utworzono nową stronę "= Zajęcia 1: podstawy = Na kilku najbliższych zajęciach przypomnimy sobie to, czego się nauczyliście w zeszłym roku na programowniu w pythonie. Nie będziemy tu p...")
(różn.) ← poprzednia wersja | przejdź do aktualnej wersji (różn.) | następna wersja → (różn.)

Zajęcia 1: podstawy

Na kilku najbliższych zajęciach przypomnimy sobie to, czego się nauczyliście w zeszłym roku na programowniu w pythonie. Nie będziemy tu pisać jeszcze raz tego, co jest opisane w wykładzie z programowania z pythonem natomiast będziemy to ćwiczyć i tego używać w praktyce.


Przypomnienie składni

Podstawy

Stałe dosłowne

Liczby
  • które ze sposobów zapisu liczby 1 są poprawne? Co oznaczają pozostałe wyrażenia? Jaki jest ich wynik?
>>> 1
1
# OK - liczba typu integer

>>> .1
0.10000000000000001
# Nie OK

>>> 1.
1.0
# OK liczba typu float

>>> 1,
(1,)
# Nie OK -- wynikiem jest krotka zawierająca liczbę 1, a nie liczba 1


>>> 1.0
1.0
# OK

>>> 1.E-1
0.10000000000000001
# Nie OK -- 1.0 * 10^(-1)


>>> 1E-1
0.10000000000000001
# Nie OK -- 1 * 10^(-1)

>>> 1E+1
10.0
# Nie OK -- 1 * 10^1

>>> 0.1E-1
0.01
# Nie OK -- 0.1 * 10^(-1)

>>> 0.1E+1
1.0
# OK -- 0.1 * 10^1

>>> .001E-2
1.0000000000000001e-05
# Nie OK -- 0.001 * 10^(-2)
  • które ze sposobów przedstawienia liczby 1/2 są poprawne? Co oznaczają pozostałe wyrażenia? Jaki jest ich wynik?
>>> 5E-1
0.5
# OK, zapis w postaci 5*10^(-1)

>>> .5
0.5
# OK

>>> 5.
5.0
# nie OK -- wartość 5, a nie 1/2


>>> 0.5
0.5
# OK

>>> 0,5
(0, 5)
# Nie OK -- wartość jest krotką zawierającą dwie liczby -- 0 i 5

>>> 1/2
0
# UWAGA -- NIE OK, dzielenie dwóch liczb całkowitych daje wynik całkowity,
# czyli tutaj zaokrąglony do 0

>>> 1/2.
0.5
# OK -- zapis 2. równoważnie 2.0 oznacza typ float, a nie integer
# dzielenie liczby integer przez float daje typ float


>>> 1%2
1
# nie OK -- a%b oznacza resztę z dzielenia a przez b
  • które ze sposobów przedstawienia liczby [math]4 + 2i[/math] są poprawne? Co oznaczają pozostałe wyrażenia? Jaki jest ich wynik?
>>> 4E-2
0.040000000000000001
# Nie OK -- nie jest reprezentacją liczby <tt><math>4 + 2i</math></tt>

>>> 4+2i
SyntaxError: invalid syntax
# Nie OK -- części urojonej nie oznaczamy literą i

>>> 4+2j
(4+2j)
# OK 

>>> 4+2J
(4+2j)
# OK

>>> 2i+4
SyntaxError: invalid syntax
# Nie OK -- i nie oznacza części urojonej


>>> 2j+4
(4+2j)
# OK -- można zamienić kolejności części rzeczywistej i urojonej


>>> 2J+4
(4+2j)
# OK -- j.w.

>>> 2+1j*2
(2+2j)
# Nie OK -- to nie jest liczba 4 + 2i, mnożenie objęło tylko część urojoną

>>> (2+1j)*2
(4+2j)
# OK

>>> 4+1j*2
(4+2j)
# OK
>>> 4+j*2

Traceback (most recent call last):
  File "<pyshell#202>", line 1, in <module>
    4+j*2
NameError: name 'j' is not defined

# Nie OK --  należy pisać: x + y*1j

>>> complex(4,2)
(4+2j)
# OK

>>> complex(2,4)
(2+4j)
# Nie OK, część rzeczywista musi być podana jako pierwszy parametr
# urojona jako drugi
  • Niech
a = 4+2j

Co będzie wynikiem:

>>> a = 4+2j
>>> a
(4+2j)
>>> a.real
4.0
>>> a.imag
2.0
>>> abs(a)
4.4721359549995796
>>> import math
>>> math.sqrt(a.real**2 + a.imag**2)
4.4721359549995796
  • Zastanów się, jak możesz zapisać liczbę 2 + 0.5i? Spróbuj wymyślić jak najwięcej sposobów, na które możesz zapisać taką liczbę. Nie chodzi w tym o tworzenie sposobów zapisu "na jedno kopyto" (niedopuszczalne jest generowanie ciągów jak np. 0.2E+1, oraz 0.02E+2, 0.002E+3, ...). Dla osoby która wymyśli najwięcej sposobów przewidziany "+". Ocenianie czy dwa dane sposoby zapisu są "znacząco" różne może być subiektywne i niesprawiedliwe. Plik z proponowanymi reprezentacjami, sformatowany tak, że w każdej linii jest jedna reprezentacja, nazywamy imie.nazwisko.txt (gdzie imie i nazwisko to imię i nazwisko autora pliku) i wysyłamy na adres prowadzącego zajęcia. Umieszczenie w pliku reprezentacji, która nie jest poprawna, dyskwalifikuje.
Napisy
  • Odgadnij wyniki następujących instrukcji:
 
print ('Jak ' 'Cię zwą?')
 
print ('Jak ','Cię zwą?')
 
print ('Jak " "Cię zwą?')
 
print ("Jak ' 'Cię zwą?")
 
print ("To jest napis wielolinijkowy.
To jest drugi wiersz.")
 
a = 1E+1
print a
 
a = "1E+1"
print "wartosc a:", a
 
print ('''To jest napis wielolinijkowy.
To jest drugi wiersz.''')
 
print ('To jest napis wielolinijkowy.\
To jest drugi wiersz.')
 
print ('To jest napis wielolinijkowy.\\
To jest drugi wiersz.')
 
print ('To jest apostrof:" ' "')
 
print ('To jest apostrof:\'')
 
print ('To jest "backslash":\')
 
print ('To jest "backslash":\\')
 
print ('To są 2 "backslashe":\\\')
 
print ('To są 2 "backslashe":\\\\')

Zmienne

  • Które nazwy zmiennych są poprawne? Jaka jest ogólna zasada?
*zmienna

jedna zmienna

jednaZmienna

_jedna_zmienna

jedna.zmienna

1zmienna
 
zmienna1

Zmienna
  • Jaki będzie wynik następujących operacji:
MojaZmienna = 5
Mojazmienna = 3
print MojaZmienna

a = 5
b = c = a

a = 5
b = a = c

Obiekty

  • Jaki będzie wynik następujących operacji?:
>>> a = "napis"
>>> b = a
>>> a = "napis2"
>>> print b
napis
>>> print a
napis2



a = [1,2,3,4]
b = a
a = [2,3,4]
print b

a = [1,2,3,4]
b = a
a.append(5)
print b

Operatory

Tabela operatorów jest dostępna tu. O kolejności wykonywania operacji decyduje tabela priorytetów operatorów.

Ściąga z operatorów binarnych:


 
Niech a = 60; b = 13; W zapisie binarnym:

#     7654 3210      
# x = abcd efgh <=> x = h*(2**0) + g*(2**1) + f*(2**2) + ... + a*(2**7) 
#

a =   0011 1100
b =   0000 1101
-----------------
a&b = 0000 1100        # logiczny and
a|b = 0011 1101        # logiczny or
a^b = 0011 0001        # logiczny xor
~a  = 1100 0011        # logiczny not
-----------------
a<<b = 111 1000 0000 0000 0000 
# przesunięcie o 13 bitów w lewo (do zapisu liczby wystarczało 8 bitów, 
# przesuwając o 13 bitów w lewo, najbardziej znaczącą jedynkę można było
# tylko o 2 bity przesunąć bez zwiększania liczby bitów potrzebnej do zapisu,
# w kolejnych 11 krokach po prawej były dopisywane zera. a<<b == a * (2**b))
a>>b = 0        # przesunięcie o 13 bitów w prawo (a>>b == a/(2**b))
 
60 & 13

60 + 13

5 + 3*2^2

5 + 3*2**2

a = 5
a/2

a = 5.
a/2

a = 5.
a//2

a = 5
a%2

"a" * 3 + "b"

Wykonanie Warunkowe

Wartości logiczne

Dwie wartości, prawdę i fałsz, oznaczamy często jako 1 i 0. W Pythonie jako wartość oznaczającą prawdę można użyć liczby 1 albo specjalnego obiektu True, natomiast fałsz — liczby 0 lub obiektu False. Te specjalne obiekty nazywane są po angielsku booleans, co należy rozumieć jako wartości Boole'a.

Cwiczenia

  • Które wyrażenia są poprawne, i jaka jest ich wartość?
1 < 2 < 3 < 4 <= 5 > 4 == 4
1 < 2 < 3 < 4 <= 5 > 4 != 4
"a" == "A"
"a" == "a"
"kluczyk" < "klucz"
"klucz" < "wielki klucz"
"A" < "B" < "b" < "a"

Szablon:Wyjaśnienie

a = 5
a%2 == 0 and a < 10 or a%2 == 1 and a > 15
  • Sprobuj zgadnąć jaki będzie wynik następujących wyrażeń. Następnie sprawdź.
'0' and '0'
'0' and '1'
'1' and '1'
('0' or '1') == 1
('0' or '1') == True
if ('0' or '1'):
 print "True"
else:
 print "False"
0 or 1
0 or 4



'a' == ('a' or 'b')
'b' == ('a' or 'b')
'a' == ('a' and 'b')
'b' == ('a' and 'b')
  • Zgadnij co sprawdzają następujące instrukcje, jakie jest ich znaczenie?
delta < 0 or a*x1**2 + b*x1 + c == 0 and a*x2**2 + b*x2 + c == 0 and x1 <= x2


  • Zapisz wyrażenia sprawdzające:
    • Czy punkt o współrzędnych (x,y) należy do wnętrze koła o środku w punkcie (0,0) i promieniu r
    • Czy punkt o współrzędnych (x,y) należy do wnętrza kwadratu o lewym dolnym wierzchołku w punkcie (2,3) i boku 5.

Konstrukcja if

  • Narysuj "graf" / "drzewo" / "diagram" reprezentowany przez następującą instrukcję. Jaka będzie odpowiedź dla liczby wejściowej 0, oraz podanej listy ruchów?

Podaj najkrótszą listę "ruchów" dzięki którym możesz osiągnąć liczbę będącą odpowiedzią na "Wielkie Pytanie o Życie, Wszechświat i całą resztę (Ultimate Question of Life, the Universe, and Everything)".

start = 0
ruchy = [0,0,0,1] 
i = 0

if ruchy[i] == 0:
    start += 2
    i += 1
    if ruchy[i] == 0:
        start += 2
        i += 1
        if ruchy[i] == 0:
            start += 2
            i += 1
            if ruchy[i] == 0:
                start += 2
                return start
            else:
                start *= 7
                return start

        else:
            start *= 7
            return start
    else:
        start *= 7
        return start


elif ruchy[i] == 1:
    start += 6
    i += 1
    if ruchy[i] == 0:
        start += 6
        return start
    elif ruchy[i] == 1:
        start *= 7
        return start

    else:
        print "niedozwolony ruch"
else:
    print "niedozwolony ruch"
  • Opisz podobną instrukcją następujący "graf":



Pętle

mx = 100
s = 0
lista = [1,49,50,10]
i = 0

while s < mx:
    s += lista[i]
    i += 1
  • opisz własnymi słowami co robi ta pętla
  • ile razy wykona się ta pętla dla listy z przykładu?
  • podaj przykład danych, dla których pętla wykona się 120 razy
  • podaj przykład danych, dla których wykonanie pętli zakończy się błędem. Popraw petlę tak, aby nie kończyła się błedem dla tych danych.
  • przepisz ten fragment kodu używając pętli for.

Ćwiczenia

  • Napisz pętlę for wypisującą kwadraty liczb od 0 do 1000000000. Użyj range lub xrange. Którego użyjesz i dlaczego?

Ćwiczenia powtórzeniowe

  • Zadeklaruj zmienną x równą pięć. Zwiększ ją o jeden, a następnie o jeden. Wypisz jej wartość.
  • Zastanów się najpierw, czy wyrażenia/instrukcje są poprawne. Spróbuj określić ich wynik. Następnie sprawdź, czy miałeś rację, testując je. Jeżeli okażą się niepoprawne, popraw je, tak by działały bądź zwracały oczekiwany wynik.
 
res = 2 + 3 * 4
 
res = -x**1/2
 
delta < 0 or a*x1**2 + b*x1 + c == 0 and a*x2**2 + b*x2 + c == 0 and x1 <= x2
a += 2 itd
'a'.join("napis")
'a'.join(["b", "b", "b", "b"])

Problemy

Zamiana systemu reprezentacji liczb

Szablon:TI/Zmiana reprezentacji liczb

Generator liczb pseudolosowych

Szablon:TI/Generator liczb pseudolosowych

Rysowanie figur

Szablon:TI/Rysowanie figur Szablon:Następny