commit 51c89cec1abf902694b01085bcb5e64b0b354083 Author: Ryszard Staruch Date: Tue Oct 1 11:35:14 2024 +0200 Add files diff --git a/00_czysty_kod.ipynb b/00_czysty_kod.ipynb new file mode 100644 index 0000000..52fd246 --- /dev/null +++ b/00_czysty_kod.ipynb @@ -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 +} diff --git a/sprawy_organizacyjne.ipynb b/sprawy_organizacyjne.ipynb new file mode 100644 index 0000000..91387fe --- /dev/null +++ b/sprawy_organizacyjne.ipynb @@ -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 +}