From 4212fd35a12b939792b484045d38427a63423a0a Mon Sep 17 00:00:00 2001 From: Tomasz Dwojak Date: Sat, 16 Dec 2017 06:21:44 +0100 Subject: [PATCH] Add labs 05 --- labs05/Lab05.ipynb | 297 +++++++++++++++++++++++++++++++++++++++ labs05/README.md | 20 +++ labs05/__init__.py | 0 labs05/argparse_min.py | 10 ++ labs05/lib.py | 11 ++ labs05/main.py | 18 +++ labs05/tools/__init__.py | 0 labs05/tools/fib.py | 38 +++++ 8 files changed, 394 insertions(+) create mode 100644 labs05/Lab05.ipynb create mode 100644 labs05/README.md create mode 100644 labs05/__init__.py create mode 100644 labs05/argparse_min.py create mode 100644 labs05/lib.py create mode 100644 labs05/main.py create mode 100644 labs05/tools/__init__.py create mode 100644 labs05/tools/fib.py diff --git a/labs05/Lab05.ipynb b/labs05/Lab05.ipynb new file mode 100644 index 0000000..cbd7e24 --- /dev/null +++ b/labs05/Lab05.ipynb @@ -0,0 +1,297 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "# Python: część 3\n", + "\n", + "## Tomasz Dwojak\n", + "\n", + "### 16 grudnia 2017" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Co już było?\n", + " * podstawowe typy i struktury danych\n", + " * funkcje\n", + " * biblioteki\n", + " * klasy\n", + " * praca z plikami\n", + " * wyjątki" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "# Co na dziś?\n", + " * Dzielenie kodu na pliki\n", + " * Podstawy analizy danych: Pandas" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Dzielenie kodu\n", + "\n", + " * Zwiększenie jakości kodu\n", + " * Napisz raz i korzystaj w wielu sytuacjach\n", + " * Tworzenie własnej biblioteki" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Dzielenie kodu - podsumowanie\n", + " * import\n", + " * ``if __name__ == '__main__'``\n", + " * Pakiety i pliki ``__init__.py``\n", + " * zmienna PYTHONPATH i ``sys.path``" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "# Interpreter Pythona" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "# Jupyter notebook" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Argumenty do programu\n", + "\n", + " * czy potrzebujemy pyCharm żeby uruchomić prosty skrypt?" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### sys.argv\n", + " * zawiera liste wszystkich argumentów\n", + " * pierwszy element zawiera nazwe pliku" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['/usr/lib/python2.7/site-packages/ipykernel/__main__.py', '-f', '/run/user/1000/jupyter/kernel-7efdb6ca-75d5-474e-90c4-fda3dadc3282.json']\n" + ] + } + ], + "source": [ + "import sys\n", + "print(sys.argv)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### Biblioteka argparse" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [], + "source": [ + "import argparse\n", + "parser = argparse.ArgumentParser()\n", + "parser.parse_args()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [], + "source": [ + "parser = argparse.ArgumentParser()\n", + "parser.add_argument(\"number\", help=\"Opis\")\n", + "args = parser.parse_args()\n", + "print(args.number)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true, + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [], + "source": [ + "parser = argparse.ArgumentParser()\n", + "parser.add_argument(\"number\", help=\"Opis\", nargs=\"+\")\n", + "args = parser.parse_args()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true, + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [], + "source": [ + "parser = argparse.ArgumentParser()\n", + "parser.add_argument(\"--verbosity\", help=\"increase output verbosity\")\n", + "args = parser.parse_args()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true, + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [], + "source": [ + "parser = argparse.ArgumentParser()\n", + "parser.add_argument(\"--verbose\", help=\"increase output verbosity\",\n", + " action=\"store_true\")\n", + "args = parser.parse_args()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true, + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [], + "source": [ + "parser = argparse.ArgumentParser()\n", + "parser.add_argument(\"-v\", \"--verbose\", help=\"increase output verbosity\",\n", + " action=\"store_true\")\n", + "args = parser.parse_args()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true, + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [], + "source": [ + "parser = argparse.ArgumentParser()\n", + "parser.add_argument(\"-v\", \"--verbose\", help=\"increase output verbosity\",\n", + " action=\"store_true\")\n", + "parser.add_argument(\"number\", help=\"Opis\", nargs=\"+\")\n", + "args = parser.parse_args()" + ] + } + ], + "metadata": { + "celltoolbar": "Slideshow", + "kernelspec": { + "display_name": "Python 2", + "language": "python2", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.14" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/labs05/README.md b/labs05/README.md new file mode 100644 index 0000000..1d86fa4 --- /dev/null +++ b/labs05/README.md @@ -0,0 +1,20 @@ +** zad. 0 ** +Napisz funkcję ``suma``, która przyjmnie jeden argument: listę liczb i zwróci ich sumę. + +** zad. 1 ** +Zaimportuj z zadania 0 fukcje ``suma``. Korzystając z tej fukcji i tablicy ``sys.argv`` oblicz i wyświetl sumę argumentów, jakie zostały przekazane do proramu. Załóź, że argumentami do programu będą tylko liczby zmiennoprzecinkowe. + +** zad. 2 ** +Uodpornoj program z zad. 1 w następujący sposób: do programu mogą zostać przekazane argumenty, które nie mają wartości liczbowej (przyjmijmy, że ich wartość to 0). Skorzystaj z mechanizmu wyjątków: złap wyjątek, jeżeli argumenty nie da się skonwertować na liczbę zmiennoprzecinkową. + +** zad. 3 ** +Przekształć rozwiązanie zadania drugiego w taki sposob, żeby korzystało z biblioteki ``argparse`` zamiast z z listy ``sys.argv``. + +** zad. 4 (Domowe) ** +Plik ``task04.py`` zawiera kod prorgamu, który działa jak popularne narzędzie unixowe ``wc`` (Word Counter): zlicza liczbę linii, wyrazów i znaków. Aktualnie program potrafi działać wyłącznie na wejściu podanym z klawiatury. Dodaj do niego opcje programu: + * domyślnie program ma zliczać na wejściu z klawiatury (stdin) i wyświetlać wszystkie 3 liczby. + * Jeżeli został podany przełącznik `-l`, to to ma zostać zwrócona tylko liczba linii. + * Jeżeli został podany przełącznik `-w`, to to ma zostać zwrócona tylko liczba słów. + * Jeżeli został podany przełącznik `-c`, to to ma zostać zwrócona tylko liczba znaków. + * Jeżeli został podany inny argument, to należy założyć że jest to nazwa pliku i potraktować ten plik jako wejście do programu. + diff --git a/labs05/__init__.py b/labs05/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/labs05/argparse_min.py b/labs05/argparse_min.py new file mode 100644 index 0000000..e34f110 --- /dev/null +++ b/labs05/argparse_min.py @@ -0,0 +1,10 @@ +import argparse + +parser = argparse.ArgumentParser() +parser.parse_args() + +"""" +parser = argparse.ArgumentParser() +parser.add_argument("number", help="Opis") +args = parser.parse_args() +""" \ No newline at end of file diff --git a/labs05/lib.py b/labs05/lib.py new file mode 100644 index 0000000..8f930ac --- /dev/null +++ b/labs05/lib.py @@ -0,0 +1,11 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +def greetings(): + print("Pozdrowienia!!!") + +print("SPAM " * 6) +print(__name__) + +if __name__ == '__main__': + print("Jestem głównym plikiem!") \ No newline at end of file diff --git a/labs05/main.py b/labs05/main.py new file mode 100644 index 0000000..8c1c4e1 --- /dev/null +++ b/labs05/main.py @@ -0,0 +1,18 @@ +#!/usr/bin/env python2 +# -*- coding: utf-8 -*- + +import lib +import tools.fib + +import sys + +# sys.path.append("..") +# import labs02.task01 + +def main(): + print("Hello World") + lib.greetings() + print(tools.fib.non_reccurent_fibonacci(50)) + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/labs05/tools/__init__.py b/labs05/tools/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/labs05/tools/fib.py b/labs05/tools/fib.py new file mode 100644 index 0000000..359f8eb --- /dev/null +++ b/labs05/tools/fib.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +Obliczenie n-tego wyrazu ciągu fibonacciego na dwa sposoby. +1. Naiwna rekurencja: podstawienie do wzoru. +2. Wersja z cachem: każdy wyraz jest obliczany dokładnie raz. +""" + +def naive_fibonacci(n): + if n <= 0: + return 0 + if n in [1,2]: + return 1 + return naive_fibonacci(n-1) + naive_fibonacci(n-2) + + +def cache_fibonacci(n, cache=None): + if cache is None: + cache = [None for i in range(n+1)] + cache[0] = 0 + cache[1] = cache[2] = 1 + return cache_fibonacci(n, cache) + else: + if cache[n] is not None: + return cache[n] + else: + cache[n] = cache_fibonacci(n-1, cache) + cache_fibonacci(n-2, cache) + return cache[n] + +def non_reccurent_fibonacci(n): + cache = [None for i in range(n+1)] + cache[0] = 0 + cache[1] = cache[2] = 1 + for i in range(2, n + 1): + cache[i] = cache[i-1] + cache[i-2] + return cache[n] +