Wizualizacja danych
Wykład 2

Operacje wejścia
i wyjścia
- dokończenie

input - operacja wejścia

num = input ("Wprowadź liczbę :")
print(num)
name1 = input("Wprowadź imię : ")
print(name1)
  • zawsze przyjmuje napis, w razie potrzeby trzeba zrzutować
x = str(num)    
y = int(num)   
z = float(num)  
print(*objects, sep=' ', end='\n', file=sys.stdout, 
      flush=False)
  • objects - to co ma być wyświetlone
  • sep - separator, domyślnie znak spacji
  • end - co co ma być wyświetlone na końcu, domyślnie znak końca linii
  • file - określa gdzie mają być objects wyświetlone, domyślnie sys.stdout (domyślny ekran)
  • flush- określa czy “wyjście” ma być buforowane przed przekazaniem do file, domyślne False
print(1, 2, 3, 4)
print(1, 2, 3, 4, sep='*')
print(1, 2, 3, 4 ,sep='#', end='&')
1 2 3 4
1*2*3*4
1#2#3#4&
print('x', 'y', 'z', sep='', end='') 
print('a', 'b', 'c' , sep='', end='')
xyzabc
print('a', 'b', '\n', 'c')
a b 
 c

\t - przesunięcie do następnego “tab”=8 spacji

print('sdf', 3456, -2, sep='\t')
sdf 3456    -2

Formatowanie napisów będzie później.

Operatory

Operacje arytmetyczne

Operator Opis Składnia
+ Dodawanie x + y
Odejmowanie x – y
* Mnożenie x * y
/ Dzielenie x / y
// Dzielenie całkowite x // y
% Dzielenie modulo x % y
** Potęgowanie x ** y
print(5+3)
print(4*5.2)
print(9-7)
print(25%7)
8
20.8
2
4
print(4/5)
print(4//5)
print(4/5.0)
print(4//5.0)
0.8
0
0.8
0.0
print(3**0)
print(0**0)
1
1
print(4/0)

Daje info: ZeroDivisionError: division by zero.

Przypisanie z operacją arytmetyczną

Lista zawiera wybrane operacje.

Inna nazwa to złożone operatory przypisania.

Operator Zapis Dłuższa wersja
+= x += 5 x = x + 5
-= x -= 5 x = x - 5
*= x *= 5 x = x * 5
/= x /= 5 x = x / 5
%= x %= 5 x = x % 5
//= x //= 5 x = x // 5
**= x **= 5 x = x ** 5
a = 5
a += 1
print(a)
a **= 2
print(a)
6
36

Operatory porównania

Operator Znaczenie Przykład
> Większe niż x > y
< Mniejsze niż x < y
== Równe x == y
!= Nie równa się x != y
>= Większe lub równe x >= y
<= Mniejsze lub równe x <= y

Operatory logiczne

Operator Znaczenie Przykład
and i x and y
or lub x or y
not negacja not x

Operatory bitowe

Operator Znaczenie Przykład
& i - logiczne x & y
| lub - logiczne x | y
^ albo - logiczne x ^ y
~ negacja - logiczne ~x
<< przesunięcie w lewo x << y
>> przesunięcie w prawo x >> y

Operator &

print(4&5)
4
x 100 4
y 101 5
x&y 100 4

Operator |

print(4|5)
5
x 100 4
y 101 5
x|y 101 5

Operator ^

print(4^5)
1
x 100 4
y 101 5
x^y 001 1

Operator ~

  • równoważnie -(x+1)
print(~4)
-5
x 100 4
~x ? -5

Operator <<

a<<b - równoważnie a*pow(2,b)

print(3<<2)
12
x 0011 3
x<<2 1100 12

Operator >>

a>>b - równoważnie a//pow(2,b)

print(13>>2)
3
x 1101 13
x>>2 0011 3

Instrukcje warunkowe
i pętle

Instrukcje warunkowe

Składnia

if <expr>:
    <statement>

else

if <expr>:
    <statement(s)>
else:
    <statement(s)>
a = 5
if a > 0:
    print("Liczba dodatnia")
else:
    print("Liczna ujemna lub zero")
Liczba dodatnia

x = 0
y = 5
if x < y:
    print('yes1')

if y < x:
    print('yes2')

if x:
    print('yes3')

if y:
    print('yes4')

if x or y:
    print('yes5')

if x and y:
    print('yes6')
yes1
yes4
yes5

elif

if <expr>:
    <statement(s)>
elif <expr>:
    <statement(s)>
elif <expr>:
    <statement(s)>
    ...
else:
    <statement(s)>
a = 5
if a > 0:
    print("Liczba dodatnia")
elif a == 0:
    print("Zero")
else:
    print("Liczna ujemna")
Liczba dodatnia

Zagnieżdżone instrukcje warunkowe:

if <expr>:
    <statement(s)>
    if <expr>:
        <statement(s)>
i = 21
if i > 0:
    print("liczba jest dodatnia")
    if i % 2 == 0:
        print("Liczba jest dodatkowo parzysta")
liczba jest dodatnia

for - pętla

for i in <collection>:
    <loop body>

Przykład:

for i in range(5):
    print(i)
0
1
2
3
4

range

Generuje nam ciąg liczb (dedykowany typ range). Trzeba zamienić na listę “by podejrzeć”.

Uwaga: wszystkie argumenty muszą być w typie całkowitym.

Jeden argument - to “koniec” - ciąg tworzą liczby naturalne od \(0\) do \(n-1\). Krok domyślny to 1.

Dwa argumenty - to “początek” i “koniec”. Krok domyślny to 1. Wtedy wyświetlone są liczby całkowite z przedziału lewostronnie domkniętego \([początek, koniec)\).

Trzy argumenty - to “początek”, “koniec” oraz krok.

print(list(range(5)))
print(list(range(1, 11)))
print(list(range(0, 30, 5)))
print(list(range(0, 10, 3)))
print(list(range(0, -10, -1)))
print(list(range(0)))
print(list(range(1, 0)))
[0, 1, 2, 3, 4]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[0, 5, 10, 15, 20, 25]
[0, 3, 6, 9]
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
[]
[]

While - pętla

while <expr>:
    <statement(s)>

Przykład:

i = 0
while i < 5:
    print(i)
    i = i + 1
0
1
2
3
4

Zagnieżdżone pętle

for i in <collection>:
    <loop body>
    for i in <collection>:
        <loop body>

inna opcja:

while <expr>:
    <statement(s)>
    while <expr>:
        <statement(s)>
for i in range(3):
    for j in range(3):
        print(i, "*", j, "=", i * j)
0 * 0 = 0
0 * 1 = 0
0 * 2 = 0
1 * 0 = 0
1 * 1 = 1
1 * 2 = 2
2 * 0 = 0
2 * 1 = 2
2 * 2 = 4

break/continue

break

n = 5
while n > 0:
    n -= 1
    if n == 2:
        break
    print(n)
4
3

continue

n = 5
while n > 0:
    n -= 1
    if n == 2:
        continue
    print(n)
4
3
1
0

Kolejność operaratorów

Kolejność operatorów

Od ostatniego:

  • lambda
  • if - else
  • or
  • and
  • not x
  • in, not in, is, is not, <, <=, >, >=, !=, ==
  • |
  • ^
  • &
  • <<, >>
  • +, -

  • *, @, /, //, %
  • +x, -x, ~x
  • **
  • await x
  • x[index], x[index:index], x(arguments...), x.attribute
  • (expressions...), [expressions...], {key: value...},{expressions...}

Źródło: https://docs.python.org/3/reference/expressions.html#operator-precedence.

Pytanie do przemyślenia

Co oznacza w Pythonie, że wartości przekazywane są przez referencję?

a = 5
b = a
b += 2
print(a)
print(b)
5
7

Typy sekwencyjne

Listy

Lista w Pythonie to tzw. typ sekwencyjny umożliwia przechowywanie elementów różnych typów.

Cechy:

  • zmienny (mutable) - umożliwia przypisanie wartości pojedynczym elementom
  • do zapisu używamy nawiasów kwadratowych
  • poszczególne elementy rozdzielamy przecinkami
  • każdy element listy ma przyporządkowany indeks
  • elementy listy są numerowane od zera
  • listy dopuszczają porządek (o ile elementy są porównywalne)
  • listy są dynamiczne (mogą mieć różną długość)
  • listy mogą być zagnieżdżone

Uwaga!

Listy w języku Python są specyficzną strukturą danych nie zawsze dostępną w innych językach programowania. Pojęcie listy w całej informatyce “szersze”. Wyróżnia się np. listy jednokierunkowe, które nie muszą mieć indeksu. Nie będziemy takich przypadków analizować.

nazwa = [element1, element2, ..., elementN]

Pusta lista:

a = []
b = list()

Lista z liczbami:

a = [2, 3, 4.5, 5, -3.2]

Lista mieszana:

b = ['abcd', 25+3j, True, 1]

Kolejność ma znaczenie

a = [1, 2, 3, 4]
b = [4, 3, 2, 1]
print(a == b)
False

Elementy na liście nie muszą być unikalne

a = [1, 2, 3, 4, 2]
b = [1, 2, 3, 4]
print(a)
print(a == b)
[1, 2, 3, 4, 2]
False

Indeks - dostęp do elementów listy (od zera)

a = [1, 3, 'abc', False, -2.3, 'XYZ', 9.3]
print(a[1])
print(a[4])
print(a[0])
#print(a[7])
3
-2.3
1
a = [1, 3, 'abc', False, -2.3, 'XYZ', 9.3]
print(a[-1])
print(a[-5])
print(a[-7])
9.3
abc
1
a = [1, 3, 'abc', False, -2.3, 'XYZ', 9.3]
print(a[1:4])
print(a[-5:-2])
print(a[:4])
[3, 'abc', False]
['abc', False, -2.3]
[1, 3, 'abc', False]
a = [1, 3, 'abc', False, -2.3, 'XYZ', 9.3]
print(a[2:])
print(a[0:6:2])
print(a[1:6:2])
['abc', False, -2.3, 'XYZ', 9.3]
[1, 'abc', -2.3]
[3, False, 'XYZ']
a = [1, 3, 'abc', False, -2.3, 'XYZ', 9.3]
print(a[6:0:-2])
print(a[::-1])
print(a[:])
[9.3, -2.3, 'abc']
[9.3, 'XYZ', -2.3, False, 'abc', 3, 1]
[1, 3, 'abc', False, -2.3, 'XYZ', 9.3]
a = [1, 3, 'abc', False, -2.3, 'XYZ', 9.3]
print(a[::2])
print(a[::-2])
[1, 'abc', -2.3, 9.3]
[9.3, -2.3, 'abc', 1]

Specjalne funkcje

Długość (rozmiar listy)

a = [1, 3, 'abc', False, -2.3, 'XYZ', 9.3]
print(len(a))
7

Implementacja samodzielna długości:

def dlugosc(lista):
    x = 0
    for i in lista:
        x += 1

    return x


a = [1, 3, 'abc', False, -2.3, 'XYZ', 9.3]
print(dlugosc(a))
7

Maksimum i minimum?

Działa wtedy gdy mamy porządek

  • liczby <=
  • napisy - porządek leksykograficzny (omówimy przy napisach)
a = [4,-5,3.4,-11.2]
print(min(a))
print(max(a))
b = ['abc', 'ABCd', 'krt', 'abcd']
print(min(b))
print(max(b))
-11.2
4
ABCd
krt

Modyfikacja i wstawianie

a = [4,-5,3.4,-11.2]
a[2] = 'a'
print(a)
[4, -5, 'a', -11.2]
a = [4,-5,3.4,-11.2]
a[2] = ['a','b']
print(a)
[4, -5, ['a', 'b'], -11.2]
a = [4,-5,3.4,-11.2]
a[1:2] = ['a','b']
print(a)
[4, 'a', 'b', 3.4, -11.2]
a = [4,-5,3.4,-11.2]
a[1:3] = ['a','b']
print(a)
[4, 'a', 'b', -11.2]

Dodawanie list

a = [4,-5,3.4,-11.2]
b = ['a','b','c']
print(a+b)
[4, -5, 3.4, -11.2, 'a', 'b', 'c']

Mnożenie listy przez liczbę całkowitą (int)

a = [4,-5,3.4,-11.2]
print(a*2)
print(2*a)
[4, -5, 3.4, -11.2, 4, -5, 3.4, -11.2]
[4, -5, 3.4, -11.2, 4, -5, 3.4, -11.2]

Usuwanie elementów z listy

a = [1, 3, 'abc', False, -2.3, 'XYZ', 9.3]
del a[2]
print(a)
del a[:]
print(a)
[1, 3, False, -2.3, 'XYZ', 9.3]
[]

Do poczytania

list.append(x) - dodaje element na końcu listy. Równoważnie a[len(a):] = [x]

a = [1, 3, 'abc', False]
a.append(5.3)
print(a)
[1, 3, 'abc', False, 5.3]

list.extend(iterable) - dodaje elementy z argumenty na koniec listy. Równoważnie: a[len(a):] = iterable

a = [1, 3, 'abc', False]
b = [3, -2]
a.extend(b)
print(a)
[1, 3, 'abc', False, 3, -2]

Różnice?

a = [1, 3, 'abc', False]
b = [3, -2]
a.append(b)
print(a)
[1, 3, 'abc', False, [3, -2]]

list.insert(i, x) - wstawia element x na pozycji i

a = [1, 3, 'abc', False]
a.insert(0,'w')
print(a)
a.insert(4,9.0)
print(a)
['w', 1, 3, 'abc', False]
['w', 1, 3, 'abc', 9.0, False]

list.remove(x) - usuwa element z listy (pierwszy od początku)

a = [1, 3, 'abc', False]
a.remove(False)
print(a)
b = [3, 4, 5, 3]
b.remove(3)
print(b)
[1, 3, 'abc']
[4, 5, 3]

list.pop() - usuwa i zwraca ostatni element

list.pop(i) - usuwa i zwraca element na pozycji i

a = [1, 3, 'abc', False]
print(a.pop())
print(a)
b = [3, -4, 6.2, 7]
print(b.pop(3))
print(b)
False
[1, 3, 'abc']
7
[3, -4, 6.2]

list.clear() - usuwa wszystkie elementy z listy. Równoważnie: del a[:]

a = [1, 3, 'abc', False]
a.clear()
print(a)
[]

list.index(x) - zwraca indeks elementu x (o ile istnieje, inaczej błąd), w przypadku duplikatów pierwszy z lewej list.index(x,start) - zwraca indeks elementu x (o ile istnieje, inaczej błąd) zaczynając od pozycji start, w przypadku duplikatów pierwszy z lewej list.index(x,start,end) - zwraca indeks elementu x (o ile istnieje, inaczej błąd) zaczynając od pozycji start a kończąc na end-1, w przypadku duplikatów pierwszy z lewej

a = [1, 3, 1, 4, 5, 2, 3]
print(a.index(3))
print(a.index(3, 5))
print(a.index(3, 1, 4))
1
6
1
a = ['abc','xyz','abc','efg']
print(a.index('abc'))
print(a.index('abc', 2))
print(a.index('abc', 1, 4))
0
2
2

list.count(x) - zwraca ile razy występuję element x na liście

a = ['abc','xyz','abc','efg']
print(a.count('abc'))
print(a.count(4))
2
0

list.sort() - sortuje listę (o ile elementy można posortować)

a = ['abc','xyz','abc','efg']
a.sort()
print(a)
['abc', 'abc', 'efg', 'xyz']

list.reverse() - odwraca kolejność elementów na liście (nie ma nic związku z sortowaniem!)

a = [4, 5, -2, 7.3, 9, -22, 23]
a.reverse()
print(a)
[23, -22, 9, 7.3, -2, 5, 4]

list.copy() - tworzy kopię listy

Spójrzmy na przykład jak działa operator przypisania dla list.

a = [4, 5, -2, 7.3, 9, -22, 23]
b = a
b[2] = 100
print(b)
print(a)
[4, 5, 100, 7.3, 9, -22, 23]
[4, 5, 100, 7.3, 9, -22, 23]

Różnica z użyciem copy.

a = [4, 5, -2, 7.3, 9, -22, 23]
b = a.copy()
b[2] = 100
print(b)
print(a)
[4, 5, 100, 7.3, 9, -22, 23]
[4, 5, -2, 7.3, 9, -22, 23]

Lista jako stos

stack = [3, 4, 5, 8, 9]
stack.append(6)
stack.append(7)
print(stack)
print(stack.pop())
print(stack)
[3, 4, 5, 8, 9, 6, 7]
7
[3, 4, 5, 8, 9, 6]

Lista jako kolejka

from collections import deque

queue = deque(["aw", "tg", "kj"])
queue.append("gg")
print(queue)
print(queue.popleft())
print(queue)
deque(['aw', 'tg', 'kj', 'gg'])
aw
deque(['tg', 'kj', 'gg'])

List Comprehensions

squares = []
for x in range(5):
    squares.append(x ** 2)

print(squares)
[0, 1, 4, 9, 16]
squares = [x**2 for x in range(5)]
print(squares)
[0, 1, 4, 9, 16]

Krotka - tuple

krotka = 123, 'abc', True
krotka2 = (123, 'abc', True)
print(krotka[2])
True
krotka[0] = 1

TypeError: ‘tuple’ object does not support item assignment

https://docs.python.org/3.10/library/stdtypes.html#tuple

Zbiór - set

cyfry = {'raz', 'dwa', 'raz', 'trzy', 'raz', 'osiem'}
print(cyfry)
{'osiem', 'dwa', 'raz', 'trzy'}

https://docs.python.org/3.10/library/stdtypes.html#set

x = {2, 3, 4, -3, 5, 2}
y = {5, 6, 7}
z = {'a', 'b'}
w = {3, 4}
print(x)
print(len(x))
print(0 in x)
print(0 not in x)
{2, 3, 4, 5, -3}
5
False
True
x = {2, 3, 4, -3, 5, 2}
y = {5, 6, 7}
z = {'a', 'b'}
w = {3, 4}
print(x.isdisjoint(y))
print(x.isdisjoint(z))
print(w.issubset(x))
print(x.issubset(w))
print(w <= x)
print(w < x)
print(w.issuperset(x))
print(x.issuperset(w))
print(w >= x)
print(w > x)
False
True
True
False
True
True
False
True
False
False
x = {2, 3, 4, -3, 5, 2}
y = {5, 6, 7}
z = {'a', 'b'}
w = {3, 4}
print(x.union(y))
print(x | y)
print(x.intersection(y))
print(x & y)
print(x.difference(y))
print(x - y)
print(x.symmetric_difference(y))
print(x ^ y)
print(x.copy())  # płytka kopia
{2, 3, 4, 5, 6, 7, -3}
{2, 3, 4, 5, 6, 7, -3}
{5}
{5}
{2, 3, 4, -3}
{2, 3, 4, -3}
{2, 3, 4, 6, 7, -3}
{2, 3, 4, 6, 7, -3}
{2, 3, 4, 5, -3}

x = {2, 3, 4, -3, 5, 2}
x.update({11})
print(x)
x |= {12}
print(x)
x = {2, 3, 4, -3, 5, 2}
x.intersection_update({5})
print(x)
x = {2, 3, 4, -3, 5, 2}
x &= {5}
print(x)
x = {2, 3, 4, -3, 5, 2}
{2, 3, 4, 5, 11, -3}
{2, 3, 4, 5, 11, 12, -3}
{5}
{5}

x = {2, 3, 4, -3, 5, 2}
x.difference_update({4})
print(x)
x = {2, 3, 4, -3, 5, 2}
x -= {4}
print(x)
x = {2, 3, 4, -3, 5, 2}
x.symmetric_difference_update({4, 11})
print(x)
x = {2, 3, 4, -3, 5, 2}
x ^= {4, 11}
print(x)
{2, 3, 5, -3}
{2, 3, 5, -3}
{2, 3, 5, 11, -3}
{2, 3, 5, 11, -3}
x = {2, 3, 4, -3, 5, 2}
print(x)
x.add(11)
print(x)
x.remove(-3)  # usuwa gdy jest, inaczej KeyError
print(x)
x.discard(12)
print(x)
{2, 3, 4, 5, -3}
{2, 3, 4, 5, 11, -3}
{2, 3, 4, 5, 11}
{2, 3, 4, 5, 11}
x = {2, 3, 4, -3, 5, 2}
print(x)
x.discard(2)
print(x)
x = {2, 3, 4, -3, 5, 2}
print(x.pop())
print(x)
x.clear()
print(x)
{2, 3, 4, 5, -3}
{3, 4, 5, -3}
2
{3, 4, 5, -3}
set()

Słownik

tel = {'jack': 4098, 'sape': 4139}
tel['guido'] = 4127
print(tel)
tel['jack']
del tel['sape']
tel['irv'] = 4127
print(tel)
{'jack': 4098, 'sape': 4139, 'guido': 4127}
{'jack': 4098, 'guido': 4127, 'irv': 4127}

https://docs.python.org/3.10/library/stdtypes.html#mapping-types-dict

Słownik a typowanie

x: dict[str, float] = {"field": 2.0}

po staremu:

from typing import Dict

x: Dict[str, float] = {"field": 2.0}
d = {"one": 1, "two": 2, "three": 3, "four": 4}
print(d)
print(list(d))
print(list(d.values()))
d["one"] = 42
print(d)
del d["two"]
print(d)
d["two"] = None
print(d)
{'one': 1, 'two': 2, 'three': 3, 'four': 4}
['one', 'two', 'three', 'four']
[1, 2, 3, 4]
{'one': 42, 'two': 2, 'three': 3, 'four': 4}
{'one': 42, 'three': 3, 'four': 4}
{'one': 42, 'three': 3, 'four': 4, 'two': None}
d = {"one": 1, "two": 2, "three": 3, "four": 4}
print(d)
print(list(reversed(d)))
print(list(reversed(d.values())))
print(list(reversed(d.items())))
{'one': 1, 'two': 2, 'three': 3, 'four': 4}
['four', 'three', 'two', 'one']
[4, 3, 2, 1]
[('four', 4), ('three', 3), ('two', 2), ('one', 1)]
d = {"one": 1, "two": 2, "three": 3, "four": 4}
print("one" in d)
print(1 in d)
print("one" not in d)
print(1 not in d)
print(iter(d))
for elem in iter(d):
    print(elem)
True
False
False
True
<dict_keyiterator object at 0x0000029EC4FAFB50>
one
two
three
four
d = {"one": 1, "two": 2, "three": 3, "four": 4}
d.clear()
print(d)
d = {"one": 1, "two": 2, "three": 3, "four": 4}
e = d.copy() # płyta kopia
print(e)
{}
{'one': 1, 'two': 2, 'three': 3, 'four': 4}
x = ('key1', 'key2', 'key3')
y = 0
d1 = dict.fromkeys(x, y)
print(d1)
z = (3, 4, 5)
d2 = dict.fromkeys(x, z)
print(d2)
{'key1': 0, 'key2': 0, 'key3': 0}
{'key1': (3, 4, 5), 'key2': (3, 4, 5), 'key3': (3, 4, 5)}
d = {"one": 1, "two": 2, "three": 3, "four": 4}
print(d.get("two"))
print(d.items())
print(d.keys())
print(d.pop("three"))
print(d)
print(d.popitem())
print(d)
2
dict_items([('one', 1), ('two', 2), ('three', 3), ('four', 4)])
dict_keys(['one', 'two', 'three', 'four'])
3
{'one': 1, 'two': 2, 'four': 4}
('four', 4)
{'one': 1, 'two': 2}
d = {"one": 1, "two": 2, "three": 3, "four": 4}
d.update(red=1, blue=2)
print(d)
print(d.values())
{'one': 1, 'two': 2, 'three': 3, 'four': 4, 'red': 1, 'blue': 2}
dict_values([1, 2, 3, 4, 1, 2])
d = {"one": 1, "two": 2, "three": 3, "four": 4}
d2 = {"a": 11, "b": 12}
d3 = d | d2
print(d3)
print(d)
d |= d2
print(d)
{'one': 1, 'two': 2, 'three': 3, 'four': 4, 'a': 11, 'b': 12}
{'one': 1, 'two': 2, 'three': 3, 'four': 4}
{'one': 1, 'two': 2, 'three': 3, 'four': 4, 'a': 11, 'b': 12}

Python comprehension

a = [3, 4, 5]
print(a)
a2 = [i**2 for i in a]
print(a2)
a3 = {i**2 for i in a}
print(a3)
a4 = {i: i**2 for i in a}
print(a4)
[3, 4, 5]
[9, 16, 25]
{16, 9, 25}
{3: 9, 4: 16, 5: 25}
a = [3, 4, 5]
print(a)
a2 = (i**2 for i in a)
print(a2)
for i in a2:
    print(i)
[3, 4, 5]
<generator object <genexpr> at 0x0000029EC4FB2880>
9
16
25
a = [3, 4, "w", 5]
print(a)
w = [i*i for i in a if isinstance(i, int)]
print(w)
[3, 4, 'w', 5]
[9, 16, 25]
a = [3, 4, "w", 5]
print(a)
w = [i*i if isinstance(i, int) else i for i in a]
print(w)
[3, 4, 'w', 5]
[9, 16, 'w', 25]

Napisy

  • trochę podobne do listy
  • typ sekwencyjny do przechowywania znaków, ale w odróżnieniu od listy jest niezmienny
  • w języku Python nie ma oddzielnego typu znakowego
  • apostrofy i cudzysłów można stosować zamiennie, ale konsekwentnie

Inne nazwy: - string, napisy, łańcuchy znaków

Abstrakcyjnie:

  • na końcu każdego napisu jest znak “zerowy” - będzie widać lepiej w C/C++

Tablica znaków ASCII https://upload.wikimedia.org/wikipedia/commons/5/5c/ASCII-Table-wide.pdf

a = "Olsztyn"
print(a)
print(a[3])
#a[2] = 'w'
Olsztyn
z
a = "Olsztyn"
b = "Gdańsk"
print(a + b)
print(a * 2)
print(2 * a)
OlsztynGdańsk
OlsztynOlsztyn
OlsztynOlsztyn

Specjalne funkcje

  • chr() zamienia liczbę całkowitą na znak
  • ord() zamienia znak na liczbę całkowitą odpowiadającą pozycji w tabeli znaków
  • len() - długość napisu
  • str() - rzutuje argument na napis

Porządek leksykograficzny

Mądra definicja z wikipedii:

Relację leksykograficzną \(\preccurlyeq\) między ciągami \(\alpha, \beta \in X^*\) ustala się następująco:

  • jeśli istnieje wskaźnik \(j\) taki, że \(\alpha(j) \neq \beta(j),\) to znajdujemy najmniejszy \(i\) o tej własności. Wówczas

    • \(\alpha \preccurlyeq \beta\) gdy \(\alpha(i) \preccurlyeq \beta(i)\) lub \(\beta \preccurlyeq \alpha\) gdy \(\beta(i) \preccurlyeq \alpha(i)\) (tzn. relacja między ciągami jest zgodna z relacją między odpowiednimi elementami)
  • jeśli taki \(j\) nie istnieje, to

    • jeśli oba są skończone i tej samej długości, to \(\alpha = \beta\)
    • jeśli oba ciągi są nieskończone, to \(\alpha = \beta\)
    • jeśli są różnej długość np. \(\beta\) jest dłuższy od \(\alpha\) (w szczególności \(\beta\) może być nieskończony), to \(\alpha\ \preccurlyeq\ \beta\)

Przykłady:

print("A" < "a")
print("Abc" < "aTw")
print("vccx" < "123")
print("ABC" < "AB")
print("AB" < "ABC")
True
True
False
False
True

Fomatowanie napisów

  • trzy różne konwencje
  • niektóre rzeczy nie działają w każdej wersji 3.x
  • warto zastanowić się czy warto używać tych konstrukcji? czasem może lepiej skorzystać z funkcji print?

styl printf

Zaczerpnięty z języka C - stare.

https://docs.python.org/3.10/library/stdtypes.html#old-string-formatting

a = "abc"
str = "a to %s" % a
print(str)
b = 4
c = 5
str2 = "%d + %d = %d" % (b, c, b + c)
print(str2)
a to abc
4 + 5 = 9

Dodatkowe:

https://gist.github.com/pjastr/02d01dba3d5f5c3e60ed74cb32c913ed https://gist.github.com/pjastr/cbe8418eb4798b92d7fcba4f48d32845 https://gist.github.com/pjastr/e7d5fcbebd578c1df122d307e0051707 https://gist.github.com/pjastr/00c1df223918f975d678d8455b4f5b0a

styl format

https://docs.python.org/3.10/library/string.html#formatstrings

a = "abc"
str = "a to {}".format(a)
print(str)
b = 4.2
c = 5
str2 = "{0} + {1} = {2}".format(b, c, b + c)
print(str2)
a to abc

4.2 + 5 = 9.2
b = 4.2
c = 5
str2 = "{0:f} + {1:d} = {2:e}".format(b, c, b + c)
print(str2)
4.200000 + 5 = 9.200000e+00

https://pyformat.info/

https://gist.github.com/pjastr/27fe6c13cd8bcba63be561a05af030a0

https://gist.github.com/pjastr/d40fe6eaf21a9595bcf6b43e7b020fbd

https://gist.github.com/pjastr/8a630b4a575e6a389a7dc3c5e8dc65a0

https://gist.github.com/pjastr/d42d937c7b00b80b5dfe309b4ac0e854

https://gist.github.com/pjastr/dbc9a0c1e8bf612b68e0bc7789daf53b

https://gist.github.com/pjastr/adfd7371dcbe4e4034bfb12dcfe30129

https://gist.github.com/pjastr/2980fb68a484dcb5ff595774eec4195c

Dodatkowe przykłady:

https://docs.python.org/3.9/library/string.html#format-examples https://gist.github.com/pjastr/d42d937c7b00b80b5dfe309b4ac0e854 https://gist.github.com/pjastr/90f1accf7f54d8c74ac036d59a24a9dd https://gist.github.com/pjastr/adfd7371dcbe4e4034bfb12dcfe30129 https://gist.github.com/pjastr/2980fb68a484dcb5ff595774eec4195c

f-Strings

https://docs.python.org/3.10/reference/lexical_analysis.html#f-strings

a = "abc"
str = f"a to {a}"
print(str)
b = 4.2
c = 5
str2 = f"{b} + {c} = {b+c}"
print(str2)
a to abc
4.2 + 5 = 9.2
b = 4.2
c = 5
str2 = f"{b:f} + {c:d} = {b+c:e}"
print(str2)
4.200000 + 5 = 9.200000e+00

Dodatkowe

Funkcje

Funkcje

def functionname( parameters ):
   "function_docstring"
   function_suite
   return [expression]
def printme(str):
    """Funkcja wyświetlająca string"""
    print(str)
    return


printme("abc")
print(printme.__doc__)
abc
Funkcja wyświetlająca string

Przekazywanie przez referencję

def changeme(lista):
    print("Przed zmianą: ", lista)
    lista[2] = 50
    print("Po zmianie: ", lista)
    return


mylist = [10, 20, 30]
changeme(mylist)
print("Poza funkcją: ", mylist)
Przed zmianą:  [10, 20, 30]
Po zmianie:  [10, 20, 50]
Poza funkcją:  [10, 20, 50]
def changeme(lista):
    lista = [2, 3, 4]
    print("Wewnątrz funkcji: ", lista)
    return


lista = [10, 20, 30]
changeme(lista)
print("Poza funkcją: ", lista)
Wewnątrz funkcji:  [2, 3, 4]
Poza funkcją:  [10, 20, 30]
def changeme():
    global lista
    lista = [2, 3, 4]
    print("Wewnątrz funkcji: ", lista)
    return


changeme()
print("Poza funkcją: ", lista)
Wewnątrz funkcji:  [2, 3, 4]
Poza funkcją:  [2, 3, 4]

Obowiązkowy argument (ang. positional argument)

def printme(str):
    print(str)
    return


printme()
## TypeError: printme() missing 1 required 
positional argument: 'str'

Keyword argument

def kwadrat(a):
    return a*a


print(kwadrat(a=4))
16

Domyślny argument

def sumsub(a, b, c=0, d=0):
    return a - b + c - d


print(sumsub(12, 4))
print(sumsub(3, 4, 5, 7))
8
-3
def srednia(first, *values):
    return (first + sum(values)) / (1 + len(values))


print(srednia(2, 3, 4, 6))
print(srednia(45))
3.75
45.0
def f(**kwargs):
    print(kwargs)


f()
f(pl="Polish", en="English")
{}
{'pl': 'Polish', 'en': 'English'}

Inne symbole

  • symbol / oznacza, że wcześniejsze argumenty są pozycyjne
  • symbol * oznacza, że późniejszej argumenty są typu keyword
def f(a, b, /, c, d, *, e, f):
    print(a, b, c, d, e, f)


f(10, 20, 30, d=40, e=50, f=60)
10 20 30 40 50 60

Funkcje matematyczne

Link do dokumentacji https://docs.python.org/3/library/math.html

import math

a=0
b=math.sin(2*math.pi)
print(b)
print(math.isclose(a,b, rel_tol=1e-09, abs_tol=1e-09))
-2.4492935982947064e-16
True

Wyrażenia lambda

Skąd nazwa? https://pl.wikipedia.org/wiki/Rachunek_lambda

Wyrażenie

def identity(x):
    return x

zapisujemy jako

lambda x: x

Jeśli uruchomimy to w konsoli, to możemy wywołać

_(5)

To tzw. przykład funkcji anonimowej.

By uruchomić to też w skrypcie, to potrzebujemy argumentu:

print((lambda x: x + 1)(2))

lub

add_one = lambda x: x + 1
print(add_one(2))

Możemy też tworzyć złożenia funkcji (funkcje wyższych rzędów):

high_ord_func = lambda x, func: x + func(x)
print(high_ord_func(2, lambda x: x * x))
print(high_ord_func(2, lambda x: x + 3))
6
7

Możemy również skorzystać z różnych opcji argumentów jak dla funkcji:

print((lambda x, y, z: x + y + z)(1, 2, 3))
print((lambda x, y, z=3: x + y + z)(1, 2))
print((lambda x, y, z=3: x + y + z)(1, y=2))
print((lambda *args: sum(args))(1,2,3))
print((lambda **kwargs: sum(kwargs.values()))(one=1, two=2, three=3))
print((lambda x, *, y=0, z=0: x + y + z)(1, y=2, z=3))
6
6
6
6
6
6

Typ

string = 'abc'
print(lambda string: string)
<function <lambda> at 0x0000029EC4F6A440>

Różnice względem zwykłej funkcji:

def cube(y):
    print(f"Finding cube of number:{y}")
    return y * y * y
  
lambda_cube = lambda num: num ** 3
print("invoking function defined with def keyword:")
print(cube(30))
print("invoking lambda function:", lambda_cube(30))
invoking function defined with def keyword:
Finding cube of number:30
27000
invoking lambda function: 27000

Przykłady praktyczne

r = lambda a: a + 15
print(r(10))
r = lambda x, y: x * y
print(r(12, 4))
25
48
subject_marks = [('English', 88), ('Science', 90), ('Maths', 97), ('Social sciences', 82)]
print("Original list of tuples:")
print(subject_marks)
subject_marks.sort(key=lambda x: x[1])
print("\nSorting the List of Tuples:")
print(subject_marks)
Original list of tuples:
[('English', 88), ('Science', 90), ('Maths', 97), ('Social sciences', 82)]

Sorting the List of Tuples:
[('Social sciences', 82), ('English', 88), ('Science', 90), ('Maths', 97)]
nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print("Original list of integers:")
print(nums)
print("\nEven numbers from the said list:")
even_nums = list(filter(lambda x: x % 2 == 0, nums))
print(even_nums)
print("\nOdd numbers from the said list:")
odd_nums = list(filter(lambda x: x % 2 != 0, nums))
print(odd_nums)
Original list of integers:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Even numbers from the said list:
[2, 4, 6, 8, 10]

Odd numbers from the said list:
[1, 3, 5, 7, 9]
array_nums1 = [1, 2, 3, 5, 7, 8, 9, 10]
array_nums2 = [1, 2, 4, 8, 9]
print("Original arrays:")
print(array_nums1)
print(array_nums2)
result = list(filter(lambda x: x in array_nums1, array_nums2))
print("\nIntersection of the said arrays: ", result)
Original arrays:
[1, 2, 3, 5, 7, 8, 9, 10]
[1, 2, 4, 8, 9]

Intersection of the said arrays:  [1, 2, 8, 9]

“Obiektowość”

Programowanie obiektowe w Pythonie

Lego jako model programowanie obiektowego

class Employee:
    """Common base class for all employees"""
    empCount = 0

    def __init__(self, name, salary):
        self.name = name
        self.salary = salary
        Employee.empCount += 1

    def displayCount(self):
        print("Total Employee %d" % Employee.empCount)

    def displayEmployee(self):
        print("Name : ", self.name, ", Salary: ",
              self.salary)


emp1 = Employee("John", 2000)
emp2 = Employee("Anna", 5000)
emp1.displayEmployee()
emp2.displayEmployee()
Name :  John , Salary:  2000
Name :  Anna , Salary:  5000

Bibliografia

Bibliografia

Bibliografia - cd2

Bibliografia - cd3