# Potęgowanie...
a = 2**10
print(a)
2**63
2**128
2**4000
a = len(str(2**4000))
a
1.0 / 10 == 0.1
0.1 == 0.10000000000000001
arr = [0,1,2,3]
print(arr)
# Listy w pythonie są bardzo elastyczne
arr = [1,2,'cos', [10,11,12], 3.14]
print(arr)
arr = [0,1,2,3]
print(arr)
len(arr)
# Wartość której komórki zostanie odczytana?
arr[1]
# Elementy listy można łatwo nadpisać
arr[2] = 2
arr[2]
arr[1] = 1
# Czy to zadziała?
arr[-1]
# Wartości których komórek zostaną odczytane?
arr[1:3]
arr[:3]
arr[-2:]
arr[-3:-1]
arr = [0,1,2,3,4,5,6]
arr[0:5]
arr[0:5:2]
arr[::2]
arr[::-1]
# Konkatenacja
a=[0,1,2,3]
b=['a','b','c','d']
a+b
# Dodawanie do listy
a=[10,20,30,40]
a.append(100)
a
# Usuwanie z listy
a=[10,20,20,30,40]
a.remove(20)
a.pop(3)
a
# Python ma wiele fajnych funkcji, np.
a = [4, 6, 'd','y', 3 ,6]
'd' in a
a.index('d')
# Czym się różni tuple od listy? (Poza nawiasami)
a = (1,2,3)
a
# Czytamy tak samo
a[0]
b = (2,3,4)
c = a + b
c
d = b + c
d
# Co się teraz stanie?
a[1]=1
oceny = {'polski': 3.5,
'matematyka': 5,
'fizyka': 4,
'informatyka': 6}
oceny
# Odczytanie wartości dla klucza
oceny['informatyka']
# A teraz?
oceny['wf']
# Łatwo można dodać ocenę
oceny['nowy przedmiot'] = 2.0
oceny
# A także nadpisać
oceny['nowy przedmiot'] = 4.0
oceny
# Zbiory. Takie jak w matematyce. Jakie są dwie podstawowe włąsności zbiorów?
ulubione_przedmioty = set(['polski', 'muzyka', 'geografia', 'historia'])
ulubione_przedmioty
# Czy element należy do zbioru?
'informatyka' in ulubione_przedmioty
#'polski' in ulubione_przedmioty
# Zastosowanie z ifem (data flow będzie dalej)
# UWAGA NA WCIĘCIA
if 'polski' in ulubione_przedmioty:
print('Kocham j. polski!')
a = set(['a','b','c','d'])
b = set(['c','d','e','f'])
a = a.union(b)
l = list(a)
print(l)
a.intersection(b)
a.difference(b)
# Jak usunąć duplikaty z listy?
l = [1, 2, 'b', 4, 2, 'b', 'c']
s = set(l)
nl = list(s)
print(nl)
# Dlaczego nie można tak?
s = set(['a', 'b', 'c'])
pos = s.index('a')
a = 4
print('asdasdas ' + str(a))
# łańcuchy znaków...
print('Imię: {}'.format('Wojciech'))
from math import pi
print(' Imię: {},\n Nazwisko: {},\n PESEL: {},\n Ulubiona: {}\n'
.format('Wojciech', 'Jaśkowski', '8212...', pi))
# Można nadać identyfikator {identyfikator}
# Czy kolejnośc ma w takim razie znaczenie?
from math import pi
print('''
Imię: {imie},
Nazwisko: {nazw},
PESEL: {pesel},
Ulubiona: {ulub}
'''.format(
nazw='Jaśkowski',
imie='Wojciech',
pesel='8212...',
ulub=pi))
# Czy da radę to wyświetlić?
print('ęśćńżół')
print('יהוה')
# Po łańcuchu znaków można w sumie iterować, więc...
s = 'ala'
print(s[0:2])
# Czy jest jakaś różnica?
print('ala')
print("ala")
# Ciekawostka
print('ala ma \' "kota"')
print("ala ma 'kota'")
# Bardzo łatwo można w pythonie dokonywać konwersji między łańcuchem znaków a inną zmienną.
str(12)
int('12')
float('12.1')
text = 'Python is easy;really?'
text.split()
text.split(';')
# Wciąż nie fajnie, ale...
import re
re.split(' |;', text)
arr = ['a','b','c','d']
str(arr)
'; '.join(arr)
arr = ['a', 'b', 'c', 'd']
for a in arr:
print(a)
list(range(0, 4))
for i in range(len(arr)):
print(i, arr[i])
# W poprzednich podejściach mieliśmy albo element, albo indeks.
# A można mieć to i to
#list(enumerate(arr))
for i, a in enumerate(arr):
print(i, a)
a = [0,1,2,3]
b = ['a','b','c','d']
n = len(a)
for i in range(n):
print(a[i], b[i])
# A co jeżeli chcemy iterować jednocześnie po dwóch listach?
a = [0,1,2,3]
b = ['a','b','c','d']
for x, y in zip(a, b):
print(x, y)
list(zip(a,b))
# A po trzech?
c=['ala','ma','kota','!']
zipped = list(zip(a,b,c))
zipped
# Skoro można 'zipować', to można także 'odzipować'
a, b, c = list(zip(*zipped))
print(a)
print(b)
print(c)
# If w pythonie jest bardzo prosty (pamiętamy o ':' oraz braku '{ }')
arr = [0,1,2,3]
for a in arr:
if (a % 3 == 0):
print('0 = {} mod 3'.format(a))
elif a % 3 == 1:
print('1 = {} mod 3'.format(a))
else:
print('2 = {} mod 3'.format(a))
# Pętla while to też pestka. Jaki tu będzie wynik?
s = 'python'
while s[0] != 'h':
s = s[1:]
print(s)
# and (nawiasy nie są konieczne)
a = 1
if -1 <= a and (a <= 1):
print('A is in range')
# 'and' czasami też nie jest konieczny...
if -1 <= a <= 1:
print('A is in range')
# negacja
a = [1, 2, 3]
if not 4 in a:
print('4 is missing')
# continue, break
a = 2
while (a < 5):
a = a + 1
print(a)
if (a == 3):
break
#continue
# Co odczytujemy?
# Co z kolejnością?
d = {'a': 1,
'b': 2,
12: 'mama',
4:23}
for v in d:
print(str(v) + ' => ' + str(d[v]))
# A gdybyśmy chcieli mieć klucz i wartość od razu?
#list(d.items())
for k, v in d.items():
print(str(k) + ' => ' + str(v))
# Na początek proste dodawanie (pamiętamy o wcięciach, ':' oraz braku '{ }')
def suma(a, b):
return a + b
if suma(1,3) == 4: print("ok") # można w jednej linijce
# Python wspiera wartości domyślne funkcji. Jaki będzie wynik?
def suma(a,
b,
wa=1,
wb=3):
return wa * a + wb * b
suma(1,1)
# A teraz?
suma(1, 3, 2, 1)
# Zamieniliśmy kolejność, odwołując się po identyfikatorach. Czy teraz się wyjdzie?
suma(1, 3, wb=2, wa=1)
print(suma(1, 3, wa=2))
# Co ta funkcja robi?
# Ile wartości ona zwraca?
def f(arr):
n = x = arr[0]
for a in arr:
if n > a:
n = a
if x < a:
x = a
return n, x
print(f([2,3,1,4]))
# Jak to przechwycić?
a = f([2,3,1,4])
print(a)
a, b = f([2,3,1,4])
print(a)
print(b)
# Czym jest x?
x = f([2,3,1,4])
type(x)
# Przkład operacji a, b = b, a (swap)
a = 1
b = 2
a, b = b, a
print('a = ' + str(a))
print('b = ' + str(b))
# Taki inny unzip
x = ('ala','ma','kota')
a, b, c = x
print('a = ' + str(a))
print('b = ' + str(b))
print('c = ' + str(c))
# Pytanie za zero punktów. Co zwraca funkcja f?
def f(wa=1, wb=1):
def g(a, b):
return a * wa + b * wb;
return g
f(1,3)
# W Javie czym musimy się posłużyć, żeby uzyskać taki efekt?
wazona = f(0, 1)
wazona
wazona(1, 3)
# Gratisowa metoda listy. Wynik?
arr = [-3, 2, 1, 4]
arr.sort()
arr
# A teraz?
arr.sort(reverse=True)
arr
# A teraz?
def mykey(x):
return abs(x)
arr.sort(key=mykey)
arr
# Możemy to zrobić 'inline' wykorzystując funkcje lambda.
arr.sort(key=lambda x: abs(x))
arr
# Utrwalmy funkcje lambda. Jaki będzie wynik?
f = lambda a, b: a - b
print(f(1,2))
# A teraz?
g = lambda a, b: a + b
print(g(1,2))
# A teraz?
f, g = g, f
print(f(1,2))
print(g(1,2))
# Python obsługuje liczby zespolone
1+3j
# Czym jest moduł liczby zepolonej?
abs(1+3j)
(1+3j)*(2-1j)
# Normalnie, po wykonaniu funkcji, jej stan lokalny jest niszczony. Ale...
# Co robi ten kod?
def whatdoido():
a, b = 0, 1
while True:
yield a
a, b = b, a + b
print(whatdoido())
# Wynik?
g = whatdoido()
print(next(g))
# A teraz?
print(next(g))
print(next(g))
print(next(g))
# Można tak
for i in range(10):
print(next(g))
# Co teraz chcemy otrzymać?
for v in whatdoido():
if v > 100:
break
print(v)
# Ten kod tworzy wszytkie k-elementowe kombinacje z iterowalnego obiektu
# (np. listy, ciągu znaków). Są tutaj dwie fajne rzeczy.
def combinations(iterable, k):
# combinations('ABCD', 2) --> AB AC AD BC BD CD
# combinations(range(4), 3) --> 012 013 023 123
pool = tuple(iterable)
print (pool)
n = len(pool)
if k > n:
return
indices = list(range(k))
print(indices)
yield tuple(pool[i] for i in indices)
while True:
for i in reversed(range(k)):
if indices[i] != i + n - k:
break
# Pierwsza fajna rzecz
else:
return
indices[i] += 1
for j in range(i+1, k):
indices[j] = indices[j-1] + 1
yield tuple(pool[i] for i in indices)
pairs = combinations('ABCD', 2)
print(pairs)
# Druga fajna rzecz. Ale musimy uważać, przy tworzeniu generatora (return)
for pair in pairs:
print(pair)
# Pierwsze trzy pary, które mają A i G w środku
pairs = combinations('ABCDEFGH', 3)
found = 0
for pair in pairs:
if 'A' in pair and 'G' in pair and found < 3:
found += 1
print(pair)
# Dwa przykłady poniżej są fajne, bo można np. wczytać sobie z jednego skrytpu drugi,
# i go wykonać
x=1
eval('max([x,2,-2,3])')
exec('import math; print(math.sin(2*math.pi))')
# Funkcje logiczne
print(all([True, False, True]))
print(any([True, False, True]))
# Funkcje matematyczne
print(sum([1,2,3]))
print(min([1,2,3]))
print(max([1,2,3]))
# Inne funkcje matematyczne
print(abs(-12))
print(round(3.14159, 3))
# Pamiętamy? Konwersja w pythonie jest łatwa.
print(float(12))
print(int(12.7))
print(str(123))
print(str([1,2,3]))
# Znak -> numer w unicode i na odwrót.
print(ord('a'))
print(chr(98))
# Fajna funkcja. Do debugowania
print(type('ala ma kota'))
print(type([1,2,3]))
# Trochę o zmiennych globalnych.
text = 'ala ma kota'
def a():
print('a: ' + text)
def b():
print('b: ' + text)
text = 'ala ma psa'
# Wynik?
a()
# Wynik?
b()
# Zmienne globalne są niebezpieczne. Python chce, żebyśmy mu dali znać,
# że wiemy co robimy :)
text = 'ala ma kota'
def c():
global text
print('c: ' + text)
text = 'ala ma psa'
c()
print(text)
# To są fajne rzeczy. Warto zapamiętać - super oszczędność kodu!
# Jakby wyglądało 'klasyczne' przeniesienie alementow jednej listy do drugiej + coś jeszcze
arr = [0,1,2,3,4,5]
new = []
for a in arr:
new.append('A' + str(a))
new
# W pythonie można tak:
arr = [0,1,2,3,4,5]
new = ['A' + str(a) for a in arr]
new
# Można dodać warunek. Czyli ogólnie: [funkcja for if]
arr = [0,1,2,3,4,5]
new = ['A' + str(a) for a in arr if a % 2 == 0]
new
# Co to robi?
arr = [0,13,2,4,11]
sum([1 for a in arr if a % 2 == 0])
# Chcemy wszystkie pierwsze litery wyrazów zamienić na wielkie
text = 'to jest krótki text nie na temat'
splitted = text.split()
splitted
big = [x[0].upper() + x[1:] for x in splitted]
big
# Trochę długaśne. Swoją drogą - fajne wykorzystanie str.join.
" ".join(big)
# Można to zrobić krócej:
text = 'to jest krótki text nie na temat'
print(" ".join([x[0].upper() + x[1:] for x in text.split()]))
# Co, gdybyśmy chcieli coś zrobić, z każdą komórka 2d macierzy?
m = [[0,1,1,0],
[1,0,1,0],
[0,1,0,1],
[1,0,0,1]]
nm = [[1 - cell for cell in row] for row in m]
print(m)
print(nm)
# Tutaj pamietamy o klamrach
# Co to robi?
przedmioty = ('matematyka', 'fizyka', 'chemia')
slownik = {p: len(p) for p in przedmioty}
slownik
# Krótko omówimy klasy (tak, python jest obiektowy)
# __init__, self
class Circle:
def __init__(self, radius):
self.radius = radius
self.costam = 2
def area(self):
from math import pi
self.size = pi * self.radius**2
return self.size
def set_radius(self, radius):
self.radius = radius
c = Circle(3)
print(c.area())
c.set_radius(5)
print(c.radius)
# W pythonie nie ma '{ }' więc jak zrobić pustą klasę?
# Pamiętamy, że w pythonie nie trzeba deklarować.
# Wynik?
class Container:
pass
def compute(container):
return container.size**2
c = Container
c.size = 2;
compute(c)
# Atrybuty 'statyczne' i dla instancji.
class Przedmiot:
acoto = 12
alefajnie = 2
def __init__(self, nazwa):
self.nazwa = nazwa
p = Przedmiot('kck')
p.nazwa
print(p.acoto)
print(Przedmiot.alefajnie)
print(Przedmiot.acoto)
Przedmiot.acoto = 5
print(Przedmiot.acoto)
# Wygląda brzydko. A jak robiliśmy print(lista) to było ładnie.
print(p)
# Można temu zaradzić
class Przedmiot:
def __init__(self, nazwa):
self.nazwa = nazwa
def __repr__(self):
return 'Przedmiot o nazwie ' + self.nazwa
p = Przedmiot('KCK')
print(p)
class Circle:
def __init__(self, radius):
self.radius = radius
def area(self):
from math import pi
return pi * self.radius**2
class Square:
def __init__(self, w):
self.w = w
def area(self):
return self.w**2
class Line:
pass
def get_shape():
from random import choice
return choice([Square(4), Circle(4), Line()])
shape = get_shape()
shape.area()
# Pisanie do pliku jest proste
f = open('test.txt','w')
for i in range(6):
f.write('To jest linia {}\n'.format(i))
f.close()
cat test.txt
# Czytanie też. Jak iterujemy plik, to czytamy linie.
f = open('test.txt')
for line in f:
print(line.strip())
f.close()
# Można tak
with open('test.txt') as f:
for line in f:
print(line.strip())
# Można od razu wczytac wsystkie linie i dalej używać.
with open('test.txt') as f:
lines = f.readlines()
lines[1]
http://www.learnpython.org/en/Welcome
https://www.hackerrank.com/domains/python/py-introduction
%matplotlib inline
import matplotlib.pyplot as plt
plt.figure(figsize=(5, 5))
plt.plot([100,200,300,400],[0.1,0.2,0.8,0.9])
#plt.savefig('myplot.pdf')
#plt.close()