Python nauka

Wstęp

Naukę warto rozpocząć zapoznania się z podstawową składnią języka Python.
Składnia jest bardzo fajnie wytłumaczona na stronie w3schools.com.

Strona jest po angielsku, ale jest napisana bardzo prostym językiem. Jeżeli chcesz programować to musisz zaczać przyzwyczajać się do języka angielskiego.
Odpowiedzi na wiele probemów nie znajdziesz po polsku. W języku angielskim znajdziesz odpowiedź na kazde pytanie 😉

Następny krok to zrobienie prostych zadań z Python. Znajdziesz je na w3resource.com.
Zadania ze strony w3resource mają też klucz odpowiedzi, więc jeżeli nie bedziesz wiedział jak coś zrobić, to możesz podejżeć odpowiedź.

Kolejny krok to robienie prawdziwych zadań z Polskiego SPOJ’a.
Zrób ich około 50. Wtedy zrozumiesz jak są pisane tego typu zadania i jak się je rozwiązuje. Język polski ułatwi Ci zrozumienie treści zadań.

Zapraszam też na super stronę do nauki programowania HeckerRank. Jest ona po angielsku ale możesz na niej zaczynać od prostrzych zagadnień.

Kolejny krok to przerzucenie się na na SPOJ’a anglojęzycznego. Rozwiązując zadania na SPOJ’u międzynarodowym będziesz podnosić swój ranking. Będziesz mógł zobaczyć jak jesteś dobry w stosunku do programistów z całego świata.
Twoje zadanie to wykonanie 100 zadań. Staraj się rozwiązywać zadania coraz trudniejsze.

Następny krok to stworzenie swojej własnej aplikacji w Python. Możesz spróbować zrobic to samodzielnie w oparciu o tutoriale na Youtube i książki.

Przy pisaniu aplikacji będziesz potrzebował GIT

Linki do nauki GIT:
Guthub dla zielonych
Git dla początkujących

Prowadzenie zajęć z programowania lub organizacja konkursów

Jeżeli chcesz prowadzić zajęcia z programowania to istnieje do tego super platforma education.sphere-engine.com. Platforma ta korzysta z tysięcy zadań SPOJ i obsługuje automatyczne ocenianie studentów.

Poniżej przedstawiam informacje pomocne w nauce Python, zarówno przy rozwiązywaniu zadań na SPOJ jak i tworzeniu własnej aplikacji.

Uruchomienie programu w konsoli Windows

python run.py

Kompilator online Python 3.5

Colaboratory

PyCharm – najlepsze środowisko do pisania w Python

Pobierz PyCharm

Instalacja PyGame na Windows

PyGame służy do tworzenia gier w Python’ie. Proces instalacji jest dobrze wytłumaczony w filmie.

Instalacja Django

Django służy do tworzenia webowych aplikacji.

Jak zainstalować Django.

Kivy – instalacja na Windows 10

Jest to biblioteka służąca do tworzenia aplikacji mobilnych na IOS i Androida w Python.
Kivy działa we wspłópracy z Pycharm
Miałem potężne problemy z instalacją kivy na Windows 10.
Rozwiązanie okazało się następujące.
W konsoli Windows należy zrobić:

Krok 1
Upewnij się, że masz najnowszą wersję pip i koła:

python -m pip install --upgrade pip wheel setuptools

Krok 2 sposób 1
Zainstaluj zależności (pomiń gstreamer (~ 120 MB), jeśli nie jest to konieczne, zobacz zależności Kivy):

python -m pip install docutils pygments pypiwin32 kivy.deps.sdl2 kivy.deps.glew

python -m pip install kivy.deps.gstreamer

Uwaga, jeśli napotkasz błąd MemoryError podczas instalacji, dodaj po instalacji pip opcję

–no-cache-dir

Krok 2 sposób 2 (jeżeli nie zadziała sposób 1)
W Pythonie 3.5+ możesz także użyć backendu kątowego zamiast dmuchać. To może być zainstalowane z:

python -m pip install kivy.deps.angle

Krok 3
Zainstaluj kivy:

python -m pip install kivy

Krok 4 (opcjonalniy)
Zainstaluj przykłady kivy:

python -m pip install kivy_examples

Przykłady są instalowane w katalogu udziału w katalogu głównym, w którym zainstalowany jest python.

Trzy sposoby łaczenia stringa ze zmiennymi

imie = "Konrad"
wiek = 20
print("Cześć",imie,". Ty masz",wiek,"lat." )
print("Cześć %s. Ty masz %d lat." % (imie, wiek))
print("Cześć {}. Ty masz {} lat.".format(imie, wiek))

Zmiana koloru czcionki

print("\u001b[32mHello World")
print("\u001b[31mHello Poland")

Kody kolorów tekstu:
Bright Black: \u001b[30;1m
Bright Red: \u001b[31;1m
Bright Green: \u001b[32;1m
Bright Yellow: \u001b[33;1m
Bright Blue: \u001b[34;1m
Bright Magenta: \u001b[35;1m
Bright Cyan: \u001b[36;1m
Bright White: \u001b[37;1m

Reset: \u001b[0m

Kody kolorów tła:
Background Black: \u001b[40m
Background Red: \u001b[41m
Background Green: \u001b[42m
Background Yellow: \u001b[43m
Background Blue: \u001b[44m
Background Magenta: \u001b[45m
Background Cyan: \u001b[46m
Background White: \u001b[47m

Reset: \u001b[0m

Zmiana koloru całego okna konsoli:

import os
os.system('color 1f') # ustawia tło na niebieski kolor

Zmiana czcionki

import os
os.console.font = 'Lucida Console'

Zmiana tytułu aplikacji

from os import system
system("title "+myCoolTitle)

Zatrzymanie działania programu na jakiś czas

Program wypisuje # co jedną pół sekundy.

for i in range(20):
    print("#", end="")
    time.sleep(0.5)

Czyszczenie ekranu – konsoli

W PyCharm to nie widać efektu ale jak uruchomicie program poza PyCharm, to wszystko będzie dobrze działało.

import os
import time
for x in range(10):
    print(x)
    time.sleep(1)
    os.system('cls')

Inna metoda

import os
clear = lambda: os.system("cls")
clear()

Operacje bitowe w Python

Bitwise AND

a & b b=0 b=1
a=0 0 0
a=1 0 1

Bitwise OR

a | b b=0 b=1
a=0 0 1
a=1 1 1

Bitwise XOR

a ^ b b=0 b=1
a=0 0 1
a=1 1 0

Przesunięcie bitowe w lewo i prawo

# wpisując 0b definiujemy liczbę binarną
z = 0b101111
print(bin(z << 1))
print(bin(z >> 1))

Efekt działania programu:

z = 0b101111
print(bin(z << 1))
print(bin(z >> 1))

Odczytanie zawartosci pliku

plik1 = open('tekst.txt').read()
print(plik1)

Zapis do pliku

Usuwa on wszystko co było wcześniej w pliku

plik = open('tekst.txt', 'w')
plik.write("Nowa treść")
plik.close()

Nadpisanie pliku do nowej linii

plik1 = open('tekst.txt').read()
print(plik1)

plik = open('tekst.txt', 'w')
plik.write(plik1 + "\nTreść w nowej linii")
plik.close()

Tworzenie nowego pliku

f = open("nazwa.txt","w+")

Pobieranie nazw wszystkich plików z folderu

import os

path = 'c:\\projects\\hc2\\'

files = []
# r=root, d=directories, f = files
for r, d, f in os.walk(path):
    for file in f:
        if '.txt' in file:
            files.append(os.path.join(r, file))

for f in files:
    print(f)

Więcej informacji jest pod tym linkiem: mkyong.com

Jak wczytać dwa znaki w jednej linii oddzielone spacją

a, b = input().split()

Jak wyświetlić nr ASCII znaku char

print (ord('a'))

Jak wyświetlić znak po nr ASCII

print (chr(97))

Tabela kodów ASCII

Link do tabeli ASCII

Odtwarznie muzyki w Pycharm

time.sleep() jest nam potrzebny by słychać było muzykę. Pycharm będzie odtwarzać muzykę tyle czasu ile sekund wpiszesz do nawiasu.
sound_file.stop() możesz użyć do nagłego przerwania odtwarzania.

Jak zaimportować vlc?
File -> Settings -> kliknij na nazwę projektu -> Project interpreter -> kliknij na + z prawej strony ->wyszuka python-vlc

Utwór nr 1 do pobrania
Utwór nr 2 do pobrania

import vlc
import time

sound_file = vlc.MediaPlayer("mv.mp3")
sound_file.play()
time.sleep(200)
#sound_file.stop()

Pauzowanie utwory

sound_file.pause()
time.sleep(2)
sound_file.play()

Sprawdzenie długości utworu mp3

from mutagen.mp3 import MP3
audio = MP3("example.mp3")
print(audio.info.length)

Obliczenia statystyczne w Python – numpy

Do obliczeń statystycznych w Python’ie używa się biblioteki – numpy
Aby zainstalować tę bibliotekę w PyCharm kliknij: File -> Settings -> Project: nazwa_projektu -> Project Interpreter
Następnie kliknij w plusik po prawej stronie. Wpisz: numpy i kliknij na dole: Install Package
Następnie możesz zamknąć te okno i w oknie Settings kliknij ok.

Średnia arytmetyczna, mediana, percentyl w numpy

import numpy as np
lista = [1, 2, 3, 4]
#średnia arytmetyczna
print(np.mean(lista))
#mediana
print(np.median(lista))
#percentyl - poniżej 15sty percentyl
print(np.percentile(lista, 15))

Łączenie Pytona z MySQL

#aby można było się połączyc z bazą danych mysql należy zaimportować
#file -> Settings-> Nazwa projektu -> Project Interpreter -> kliknij plus ->mysql-connector

import mysql.connector

#dla łączenia się z db4free.net robimy tak jak u dołu, user i password wpisujesz własne
mydb = mysql.connector.connect(
    host="db4free.net",
    user="wlasny",
    password="wlasne"
)

#https://www.youtube.com/watch?v=-YU36D7oTLA
mycursor = mydb.cursor()
mycursor.execute("SHOW DATABASES")

for db in mycursor:
    print(db)

Dodanie tabeli do bazy danych i wyświetlenie wszystkich tabel w bazie danych

Poniżej password wpisałem database. Tabela musi powstać w konkretnej bazie danych.

import mysql.connector

mydb = mysql.connector.connect(
    host="db4free.net",
    user="wlasny",
    password="wlasne",
    database="wlasna_nazwa"
)

mycursor = mydb.cursor()
mycursor.execute("CREATE TABLE imiona(imie VARCHAR(200) NOT NULL)")
mycursor.execute("SHOW TABLES")

for db in mycursor:
    print(db)

Pobieranie danych historycznych z giełdy Binance

#biblioteka potrzbna do pobierania json
import json
# biblioteka potrzbna do dobrego ułożenia danych pobranych
# z json w zmiennej data
import requests
#link do pobierania danych historycznych z binance
root_url = 'https://api.binance.com/api/v1/klines'
# para walutowa jakiej dane chcemy pobrać
symbol = 'STEEMETH'
# interwał jaki chcemy pobrać
interval = '1h'
# łączymy link, parę walutową i interwał w jedno
url = root_url + '?symbol=' + symbol + '&interval=' + interval
# wstawiamy do zmiennej data wartości
data = json.loads(requests.get(url).text)
# wypisanie na ekranie wartości
for el in data:
    print(el)

Tworzenie pliku CSV przy pomocy Python i zapis jednej linii

import csv

with open('mycsv.csv', 'w', newline='') as f:
    thewriter = csv.writer(f)

    thewriter.writerow(['col1', 'col2', 'col3'])

Progam pobierający historyczne kursy jednominutowe BTC do Tethera z giełdy Binance

#biblioteka potrzbna do pobierania json
import json
# biblioteka potrzbna do dobrego ułożenia danych pobranych
# z json w zmiennej data
import requests
import csv
#link do pobierania danych historycznych z binance
root_url = 'https://api.binance.com/api/v1/klines'
# para walutowa jakiej dane chcemy pobrać
symbol = 'BTCUSDT'
# interwał jaki chcemy pobrać
interval = '1m'
# łączymy link, parę walutową i interwał w jedno
url = root_url + '?symbol=' + symbol + '&interval=' + interval
# wstawiamy do zmiennej data wartości
data = json.loads(requests.get(url).text)
# zapisanie wartości do pliku CSV
with open('BTCUSDT.csv', 'w', newline='') as f:
    thewriter = csv.writer(f)
    for el in data:
        thewriter.writerow(el)

Jak nie przechodzić do następnej lini po wpisaniu komendy print?

W Python 3.7.3 należy zrobić to ta:

print("Tu jest jakiś tekst", end="")

Wariacja i kombinacja

Ten temat jest dobrze wytłumaczony na stronie geeksforgeeks.

Tablica dwuwymiarowa w Python

Do tego celu używamy listy w Python.

# ilość wierszy
m = 4
# ilość kolumn
n = 5
# stworzenie tablicy o wskazanych wymiarach i
# uzupełnienie jej zerami
a = [[0 for x in range(n)] for x in range(m)]
# zmiana warości pierwszego elementu
a[0][0] = 3
# wypisanie wszystkich wartości tablicy
for x in a:
    print(x)

Dzielenie

Jeżeli chcesz uzyskać wynik typu float dziel używając: /
Jeżeli chcesz uzyskać wynik całkowity to dziel używając //

Usunięcie spacji z lewej strony z wczytywanej wartości

a = input("Jak masz na imię?")
print("Cześć", a.lstrip())

Wczytanie wartości integer z jednej linii, liczby odzielone są spacjami

Jest to rozwiązanie zapożyczone z HackerRank. Jego zaletą jest to że jest bardzo krótkie. Zajmuję jedną linijkę kodu.

arr = list(map(int, input().split()))

Pętla for z dwoma zmiennymi

array = list("abcdef")
for index, letter in enumerate(array):
    print("%d %s" % (index, letter))

Wynikiem działania tego programu jest:

0 a
1 b
2 c
3 d
4 e
5 f

%d – oznacza wartość decymalną
%s – oznacza zmienną tekstową

Zamiana stringu na listę – rozbicie na poszczególne znaki

Najprostsza metota:

s = "alama"
s1 = list(s)

Alternatywna metoda:

s1 ="ala"
s1t = [char for char in s1]
print(s1t)

Efekt:

['a', 'l', 'a']

Usunięcie duplikatów z listy

lista = [1,1,1,2,2,2,3,3,4]
lista = list(set(lista))
print(lista)

Efekt działania programu:

[1, 2, 3, 4]

Usunięcie duplikatów ze stringa

Najpierw zamień stringa na listę.

mylist = ["a", "b", "a", "c", "c"]
mylist = list(dict.fromkeys(mylist))

Teraz z listy utwórz stringa.

Co ma klasyczny szblon kodu Python na HackerRank ?

import math
import os
import random
import re
import sys


def sockMerchant(n, ar):
# Tu znajduje się jakaś treść funkcji.

if __name__ == '__main__':
    fptr = open(os.environ['OUTPUT_PATH'], 'w')

    n = int(input())

    ar = list(map(int, input().rstrip().split()))

    result = sockMerchant(n, ar)

    fptr.write(str(result) + '\n')

    fptr.close()

Łączenie i dzielenie stringa

a = "this is a string"
a = a.split(" ") # a is converted to a list of strings. 

Efekt:

['this', 'is', 'a', 'string']

A teraz łączenie:

a = "-".join(a)

Efekt:

this-is-a-string 

Pętla for ze skokowym przejściem

for i in range(10, 20, 2):
    print(i)

Efekt tego jest taki:

10
12
14
16
18

Textwrap

import textwrap

string = input()

lista = textwrap.wrap(string, 2)
for x in lista:
    print(x)

Input:

alamakota

Output:

al
am
ak
ot
a

Znak nowej lini wewnątrz stringa

Użyj: \n

Sprawdzenie czy litera jest wielka

s1 = ["a", "b", "c"]
if s1[i].isupper():

Funkcja format

pracownicy = ["Konrad", "Adam", "Dominik"]
for i in range(len(pracownicy)):
    powitanie = "{} - Witam Cię!"
    print(powitanie.format(pracownicy[i]))

Wynik to:

Konrad - Witam Cię!
Adam - Witam Cię!
Dominik - Witam Cię!

Centrowanir tekstu wyrównywanie do prawej i lewej

n = 5
for i in range(1, n + 1):
    a = i *"*"
    print(a.rjust(n,' '))

Efekt:

         *
        **
       ***
      ****
     *****

Wyrównanie w lewo:

a.ljust(10,' ')

Centrowanie:

a.center(10,' ')

Złożoność obliczeniowa

Określa ile operacji wykona dany program. Pojęcie to jest ważne przy wyborze rozwiązania danego zadania.
Link do strony dobrze tłumaczącej to zagadnienie: Samouczek Programisty

Must continue reading lines until there is no more input

Mamy w zadaniu wczytywać jakąś wartość, aż przestanie być ona podawana.
Należy użyć poniższego bloku:

while True:
    try:
        c = input()
    except EOFError:
        break

Wskazanie indeksu w stringu dla konkretnej litery

fraza = "Ala ma kota"
print(fraza.index("a"))

Wyświetli się:

2

Zamiana wewnatrz stringa, konkretnego wyrazu na inny

fraza = "Ala ma kota"
print(fraza)
print(fraza.replace("Ala", "Ola"))

Efekt:

Ala ma kota
Ola ma kota

Wartość absolutna

liczba = -1
print(abs(liczba))

Potęgowanie

3 do potęgi 3

print(pow(3, 3))

Wartość maksymalna i minimalna

print(max(3, 1, 15))
print(min(3, 1, 15))

Zaokrąglenie

print(round(3.4))
print(round(3.5))
print(round(3.6))

Efekt:

3
4
4

Inne zaokrąglanie:

from math import *
print(ceil(7.7))
print(floor(7.7))

Efekt:

8
7

Pierwiastkowanie

from math import *
print(sqrt(36))

Łączenie dwóch list

fala = [1, 3, 5]
woda = ["a", "v", "c"]
fala.extend(woda)
print(fala)

Efekt:

[1, 3, 5, 'a', 'v', 'c']

Wstawienie elementu do środka listy

ala = ["a", "c"]
ala.insert(1, "b")
print(ala)

Efekt:

['a', 'b', 'c']

Zliczenie występowania danego elementu w stringu

ala = ["a", "c", "a", "f"]
print(ala.count("a"))

Efekt:

2

Sprawdzenie czy dany element znajduje się wewnątrz listy

ala = ["a", "c", "a", "f"]
try:
    ala.index("g")
    print("jest")
except:
    print("nie ma")

Kopiowanie list

ala = ["a", "c", "a", "f"]
ala1 = ala
ala[0] = "z"
print(ala1)

Efekt:

['z', 'c', 'a', 'f']

Należy tak robić:

ala = ["a", "c", "a", "f"]
ala1 = ala.copy()
ala[0] = "z"
print(ala1)

Efekt:

['a', 'c', 'a', 'f']

Zamienienie dwóch elementów wewnątrz listy

s = [1, 2, 4, 9]
s[0], s[1] = s[1], s[0]
print(s)

Efekt:

[2, 1, 4, 9]

Można zamieniać też elementy z dwóch różnych list

s = [1, 2, 3, 4]
f = [9, 8, 7, 6]
s[0], f[0] = f[0], s[0]
print(s)
print(f)

Efekt:

[9, 2, 3, 4]
[1, 8, 7, 6]

Sortowanie listy po nazwiskach

persons = ['Adam Kowalski', 'Ewa Zygadło', 'Monika Betel']
persons.sort(key=lambda x: x.split(' ')[-1].lower())
print(persons)

lower() dodaliśmy po to, by nazwiska napisane małymi siterami nie znalazły się na końcu listy.

Efekt działania programu:

['Monika Betel', 'Adam Kowalski', 'Ewa Zygadło']

Sortowanie, które nie wpływa na oryginalną listę

persons = ['Adam Kowalski', 'Ewa Zygadło', 'Monika Betel']
x2 = sorted(persons, key=lambda x: x.split(' ')[-1].lower())
print(persons)
print(x2)

Efekt działania programu:

persons = ['Adam Kowalski', 'Ewa Zygadło', 'Monika Betel']
x2 = sorted(persons, key=lambda x: x.split(' ')[-1].lower())
print(persons)
print(x2)

Recursion – czyli rekurencja

To funkcja, która wywołuje sama siebie.
Prosty przykład:

def f(a):
    return a/2

wynik = f(f(f(1000)))
print(wynik)

Wątki

Mamy 2 wątki. a1 odpowiada za odliczanie od 1 do 200.
Wątek a2 puszcza muzykę.
t1.join() powoduje że nie uruchomi się dalsza cześć programu zanim nie skończy się wątek.

import vlc
import time
from threading import Thread
def a1(x):
    x = int(x)
    for i in range(200):
        print(x)
        x += 1
        time.sleep(1)
def a2():
    sound_file = vlc.MediaPlayer("mv.mp3")
    sound_file.play()
    time.sleep(200)

t1 = Thread(target=a1, args=("1"))
t2 = Thread(target=a2, args=())
t1.start()
t2.start()

t1.join()
t2.join()

Wydobycie różnych wartości z daty

import time
import datetime

#nazwa dnia
now = datetime.datetime.now()
day_name = now.strftime("%A")
print(day_name)

#nr dnia w tygodniu
day_of_week = now.weekday() + 1
print(day_of_week)

#nr dnia w miesiącu
now2 = time.localtime(time.time())
day_of_month = now2.tm_mday
print(day_of_month)

#dzień roku
day_of_year = (now - datetime.datetime(now.year, 1, 1)).days + 1
print(day_of_year)

#classic date
classic_date = now.date()
print(classic_date)

Pobranie daty z timestamp

from datetime import date
from_timestamp = date.fromtimestamp(1326244364)
print("Date =", from_timestamp)

Konwersja daty stringowej do timestamp

import time
import datetime
s = "01-12-2011"
time.mktime(datetime.datetime.strptime(s, "%d-%m-%Y").timetuple())

Importowanie danych z CSV i JSON do MySQL

Link filmu wyjaśniającego zagadnienia
Link do artykułu

Łączenie się API

import requests
import pprint
r = requests.get('https://api.alternative.me/fng/')
my_data = r.json()
print(my_data)

Otwarcie okna przeglątki na nakiejś stronie www

import webbrowser
webbrowser.open_new_tab("https://www.google.com/")

Jak ukryć okno konsoli

Jeżeli chcemy by program działał z niewidocznym oknem konsoli to w Pycharm utwórz nowy plik z rozszerzeniem .pyw na przykład run2.pyw
Przekopiuj do niego kod swojego skryptu i zapisz.
Teraz po uruchomieniu tego pliku, program będzie działał ale będzie nie widoczny dla użytkownika.

Zmiana nazwy okna konsoli

from os import system
myCoolTitle = "Super Lekcja"
system("title "+myCoolTitle)
input()

Skrypt uruchamia inny skrypt w systemie Windows

import os
os.system("script2.py 1")

Pobranie rozdzelczości ekranu

Najpierw zainstaluj w Pycharm bibliotekę pywin32.

from win32api import GetSystemMetrics

print("Width =", GetSystemMetrics(0))
print("Height =", GetSystemMetrics(1))

Graficzny edukacyjny interface w Python – Turtle

Jest to fajne narzędzie do nauki programowania.
Poniżej przedstawiam prosty przykład programu.

import turtle
#stworzenie okna
wn = turtle.Screen()
turtle.down()
turtle.goto(100, 100)
turtle.goto(-100, 100)
turtle.exitonclick()

Przydatne funkcje:

import turtle

tim = turtle.Turtle()
tim.shape('turtle')
tim.pensize(5)
tim.color('blue')
tim. speed(10)
tim.forward(100)
tim.left(90)
tim.forward(100)
tim.right(90)
tim.color('yellow')
tim.back(300)

tim.penup()
tim.forward(50)
tim.pendown()
tim.color('red')
tim.forward(50)
# ustawiam kolor zamalowywania. Red dla zewnętrza, blue dla wnętrza
tim.color('red', 'blue')
# zamalowana figura
tim.begin_fill()
tim.circle(50)
tim.end_fill()
# rysowanie kwadratu
tim.color('yellow', 'black')
tim.begin_fill()
for x in range(4):
    tim.forward(100)
    tim.right(90)
tim.end_fill()

# ustawianie pozycji żółwia
tim.setpos(0, 0)
tim.setpos(200, 200)
tim.setpos(-200, 200)

turtle.exitonclick()

Pierwsza gra

import turtle
# stworzenie okna gry
wn = turtle.Screen()
wn.title('First Game')
wn.bgcolor('#0E6655')
wn.setup(width=800, height=600)
wn.tracer(0)

# stworzenie bohatera olo
olo = turtle.Turtle()
olo.speed(0)
olo.shape('circle')
olo.color('#1C2833')
olo.penup()
olo.goto(0, 0)

# stworzenie celu
cel = turtle.Turtle()
cel.speed(0)
cel.shape('circle')
cel.color('yellow')
cel.penup()
cel.goto(200, 200)
# poruszanie się bohatera olo
def olo_up():
    y = olo.ycor()
    y += 20
    olo.sety(y)
def olo_down():
    y = olo.ycor()
    y -= 20
    olo.sety(y)
def olo_left():
    x = olo.xcor()
    x -= 20
    olo.setx(x)
def olo_right():
    x = olo.xcor()
    x += 20
    olo.setx(x)
def olo_diverse_y():
    y = olo.ycor()
    if y > 0:
        y -= 20
    elif y < 0:
        y += 20
    olo.sety(y * (-1))
def olo_diverse_x():
    x = olo.xcor()
    if x > 0:
        x -= 20
    elif x < 0:
        x += 20
    olo.setx(x * (-1))

#pobieranie z klawiatury
wn.listen()
wn.onkeypress(olo_up, "w")
wn.onkeypress(olo_down, "s")
wn.onkeypress(olo_right, "d")
wn.onkeypress(olo_left, "a")

# głowna pętla gry
while True:
    wn.update()
    # nie wychodzenie za ekran
    if -290 > olo.ycor() or olo.ycor() > 290:
        olo_diverse_y()
    if -390 > olo.xcor() or olo.xcor() > 390:
        olo_diverse_x()
    # komunikat o zwycięstwie
    if olo.ycor() == cel.ycor() and olo.xcor() == cel.xcor():
        cel.write("   You win!", font=("Arial", 16, "normal"))
    else:
        cel.clear()

Ukrywanie i odkrywanie żółwia

tim.hideturtle()
tim.showturtle()

Żółw porusza się w miejsce kliknięcia myszą

import turtle
wn = turtle.Screen()
tim = turtle.Turtle()

def h1(x, y):
    tim.goto(x, y)

wn.onclick(h1)
wn.mainloop()

Okno ma konkretne wymiary i pozycję na ekranie komputera

wn = turtle.Screen()
wn.setup(width=300, height=300, startx=0, starty=0)

Lewy górny róg ma pozycję x=0 i y=0.

Rusunek wykonuje się natychmiast

wn = turtle.Screen()
wn.tracer(0, 0)

Algorytm Euklidesa w Python

x = int(input("podaj x: "))
y = int(input("podaj y: "))
lista = [x, y].sort()
if x==y:
  print(x)
else:
  while True:
    reszta = lista[1] % lista[0]
    if reszta == 0:
      break
    reszta2 = lista[0] % reszta
    if reszta2 == 0:
      break
    lista[1] = reszta
    lista[0] = reszta2
  wynik = [reszta, reszta2]
  print(max(wynik))

Web scraping – Instalacja Beautifulsoup

Web scraping to pobieranie danych ze stron internetowych.

Instalacja o ile jest wymagana:

pip3 install beautifulsoup4

Web scraping – pobranie wszystkich treści z wszystkich elementów wybranej klasy.

from urllib.request import urlopen
from bs4 import BeautifulSoup
html = urlopen('https://www.fem.org.pl/')
bs = BeautifulSoup(html.read(), 'html.parser')
firstList = bs.find_all(class_='excerpt')
for x in firstList:
    print(x.get_text().strip())

Web scraping – pobranie wartości klasy zagnieżdżonej w klasie

W poniższym przykładzie chcemy pobrać aktualny kurs Euro

from urllib.request import urlopen
from bs4 import BeautifulSoup
html = urlopen('https://kursy-walut.mybank.pl/')
bs = BeautifulSoup(html.read(), 'html.parser')
kurs = bs.find(class_='box_mini').find(class_='b2')
print(kurs.get_text())

Web scraping pobieranie linków ze strony

from urllib.request import urlopen
from bs4 import BeautifulSoup
html = urlopen('http://kursyexcela.pl/python_nauka/')
page = BeautifulSoup(html.read(), 'html.parser')
for link in page.find_all('a'):
       url = link.get('href')
       print(url)

Zamknięcie systemu

Dla Windows:

import os
os.system('shutdown -s')

Dla Linux:

import os
os.system('systemctl poweroff') 

Wypisanie całego kalendarza w Python

import calendar
print(calendar.TextCalendar(firstweekday=6).formatyear(2015))

Porównianie list comprehensions z generatorem

Listy używają []
Generatory używają ()
Generatory są bardzo szybkie i w najmniejszym stopniu obciążają pamięć.

Przeanalizuj kod:

lista = [i*2+1 for i in range(20)]
for i in lista:
    print(i, end=' ')
    if i > 23:
        break
print("Break time!")
for i in lista:
    print(i, end=' ')
print("The End")

Wynik działania programu:

1 3 5 7 9 11 13 15 17 19 21 23 25 Break time!
1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 The End

Generator zapamiętuje miejsce przerwania

gen = (i*2+1 for i in range(20))
for i in gen:
    print(i, end=' ')
    if i > 23:
        break
print("Break time!")
for i in gen:
    print(i, end=' ')
print("The End")

Wynik działania programu:

1 3 5 7 9 11 13 15 17 19 21 23 25 Break time!
27 29 31 33 35 37 39 The End

Generator używający yield

def power2():
    power = 1
    while True:
        yield power
        power = power * 2

it = power2()
for x in range(4):
    print(next(it))

Map w Python

Problem polega na tym, że mamy listę radii, która zawiera wartości promienii.
Tworzymy funkcję area(), która potrafi wyliczyć pole koła.
Nastęmnie chcemy wszystkie pola, tzn. dla każdego promienia z listy radii, wpisać do listy areas.

Poniżej prezentuję prawidłowe rozwiązanie problemu bez użycia map:

import math

def area(r):
    return math.pi * (r**2)

radii = [3, 4, 5.3, 3.1, 23]

areas = []
for r in radii:
    a = area(r)
    areas.append(a)

print(areas)

A teraz rozwiązanie problemu przy użyciu map:

import math

def area(r):
    return math.pi * (r**2)

radii = [3, 4, 5.3, 3.1, 23]

areas = list(map(area, radii))

print(areas)

Rozwiązanie jest znacznie krótsze bo jednolinijkowe.
Map przyjmuje dwa argumenty: funkcję i listę.
Map uruchomi funkcję po koleji dla wszystkich elementów listy.
Map niezwraca listy, więc map nalerzy rzutować do listy.

Poniżej przedstawię kolejny przykład użycia map.
Naszym zadaniem jest zamiana temperatury wyrażonej w C na F. Działamy na liście zawierającej miasta i odpowiadające im temperatury.

temps = [("wrocław", 24), ("Warszawa", 16), ("Londyn", 12), ("Rzym", 30)]
c_to_f = lambda data: (data[0], (9/5)*data[1] + 32)
converted_temps = list(map(c_to_f, temps))
print(converted_temps)

Jak sprawdzić w Python jak długo wykonuje się program?

import time
start_time = time.time()
print("Mój program wykonał się w czasie: ", time.time() - start_time)

Wysłanie emaila przy pomocy Python

Na początku trzeba wejść do do ustawień swojego profilu google i zezwolić na logowanie się na logowanie się zewnętrznych aplikacji do Twojego konta.Link do ustawień konta Google W sekcji Less secure app access zmień suwak na on.

Jeżeli chcesz wysyłać male z poziomu servera Ubuntu to Google wymaga stworzenia App password.
Aby je stworzyć wejdź do Google Account -> Singning in to Google -> i uruchom 2-Step Verification.
Następnie będziesz mógł wytworzyć App password

import smtplib
from email.mime.text import  MIMEText
from email.mime.multipart import MIMEMultipart

email = 'twoj.adres@gmail.com'
password = 'twoje.haslo'
send_to_email = 'twoj.adrei@gmail.com'
subject = 'Buy signal'
message = 'Buy now Bitcoin!'

msg = MIMEMultipart()
msg['From'] = email
msg['To'] = send_to_email
msg['Subject'] = subject

msg.attach(MIMEText(message, 'plain'))

server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
server.login(email, password)
text = msg.as_string()
server.sendmail(email, send_to_email, text)
server.quit()
print('ok')