Add files

This commit is contained in:
Ryszard Staruch 2024-10-01 11:35:14 +02:00
commit 51c89cec1a
2 changed files with 301 additions and 0 deletions

205
00_czysty_kod.ipynb Normal file
View File

@ -0,0 +1,205 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Czysty kod"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Gorąco zachęcam do przeczytania książki: Czysty kod. Podręcznik dobrego programisty"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Co to znaczy \"czysty kod\"?\n",
"\n",
"Czysty kod to taki zapis kodu, który będzie czytelny/przyjazny dla innych osób (lub samego siebie przy powrocie do danego kodu po kilku miesiącach przerwy)\n",
"\n",
"Czysty kod powinien być:\n",
"* poprawnie sformatowany (dla chętnych dokument PEP 8 opisujący formatowanie kodu w Pythonie https://peps.python.org/pep-0008/)\n",
"* samoopisywalny - nazwy zmiennych/funkcji powinny opisywać, co dzieje się w danym fragmencie kodu\n",
"* możliwie krótki i prosty (brak wielokrotnych zagnieżdżeń, wielu różnych wariantów w blokach if-elif-else itp.)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**1. Nazwy:**\n",
"\n",
"* **Znaczące i opisowe:** Nazwy zmiennych, funkcji i klas powinny jasno wskazywać ich przeznaczenie (czyli definiować, z czym mamy doczynienia). Krótka nazwa to nie zawsze dobra nazwa! Przykłady:\n",
" * `words` zamiast `w`\n",
" * `number_of_ill_patients` jako liczba chorych pacjentów. Jeśli chcielibyśmy przetrzymywać listę/zbiór chorych pacjentów (obiektów posiadających informacje o pacjentach), wtedy możemy skorzystać ze zmiennej `ill_patients`.\n",
" * `calculate_sum()` zamiast `calc()`\n",
" * nazwy takie jak `x` czy `y` możemy wykorzystywać w takich zastosowaniach jak indeks podczas iterowania pętli\n",
"* **Konwencja:** Używaj `snake_case` dla nazw zmiennych i funkcji (małe litery, podkreślenia). Klasy piszemy w `CamelCase` (duże litery na początku każdego słowa).\n",
"* **Unikaj skrótów:** `unique_elements` zamiast `uni_elem`, wyjątek stanowią skróty, które są jednoznaczne, powszechnie przyjęte i rozumiane przez zdecydowaną większość osób mających styczność z kodem (np. number -> num, dataframe -> df, vocabulary -> vocab, character -> char).\n",
"\n",
"**2. Formatowanie:**\n",
"\n",
"* **Wcięcia:** Używaj 4 spacji na każde wcięcie.\n",
"* **Puste linie:** Oddzielaj bloki kodu pustymi liniami dla lepszej czytelności (funkcje, klasy, oraz fragmenty kodu staniowące pewną logiczną spójność).\n",
"* **Długość linii:** Staraj się, aby linie kodu nie były dłuższe niż 80 znaków.\n",
"\n",
"**3. Funkcje:**\n",
"\n",
"* **Jedno zadanie:** Każda funkcja powinna wykonywać tylko jedno, konkretne zadanie.\n",
"* **Krótkie i zwięzłe:** Funkcje powinny być krótkie i łatwe do zrozumienia (tak samo ich nazwy).\n",
"\n",
"**4. Komentarze:**\n",
"* **Podstawowa zasada:** W komentarzu umieszczaj informacje, których nie da się wyrazić w kodzie, a które są ważne. \n",
"* **Unikaj nadmiaru komentarzy:** Zbyt wiele komentarzy może utrudnić czytanie kodu.\n",
"\n",
"**5. Moduły i pakiety:**\n",
"\n",
"* **Organizacja:** Dziel duży kod na mniejsze moduły i pakiety, aby ułatwić jego zarządzanie.\n",
"* **Import:** Importuj tylko niezbędne moduły.\n",
"\n",
"**Narzędzia:**\n",
"\n",
"* **Linters:** Używaj linterów, takich jak `pylint` lub `flake8`, aby automatycznie sprawdzać styl i jakość kodu.\n",
"* **Formatery:** Używaj formaterów kodu, takich jak `black` lub `autopep8`, aby automatycznie formatować kod zgodnie z ustalonymi konwencjami.\n",
"\n",
"**Pamiętaj:** Celem czystego kodu jest jego zrozumienie i utrzymanie. Inwestycja w czysty kod zaoszczędzi Ci (oraz Twoim współpracownikom) czasu i wysiłku w przyszłości."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Przykład nieczytelnego kodu"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"with open(\"file1.txt\", \"r\") as f:\n",
" b = f.readlines()\n",
" b = [x.strip() for x in b]\n",
" b = set(b)\n",
"with open(\"file2.txt\", \"r\") as f:\n",
" a = f.readlines()\n",
" a = [x.strip() for x in a]\n",
" a = \" \".join(a)\n",
"a = a.split()\n",
"\n",
"aa = []\n",
"for a1 in a:\n",
"\n",
" aaa = \"\".join([c for c in a1 if c.isalpha()])\n",
" aa.append(aaa)\n",
"o = []\n",
"for a2 in aa:\n",
" if a2 not in b:\n",
" o.append(a2)\n",
" \n",
"print(o)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Przykład wyżej po poprawie"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def remove_nonletters_chars(words):\n",
" filtered_words = []\n",
"\n",
" for word in words:\n",
" filtered_word = \"\".join([char for char in word if char.isalpha()])\n",
" filtered_words.append(filtered_word)\n",
" \n",
" return filtered_words\n",
"\n",
"\n",
"def get_out_of_vocab_words(text, vocab):\n",
" words = text.split()\n",
" words = remove_nonletters_chars(words)\n",
"\n",
" out_of_vocab_words = []\n",
" for word in words:\n",
" if word not in vocab:\n",
" out_of_vocab_words.append(word)\n",
" \n",
" return out_of_vocab_words"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"a\n"
]
}
],
"source": [
"with open(\"vocabulary.txt\", \"r\") as file:\n",
" vocab = file.readlines()\n",
" vocab = [x.strip() for x in vocab]\n",
" vocab = set(vocab)\n",
"\n",
"with open(\"article.txt\", \"r\") as file:\n",
" article = file.readlines()\n",
" article = [x.strip() for x in article]\n",
" article = \" \".join(article)\n",
"\n",
"out_of_vocab_words = get_out_of_vocab_words(article, vocab)\n",
"print(out_of_vocab_words)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### W powyższym kodzie:\n",
"* zmienne jednoznacznie wskazują \"czym\" są\n",
"* nazwy funkcji opisują co w nich jest wykonywane\n",
"* fragmenty kodu są właściwie oddzielone nowymi liniami\n",
"* kod nie zawiera komentarzy, ponieważ strukturę działania programu dało się wyrazić poprzez nadanie właściwych nazw ziennym oraz funkcjom"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.5"
}
},
"nbformat": 4,
"nbformat_minor": 2
}

View File

@ -0,0 +1,96 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Informacje ogólne"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Prowadzący\n",
"\n",
"mgr Ryszard Staruch\n",
"\n",
"Kontakt: mail (ryssta@amu.edu.pl) lub przez Teamsy\n",
"\n",
"Dużury: wtorek 10:00-11:30 (możliwe inne terminy)\n",
"\n",
"\n",
"## Literatura\n",
"Polecana literatura do przedmiotu:\n",
"\n",
"- Koehn, P. (2009). Statistical Machine Translation. Cambridge: Cambridge University Press. doi:10.1017/CBO9780511815829\n",
"- Philipp Koehn. \"Neural Machine Translation\". 2020.\n",
"- https://web.stanford.edu/~jurafsky/slp3/3.pdf\n",
"- Jacob Devlin, Ming-Wei Chang, Kenton Lee, Kristina Toutanova. 2019. BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding. North American Association for Computational Linguistics (NAACL).\n",
"- Colin Raffel, Noam Shazeer, Adam Roberts, Katherine Lee, Sharan Narang, Michael Matena, Yanqi Zhou, Wei Li, Peter J. Liu. 2020. Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer. Journal of Machine Learning Research vol 21, number 140, pages 1-67.\n",
"- Radford, Alec and Wu, Jeff and Child, Rewon and Luan, David and Amodei, Dario and Sutskever, Ilya. 2019. Language Models are Unsupervised Multitask Learners\n",
"- https://jalammar.github.io/illustrated-transformer/\n",
"- https://www.youtube.com/watch?v=-9evrZnBorM&ab_channel=YannicKilcher\n",
"- https://www.youtube.com/watch?v=u1_qMdb0kYU&ab_channel=YannicKilcher\n",
"- Kursy Andrewa Ng na Courserze\n",
"\n",
"\n",
"## Laboratorium \n",
"\n",
"Podstawą do zaliczenia laboratorium jest uzyskanie odpowiedniej liczby punktów. Liczba punktów jest jedynym kryterium oceny końcowej. \n",
"\n",
"Punkty otrzymuje się za rozwiązanie zadań podanych przez prowadzącego oraz projekt końcowy. \n",
"\n",
"### Zadania ćwiczeniowe (laboratoria 2 6 oraz 8 12) \n",
"\n",
"Zadania ćwiczeniowe studenci wykonują podczas laboratoriów 2 6 oraz 8 12. Celem każdego laboratorium jest nabycie umiejętności praktycznego wykorzystania wiedzy poznanej podczas poprzedzającego wykładu. Podczas jednych zajęć rozwiązuje się od jednego do kilku zadań. Termin oddania zadań mija w najbliższy wtorek o godzinie 23:59 po danych zajęciach (czyli dla zajęć z 9 października termin oddania zadań przypada na 15 października 23:59). \n",
"\n",
"Maksymalna liczba punktów do uzyskania za zadania na jednych zajęciach wynosi: **40**. Warunkiem koniecznym dla zdobycia maksymalnej liczby punktów jest obecność na zajęciach. \n",
"\n",
"W przypadku nieobecności na zajęciach student ma prawo wykonać zadania i oddać je w terminie uzgodnionym z prowadzącym. Maksymalna liczba punktów do uzyskania wynosi wtedy: **20**. \n",
"\n",
"### Zadanie projektowe (laboratoria 7 oraz 13 15) \n",
"\n",
"Laboratoria nr 7 będą poświęcone podzieleniu się na zespoły oraz przygotowanie/przedyskutowanie kwestii zadania projektowego.\n",
"\n",
"Studenci dobierają się w grupy 2 osobowe (w przypadku nieparzystej liczby osób w grupie 1 zespół musi być 3 osobowy) i przedstawiają propozycję projektu najpóźniej do zajęć nr 12 włącznie (zajęcia nr 12 wypadają 18 grudnia 2024). Nie ma możliwości samodzielnego wykonania projektu. \n",
"\n",
"Wykonanie projektu polega na stworzeniu programu/systemu (zgodnie z ustalonym tematem projektu) oraz przygotowaniu i przedstawieniu prezentacji (czas trwania 5-10 minut) na zajęciach nr 14 i 15. \n",
"\n",
"Dokładny termin prezentacji każdego zespołu zostanie ustalony wspólnie z prowadzącym. \n",
"\n",
"Oceniana będzie kreatywność/oryginalność projektu, wykonanie projektu oraz odpowiednie zaprezentowanie projektu. \n",
"\n",
"Maksymalna sumaryczna liczba punktów do zdobycia za zadanie projektowe wynosi 200 punktów. \n",
"\n",
"Część techniczna projektu (kod źródłowy/przykładowe dane) musi zostać przekazana prowadzącemu w formie umożliwiającej bezproblemowe uruchomienie projektu. \n",
"\n",
"\n",
"Przelicznik punktów na ocenę:\n",
"* 0-299 — 2\n",
"* 300-349 — 3\n",
"* 350-399 — 3+\n",
"* 400-449 — 4\n",
"* 450-499 — 4+\n",
"* 500+ — 5\n",
"\n",
"Technicznie rozwiązania zadań zgłaszamy na platformie Teams.\n",
"\n",
"\n",
"Łącznie (za zadania oraz projekt) do zdobycia będzie 600 punktów.\n",
"\n",
"\n",
"## Obecność na zajęciach\n",
"\n",
"Obecność na zajęciach jest **obowiązkowa**. Nieobecność może być usprawiedliwiona w przypadku choroby potwierdzonej zwolnieniem lekarskim. Dopuszczalne są maksymalnie 3 nieusprawiedliwione nieobecności."
]
}
],
"metadata": {
"language_info": {
"name": "python"
}
},
"nbformat": 4,
"nbformat_minor": 2
}