Spis treści
- Wprowadzenie
- Zmienne i typy danych
- Podstawowe operacje
- Struktury danych
- Funkcje
- Sterowanie przepływem
- Praca z projektami
- Zadania do wykonania
Wprowadzenie
Python to interpretowany, wysokopoziomowy język programowania o ogólnym przeznaczeniu. Wyróżnia się czytelnością kodu i prostą składnią, co czyni go doskonałym językiem zarówno dla początkujących, jak i zaawansowanych programistów.
Pierwsze kroki z Pythonem
Aby zacząć pracę z Pythonem, możesz użyć interaktywnego interpretera (REPL - Read-Eval-Print Loop):
# Uruchom interpreter Python w terminalu, wpisując:
python # lub python3 na niektórych systemach
# Napisz swój pierwszy program:
print("Hello, World!")
Możesz również utworzyć plik z rozszerzeniem .py
i uruchomić go z terminala:
# Utwórz plik hello.py
print("Hello, World!")
# Uruchom z terminala
python hello.py
Zmienne i typy danych
W Pythonie zmienne są dynamicznie typowane, co oznacza, że nie trzeba deklarować ich typu - interpreter sam określa typ na podstawie przypisanej wartości.
Deklarowanie zmiennych
# Zmienna całkowita
number = 42
# Zmienna zmiennoprzecinkowa
pi = 3.14159
# Zmienna tekstowa (string)
name = "Python"
# Zmienna logiczna (boolean)
is_awesome = True
# Wypisywanie wartości
print(number)
print(f"Wartość pi: {pi}")
print(f"Nazwa: {name}")
print(f"Czy Python jest wspaniały? {is_awesome}")
Podstawowe typy danych
Python posiada kilka podstawowych typów danych:
- Liczby:
int
- liczby całkowite:42
,-7
,0
float
- liczby zmiennoprzecinkowe:3.14
,-0.001
complex
- liczby zespolone:3+4j
- Teksty:
str
- łańcuchy znaków:"Hello"
,'Python'
- Wartości logiczne:
bool
-True
lubFalse
- Typ specjalny:
None
- reprezentuje brak wartości
# Sprawdzanie typu zmiennej
x = 10
print(type(x)) # <class 'int'>
y = "Hello"
print(type(y)) # <class 'str'>
z = 3.14
print(type(z)) # <class 'float'>
Podstawowe operacje
Operacje na liczbach
# Dodawanie
sum = 5 + 3 # 8
# Odejmowanie
difference = 10 - 4 # 6
# Mnożenie
product = 4 * 5 # 20
# Dzielenie (wynik jako float)
quotient = 20 / 4 # 5.0
# Dzielenie całkowitoliczbowe
integer_division = 20 // 3 # 6
# Reszta z dzielenia
remainder = 20 % 3 # 2
# Potęgowanie
power = 2 ** 3 # 8
Operacje na stringach
# Łączenie stringów
greeting = "Hello" + " " + "Python" # "Hello Python"
# Powtarzanie stringów
repeated = "Python" * 3 # "PythonPythonPython"
# Dostęp do znaków (indeksowanie)
first_char = "Python"[0] # "P"
last_char = "Python"[-1] # "n"
# Wycinanie (slicing)
substring = "Python"[1:4] # "yth"
Struktury danych
Listy
Listy są uporządkowanymi, modyfikowalnymi kolekcjami elementów. Mogą zawierać elementy różnych typów.
# Tworzenie listy
fruits = ["apple", "banana", "cherry"]
# Dostęp do elementów
first_fruit = fruits[0] # "apple"
# Modyfikowanie elementów
fruits[1] = "blueberry" # ["apple", "blueberry", "cherry"]
# Dodawanie elementów
fruits.append("orange") # ["apple", "blueberry", "cherry", "orange"]
# Długość listy
num_fruits = len(fruits) # 4
# Usuwanie elementów
del fruits[0] # ["blueberry", "cherry", "orange"]
# Iteracja po liście
for fruit in fruits:
print(fruit)
Krotki (Tuples)
Krotki są uporządkowanymi, niemodykowalnymi kolekcjami elementów.
# Tworzenie krotki
point = (10, 20)
# Dostęp do elementów
x_coord = point[0] # 10
y_coord = point[1] # 20
# Próba modyfikacji spowoduje błąd
# point[0] = 15 # TypeError: 'tuple' object does not support item assignment
# Rozpakowanie krotki
x, y = point
print(x, y) # 10 20
Słowniki (Dictionaries)
Słowniki przechowują pary klucz-wartość.
# Tworzenie słownika
person = {
"name": "John",
"age": 30,
"city": "New York"
}
# Dostęp do wartości
name = person["name"] # "John"
# Modyfikowanie wartości
person["age"] = 31
# Dodawanie nowych par klucz-wartość
person["job"] = "Developer"
# Sprawdzanie, czy klucz istnieje
if "age" in person:
print(f"Age: {person['age']}")
# Iteracja po słowniku
for key, value in person.items():
print(f"{key}: {value}")
Zbiory (Sets)
Zbiory przechowują unikalne elementy w nieporządkowanej kolekcji.
# Tworzenie zbioru
colors = {"red", "green", "blue"}
# Dodawanie elementów
colors.add("yellow")
# Usuwanie elementów
colors.remove("green")
# Sprawdzanie, czy element jest w zbiorze
is_red_present = "red" in colors # True
# Operacje na zbiorach
set1 = {1, 2, 3}
set2 = {3, 4, 5}
union = set1 | set2 # {1, 2, 3, 4, 5}
intersection = set1 & set2 # {3}
difference = set1 - set2 # {1, 2}
Funkcje
Funkcje w Pythonie definiuje się za pomocą słowa kluczowego def
.
Definiowanie i wywoływanie funkcji
# Prosta funkcja bez parametrów
def say_hello():
print("Hello, Python!")
# Wywołanie funkcji
say_hello()
# Funkcja z parametrami
def greet(name):
print(f"Hello, {name}!")
greet("Alice")
# Funkcja z wartością domyślną parametru
def greet_with_message(name, message="Welcome!"):
print(f"Hello, {name}! {message}")
greet_with_message("Bob")
greet_with_message("Charlie", "Have a nice day!")
Zwracanie wartości
# Funkcja zwracająca wartość
def add(a, b):
return a + b
result = add(5, 3)
print(result) # 8
# Funkcja może zwracać wiele wartości (jako krotkę)
def get_dimensions():
return 1920, 1080
width, height = get_dimensions()
print(f"Width: {width}, Height: {height}")
Sterowanie przepływem
Instrukcje warunkowe
# Prosty if
age = 20
if age >= 18:
print("Jesteś pełnoletni")
# if-else
temperature = 15
if temperature > 20:
print("Jest ciepło")
else:
print("Jest chłodno")
# if-elif-else
score = 85
if score >= 90:
grade = "A"
elif score >= 80:
grade = "B"
elif score >= 70:
grade = "C"
elif score >= 60:
grade = "D"
else:
grade = "F"
print(f"Ocena: {grade}")
Pętle
# Pętla for z zakresu
for i in range(5):
print(i) # 0, 1, 2, 3, 4
# Pętla for po kolekcji
fruits = ["apple", "banana", "cherry"]
for fruit in fruits:
print(fruit)
# Pętla while
count = 0
while count < 5:
print(count)
count += 1
# Instrukcje break i continue
for i in range(10):
if i == 3:
continue # Pomiń tę iterację
if i == 7:
break # Zakończ pętlę
print(i)
Praca z projektami
Moduły i importy
Python pozwala organizować kod w modułach i pakietach.
# Importowanie całego modułu
import math
print(math.pi) # 3.141592653589793
# Importowanie konkretnych elementów z modułu
from math import sqrt, pow
print(sqrt(16)) # 4.0
print(pow(2, 3)) # 8.0
# Importowanie z aliasem
import numpy as np
Wirtualne środowiska
Wirtualne środowiska pomagają izolować zależności projektu, dzięki czemu różne projekty mogą korzystać z różnych wersji bibliotek bez konfliktów.
Virtualenv i venv
Python oferuje wbudowane narzędzie venv
do tworzenia wirtualnych środowisk:
# Tworzenie wirtualnego środowiska
python -m venv myenv
# Aktywacja środowiska (Windows)
myenv\Scripts\activate
# Aktywacja środowiska (macOS/Linux)
source myenv/bin/activate
# Sprawdzenie, czy środowisko jest aktywne (powinno pokazać ścieżkę do środowiska)
which python # na macOS/Linux
where python # na Windows
# Dezaktywacja środowiska
deactivate
Alternatywnie można użyć pakietu virtualenv
, który oferuje więcej opcji:
# Instalacja virtualenv
pip install virtualenv
# Tworzenie środowiska
virtualenv myproject_env
# Tworzenie środowiska z konkretną wersją Pythona
virtualenv -p python3.9 myproject_env
Zarządzanie zależnościami
Po aktywacji wirtualnego środowiska, można zarządzać zależnościami projektu:
# Instalacja pojedynczego pakietu
pip install requests
# Instalacja konkretnej wersji pakietu
pip install requests==2.28.1
# Zapisywanie zależności do pliku requirements.txt
pip freeze > requirements.txt
# Zawartość pliku requirements.txt może wyglądać tak:
# requests==2.28.1
# numpy==1.23.4
# pandas==1.5.1
# Instalacja wszystkich zależności z pliku requirements.txt
pip install -r requirements.txt
Dobra praktyka: struktura projektu z wirtualnym środowiskiem
Typowa struktura projektu Pythona z wirtualnym środowiskiem:
myproject/
│
├── venv/ # Katalog wirtualnego środowiska (nie dodawany do systemu kontroli wersji)
├── requirements.txt # Lista zależności
├── README.md # Dokumentacja projektu
├── setup.py # Plik konfiguracyjny do instalacji pakietu (opcjonalnie)
│
├── mypackage/ # Główny pakiet projektu
│ ├── __init__.py
│ ├── module1.py
│ └── module2.py
│
└── tests/ # Testy
├── __init__.py
├── test_module1.py
└── test_module2.py
Poetry - nowoczesne zarządzanie zależnościami
Poetry to nowoczesne narzędzie do zarządzania zależnościami i pakietami w Pythonie, które rozwiązuje wiele problemów związanych z tradycyjnym podejściem używającym pip
i setup.py
.
Instalacja Poetry
# Instalacja na macOS/Linux/WSL
curl -sSL https://install.python-poetry.org | python3 -
# Instalacja na Windows (PowerShell)
(Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | python -
Tworzenie nowego projektu
# Utworzenie nowego projektu
poetry new my-project
# Struktura utworzonego projektu:
# my-project/
# ├── pyproject.toml # Konfiguracja projektu i zależności
# ├── README.md
# ├── my_project/ # Kod źródłowy
# │ └── __init__.py
# └── tests/ # Testy
# └── __init__.py
Można też zainicjować Poetry w istniejącym projekcie:
cd existing-project
poetry init
Zarządzanie zależnościami w Poetry
# Dodawanie zależności
poetry add requests
# Dodawanie zależności deweloperskich (tylko do pracy nad projektem)
poetry add pytest --group dev
# Usuwanie zależności
poetry remove requests
# Aktualizacja zależności
poetry update
# Wyświetlanie zainstalowanych zależności
poetry show
Plik pyproject.toml
Poetry używa pliku pyproject.toml
do konfiguracji projektu i zarządzania zależnościami:
[tool.poetry]
name = "my-project"
version = "0.1.0"
description = "Mój wspaniały projekt"
authors = ["Jan Kowalski <jan.kowalski@example.com>"]
readme = "README.md"
[tool.poetry.dependencies]
python = "^3.8"
requests = "^2.28.1"
[tool.poetry.group.dev.dependencies]
pytest = "^7.0.0"
[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"
Używanie środowiska wirtualnego z Poetry
Poetry automatycznie tworzy i zarządza wirtualnym środowiskiem:
# Uruchamianie komend w środowisku Poetry
poetry run python myscript.py
# Uruchamianie testów
poetry run pytest
Zalety Poetry
- Rozwiązywanie konfliktów zależności - Poetry automatycznie rozwiązuje konflikty i zapewnia kompatybilność wszystkich bibliotek.
- Deterministyczne buildy - Dzięki plikowi lockfile (
poetry.lock
) każda instalacja będzie miała dokładnie te same wersje zależności. - Łatwe publikowanie - Możliwość publikowania paczek na PyPI jednym poleceniem:
poetry publish
. - Grupy zależności - Możliwość organizowania zależności w grupy (np. produkcyjne, deweloperskie, testowe).
- Przyjazny interfejs - Intuicyjne polecenia i komunikaty błędów.