diff --git a/.gitignore b/.gitignore index b6e4761..a724b2a 100644 --- a/.gitignore +++ b/.gitignore @@ -127,3 +127,5 @@ dmypy.json # Pyre type checker .pyre/ +.DS_Store + diff --git a/ArrayList.py b/ArrayList.py new file mode 100644 index 0000000..3b865f9 --- /dev/null +++ b/ArrayList.py @@ -0,0 +1,194 @@ +import array as arr +from typing import Iterable, Any, Type + + +class ArrayList: + def __init__(self, typecode: str, data=None) -> None: + ''' + Функция для инициализации объекта класса + + :param typecode: тип + :param data: данные + ''' + if typecode in ['i', 'f', 'u'] and type(data) == list and data is not None: + self.__type = typecode + self.array = arr.array(typecode, data) + elif typecode in ['i', 'f', 'u'] and data is None: + self.__type = typecode + self.array = arr.array(typecode) + else: + raise Exception('Wrong init parameters.') + + self.__type_dict = {'i': int, 'f': float, 'u': str}[typecode] + super().__init__() + + def __getitem__(self, index): + if isinstance(index, slice): + return type(self)(self.__type, self.array[index]) + else: + return self.array[index] + + def __setitem__(self, key, value): + self.array[key] = value + + def __delitem__(self, key): + self.array = self.array[:key] + self.array[key + 1:] + + def __contains__(self, item): + for i in range(len(self.array)): + if self.array[i] == item: + return True + return False + + def __iter__(self): + return Iterator(self.array) + + def __reversed__(self): + return Iterator(self.array, -1, 0, -1) + + def __len__(self): + return len(self.array) + + def __iadd__(self, ArrayList): + self.array = self.array + ArrayList.array + return self + + def __str__(self) -> str: + return 'ArrayList' + str(self.array)[5:] + + def __repr__(self): + return self.array.__repr__() + + def __sizeof__(self) -> int: + return self.array.__sizeof__() + + def __dir__(self) -> Iterable[str]: + return self.__dir__() + + def append(self, value): + ''' + Добавление в конец списка + + :param value: значение + :return: None + ''' + if self.__type_dict is type(value): + self.array = self.array + arr.array(self.__type, [value]) + else: + raise Exception('Wrong type of value.') + + def insert(self, index: int, value): + ''' + Добавление значения по индексу + + :param index: индекс + :param value: значение + :return: None + ''' + if type(index) is int and type(value) is self.__type_dict: + if index >= self.__len__(): + self.append(value) + elif index <= 0: + self.array = arr.array(self.__type, [value]) + self.array + else: + tmp = arr.array(self.__type, [value]) + self.array = self.array[:index] + tmp + self.array[index:] + else: + raise Exception('Wrong index and value.') + + def count(self, value): + ''' + Подсчет одинаннаковых значений + + :param value: значение + :return: None + ''' + counter = 0 + for el in self.array: + if el == value: + counter += 1 + return counter + + def reverse(self): + ''' + Разворот списка + + :return: список на оборот + ''' + self.array = self.array[::-1] + + def remove(self, value): + ''' + Удаление элемента + + :param value: значение + :return: None + ''' + for i, el in enumerate(self): + if el == value: + self.array = self.array[:i] + self.array[i + 1:] + + def pop(self, i=None): + ''' + Удаление элемента по индексу + + :param i: индекс + :return: удаленный элемент + ''' + if i is None: + i = -1 + + el = self.array[i] + if i != -1: + self.array = self.array[:i] + self.array[i + 1:] + else: + self.array = self.array[:i] + return el + + def index(self, value): + ''' + Возвращение индекса + + :param value: элемент + :return: индекс по элементу + ''' + for i, el in enumerate(self.array): + if el == value: + return i + raise Exception('Value not found.') + + def extend(self, arrayList): + ''' + Добавление списка к существующему + + :param arrayList: + :return: None + ''' + for el in arrayList: + self.array.append(el) + + +class Iterator: + def __init__(self, collection, start=0, end=-1, step=1): + self.collection = collection + if start < 0: + self.start = len(collection) + start + else: + self.start = start + if end < 0: + self.end = len(collection) + end + step + else: + self.end = end + step + self.step = step + self.current = self.start + + def __next__(self): + if self.current == self.end: + raise StopIteration + + c_el = self.collection[self.current] + self.current += self.step + return c_el + + def __iter__(self): + return self diff --git a/lecture_1/01 Introduction.ipynb b/lecture_1/01 Introduction.ipynb deleted file mode 100644 index 4ee7b2a..0000000 --- a/lecture_1/01 Introduction.ipynb +++ /dev/null @@ -1,1266 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "source": [ - "# Python 101" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "source": [ - "**TLDR** - один из лучших языков программирования. \n", - "И что в нем особенного?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Особенности\n", - "### Интерпретрируемый язык" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Создадим Hello World" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "!echo \"a = 1; print('Hello world, and the number is %d' % a)\" > interpreted.py" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Hello world, and the number is 1\r\n" - ] - } - ], - "source": [ - "!python interpreted.py" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Как видим, ничего компилировать не пришлось. \n", - "Что осталось на выходе?" - ] - }, - { - "cell_type": "code", - "execution_count": 80, - "metadata": {}, - "outputs": [], - "source": [ - "!ls -al | grep *.py*" - ] - }, - { - "cell_type": "code", - "execution_count": 82, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " 2 0 LOAD_GLOBAL 0 (print)\n", - " 2 LOAD_CONST 1 ('Hello friends!')\n", - " 4 CALL_FUNCTION 1\n", - " 6 POP_TOP\n", - " 8 LOAD_CONST 0 (None)\n", - " 10 RETURN_VALUE\n" - ] - } - ], - "source": [ - "def hello_world():\n", - " print(\"Hello friends!\")\n", - "\n", - "import dis\n", - "dis.dis(hello_world)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "У нас не остается никаких бинарных исполняемых файлов" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Кроссплатформенность" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Python - кроссплатформенный (если есть интерпретатор для вашей платформы)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![platforms](images/platforms.png)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Динамическая типизация" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n" - ] - } - ], - "source": [ - "variable_a = 1\n", - "print(type(variable_a))" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n" - ] - } - ], - "source": [ - "variable_a = \"123\"\n", - "print(type(variable_a))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Язык с удобным синтаксисом" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Java** (без модных API) - https://pastebin.com/Rk3L67eU" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![java](images/java.png)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Python-версия**" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "REPREPREP\n" - ] - } - ], - "source": [ - "def repeat_string(data, times=7):\n", - " if data and times > 0:\n", - " print(data*times)\n", - " else:\n", - " print(\"Incorrect data\")\n", - "\n", - "repeat_string('REP', 3)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Вопрос** - при каком случае сломается этот код?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Большое число библиотек на любой случай" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Стандартная библиотека** \n", - "https://docs.python.org/3/library/ \n", - " \n", - " \n", - "**Real-Case** \n", - "Сбор данных о погоде в разных городах и укладка для дальнейшего использования \n", - "https://www.metaweather.com/api/" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "import json\n", - "import requests\n", - "import pandas as pd" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "london\n", - "paris\n", - "moscow\n" - ] - } - ], - "source": [ - "location_api = 'https://www.metaweather.com/api/location/search/?query={city}'\n", - "weather_api = 'https://www.metaweather.com/api/location/{id}'\n", - "\n", - "cities = ['london', 'paris', 'moscow']\n", - "df_raw = []\n", - "\n", - "for c in cities:\n", - " print(c)\n", - " woeid = requests.get(location_api.format(city=c)).json()[0]['woeid']\n", - " desc = requests.get(weather_api.format(id=woeid)).json()\n", - " if isinstance(desc, list):\n", - " df_raw.append(desc[0])\n", - " else:\n", - " df_raw.append(desc['consolidated_weather'][0])\n", - "\n", - "df = pd.DataFrame(df_raw)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
idweather_state_nameweather_state_abbrwind_direction_compasscreatedapplicable_datemin_tempmax_tempthe_tempwind_speedwind_directionair_pressurehumidityvisibilitypredictability
05268017250304000Heavy RainhrSSE2020-03-04T12:16:02.402074Z2020-03-043.4308.2057.0103.651427164.3418901008.5697.27315077
14757901367312384Heavy RainhrS2020-03-04T12:36:05.400612Z2020-03-044.0558.7906.3105.745560191.0000001012.5806.69092577
24825981833445376Heavy CloudhcSE2020-03-04T12:27:32.621772Z2020-03-041.9155.2005.7053.006960127.3276921017.08911.09706871
\n", - "
" - ], - "text/plain": [ - " id weather_state_name weather_state_abbr \\\n", - "0 5268017250304000 Heavy Rain hr \n", - "1 4757901367312384 Heavy Rain hr \n", - "2 4825981833445376 Heavy Cloud hc \n", - "\n", - " wind_direction_compass created applicable_date \\\n", - "0 SSE 2020-03-04T12:16:02.402074Z 2020-03-04 \n", - "1 S 2020-03-04T12:36:05.400612Z 2020-03-04 \n", - "2 SE 2020-03-04T12:27:32.621772Z 2020-03-04 \n", - "\n", - " min_temp max_temp the_temp wind_speed wind_direction air_pressure \\\n", - "0 3.430 8.205 7.010 3.651427 164.341890 1008.5 \n", - "1 4.055 8.790 6.310 5.745560 191.000000 1012.5 \n", - "2 1.915 5.200 5.705 3.006960 127.327692 1017.0 \n", - "\n", - " humidity visibility predictability \n", - "0 69 7.273150 77 \n", - "1 80 6.690925 77 \n", - "2 89 11.097068 71 " - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "df.to_excel('weather_dataset.xlsx', index=False)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Недостатки" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Быстродействие\n", - "Говорят что Python медленный. \n", - "Не всегда" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Original string: PHP\n", - "\n", - "After repeating 7 times: PHPPHPPHPPHPPHPPHPPHP\n", - "CPU times: user 16.2 ms, sys: 15.1 ms, total: 31.3 ms\n", - "Wall time: 504 ms\n" - ] - } - ], - "source": [ - "%%time\n", - "!cd /Users/lancer/KIB\\ Python\\ Course/CentralRepo/lecture_1 && java StringRep" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "REPREPREP\n", - "CPU times: user 6.52 ms, sys: 11.2 ms, total: 17.8 ms\n", - "Wall time: 187 ms\n" - ] - } - ], - "source": [ - "%%time\n", - "!cd /Users/lancer/KIB\\ Python\\ Course/CentralRepo/lecture_1 && python string_rep.py" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "При математических операциях особенно" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 13 µs, sys: 1e+03 ns, total: 14 µs\n", - "Wall time: 20 µs\n" - ] - }, - { - "data": { - "text/plain": [ - "2016" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "%%time\n", - "sum(range(2**6))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Подключим математическую библиотеку" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 417 µs, sys: 180 µs, total: 597 µs\n", - "Wall time: 592 µs\n" - ] - }, - { - "data": { - "text/plain": [ - "2016" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "%%time\n", - "import numpy as np\n", - "np.sum(np.array(range(2**6)))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Ошибку можно словить только в рантайме" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "String operation completed= aa\n", - "String operation completed= bb\n" - ] - }, - { - "ename": "AttributeError", - "evalue": "'int' object has no attribute 'replace'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m'a'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'b'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m12\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0md\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"String operation completed=\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreplace\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0md\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mAttributeError\u001b[0m: 'int' object has no attribute 'replace'" - ] - } - ], - "source": [ - "data = ['a', 'b', 12]\n", - "for d in data:\n", - " print(\"String operation completed=\", d.replace(d, d*2))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Снова к плюсам \n", - " \n", - "Универсальность, развитое сообщество привели к широкому распространению языка -> **Востребованность** \n", - "Востребованность порождает разнообразие \n", - "* backend \n", - "* web \n", - "* devops \n", - "* data science\n", - "\n", - "\n", - "![hh_python](images/hh.png) \n", - "![hh_cpp](images/cpp.png) \n", - " \n", - "### Баян про зарплату\n", - "![salary](images/salary.jpeg) \n", - "\n", - " \n", - "### Мораль такова - прокачанный разработчик всегда найдет хорошее место и оклад" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Ладно, убедили, я хочу питонить!!!111 \n", - " \n", - " \n", - " \n", - "Существуют несколько реализаций Python:\n", - "* CPython - стандартная реализация\n", - "* Jython\n", - "* IronPython\n", - "* PyPy \n", - " \n", - " \n", - " \n", - "### Установка CPython\n", - "* Собрать самому из исходников (make install ...)\n", - "* Готовый пакет (deb/rpm/msi)\n", - "* Anaconda\n", - " \n", - " \n", - " \n", - "### В чем создавать скрипты\n", - "* Любой текстовый редактор\n", - "* Любая годная IDE\n", - "* Pycharm Community\n", - "* Jupyter Notebook\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Jupyter \n", - "![jup_arch](images/jupyter.png) " - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "lancer 27228 0.0 0.7 4314132 57708 s000 S+ 4:02PM 0:06.75 /Users/lancer/anaconda3/bin/python /Users/lancer/anaconda3/bin/jupyter-notebook\r\n", - "lancer 28057 0.0 0.7 4611776 60512 ?? Ss 5:01PM 0:04.08 /Users/lancer/anaconda3/bin/python -m ipykernel_launcher -f /Users/lancer/Library/Jupyter/runtime/kernel-7e9c7b7c-dc29-47c6-a647-432201f4374a.json\r\n" - ] - } - ], - "source": [ - "!ps aux | grep python | grep -v grep" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "lancer 28057 4.3 0.7 4611776 60512 ?? Ss 5:01PM 0:04.11 /Users/lancer/an 27228\r\n", - "lancer 28389 3.0 0.0 4270384 1184 s003 Ss+ 5:12PM 0:00.01 /bin/sh -c ps au 28057\r\n" - ] - } - ], - "source": [ - "!ps aux -o ppid | grep 28057 | grep -v grep" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Синтаксис \n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Логически, код на Python разделяется на строки " - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "metadata": {}, - "outputs": [], - "source": [ - "logical_string = 'cool'" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Разделяются строки переносом строки, либо ';'" - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "metadata": {}, - "outputs": [], - "source": [ - "today = 'is'; the_great = 'day'" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Переменная может быть объявлена любой алфавитной последовательностью + нижний слэш, но не должна начинаться с цифры" - ] - }, - { - "cell_type": "code", - "execution_count": 71, - "metadata": {}, - "outputs": [], - "source": [ - "джигурда = 'с бородой'\n", - "and_your_mentors = 'без'" - ] - }, - { - "cell_type": "code", - "execution_count": 73, - "metadata": {}, - "outputs": [ - { - "ename": "SyntaxError", - "evalue": "invalid syntax (, line 1)", - "output_type": "error", - "traceback": [ - "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m1\u001b[0m\n\u001b[0;31m 7sdf = None\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" - ] - } - ], - "source": [ - "7sdf = None" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Комментарий - через #" - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "metadata": {}, - "outputs": [], - "source": [ - "# результат этого кода видят только ...\n", - "data = None" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Иногда нужно делать длинные вызовы, условия \n", - "Используем обратный slash" - ] - }, - { - "cell_type": "code", - "execution_count": 56, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "46\n" - ] - } - ], - "source": [ - "big_data = \\\n", - " 10*2 + \\\n", - " 23+3\n", - "print(big_data)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Иногда backslash не нужен (в основном в коллекциях)" - ] - }, - { - "cell_type": "code", - "execution_count": 58, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[1, 2, 3, 4, 5, 6, 7, 8, 10]\n" - ] - } - ], - "source": [ - "container = [1,2,3,4,\n", - " 5,6,7,8,\n", - " 10]\n", - "print(container)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Функции объявляются с помощью ключевого слова **def**" - ] - }, - { - "cell_type": "code", - "execution_count": 61, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "-100\n" - ] - } - ], - "source": [ - "def inverter(number):\n", - " print(number * -1)\n", - " \n", - "inverter(100)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Тело функций и других похожих по смыслу конструкций выделяется с помощью отступов (с помощью пробелов или табуляции) \n", - "Отступы должны быть везде одинаковые" - ] - }, - { - "cell_type": "code", - "execution_count": 67, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Все по-пацански\n", - "1\n", - "2\n" - ] - } - ], - "source": [ - "def ok_indent():\n", - " print(\"Все по-пацански\")\n", - " print(1)\n", - " if 1 != 2:\n", - " print(2)\n", - "ok_indent()\n" - ] - }, - { - "cell_type": "code", - "execution_count": 69, - "metadata": {}, - "outputs": [ - { - "ename": "IndentationError", - "evalue": "unindent does not match any outer indentation level (, line 4)", - "output_type": "error", - "traceback": [ - "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m4\u001b[0m\n\u001b[0;31m if 1 != 2:\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mIndentationError\u001b[0m\u001b[0;31m:\u001b[0m unindent does not match any outer indentation level\n" - ] - } - ], - "source": [ - "def notok_indent():\n", - " print(\"Все по-пацански\")\n", - " print(1)\n", - " if 1 != 2:\n", - " print(2)\n", - "ok_indent()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Операторы " - ] - }, - { - "cell_type": "code", - "execution_count": 74, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Сложение: 5+2 = 7\n", - "Вычитание: 5-2 = 3\n", - "Умножение: 5*2 = 10\n", - "Степень: 5^2 = 25\n", - "Деление: 5/2 = 2.5\n", - " Целое: 2\n", - " Остаток: 1\n" - ] - } - ], - "source": [ - "a = 5 + 2; \n", - "print('Сложение: 5+2 =', a)\n", - "a = 5 - 2; \n", - "print('Вычитание: 5-2 =', a)\n", - "a = 5 * 2; \n", - "print('Умножение: 5*2 =', a)\n", - "a = 5 ** 2; \n", - "print('Степень: 5^2 =', a)\n", - "a = 5 / 2; \n", - "print('Деление: 5/2 =', a)\n", - "a = 5 // 2; \n", - "print(' Целое: ', a)\n", - "a = 5 % 2; \n", - "print(' Остаток: ', a)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Побитовые операторы предназначены для работы с данными в битовом (двоичном) формате.\n", - "\n", - "`&` - побитовый \"И\"\n", - "\n", - "`|` - побитовый \"ИЛИ\"\n", - "\n", - "`^` - побитовый \"Исключающее ИЛИ\"\n", - "\n", - "`~` - побитовое отрицание (дополнение) - унарная операция\n", - "\n", - "`<<` - побитовый сдвиг влево\n", - "\n", - "`>>` - побитовый сдвиг право" - ] - }, - { - "cell_type": "code", - "execution_count": 76, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "101 & 011 = 1 ( 0b1 )\n", - "101 | 011 = 7 ( 0b111 )\n", - "101 ^ 011 = 6 ( 0b110 )\n", - "~101 = -6 ( -0b110 )\n", - "101 << 2 = 10 ( 0b1010 )\n", - "101 >> 2 = 2 ( 0b10 )\n" - ] - } - ], - "source": [ - "print(\"101 & 011 = \", 5 & 3, \"(\", bin(5 & 3), \")\")\n", - "print(\"101 | 011 = \", 5 | 3, \"(\", bin(5 | 3), \")\")\n", - "print(\"101 ^ 011 = \", 5 ^ 3, \"(\", bin(5 ^ 3), \")\")\n", - "print(\"~101 = \", ~5, \"(\", bin(~5), \")\")\n", - "print(\"101 << 2 = \",5 << 1, \"(\", bin(5 << 1), \")\")\n", - "print(\"101 >> 2 = \",5 >> 1, \"(\", bin( 5>> 1), \")\")\n", - "\n", - "#bin() - представление числа в двоичной системе счисления" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Условия" - ] - }, - { - "cell_type": "code", - "execution_count": 77, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Yes.\n" - ] - } - ], - "source": [ - "a = 5\n", - "b = 3\n", - "\n", - "if a > b:\n", - " a += 1\n", - " print('Yes.')\n", - "elif a < b:\n", - " a -= 1\n", - " print('No')\n", - "else:\n", - " print('Equal.')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "a = 1\n", - "b = 2\n", - "c = 3\n", - "d = 4\n", - "\n", - "if (a == 1 and b == 2 and\n", - " c == 3 and d == 4):\n", - " print('1')\n", - "\n", - "if [a == 1 and b == 2 and\n", - " c == 3 and d == 4]:\n", - " print('2')\n", - " \n", - "if {a == 1 and b == 2 and\n", - " c == 3 and d == 4}:\n", - " print('3')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Циклы" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Цикл от 0 до n-1:\n", - "for i in range(8):\n", - " print(i)\n", - "\n", - "# Цикл от m до n-1. \n", - "# Посчитаем факториал числа 8\n", - "f = 1\n", - "for i in range(2, 9):\n", - " f = f * i\n", - "print(f)\n", - "\n", - "# Цикл по итерируемому объекту\n", - "\n", - "tup = (1, 2, 5)\n", - "for i in tup:\n", - " print(i)\n", - "\n", - "s = 'КСБ'\n", - "for letter in s:\n", - " print(letter.lower())\n", - "\n", - "d = {1: 'one', 2: 'two'}\n", - "for el in d:\n", - " print(el, ':', d[el])\n", - "\n", - "for k, v in d.items():\n", - " print(k, ':', v)\n", - "\n", - "# Цикл while\n", - "# Сумма четных чисел от 2 до n\n", - "\n", - "n = 20\n", - "i = 2\n", - "sum = 0\n", - "\n", - "while i < n:\n", - " sum += i\n", - " i += 2\n", - "print(sum)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "( ) [ ] { }\n", - ", : . ; @ = ->\n", - "+= -= *= /= //= %= @=\n", - "&= |= ^= >>= <<= **=" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Zen of Python" - ] - }, - { - "cell_type": "code", - "execution_count": 78, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The Zen of Python, by Tim Peters\n", - "\n", - "Beautiful is better than ugly.\n", - "Explicit is better than implicit.\n", - "Simple is better than complex.\n", - "Complex is better than complicated.\n", - "Flat is better than nested.\n", - "Sparse is better than dense.\n", - "Readability counts.\n", - "Special cases aren't special enough to break the rules.\n", - "Although practicality beats purity.\n", - "Errors should never pass silently.\n", - "Unless explicitly silenced.\n", - "In the face of ambiguity, refuse the temptation to guess.\n", - "There should be one-- and preferably only one --obvious way to do it.\n", - "Although that way may not be obvious at first unless you're Dutch.\n", - "Now is better than never.\n", - "Although never is often better than *right* now.\n", - "If the implementation is hard to explain, it's a bad idea.\n", - "If the implementation is easy to explain, it may be a good idea.\n", - "Namespaces are one honking great idea -- let's do more of those!\n" - ] - } - ], - "source": [ - "import this" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Ключевые принципы Python \n", - "* Все есть объект \n", - "![hier](images/type_hier.png) " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "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.7.4" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/lecture_1/02. Data Types.ipynb b/lecture_1/02. Data Types.ipynb deleted file mode 100644 index f6285a6..0000000 --- a/lecture_1/02. Data Types.ipynb +++ /dev/null @@ -1,442 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "7gou5fqfnRGv" - }, - "source": [ - "# Типы данных в Python. Изменяемые и неизменяемые типы. Хранение переменных в памяти" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "Px79JIsrnRGz" - }, - "source": [ - "Python – это динамически типизированный язык, тип переменной определяется непосредственно при выполнении программы.\n", - "\n", - "Например, строка:\n", - "\n", - "`a = 5`\n", - "\n", - "объявляет переменную b и присваивает ей значение 5.\n", - "\n", - "Python - язык с сильной типизацией, то есть вы не можете складывать например строки и числа, нужно все приводить к одному типу." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "6N_4uTdznRG1", - "outputId": "22ad0683-5389-4fe2-a6cd-2568c5e2f825" - }, - "outputs": [], - "source": [ - "a = 5\n", - "print(type(a))\n", - "\n", - "a = 5.5\n", - "print(type(a))\n", - "\n", - "a = 'abc'\n", - "print(type(a))\n", - "\n", - "a = [1,2]\n", - "print(type(a))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "hGEE9NDznRG_" - }, - "source": [ - "## Типы данных\n", - "К основным встроенным типам данных в Python относятся:\n", - "\n", - "- **None** (неопределенное значение переменной)\n", - "- **Логические переменные** (Boolean Type)\n", - "- **NotImplemented** (используется для указания Python, что специальный метод не поддерживает конкретные аргументы, а Python будет пытаться использовать альтернативы, если они доступны)\n", - "- **Числа** (Numeric Type)\n", - " - *int* – целое число\n", - " - *float* – число с плавающей точкой\n", - " - *complex* – комплексное число\n", - "- **Списки** (Sequence Type)\n", - " - *list* – список\n", - " - *tuple* – кортеж\n", - " - *range* – диапазон\n", - "- **Строки** (Text Sequence Type )\n", - " - *str*\n", - "- **Бинарные списки** (Binary Sequence Types)\n", - " - *bytes* – байты\n", - " - *bytearray* – массивы байт\n", - " - *memoryview* – специальные объекты для доступа к внутренним данным объекта через protocol buffer\n", - "- **Множества** (Set Types)\n", - " - *set* – множество\n", - " - *frozenset* – неизменяемое множество\n", - "- **Словари** (Mapping Types)\n", - " - *dict* – словарь" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "x1gCErknnRHC" - }, - "source": [ - "## Хранение переменных в памяти\n", - "\n", - "При создании переменной вначале создается **объект**, который имеет **уникальный идентификатор**, **тип** и **значение**, после этого переменная может ссылаться на созданный объект.\n", - "\n", - "![Создание переменной](02/02-00.png)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "2384645881968" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "a = 4789\n", - "id(a)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "2384645884592" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "b = 4789\n", - "id(b)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 68 - }, - "colab_type": "code", - "executionInfo": { - "elapsed": 2100, - "status": "ok", - "timestamp": 1575272498278, - "user": { - "displayName": "Надежда Демиденко", - "photoUrl": "https://lh3.googleusercontent.com/a-/AAuE7mA6D7k5OgtG9hzPe8Abs8DfOKAXQoTXaPfn7EY=s64", - "userId": "05224310221243935536" - }, - "user_tz": -180 - }, - "id": "tAglMsYQnRHD", - "outputId": "75595566-2e30-4bbb-b6b5-f5c9010c42bc" - }, - "outputs": [], - "source": [ - "a = 19.5\n", - "\n", - "print('идентификатор: ', id(a))\n", - "print('тип: ', type(a))\n", - "print('значение: ', a)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "Z3CNEcb5j4DB" - }, - "source": [ - "Операция `*3` при создании объекта копирует ссылки. Это видно на следующем примере:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 51 - }, - "colab_type": "code", - "executionInfo": { - "elapsed": 746, - "status": "ok", - "timestamp": 1575272888037, - "user": { - "displayName": "Надежда Демиденко", - "photoUrl": "https://lh3.googleusercontent.com/a-/AAuE7mA6D7k5OgtG9hzPe8Abs8DfOKAXQoTXaPfn7EY=s64", - "userId": "05224310221243935536" - }, - "user_tz": -180 - }, - "id": "j4CHjQZPkEP-", - "outputId": "2e1fad27-5487-47b5-8f3b-b6179565ffc9" - }, - "outputs": [], - "source": [ - "a = [[]] * 3\n", - "print(a)\n", - "\n", - "a[0].append(3)\n", - "print(a)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "zBxjS5PBnRHK" - }, - "source": [ - "## Изменяемые и неизменяемые типы данных\n", - "\n", - "В Python существуют изменяемые и неизменяемые типы.\n", - "\n", - "![Типы данных](02/02-03.png)\n", - "\n", - "К **неизменяемым** (*immutable*) типам относятся: \n", - "- целые числа (*int*)\n", - "- числа с плавающей точкой (*float*)\n", - "- комплексные числа (*complex*)\n", - "- логические переменные (*bool*)\n", - "- кортежи (*tuple*)\n", - "- строки (*str*)\n", - "- неизменяемые множества (*frozen set*).\n", - "\n", - "К **изменяемым** (mutable) типам относятся:\n", - "- списки (*list*)\n", - "- множества (*set*)\n", - "- словари (*dict*)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "rMEig-G9nRHM" - }, - "source": [ - "### Неизменяемые типы\n", - "\n", - "Неизменяемость типа данных означает, что созданный объект больше не изменяется.\n", - "При изменении значения происходит создание нового объекта, на который теперь будет ссылаться переменная." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "2fNDSEDPnRHO", - "outputId": "36cd1687-3702-44cf-e7df-f087b85ac6aa" - }, - "outputs": [], - "source": [ - "a = 2\n", - "print(id(a))\n", - "\n", - "a = 4\n", - "print(id(a))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "j46-f4ibnRHV" - }, - "source": [ - "Если выполнить операцию присваивания\n", - "\n", - "`a = b`\n", - "\n", - "то переменная `a` будет ссылаться на тот же объект, что и переменная `b`.\n", - "\n", - "Узнать, ссылаются ли переменные на один и тот же объект, можно при помощи операторов тождественности:\n", - "\n", - "* `is`\n", - "* `is not`\n", - "\n", - "![Пример адресации переменных неизменяемых типов](02/02-01.png)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "M0XLS-XcnRHX", - "outputId": "431b3e62-481a-499b-fde6-b88d25339bb3" - }, - "outputs": [], - "source": [ - "a = 16\n", - "print('id(a) = ', id(a))\n", - "\n", - "b = 2.2\n", - "print('id(b) = ', id(b))\n", - "\n", - "a = b\n", - "\n", - "print('id(a) = ', id(a))\n", - "print(a is b)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "UWHsKNrp89xX" - }, - "source": [ - "Так как строки - также неизменяемые объекты, при попытке изменить какой-нибудь символ в строке произойдет ошибка:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 180 - }, - "colab_type": "code", - "executionInfo": { - "elapsed": 1819, - "status": "error", - "timestamp": 1575530835506, - "user": { - "displayName": "Надежда Демиденко", - "photoUrl": "https://lh3.googleusercontent.com/a-/AAuE7mA6D7k5OgtG9hzPe8Abs8DfOKAXQoTXaPfn7EY=s64", - "userId": "05224310221243935536" - }, - "user_tz": -180 - }, - "id": "lvbc7Hsx9IXH", - "outputId": "ce421abf-21a7-498b-efbf-2cfd666f440c" - }, - "outputs": [], - "source": [ - "s = \"абракадабра\"\n", - "s[3] = 'ы'" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "Fp8gCBqvnRHc" - }, - "source": [ - "### Изменяемые типы\n", - "\n", - "Изменяемыми объектами являются списки, множества и словари, и их можно менять:\n", - "\n", - "- Менять элементы\n", - "- Добавлять/удалять элементы\n", - "\n", - "В примере ниже создан список, а потом изменен второй элемент.\n", - "\n", - "В качестве данных списка выступают не объекты, а отношения между объектами. Т.е. в переменной a хранятся ссылки на объекты содержащие числа 1 и 3, а не непосредственно сами эти числа.\n", - "\n", - "![Пример адресации переменных изменяемых типов](02/02-02.png)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "qMz0niUSnRHe", - "outputId": "8b8390f8-cbe7-4b67-ee70-7815b33cfa5b" - }, - "outputs": [], - "source": [ - "# Создаем список\n", - "a = [1, 2]\n", - "\n", - "print(a)\n", - "print('a: ', id(a))\n", - "print('a[1]: ', id(a[1]))\n", - "print()\n", - "\n", - "# Изменяем один элемент\n", - "a[1] = 3\n", - "\n", - "print(a)\n", - "print('a: ', id(a))\n", - "print('a[1]: ', id(a[1]))\n", - "print()\n", - "\n", - "# Добавляем еще один элемент в список\n", - "a.append(4)\n", - "\n", - "print(a)\n", - "print('a: ', id(a))\n" - ] - } - ], - "metadata": { - "colab": { - "name": "topic02.ipynb", - "provenance": [] - }, - "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.7.4" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/lecture_1/03. Strings.ipynb b/lecture_1/03. Strings.ipynb deleted file mode 100644 index 5a6106f..0000000 --- a/lecture_1/03. Strings.ipynb +++ /dev/null @@ -1,886 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "BFdiWhNr6r0G" - }, - "source": [ - "# Работа со строками" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "uYFXI1DQ6r0K" - }, - "source": [ - "Строки в Python - упорядоченные последовательности символов, используемые для хранения и представления текстовой информации.\n", - "\n", - "В Python, начиная с версии 3, все строки являются юникодом.\n", - "\n", - "Строки явлются неизменяемым типом." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "KWnZ9OXX6r0M" - }, - "source": [ - "## Литералы строк\n", - "\n", - "Строки заключают в двойные или одинарные кавычки. Между ними нет разницы, причина наличия двух вариантов в том, чтобы позволить вставлять в литералы строк символы кавычек или апострофов, не используя экранирование." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "G4dTs2aS6r0N", - "outputId": "4551d821-23e5-4aa5-e640-ead3f0c7a308" - }, - "outputs": [], - "source": [ - "s = 'your\"s'\n", - "print(s)\n", - "s = \"your's\"\n", - "print(s)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "P7TZgo5E6r0W" - }, - "source": [ - "Тройные апострофы или кавычки можно использовать для записи многострочных блоков текста. Внутри такой строки возможно присутствие кавычек и апострофов, главное, чтобы не было трех кавычек подряд." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "T8eevX9M6r0Y", - "outputId": "c529db6b-62e8-4c8f-ffa4-9888d7cd1783" - }, - "outputs": [], - "source": [ - "s = '''Это очень большая\n", - "строка, 'многострочный'\n", - "блок текста'''\n", - "print(s)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "Gx854F6e6r0e" - }, - "source": [ - "### Экранированные последовательности - служебные символы\n", - "\n", - "`\\` - экранирование следующего символа\\\n", - "`\\n` - Новая строка\\\n", - "`\\a` - Сигнал BIOS\\\n", - "`\\b` - Backspace\\\n", - "`\\r` - Возврат каретки\\\n", - "`\\t` - Горизонтальная табуляция\\\n", - "`\\v` - Вертикальная табуляция\\\n", - "`\\uhhhh` - 16-битовый символ Юникода в 16-ричном представлении\\\n", - "`\\xhh` - 16-ричное значение символа\\\n", - "`\\ooo` - 8-ричное значение символа\\\n", - "`\\0` - Символ Null (не является признаком конца строки)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "N30enGHm6r0g", - "outputId": "56879859-f225-4cba-e79b-0adeeede903d" - }, - "outputs": [], - "source": [ - "print('aa\\nbb')\n", - "print('aa\\bbb')\n", - "print('aa\\tbb')\n", - "print('\\u00A9')\n", - "print('\\154')" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "rNAzFO0B6r0m" - }, - "source": [ - "### \"Сырые\" строки\n", - "\n", - "Если перед открывающей кавычкой стоит символ 'r' (в любом регистре), то механизм экранирования отключается.\n", - "\n", - "Но, несмотря на назначение, \"сырая\" строка не может заканчиваться символом обратного слэша." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "UjvATtvO6r0o", - "outputId": "a4c21be4-a802-4519-a621-f46619f2f288" - }, - "outputs": [], - "source": [ - "s = r'C:\\newt.txt'\n", - "print(s)\n", - "\n", - "# Если нужен \\ в конце строки:\n", - "\n", - "s = r'\\n\\n\\\\'[:-1]\n", - "print(s)\n", - "s = r'\\n\\n' + '\\\\'\n", - "print(s)\n", - "s = '\\\\n\\\\n\\\\'\n", - "print(s)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "-ktZP5fOt3yu" - }, - "source": [ - "### Форматирование строк\n", - "\n", - "Существует несколько более удобных способов форматирования строк, чем простая конкатенация." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "T0YPDJltt5JG" - }, - "source": [ - "#### Оператор `%`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 51 - }, - "colab_type": "code", - "executionInfo": { - "elapsed": 1918, - "status": "ok", - "timestamp": 1575276473682, - "user": { - "displayName": "Надежда Демиденко", - "photoUrl": "https://lh3.googleusercontent.com/a-/AAuE7mA6D7k5OgtG9hzPe8Abs8DfOKAXQoTXaPfn7EY=s64", - "userId": "05224310221243935536" - }, - "user_tz": -180 - }, - "id": "IKAFxGH6w4Zb", - "outputId": "197bf9f5-96c4-48a5-ecb7-545a46a06383" - }, - "outputs": [], - "source": [ - "# Подстановка одного оператора\n", - "name = 'Vasya'\n", - "print('Hello, %s!' % name)\n", - "\n", - "# А если несколько, то значением будет являться кортеж со строками подстановки:\n", - "print('%d %s, %d %s' % (6, 'bananas', 10, 'lemons'))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "Omjyy7ZqzL4O" - }, - "source": [ - "Спецификаторы преобразования записываются в следующем порядке:\n", - "\n", - "1. %.\n", - "2. Ключ (опционально), определяет, какой аргумент из значения будет подставляться.\n", - "3. Флаги преобразования.\n", - "4. Минимальная ширина поля. Если *, значение берётся из кортежа.\n", - "5. Точность, начинается с '.', затем - желаемая точность.\n", - "6. Модификатор длины (опционально).\n", - "7. Тип.\n", - "\n", - "Возможные типы представлены в таблице ниже:\n", - "\n", - "|Тип|Значение|\n", - "|---|:---|\n", - "|`%d`, `%i`, `%u`|Десятичное число|\n", - "|`%o`|Число в восьмеричной системе счисления|\n", - "|`%x`|Число в шестнадцатеричной системе счисления (буквы в нижнем регистре)|\n", - "|`%X`|Число в шестнадцатеричной системе счисления (буквы в верхнем регистре)|\n", - "|`%e`|Число с плавающей точкой с экспонентой (экспонента в нижнем регистре)|\n", - "|`%E`|Число с плавающей точкой с экспонентой (экспонента в верхнем регистре)|\n", - "|`%f`, `%F`|Число с плавающей точкой (обычный формат)|\n", - "|`%g`|Число с плавающей точкой. с экспонентой (экспонента в нижнем регистре), если она меньше, чем -4 или точности, иначе обычный формат|\n", - "|`%G`|Число с плавающей точкой. с экспонентой (экспонента в верхнем регистре), если она меньше, чем -4 или точности, иначе обычный формат|\n", - "|`%r`|Строка (литерал python)|\n", - "|`%s`|Строка (как обычно воспринимается пользователем)|\n", - "|`%%`|Знак `%`|\n", - "\n", - "Флаги преобразования:\n", - "\n", - "|Флаг|Значение|\n", - "|---|:---|\n", - "|`#`|Значение будет использовать альтернативную форму|\n", - "|`0`|Свободное место будет заполнено нулями|\n", - "|`-`|Свободное место будет заполнено пробелами справа|\n", - "|` ` (пробел)|Свободное место будет заполнено пробелами справа|\n", - "|`+`|Свободное место будет заполнено пробелами слева|" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 136 - }, - "colab_type": "code", - "executionInfo": { - "elapsed": 1457, - "status": "ok", - "timestamp": 1575277126575, - "user": { - "displayName": "Надежда Демиденко", - "photoUrl": "https://lh3.googleusercontent.com/a-/AAuE7mA6D7k5OgtG9hzPe8Abs8DfOKAXQoTXaPfn7EY=s64", - "userId": "05224310221243935536" - }, - "user_tz": -180 - }, - "id": "NBvmPVmV1Gxy", - "outputId": "ec0b1790-d510-4144-eaee-fdd72a5ae916" - }, - "outputs": [], - "source": [ - "print ('%(language)s has %(number)03d quote types.' % {\"language\": \"Python\", \"number\": 2})\n", - "\n", - "print('%.2s' % 'Hello!')\n", - "print('%.*s' % (2, 'Hello!'))\n", - "print('%-10d' % 25)\n", - "print('%+10f' % 25)\n", - "print('+25.000000')\n", - "print('%+10s' % 'Hello')" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "bRGQz2J89FXT" - }, - "source": [ - "#### Метод **format**" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 136 - }, - "colab_type": "code", - "executionInfo": { - "elapsed": 1315, - "status": "ok", - "timestamp": 1575279818764, - "user": { - "displayName": "Надежда Демиденко", - "photoUrl": "https://lh3.googleusercontent.com/a-/AAuE7mA6D7k5OgtG9hzPe8Abs8DfOKAXQoTXaPfn7EY=s64", - "userId": "05224310221243935536" - }, - "user_tz": -180 - }, - "id": "xyN98bDL9DvY", - "outputId": "76910550-2d50-4faa-d035-90e32f00d3e7" - }, - "outputs": [], - "source": [ - "name = 'Vasya'\n", - "print('Hello, {}!'.format(name))\n", - "\n", - "print('{0}, {1}, {2}'.format('a', 'b', 'c'))\n", - "print('{}, {}, {}'.format('a', 'b', 'c'))\n", - "print('{2}, {1}, {0}'.format('a', 'b', 'c'))\n", - "print('{2}, {1}, {0}'.format(*'abc'))\n", - "\n", - "print('Coordinates: {latitude}, {longitude}'.format(latitude='37.24N', longitude='-115.81W'))\n", - "\n", - "coord = {'latitude': '37.24N', 'longitude': '-115.81W'}\n", - "print('Coordinates: {latitude}, {longitude}'.format(**coord))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "ks1w757EA03H" - }, - "source": [ - "Синтаксис метода format:\n", - "\n", - "|||\n", - "|---|---|\n", - "|поле замены |`\"{\" [имя поля] [\"!\" преобразование] [\":\" спецификация] \"}\"`|\n", - "|имя поля|`arg_name (\".\" имя атрибута \\| \"[\" индекс \"]\")*`|\n", - "|преобразование|`\"r\" (внутреннее представление) \\| \"s\" (человеческое представление)`|\n", - "|спецификация|см. таблица ниже|\n", - "\n", - "Спецификация формата\n", - "\n", - "|||\n", - "|---|:---|\n", - "|спецификация|`[[fill]align][sign][#][0][width][,][.precision][type]`|\n", - "|заполнитель|символ кроме `{` или `}`|\n", - "|выравнивание|\"<\" \\| \">\" \\| \"=\" \\| \"^\"|\n", - "|знак|\"+\" \\| \"-\" \\| \" \"|\n", - "|ширина|integer|\n", - "|точность|integer|\n", - "|тип|\"b\" \\| \"c\" \\| \"d\" \\| \"e\" \\| \"E\" \\| \"f\" \\| \"F\" \\| \"g\" \\| \"G\" \\| \"n\" \\| \"o\" \\| \"s\" \\| \"x\" \\| \"X\" \\| \"%\"|\n", - "\n", - "Выравнивание производится при помощи символа-заполнителя. Доступны следующие варианты выравнивания:\n", - "\n", - "|Флаг|Значение|\n", - "|---|:---|\n", - "|`<`|Символы-заполнители будут справа (выравнивание объекта по левому краю) (по умолчанию)|\n", - "|`>`|выравнивание объекта по правому краю|\n", - "|`=`|Заполнитель будет после знака, но перед цифрами. Работает только с числовыми типами|\n", - "|`^`|Выравнивание по центру|\n", - "\n", - "Опция \"знак\" используется только для чисел и может принимать следующие значения:\n", - "\n", - "|Флаг|Значение|\n", - "|---|:---|\n", - "|`+`|Знак должен быть использован для всех чисел|\n", - "|`-`|'-' для отрицательных, ничего для положительных|\n", - "|'Пробел'|'-' для отрицательных, пробел для положительных|\n", - "\n", - "Поле \"тип\" может принимать следующие значения:\n", - "\n", - "|Тип|Значение|\n", - "|---|:---|\n", - "|`d`, `i`, `u`|Десятичное число|\n", - "|`o`|Число в восьмеричной системе счисления|\n", - "|`x`|Число в шестнадцатеричной системе счисления (буквы в нижнем регистре)|\n", - "|`X`|Число в шестнадцатеричной системе счисления (буквы в верхнем регистре)|\n", - "|`e`|Число с плавающей точкой с экспонентой (экспонента в нижнем регистре)|\n", - "|`E`|Число с плавающей точкой с экспонентой (экспонента в верхнем регистре)|\n", - "|`f`, `F`|Число с плавающей точкой (обычный формат)|\n", - "|`g`|Число с плавающей точкой. с экспонентой (экспонента в нижнем регистре), если она меньше, чем -4 или точности, иначе обычный формат|\n", - "|`G`|Число с плавающей точкой. с экспонентой (экспонента в верхнем регистре), если она меньше, чем -4 или точности, иначе обычный формат|\n", - "|`c`|Символ (строка из одного символа или число - код символа)|\n", - "|`s`|Строка|\n", - "|`%`|Число умножается на 100, отображается число с плавающей точкой, а за ним знак %|\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 85 - }, - "colab_type": "code", - "executionInfo": { - "elapsed": 1087, - "status": "ok", - "timestamp": 1575281946261, - "user": { - "displayName": "Надежда Демиденко", - "photoUrl": "https://lh3.googleusercontent.com/a-/AAuE7mA6D7k5OgtG9hzPe8Abs8DfOKAXQoTXaPfn7EY=s64", - "userId": "05224310221243935536" - }, - "user_tz": -180 - }, - "id": "2iphdJ8cGWRR", - "outputId": "0ed8e48f-6a62-4a09-9e08-0da340c4914e" - }, - "outputs": [], - "source": [ - "# Несколько примеров\n", - "\n", - "print(\"int: {0:d}; hex: {0:x}; oct: {0:o}; bin: {0:b}\".format(42))\n", - "\n", - "points = 19.5\n", - "total = 22\n", - "print('Correct answers: {:.2%}'.format(points/total))\n", - "\n", - "print('{:^30}'.format('centered'))\n", - "print('{:*^30}'.format('centered'))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "KDDNupK4X-_n" - }, - "source": [ - "#### F-строки\n", - "\n", - "С версии Python 3.6 появился новый способ: f-строки. F-строки предоставляют способ встраивания выражений внутри строковых литералов с минимальным синтаксисом. Стоит обратить внимание на то, что f-строка является выражением, которое оценивается по мере выполнения, а не постоянным значением. \n", - "\n", - "В исходном коде Python f-строки является литеральной строкой с префиксом f, которая содержит выражения внутри скобок. Выражения заменяются их значением." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 102 - }, - "colab_type": "code", - "executionInfo": { - "elapsed": 642, - "status": "ok", - "timestamp": 1575236533893, - "user": { - "displayName": "Надежда Демиденко", - "photoUrl": "https://lh3.googleusercontent.com/a-/AAuE7mA6D7k5OgtG9hzPe8Abs8DfOKAXQoTXaPfn7EY=s64", - "userId": "05224310221243935536" - }, - "user_tz": -180 - }, - "id": "xtRKhnsMYouR", - "outputId": "d5b06b08-1421-4d8b-b5d0-485245317d17" - }, - "outputs": [], - "source": [ - "name = \"Eric Idle\"\n", - "age = 74\n", - "profession = \"comedian\"\n", - "affiliation = \"Monty Python\"\n", - "\n", - "# Переменные \n", - "print(f\"Hello, {name}. You are {age}.\")\n", - "print(F\"Hello, {name}. You are {age}.\")\n", - "\n", - "# Произвольные выражения\n", - "print(f\"{2 * 37}\")\n", - "\n", - "# Вызов функций\n", - "print(f\"{name.lower()} is funny.\")\n", - "\n", - "# Многострочные f-strings\n", - "message = (\n", - " f\"Hi {name}. \"\n", - " f\"You are a {profession}. \"\n", - " f\"You were in {affiliation}.\"\n", - ")\n", - " \n", - "print(message)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 85 - }, - "colab_type": "code", - "executionInfo": { - "elapsed": 1333, - "status": "ok", - "timestamp": 1575282366784, - "user": { - "displayName": "Надежда Демиденко", - "photoUrl": "https://lh3.googleusercontent.com/a-/AAuE7mA6D7k5OgtG9hzPe8Abs8DfOKAXQoTXaPfn7EY=s64", - "userId": "05224310221243935536" - }, - "user_tz": -180 - }, - "id": "qL7pczoXJA9Z", - "outputId": "69c3ed93-074b-48c2-bd8d-01f418c80f7a" - }, - "outputs": [], - "source": [ - "# После двоеточия в f-строках можно указывать те же значения, что и при использовании format:\n", - "\n", - "oct1, oct2, oct3, oct4 = [10, 1, 1, 1]\n", - "print(f'''\n", - " IP address:\n", - " {oct1:<8} {oct2:<8} {oct3:<8} {oct4:<8}\n", - " {oct1:08b} {oct2:08b} {oct3:08b} {oct4:08b}''')" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "-C9W60c46r0t" - }, - "source": [ - "## Функции и методы работы со строками" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "k9nIMFL56r0x" - }, - "source": [ - "### Базовые методы" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "kc2BCMQM6r02", - "outputId": "3a6f8293-3022-4956-daf7-c435b178377b" - }, - "outputs": [], - "source": [ - "# Конкатенация (сложение)\n", - "s1 = 'abc'\n", - "s2 = 'def'\n", - "s = s1 + s2\n", - "print(s)\n", - "\n", - "# Дублирование (умножение)\n", - "print(s*3)\n", - "\n", - "# Длина строки\n", - "print(len(s))\n", - "\n", - "# Доступ по индексу (нумерация идет с 0!)\n", - "# Отрицательный индекс означает, что счет будет вестись с конца\n", - "print(s[0])\n", - "print(s[3])\n", - "print(s[-1])\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "Hb30Dq6y6r09" - }, - "source": [ - "Так как строки являются неизменяемым типом, все функции и методы будут создавать новый объект.\n", - "\n", - "Попытка изменить один символ при помощи доступа по индексу приведет к ошибке:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "xZ67zLrU6r0_", - "outputId": "d06a926e-8d86-4dde-9491-94edc13ba9bb", - "scrolled": true - }, - "outputs": [], - "source": [ - "# Неправильно\n", - "s = 'abcdef'\n", - "s[2] = 'Z'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "1l-2ar9L6r1G", - "outputId": "10bcdaaa-145d-4574-a86e-51953623a70e", - "scrolled": true - }, - "outputs": [], - "source": [ - "# Правильно\n", - "s = 'abcdef'\n", - "s = s[:2] + 'Z' + s[3:]\n", - "print(s)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "8CEqhN5W6r1O" - }, - "source": [ - "### Срез\n", - "\n", - "Срез возвращает подстроку.\n", - "\n", - "Оператор извлечения среза: `[Start:Stop]`. Start – начало среза, а Stop – окончание;\n", - "\n", - "Символ с номером Stop в срез не входит. По умолчанию первый индекс равен 0, а второй - длине строки." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "QHBUuxNV6r1Q", - "outputId": "a7e71319-94d7-4b78-9541-b1baafc57b3a" - }, - "outputs": [], - "source": [ - "s = 'abcdef'\n", - "\n", - "print('3:5 ', s[3:5])\n", - "print('2:-2', s[2:-2])\n", - "print(' :4 ', s[:4])\n", - "print('1: ', s[1:])\n", - "print(' : ', s[:])" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "AeUK_5-z6r1a" - }, - "source": [ - "Кроме того, можно задать шаг, с которым нужно извлекать срез: `[Start:Stop:Step]`.\n", - "\n", - "Отрицательное значение шага будет означать, что строка будет пройдена в обратном направлении." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "QExj_NSq6r1d", - "outputId": "0b74cece-fb66-4455-bcd1-dab9c93b37e5", - "scrolled": true - }, - "outputs": [], - "source": [ - "s = 'abcdef'\n", - "\n", - "print(' : :-1', s[::-1])\n", - "print('3:5:-1', s[3:5:-1])\n", - "print('5:3:-1', s[5:3:-1])\n", - "print('1: : 2', s[1::2])" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "HeYsPyDL6r1n" - }, - "source": [ - "### Прочие функции\n", - "\n", - "|Функция|Назначение|\n", - "|---|:---|\n", - "|`S.find(str, [start],[end])`|Поиск подстроки в строке. Возвращает номер первого вхождения или -1|\n", - "|`S.rfind(str, [start],[end])`|Поиск подстроки в строке. Возвращает номер последнего вхождения или -1|\n", - "|`S.index(str, [start],[end])`|Поиск подстроки в строке. Возвращает номер первого вхождения или вызывает ValueError|\n", - "|`S.rindex(str, [start],[end])`|Поиск подстроки в строке. Возвращает номер последнего вхождения или вызывает ValueError|\n", - "|`S.replace(шаблон, замена)`|Замена шаблона|\n", - "|`S.split(символ)`|Разбиение строки по разделителю|\n", - "|`S.isdigit()`|Состоит ли строка из цифр|\n", - "|`S.isalpha()`|Состоит ли строка из букв|\n", - "|`S.isalnum()`|Состоит ли строка из цифр или букв|\n", - "|`S.islower()`|Состоит ли строка из символов в нижнем регистре|\n", - "|`S.isupper()`|Состоит ли строка из символов в верхнем регистре|\n", - "|`S.isspace()`|Состоит ли строка из неотображаемых символов (пробел, символ перевода страницы (`\\f`), \"новая строка\" (`\\n`), \"перевод каретки\" (`\\r`), \"горизонтальная табуляция\" (`\\t`) и \"вертикальная табуляция\" (`\\v`))|\n", - "|`S.istitle()`|Начинаются ли слова в строке с заглавной буквы|\n", - "|`S.upper()`|Преобразование строки к верхнему регистру|\n", - "|`S.lower()`|Преобразование строки к нижнему регистру|\n", - "|`S.startswith(str)`|Начинается ли строка S с шаблона str|\n", - "|`S.endswith(str)`|Заканчивается ли строка S шаблоном str|\n", - "|`S.join(список)`|Сборка строки из списка с разделителем S|\n", - "|`ord(символ)`|Символ в его код ASCII|\n", - "|`chr(число)`|Код ASCII в символ|\n", - "|`S.capitalize()`|Переводит первый символ строки в верхний регистр, а все остальные в нижний|\n", - "|`S.center(width, [fill])`|Возвращает отцентрованную строку, по краям которой стоит символ fill (пробел по умолчанию)|\n", - "|`S.count(str, [start],[end])`|Возвращает количество непересекающихся вхождений подстроки в диапазоне [начало, конец] (0 и длина строки по умолчанию)|\n", - "|`S.expandtabs([tabsize])`|Возвращает копию строки, в которой все символы табуляции заменяются одним или несколькими пробелами, в зависимости от текущего столбца. Если TabSize не указан, размер табуляции полагается равным 8 пробелам|\n", - "|`S.lstrip([chars])`|Удаление пробельных символов в начале строки|\n", - "|`S.rstrip([chars])`|Удаление пробельных символов в конце строки|\n", - "|`S.strip([chars])`|Удаление пробельных символов в начале и в конце строки|\n", - "|`S.partition(шаблон)`|Возвращает кортеж, содержащий часть перед первым шаблоном, сам шаблон, и часть после шаблона. Если шаблон не найден, возвращается кортеж, содержащий саму строку, а затем две пустых строки|\n", - "|`S.rpartition(sep)`|Возвращает кортеж, содержащий часть перед последним шаблоном, сам шаблон, и часть после шаблона. Если шаблон не найден, возвращается кортеж, содержащий две пустых строки, а затем саму строку|\n", - "|`S.swapcase()`|Переводит символы нижнего регистра в верхний, а верхнего – в нижний|\n", - "|`S.title()`|Первую букву каждого слова переводит в верхний регистр, а все остальные в нижний|\n", - "|`S.zfill(width)`|Делает длину строки не меньшей width, по необходимости заполняя первые символы нулями|\n", - "|`S.ljust(width, fillchar=\" \")`|Делает длину строки не меньшей width, по необходимости заполняя последние символы символом fillchar|\n", - "|`S.rjust(width, fillchar=\" \")`|Делает длину строки не меньшей width, по необходимости заполняя первые символы символом fillchar|\n", - "|`S.format(*args, **kwargs)`|Форматирование строки|" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 136 - }, - "colab_type": "code", - "executionInfo": { - "elapsed": 1646, - "status": "ok", - "timestamp": 1575283586234, - "user": { - "displayName": "Надежда Демиденко", - "photoUrl": "https://lh3.googleusercontent.com/a-/AAuE7mA6D7k5OgtG9hzPe8Abs8DfOKAXQoTXaPfn7EY=s64", - "userId": "05224310221243935536" - }, - "user_tz": -180 - }, - "id": "6-nl8p6r6r1r", - "outputId": "7ce6bbc8-57c5-496a-f4b6-64a2a3885ba2" - }, - "outputs": [], - "source": [ - "# Некоторые примеры функций работы со строками\n", - "\n", - "# Метод split\n", - "\n", - "s = 'abcdef abcba aaa'\n", - "# Если разделитель не указан, выполняется разбитие по пробелу\n", - "print(s.split())\n", - "print(s.split('c'))\n", - "# в параметре maxsplit указывается максимальное количество разбиений. По умолчанию -1, то есть без ограничений\n", - "print(s.split('c', maxsplit=1))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "ZM5b-svROG2a" - }, - "outputs": [], - "source": [ - "# Метод join\n", - "\n", - "# возвращается строка, полученная соединением элементов переданного списка в одну строку, \n", - "# при этом между элементами списка вставляется разделитель, равный той строке, к которой применяется метод.\n", - "\n", - "a = ['red', 'green', 'blue']\n", - "print(' '.join(a))\n", - "print(''.join(a))\n", - "print('***'.join(a))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 51 - }, - "colab_type": "code", - "executionInfo": { - "elapsed": 985, - "status": "ok", - "timestamp": 1575283734335, - "user": { - "displayName": "Надежда Демиденко", - "photoUrl": "https://lh3.googleusercontent.com/a-/AAuE7mA6D7k5OgtG9hzPe8Abs8DfOKAXQoTXaPfn7EY=s64", - "userId": "05224310221243935536" - }, - "user_tz": -180 - }, - "id": "dNcC7T93OSdY", - "outputId": "99900bf1-c683-4b72-c7cb-61c5dee521ab" - }, - "outputs": [], - "source": [ - "# Метод replace\n", - "s = 'abcabcbabc'\n", - "print(s.replace('c','Z'))\n", - "# третьим параметром может стоять количество замен (от начала строки)\n", - "print(s.replace('c','Z', 2))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "RUQn37EgmgIT" - }, - "source": [ - "# Задачи для практики\n", - "\n", - "- В строке заменить пробелы звездочкой. Если встречается подряд несколько пробелов, то их следует заменить одним знаком \"*\", пробелы в начале и конце строки удалить.\n", - "- В строке найти все слова, в которых содержится заданная подстрока, и вывести эти слова целиком." - ] - } - ], - "metadata": { - "colab": { - "name": "topic03.ipynb", - "provenance": [] - }, - "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.7.4" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/lecture_1/04. Iterators.ipynb b/lecture_1/04. Iterators.ipynb deleted file mode 100644 index 459fc52..0000000 --- a/lecture_1/04. Iterators.ipynb +++ /dev/null @@ -1,1150 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "vjOw806ePGYf" - }, - "source": [ - "# Работа с итерируемыми коллекциями\n", - "\n", - "Коллекция в Python — программный объект (переменная-контейнер), хранящая набор значений одного или различных типов, позволяющий обращаться к этим значениям, а также применять специальные функции и методы, зависящие от типа коллекции." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "6jFHTx2BPGYh" - }, - "source": [ - "## Классификация коллекций\n", - "\n", - "![Классификация коллекций](04/04-00.png)\n", - "\n", - "**Индексированность** – каждый элемент коллекции имеет свой порядковый номер — индекс. Это позволяет обращаться к элементу по его порядковому индексу, проводить слайсинг («нарезку») — брать часть коллекции выбирая исходя из их индекса. Детально эти вопросы будут рассмотрены в дальнейшем в отдельной статье.\n", - "\n", - "**Уникальность** – каждый элемент коллекции может встречаться в ней только один раз. Это порождает требование неизменности используемых типов данных для каждого элемента, например, таким элементом не может быть список.\n", - "\n", - "**Изменяемость коллекции** — позволяет добавлять в коллекцию новых членов или удалять их после создания коллекции." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "0FR4kfQ6PGYi", - "outputId": "2d58c51e-d551-4dc1-c7ab-a32666ffd851" - }, - "outputs": [], - "source": [ - "# Лист (list)\n", - "a = []\n", - "print(type(a))\n", - "\n", - "# Кортеж (tuple)\n", - "a = ()\n", - "print(type(a))\n", - "\n", - "# Множество (set)\n", - "a = {10, 20}\n", - "print(type(a))\n", - "\n", - "# Неизменное множество (frozenset)\n", - "a = frozenset()\n", - "print(type(a))\n", - "\n", - "# Словарь (dict)\n", - "a = {'a': 1, 'b':2}\n", - "print(type(a))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "YbHTzkBcPGYk" - }, - "source": [ - "В зависимости от стоящих задач, один тип коллекции можно конвертировать в другой тип коллекции. Для этого, как правило достаточно передать одну коллекцию в функцию создания другой.\n", - "\n", - "При преобразовании одной коллекции в другую возможна потеря данных:\n", - "\n", - "- При преобразовании в множество теряются дублирующие элементы, так как множество содержит только уникальные элементы. Проверка на уникальность, обычно и является причиной использовать множество в задачах, где у нас есть в этом потребность.\n", - "- При конвертации индексированной коллекции в неиндексированную теряется информация о порядке элементов." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "T0vPrg3APGYl", - "outputId": "ad6692b0-3d8b-43de-fc6c-80b4df6e57d4" - }, - "outputs": [], - "source": [ - "my_tuple = ('a', 'b', 'a')\n", - "\n", - "my_list = list(my_tuple)\n", - "my_set = set(my_tuple) # теряем индексы и дубликаты элементов\n", - "my_frozenset = frozenset(my_tuple) # теряем индексы и дубликаты элементов\n", - "\n", - "print(my_list, my_set, my_frozenset)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "mqr3Q4VjPGYn" - }, - "source": [ - "## Списки\n", - "\n", - "Со списками возможны следующие действия:\n", - "\n", - "- Печать элементов: `print()`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 34 - }, - "colab_type": "code", - "executionInfo": { - "elapsed": 2503, - "status": "ok", - "timestamp": 1575285065201, - "user": { - "displayName": "Надежда Демиденко", - "photoUrl": "https://lh3.googleusercontent.com/a-/AAuE7mA6D7k5OgtG9hzPe8Abs8DfOKAXQoTXaPfn7EY=s64", - "userId": "05224310221243935536" - }, - "user_tz": -180 - }, - "id": "RNUpqiFsPGYo", - "outputId": "2b47c7a6-948e-45e3-8080-f8641053c361" - }, - "outputs": [], - "source": [ - "my_list = ['a', 'b', 'c', 'd', 'e', 'f']\n", - "print(my_list)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "RKG4g4vrPGYp" - }, - "source": [ - "- Подсчет количества элементов: `len()`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 34 - }, - "colab_type": "code", - "executionInfo": { - "elapsed": 2632, - "status": "ok", - "timestamp": 1575285084438, - "user": { - "displayName": "Надежда Демиденко", - "photoUrl": "https://lh3.googleusercontent.com/a-/AAuE7mA6D7k5OgtG9hzPe8Abs8DfOKAXQoTXaPfn7EY=s64", - "userId": "05224310221243935536" - }, - "user_tz": -180 - }, - "id": "XC0IkQGvPGYq", - "outputId": "7e883c99-b523-4ce9-f627-9e96bc92bbaa" - }, - "outputs": [], - "source": [ - "my_list = ['a', 'b', 'c', 'd', 'e', 'f']\n", - "print(len(my_list))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "L3GPNy6ePGYt" - }, - "source": [ - "- Проверка принадлежности элемента данной коллекции: операторы `in`, `not in`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 85 - }, - "colab_type": "code", - "executionInfo": { - "elapsed": 907, - "status": "ok", - "timestamp": 1575285122229, - "user": { - "displayName": "Надежда Демиденко", - "photoUrl": "https://lh3.googleusercontent.com/a-/AAuE7mA6D7k5OgtG9hzPe8Abs8DfOKAXQoTXaPfn7EY=s64", - "userId": "05224310221243935536" - }, - "user_tz": -180 - }, - "id": "5tisZa3WPGYu", - "outputId": "de87cf45-424f-4e66-877d-f2627e6f4255" - }, - "outputs": [], - "source": [ - "my_list = ['a', 'b', 'c', 'd', 'e', 'f']\n", - "\n", - "print('a' in my_list)\n", - "print('q' in my_list)\n", - "print('a' not in my_list)\n", - "print('q' not in my_list) #поиск подстроки в строке" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "8Y1pQ8kIPGYw" - }, - "source": [ - "- Обход всех элементов в цикле: `for in`\n", - "\n", - "В цикле будут последовательно перебираться элементы коллекции, пока не будут перебраны все из них.\n", - "\n", - "Порядок обработки элементов для не индексированных коллекций будет не тот, как при их создании.\n", - "\n", - "**Не меняйте количество элементов коллекции в теле цикла во время итерации по этой же коллекции!** — Это порождает не всегда очевидные на первый взгляд ошибки." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 119 - }, - "colab_type": "code", - "executionInfo": { - "elapsed": 1063, - "status": "ok", - "timestamp": 1575285148500, - "user": { - "displayName": "Надежда Демиденко", - "photoUrl": "https://lh3.googleusercontent.com/a-/AAuE7mA6D7k5OgtG9hzPe8Abs8DfOKAXQoTXaPfn7EY=s64", - "userId": "05224310221243935536" - }, - "user_tz": -180 - }, - "id": "jBf8pbg5PGYw", - "outputId": "015c023a-295c-4aaf-c170-db6ecf39904f" - }, - "outputs": [], - "source": [ - "my_list = ['a', 'b', 'c', 'd', 'e', 'f']\n", - "my_dict = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6}\n", - "\n", - "for elem in my_list:\n", - " print(elem)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "hZcFKCePWt8f" - }, - "source": [ - "- Функция `enumerate()`\n", - "\n", - "Встроенная функция `enumerate()` создает объект, который генерирует кортежи, состоящие из двух элементов - индекса элемента и самого элемента.\n", - "\n", - "Функция `enumerate()` используется для упрощения прохода по коллекциям в цикле, когда кроме самих элементов требуется их индекс." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 153 - }, - "colab_type": "code", - "executionInfo": { - "elapsed": 627, - "status": "ok", - "timestamp": 1575622333369, - "user": { - "displayName": "Надежда Демиденко", - "photoUrl": "https://lh3.googleusercontent.com/a-/AAuE7mA6D7k5OgtG9hzPe8Abs8DfOKAXQoTXaPfn7EY=s64", - "userId": "05224310221243935536" - }, - "user_tz": -180 - }, - "id": "cjuqtRatV2CA", - "outputId": "1a7560fc-3bf6-4070-cbf9-df6d0e99fd0c" - }, - "outputs": [], - "source": [ - "a = [10, 20, 30, 40]\n", - "for i in enumerate(a):\n", - " print(i)\n", - " \n", - "for id, item in enumerate(a):\n", - " a[id] = item + 5\n", - " print(a[id])" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "ZNAe7-bJPGYy" - }, - "source": [ - "- Функции `min()`, `max()`, `sum()`\n", - "\n", - "Функции `min()`, `max()` — поиск минимального и максимального элемента соответственно — работают не только для числовых, но и для строковых значений.\n", - "\n", - "`sum()` — суммирование всех элементов, если они все числовые." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 34 - }, - "colab_type": "code", - "executionInfo": { - "elapsed": 662, - "status": "ok", - "timestamp": 1575285169105, - "user": { - "displayName": "Надежда Демиденко", - "photoUrl": "https://lh3.googleusercontent.com/a-/AAuE7mA6D7k5OgtG9hzPe8Abs8DfOKAXQoTXaPfn7EY=s64", - "userId": "05224310221243935536" - }, - "user_tz": -180 - }, - "id": "c9iiD1yvPGYy", - "outputId": "9edc7f7e-508a-4c5f-854c-6fa9a12d7955" - }, - "outputs": [], - "source": [ - "my_list = ['a', 'b', 'c', 'd', 'e', 'f']\n", - "print(min(my_list))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "0nIZ8IuUPGY0" - }, - "source": [ - "- Функция `sorted()` - сортировка элементов коллекции\n", - "\n", - "Мы может использовать функцию `sorted()` для вывода списка сортированных элементов любой коллекции для последующее обработки или вывода.\n", - "\n", - "1. функция не меняет исходную коллекцию, а возвращает новый список из ее элементов;\n", - "2. независимо от типа исходной коллекции, вернётся список (list) ее элементов;\n", - "3. поскольку она не меняет исходную коллекцию, ее можно применять к неизменяемым коллекциям;\n", - "4. поскольку при сортировке возвращаемых элементов нам не важно, был ли у элемента некий индекс в исходной коллекции, можно применять к неиндексированным коллекциям;\n", - "5. Имеет дополнительные не обязательные аргументы:\n", - " - `reverse = True` - сортировка в обратном порядке\n", - " - `key = funcname` (начиная с Python 2.4) - сортировка с помощью специальной функции funcname" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 68 - }, - "colab_type": "code", - "executionInfo": { - "elapsed": 1124, - "status": "ok", - "timestamp": 1575285198431, - "user": { - "displayName": "Надежда Демиденко", - "photoUrl": "https://lh3.googleusercontent.com/a-/AAuE7mA6D7k5OgtG9hzPe8Abs8DfOKAXQoTXaPfn7EY=s64", - "userId": "05224310221243935536" - }, - "user_tz": -180 - }, - "id": "eJhYRR3qPGY0", - "outputId": "395ad1d4-0113-4356-8e79-676bc198698d" - }, - "outputs": [], - "source": [ - "my_list = [2, 5, 1, 7, 3]\n", - "my_list_sorted = sorted(my_list)\n", - "print(my_list_sorted)\n", - "\n", - "my_set = {2, 5, 1, 7, 3}\n", - "my_set_sorted = sorted(my_set, reverse=True)\n", - "print(my_set_sorted)\n", - "\n", - "# сортировка списка строк по длине len() каждого элемента\n", - "my_files = ['somecat.jpg', 'pc.png', 'apple.bmp', 'mydog.gif']\n", - "my_files_sorted = sorted(my_files, key=len)\n", - "print(my_files_sorted)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "NpI9zoGhPGY2" - }, - "source": [ - "- `.count()` - подсчет определенных элементов для неуникальных коллекций, возвращает сколько раз элемент встречается в коллекции." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "fa7M6O_CPGY3", - "outputId": "8e615fb5-e7dd-4a28-f231-8e5d9591982b" - }, - "outputs": [], - "source": [ - "my_list = [1, 2, 2, 2, 2, 3]\n", - "\n", - "print(my_list.count(2))\n", - "print(my_list.count(5))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "ZrntKDurPGY4" - }, - "source": [ - "- `.index()` - минимальный индекс переданного элемента для индексированных коллекций. Если такого элемента не найдено - ошибка ValueError." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "7qUiE951PGY5", - "outputId": "898f6972-e34c-496e-9840-90cb94676d59" - }, - "outputs": [], - "source": [ - "my_list = [1, 2, 2, 2, 2, 3]\n", - "\n", - "print(my_list.index(2))\n", - "print(my_list.index(5)) # ValueError: 5 is not in list - такого элемента нет в ссписке" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "ds-uw01wPGY6" - }, - "source": [ - "- `.copy()` — неглубокая (не рекурсивная) копия коллекции" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "92RgKL_nPGY7", - "outputId": "76241685-e9fd-4e3d-a0bc-80e17e375db2" - }, - "outputs": [], - "source": [ - "my_set = {1, 2, 3}\n", - "my_set_2 = my_set.copy()\n", - "\n", - "print(my_set_2 == my_set) # коллекции равны - содержат одинаковые значения\n", - "print(my_set_2 is my_set) # коллекции не идентичны - это разные объекты с разными id" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "XcOr3QFoPGY9" - }, - "source": [ - "- `.clear()` — метод изменяемых коллекций, удаляющий из коллекции все элементы и превращающий её в пустую коллекцию." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "4OM3ZF19PGY9", - "outputId": "f4e01454-7b07-4933-fedd-c3f8e54cb428" - }, - "outputs": [], - "source": [ - "my_set = {1, 2, 3}\n", - "print(my_set)\n", - "\n", - "my_set.clear()\n", - "print(my_set)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "jk3nmQVFPGY_" - }, - "source": [ - "- Обращение к элементу\n", - "\n", - "Можно обратиться к элементу по индексу в квадратных скобках (отрицательный индекс означает отсчет с конца)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "nJNxcIllPGZA", - "outputId": "e6b864e7-1817-4a98-8c36-12b328daf17b" - }, - "outputs": [], - "source": [ - "my_list = ['a', 'b', 'c', 'd', 'e', 'f']\n", - "\n", - "print(my_list[0])\n", - "print(my_list[3])\n", - "print(my_list[-1])" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "aGKx62RPPGZB" - }, - "source": [ - "Коллекции могут иметь несколько уровней вложенности, к примеру, список списков. Для перехода на уровень глубже ставится вторая пара квадратных скобок." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "A8XAE_s6PGZD", - "outputId": "86f69974-8531-4c90-acf8-0a7b22fc96bc" - }, - "outputs": [], - "source": [ - "my_2lvl_list = [[1, 2, 3], ['a', 'b', 'c']]\n", - "\n", - "print(my_2lvl_list[0])\n", - "print(my_2lvl_list[0][0])\n", - "print(my_2lvl_list[1][-1])" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "PbxV3yZaPGZE" - }, - "source": [ - "Так как **списки** - изменяемые коллекции, в них можно изменять элементы, обращаясь к ним через индекс.\\\n", - "*Прим.: Для этого элемент уже должен существовать в списке, нельзя таким образом добавить элемент на несуществующий индекс.*" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "GqUxYt8zPGZF", - "outputId": "9ac37287-81e4-4ff7-fa30-02f582831bf5" - }, - "outputs": [], - "source": [ - "my_list = [1, 2, 3, [4, 5]]\n", - "my_list[0] = 10\n", - "my_list[-1][0] = 40\n", - "print(my_list)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "_P6-GsqKPGY2" - }, - "source": [ - "- Добавление и удаление элементов \n", - "\n", - "![Добавление и удаление элементов](04-03.png)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 85 - }, - "colab_type": "code", - "executionInfo": { - "elapsed": 838, - "status": "ok", - "timestamp": 1575287019806, - "user": { - "displayName": "Надежда Демиденко", - "photoUrl": "https://lh3.googleusercontent.com/a-/AAuE7mA6D7k5OgtG9hzPe8Abs8DfOKAXQoTXaPfn7EY=s64", - "userId": "05224310221243935536" - }, - "user_tz": -180 - }, - "id": "t3u83DQUXkVO", - "outputId": "3949112c-943a-43d5-a650-d5f617757fa4" - }, - "outputs": [], - "source": [ - "my_list = [13, 27, 8]\n", - "print(my_list)\n", - "my_list.append(41)\n", - "print(my_list)\n", - "# Удаление по значению\n", - "my_list.remove(27)\n", - "print(my_list)\n", - "# Удаление по индексу\n", - "my_list.pop(1)\n", - "print(my_list)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "Ni6pns0GPGZP" - }, - "source": [ - "Для объединения списков (list) возможны три варианта без изменения исходного списка:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "AiyYEIcBPGZQ", - "outputId": "5eb631a5-672d-45a7-b75e-0831cafd2e39" - }, - "outputs": [], - "source": [ - "# Добавляем все элементы второго списка к элементам первого\n", - "# (аналог метод .extend() но без изменения исходного списка):\n", - "a = [1, 2, 3]\n", - "b = [4, 5]\n", - "c = a + b \n", - "print(a, b, c)\n", - "\n", - "# Добавляем второй список как один элемент без изменения исходного списка\n", - "# (аналог метода.append() но без изменения исходного списка):\n", - "a = [1, 2, 3]\n", - "b = [4, 5]\n", - "c = a + [b]\n", - "print(a, b, c)\n", - "\n", - "# работает на версии питона 3.5 и выше:\n", - "a, b = [1, 2, 3], [4, 5]\n", - "c = [*a, *b]\n", - "print(c)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "S3Oe7r0FZM0A" - }, - "source": [ - "## Кортежи и строки\n", - "\n", - "Кортежи и строки во многом похожи на списки, за одним исключением: они неизменяемые. Соответственно, для них работает всё то же самое, что и для списков, кроме функций, изменяющих коллекцию.\n", - "\n", - "Кортежи работают быстрее, чем списки, поэтому если не нужно менять коллекцию, лучше использовать кортеж или строку." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 204 - }, - "colab_type": "code", - "executionInfo": { - "elapsed": 763, - "status": "ok", - "timestamp": 1575287246656, - "user": { - "displayName": "Надежда Демиденко", - "photoUrl": "https://lh3.googleusercontent.com/a-/AAuE7mA6D7k5OgtG9hzPe8Abs8DfOKAXQoTXaPfn7EY=s64", - "userId": "05224310221243935536" - }, - "user_tz": -180 - }, - "id": "TuVIeCc2Z7Z1", - "outputId": "e0e0a267-74af-4629-e81f-f8b3c793d070" - }, - "outputs": [], - "source": [ - "my_tuple = (3, 2, 4, 1, 5)\n", - "my_string = 'lndskb'\n", - "\n", - "print(my_tuple)\n", - "print(my_tuple[2])\n", - "\n", - "print(my_string[-1])\n", - "\n", - "print(sorted(my_tuple))\n", - "print(sorted(my_string))\n", - "\n", - "for each in my_string:\n", - " print(each)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "T4lLLzN6PGZN" - }, - "source": [ - "Объединение строк (string) и кортежей (tuple) возможна с использованием оператора сложения «+»" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "2uH-ZNYuPGZN", - "outputId": "1b28443e-d604-49d1-b1b6-7207ab727232" - }, - "outputs": [], - "source": [ - "str1 = 'abc'\n", - "str2 = 'de'\n", - "str3 = str1 + str2\n", - "print(str3)\n", - "\n", - "tuple1 = (1, 2, 3)\n", - "tuple2 = (4, 5)\n", - "tuple3 = tuple1 + tuple2\n", - "print(tuple3)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "IYxrrT5zcqR3" - }, - "source": [ - "## Словари и множества\n", - "\n", - "Множество (set) – неупорядоченная коллекция из уникальных (неповторяющихся) элементов. Элементы множества в Python должны быть немутабельны (неизменяемы), хотя само содержимое множества может меняться: можно добавлять и удалять элементы из множества.\n", - "\n", - "Словарь (dictionary) — это ассоциативный массив или хеш. Это неупорядоченное множество пар `ключ: значение` с требованием уникальности ключей. \n", - "\n", - "Внутри множества тоже реализованы как хэш-таблицы, в которых есть только ключи без значений и добавлены некоторые оптимизации, которые используют отсутствие значений." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 214 - }, - "colab_type": "code", - "executionInfo": { - "elapsed": 719, - "status": "error", - "timestamp": 1575288952985, - "user": { - "displayName": "Надежда Демиденко", - "photoUrl": "https://lh3.googleusercontent.com/a-/AAuE7mA6D7k5OgtG9hzPe8Abs8DfOKAXQoTXaPfn7EY=s64", - "userId": "05224310221243935536" - }, - "user_tz": -180 - }, - "id": "OsSXRtkge8FH", - "outputId": "3fb2815d-9457-4bfa-90dc-75f32735ee65" - }, - "outputs": [], - "source": [ - "# Создание множества\n", - "my_set = set() # пустое множество\n", - "my_set = {1, 2, 3, 4}\n", - "\n", - "my_hetero_set = {\"abc\", 3.14, (10, 20)} # можно с кортежем\n", - "\n", - "my_invalid_set = {\"abc\", 3.14, [10, 20]} # нельзя со списком, так как он нехешируемый" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 51 - }, - "colab_type": "code", - "executionInfo": { - "elapsed": 649, - "status": "ok", - "timestamp": 1575288896503, - "user": { - "displayName": "Надежда Демиденко", - "photoUrl": "https://lh3.googleusercontent.com/a-/AAuE7mA6D7k5OgtG9hzPe8Abs8DfOKAXQoTXaPfn7EY=s64", - "userId": "05224310221243935536" - }, - "user_tz": -180 - }, - "id": "3vQWag4RhwDQ", - "outputId": "adc7d5c2-5c36-4fc4-ac5c-3fd5e1b8c5a7" - }, - "outputs": [], - "source": [ - "# Создание словаря\n", - "\n", - "my_dict1 = {} # Пустой словарь\n", - "print(my_dict1)\n", - "my_dict2 = {'one': 10, 'two': 20, 'three': 30}\n", - "print(my_dict2)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 374 - }, - "colab_type": "code", - "executionInfo": { - "elapsed": 713, - "status": "ok", - "timestamp": 1575289237227, - "user": { - "displayName": "Надежда Демиденко", - "photoUrl": "https://lh3.googleusercontent.com/a-/AAuE7mA6D7k5OgtG9hzPe8Abs8DfOKAXQoTXaPfn7EY=s64", - "userId": "05224310221243935536" - }, - "user_tz": -180 - }, - "id": "H71xC2y2i9r4", - "outputId": "f22495f9-1d9b-4e81-f3e1-94c9b945788c" - }, - "outputs": [], - "source": [ - "# Доступ к значениям или к ключам выполняется при помощи .keys() или .values()\n", - "# .items() возвращает пару \"ключ: значение\" в кортеже\n", - "\n", - "my_dict = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6}\n", - "\n", - "print('Проход по ключам')\n", - "for elem in my_dict: # равносильно my_dict.keys()\n", - " print(elem) \n", - " \n", - "print('Проход по значениям')\n", - "for elem in my_dict.values(): # .values() возвращает значения\n", - " print(elem)\n", - "\n", - "print('Проход по парам - ключ: значение')\n", - "for key, value in my_dict.items(): # Проход по .items() возвращает кортеж (ключ, значение), \n", - " print(key, value) " - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "Wc1ksuulPGZM" - }, - "source": [ - "Операции, непосредственно изменяющие множество\n", - "\n", - "|Функция|Пояснение \n", - "|---|:---|\n", - "|`set.update(other, ...)`; `set \\|= other \\| ...`|объединение|\n", - "|`set.intersection_update(other, ...)`; `set &= other & ...`|пересечение|\n", - "|`set.difference_update(other, ...)`; `set -= other \\| ...`|вычитание|\n", - "|`set.symmetric_difference_update(other)`; `set ^= other`|множество из элементов, встречающихся в одном множестве, но не встречающиеся в обоих|\n", - "|`set.add(elem)`|добавляет элемент в множество|\n", - "|`set.remove(elem)`|удаляет элемент из множества. KeyError, если такого элемента не существует|\n", - "|`set.discard(elem)`|удаляет элемент, если он находится в множестве|\n", - "|`set.pop()`|удаляет первый элемент из множества. Так как множества не упорядочены, нельзя точно сказать, какой элемент будет первым|\n", - "|`set.clear()`|очистка множества|" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "31fpGaQePGZS" - }, - "source": [ - "Объединить словари можно, комбинируя методы .copy() и .update():" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 51 - }, - "colab_type": "code", - "executionInfo": { - "elapsed": 1420, - "status": "ok", - "timestamp": 1575288544579, - "user": { - "displayName": "Надежда Демиденко", - "photoUrl": "https://lh3.googleusercontent.com/a-/AAuE7mA6D7k5OgtG9hzPe8Abs8DfOKAXQoTXaPfn7EY=s64", - "userId": "05224310221243935536" - }, - "user_tz": -180 - }, - "id": "jCUzbitxPGZS", - "outputId": "fd97e853-89ec-47e5-b1d3-28fbd9ff4424" - }, - "outputs": [], - "source": [ - "dict1 = {'a': 1, 'b': 2}\n", - "dict2 = {'c': 3, 'd': 4}\n", - "dict3 = dict1.copy()\n", - "dict3.update(dict2)\n", - "print(dict3)\n", - "\n", - "# Для версии Python 3.5 и выше:\n", - "dict1 = {'a': 1, 'b': 2}\n", - "dict2 = {'c': 3, 'd': 4}\n", - "dict3 = {**dict1, **dict2}\n", - "print(dict3)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "LWBSMlXVgNGN" - }, - "source": [ - "С множествами можно выполнять множество операций: находить объединение, пересечение и т.п.:\n", - "\n", - "|Функция|Пояснение \n", - "|---|:---|\n", - "|`len(s)`|число элементов в множестве (размер множества)|\n", - "|`x in s`|принадлежит ли x множеству s|\n", - "|`set.isdisjoint(other)`|истина, если set и other не имеют общих элементов|\n", - "|`set == other`|все элементы set принадлежат other, все элементы other принадлежат set|\n", - "|`set.issubset(other)` или `set <= other`|все элементы set принадлежат other|\n", - "|`set.issuperset(other)` или `set >= other`|аналогично|\n", - "|`set.union(other, ...)` или `set \\| other \\| ...`|объединение нескольких множеств|\n", - "|`set.intersection(other, ...)` или `set & other & ...`|пересечение|\n", - "|`set.difference(other, ...)` или `set - other - ...`|множество из всех элементов set, не принадлежащие ни одному из other|\n", - "|`set.symmetric_difference(other)`; `set ^ other`|множество из элементов, встречающихся в одном множестве, но не встречающиеся в обоих|\n", - "|`set.copy()`|копия множества|" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "WmzhPB9cPGZH" - }, - "source": [ - "### Срезы\n", - "\n", - "В индексируемых коллекциях также применимы срезы, как при работе со строками: `[Start:Stop:Step]`\n", - "\n", - "Start задает начало среза;\\\n", - "Stop задает конец среза (не включая элемент с индексом Stop);\\\n", - "Step задает шаг.\n", - "\n", - "Срезы на примере строки:\n", - "\n", - "![Примеры срезов](04-02.png)\n", - "\n", - "С помощью среза можно не только получать копию коллекции, но в случае **списка** можно также менять значения элементов, удалять и добавлять новые. Для этого необходимо передавать также итерируемый объект.\n", - "\n", - "Обращение к несуществующему индексу коллекции вызывает ошибку, а в случае выхода границ среза за границы коллекции никакой ошибки не происходит." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "ZYEoYBvBPGZI", - "outputId": "4d2fe08f-9291-41a9-b5a6-7b9bdc28027d" - }, - "outputs": [], - "source": [ - "my_list = [1, 1, 3, 4, 5]\n", - "\n", - "# my_list[1:2] = 2 # Неправильно - TypeError: can only assign an iterable\n", - "my_list[1:2] = [2] # Правильно\n", - "print(my_list)\n", - "\n", - "my_list[1:3] = [20, 30]\n", - "print(my_list) # [1, 20, 30, 4, 5]\n", - "\n", - "my_list[1:3] = [0] # можно заменить два элемента на один\n", - "print(my_list)\n", - "my_list[2:] = [40, 50, 60] # или два элемента на три\n", - "print(my_list)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "VUgsI77tjnq4" - }, - "source": [ - "Можно также создать объект среза (slice) или использовать его на лету:\n", - "slice(start,stop,step)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 153 - }, - "colab_type": "code", - "executionInfo": { - "elapsed": 441, - "status": "ok", - "timestamp": 1575289585211, - "user": { - "displayName": "Надежда Демиденко", - "photoUrl": "https://lh3.googleusercontent.com/a-/AAuE7mA6D7k5OgtG9hzPe8Abs8DfOKAXQoTXaPfn7EY=s64", - "userId": "05224310221243935536" - }, - "user_tz": -180 - }, - "id": "ji0Ksxeojwcb", - "outputId": "e0fc67b2-ef45-4422-9c51-84cc5ba02a71" - }, - "outputs": [], - "source": [ - "my_list = [5, 6, 7, 8, 9]\n", - "\n", - "my_slice = slice(2, 4)\n", - "print(my_slice.start)\n", - "print(my_slice.stop)\n", - "print(my_slice.step)\n", - "\n", - "print(my_list[my_slice]) # эквивалент [2:4]\n", - "\n", - "print(my_list[slice(1, None)]) # эквивалент [1:]\n", - "\n", - "print(my_list[slice(None, -1)]) # эквивалент [:-1]\n", - "\n", - "print(my_list[slice(None, None, 2)]) # эквивалент [::2]\n", - "\n", - "print(my_list[slice(None)]) # эквивалент [::]" - ] - } - ], - "metadata": { - "colab": { - "name": "topic04.ipynb", - "provenance": [ - { - "file_id": "1Fx90fM9aCQ4ZuX5vz_fCkFFCHjZXzMng", - "timestamp": 1575284888378 - } - ] - }, - "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.7.4" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/lecture_1/Python_Lecture1.pptx b/lecture_1/Python_Lecture1.pptx deleted file mode 100644 index 463d89e..0000000 Binary files a/lecture_1/Python_Lecture1.pptx and /dev/null differ diff --git a/lecture_1/StringRep.java b/lecture_1/StringRep.java deleted file mode 100644 index 4c0e9ae..0000000 --- a/lecture_1/StringRep.java +++ /dev/null @@ -1,22 +0,0 @@ -import java.util.Arrays; -public class StringRep { - public static void main(String[] args) { - String str1 = "PHP"; - System.out.println("Original string: "+str1); - String resultV1 = repeat_str(str1, 7); - System.out.println("\nAfter repeating 7 times: "+resultV1); - } -public static String repeat_str(String str1, int n) { - if (str1 == null || str1.isEmpty()) { - return ""; - } - if (n <= 0) { - return str1; - } - StringBuilder x = new StringBuilder(str1.length() * n); - for (int i = 1; i <= n; i++) { - x.append(str1); - } - return x.toString(); - } -} diff --git a/lecture_1/images/cpp.png b/lecture_1/images/cpp.png deleted file mode 100644 index d6e0f2a..0000000 Binary files a/lecture_1/images/cpp.png and /dev/null differ diff --git a/lecture_1/images/hh.png b/lecture_1/images/hh.png deleted file mode 100644 index fa675f3..0000000 Binary files a/lecture_1/images/hh.png and /dev/null differ diff --git a/lecture_1/images/java.png b/lecture_1/images/java.png deleted file mode 100644 index 4501fbc..0000000 Binary files a/lecture_1/images/java.png and /dev/null differ diff --git a/lecture_1/images/jupyter.png b/lecture_1/images/jupyter.png deleted file mode 100644 index 3b01005..0000000 Binary files a/lecture_1/images/jupyter.png and /dev/null differ diff --git a/lecture_1/images/platforms.png b/lecture_1/images/platforms.png deleted file mode 100644 index 5b2b19d..0000000 Binary files a/lecture_1/images/platforms.png and /dev/null differ diff --git a/lecture_1/images/salary.jpeg b/lecture_1/images/salary.jpeg deleted file mode 100644 index 1002c82..0000000 Binary files a/lecture_1/images/salary.jpeg and /dev/null differ diff --git a/lecture_1/images/type_hier.png b/lecture_1/images/type_hier.png deleted file mode 100644 index c4afc9f..0000000 Binary files a/lecture_1/images/type_hier.png and /dev/null differ diff --git a/lecture_1/string_rep.py b/lecture_1/string_rep.py deleted file mode 100644 index a5eed64..0000000 --- a/lecture_1/string_rep.py +++ /dev/null @@ -1,8 +0,0 @@ -def repeat_string(data, times=7): - if data and times > 0: - print(data*times) - else: - print("Incorrect data") - -repeat_string('REP', 3) - diff --git a/lecture_2/05. Functions.ipynb b/lecture_2/05. Functions.ipynb deleted file mode 100644 index 96fd140..0000000 --- a/lecture_2/05. Functions.ipynb +++ /dev/null @@ -1,588 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "2E9PSVGar_P2" - }, - "source": [ - "# Функции, распаковка аргументов" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "G8cvP38xsA9c" - }, - "source": [ - "Функция в python - объект, принимающий аргументы и возвращающий значение. Обычно функция определяется с помощью инструкции def.\n", - "\n", - "Определим простейшую функцию:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 51 - }, - "colab_type": "code", - "executionInfo": { - "elapsed": 921, - "status": "ok", - "timestamp": 1575291863858, - "user": { - "displayName": "Надежда Демиденко", - "photoUrl": "https://lh3.googleusercontent.com/a-/AAuE7mA6D7k5OgtG9hzPe8Abs8DfOKAXQoTXaPfn7EY=s64", - "userId": "05224310221243935536" - }, - "user_tz": -180 - }, - "id": "LAuK2PEUsKVt", - "outputId": "155ca390-8ab2-4138-9b31-41dfe657958f" - }, - "outputs": [], - "source": [ - "def add(x, y):\n", - " return x + y # Инструкция return возвращает значение.\n", - "\n", - "print(add(1, 10))\n", - "print(add('abc', 'def'))\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "9_RoJGBas3Q5" - }, - "source": [ - "Функция может не врзвращать значение. Тогда она вернет `None`." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 34 - }, - "colab_type": "code", - "executionInfo": { - "elapsed": 1212, - "status": "ok", - "timestamp": 1575291853814, - "user": { - "displayName": "Надежда Демиденко", - "photoUrl": "https://lh3.googleusercontent.com/a-/AAuE7mA6D7k5OgtG9hzPe8Abs8DfOKAXQoTXaPfn7EY=s64", - "userId": "05224310221243935536" - }, - "user_tz": -180 - }, - "id": "-yI4x4-EtedU", - "outputId": "4ac3e7da-bae3-44d9-a4b6-42f527fb8678" - }, - "outputs": [], - "source": [ - "def func():\n", - " pass\n", - "\n", - "print(func())" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "yBVIEOjKtnGm" - }, - "source": [ - "## Аргументы функции\n", - "\n", - "Функция может принимать произвольное количество аргументов или не принимать их вовсе. Также распространены функции с произвольным числом аргументов, функции с позиционными и именованными аргументами, обязательными и необязательными." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 85 - }, - "colab_type": "code", - "executionInfo": { - "elapsed": 1148, - "status": "ok", - "timestamp": 1575633834091, - "user": { - "displayName": "Надежда Демиденко", - "photoUrl": "https://lh3.googleusercontent.com/a-/AAuE7mA6D7k5OgtG9hzPe8Abs8DfOKAXQoTXaPfn7EY=s64", - "userId": "05224310221243935536" - }, - "user_tz": -180 - }, - "id": "rD-EwNEyuAW-", - "outputId": "4e21c441-f0c7-4d0b-f875-5d822aaceab2" - }, - "outputs": [], - "source": [ - "# Позиционные аргументы, передаются при вызове строго в том порядке, в котором описаны\n", - "def func(a, b, c=2): # c - необязательный аргумент\n", - " return a + b + c\n", - "\n", - "print(func(1, 2)) # a = 1, b = 2, c = 2 (по умолчанию)\n", - "print(func(1, 2, 3)) # a = 1, b = 2, c = 3\n", - "\n", - "# Но к ним можно обратиться и по имени\n", - "print(func(a=1, b=3)) # a = 1, b = 3, c = 2\n", - "print(func(a=3, c=6)) # a = 3, c = 6, b не определен, ошибка TypeError" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "PCUL1a0jFhhm" - }, - "source": [ - "При использовании позиционных аргументов вы вынуждены соблюдать их порядок, в то время как именованные аргументы можно расположить как угодно. Также они позволяют не указывать значения аргументов, у которых есть значения по умолчанию.\n", - "\n", - "Если мы хотим получить только именованные аргументы без захвата неограниченного количества позиционных, Python позволяет сделать это с помощью одинокой звёздочки:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 248 - }, - "colab_type": "code", - "executionInfo": { - "elapsed": 1062, - "status": "error", - "timestamp": 1575634129382, - "user": { - "displayName": "Надежда Демиденко", - "photoUrl": "https://lh3.googleusercontent.com/a-/AAuE7mA6D7k5OgtG9hzPe8Abs8DfOKAXQoTXaPfn7EY=s64", - "userId": "05224310221243935536" - }, - "user_tz": -180 - }, - "id": "NIO-KmXUB0Dn", - "outputId": "698b7953-8467-4625-80c1-67526eaf14ce" - }, - "outputs": [], - "source": [ - "# Все аргументы после звездочки являются строго именованными\n", - "def foo(a, b=3, *, c, d=10):\n", - " return(a, b, c, d)\n", - "\n", - "print(foo(1, 2, c=3, d=4))\n", - "print(foo(1, c=3, d=4))\n", - "# К первым двум по-прежнему можно обращаться и по имени\n", - "print(foo(a=10, b=20, c=30, d=40))\n", - "\n", - "# Попытка передачи аргументов как позиционных приведет к ошибке:\n", - "print(foo(1, 2, 3, 4))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "_jbrP93AuQxJ" - }, - "source": [ - "Функция также может принимать переменное количество позиционных аргументов, тогда перед именем ставится `*`.\n", - "\n", - "`args` - это кортеж из всех переданных аргументов функции, и с переменной можно работать также, как и с кортежем." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 68 - }, - "colab_type": "code", - "executionInfo": { - "elapsed": 957, - "status": "ok", - "timestamp": 1575293047043, - "user": { - "displayName": "Надежда Демиденко", - "photoUrl": "https://lh3.googleusercontent.com/a-/AAuE7mA6D7k5OgtG9hzPe8Abs8DfOKAXQoTXaPfn7EY=s64", - "userId": "05224310221243935536" - }, - "user_tz": -180 - }, - "id": "dcQj5pLVucAZ", - "outputId": "5f9af835-767f-41f4-c08d-90d27e916d95" - }, - "outputs": [], - "source": [ - "def func(*args):\n", - " return args\n", - "\n", - "print(func(1, 2, 3, 'abc'))\n", - "print(func())\n", - "print(func(1))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "2xlrXoh7uvKW" - }, - "source": [ - "Функция может принимать и произвольное число именованных аргументов, тогда перед именем ставится `**`.\n", - "\n", - "В переменной `kwargs` у нас хранится словарь, с которым мы тоже можем производить операции." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 68 - }, - "colab_type": "code", - "executionInfo": { - "elapsed": 1217, - "status": "ok", - "timestamp": 1575292272047, - "user": { - "displayName": "Надежда Демиденко", - "photoUrl": "https://lh3.googleusercontent.com/a-/AAuE7mA6D7k5OgtG9hzPe8Abs8DfOKAXQoTXaPfn7EY=s64", - "userId": "05224310221243935536" - }, - "user_tz": -180 - }, - "id": "A3l4ExdcuuQ4", - "outputId": "0ca68134-49e8-458e-c32c-62871d90f22b" - }, - "outputs": [], - "source": [ - "def func(**kwargs):\n", - " return kwargs\n", - "print(func(a=1, b=2, c=3))\n", - "print(func())\n", - "print(func(a='python'))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "iPWkI6iSzFPD" - }, - "source": [ - "## Распаковка\n", - "\n", - "В Python 3 также появилась возможность использовать оператор `*` для распаковки итерируемых объектов:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 68 - }, - "colab_type": "code", - "executionInfo": { - "elapsed": 1068, - "status": "ok", - "timestamp": 1575297553302, - "user": { - "displayName": "Надежда Демиденко", - "photoUrl": "https://lh3.googleusercontent.com/a-/AAuE7mA6D7k5OgtG9hzPe8Abs8DfOKAXQoTXaPfn7EY=s64", - "userId": "05224310221243935536" - }, - "user_tz": -180 - }, - "id": "Fl6DfwkcDD7P", - "outputId": "a7bcfdb6-700f-449f-9e58-a95eed14a76e" - }, - "outputs": [], - "source": [ - "fruits = ['lemon', 'pear', 'watermelon', 'tomato']\n", - "first, second, *remaining = fruits\n", - "print(remaining)\n", - "\n", - "first, *remaining = fruits\n", - "print(remaining)\n", - "\n", - "first, *middle, last = fruits\n", - "print(middle)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "Lgcs6x9IDUAZ" - }, - "source": [ - "В Python 3.5 появились новые способы использования оператора `*`. Например, возможность сложить итерируемый объект в новый список.\n", - "\n", - "Допустим, у вас есть функция, которая принимает любую последовательность и возвращает список, состоящий из этой последовательности и её обратной копии, сконкатенированных вместе." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "ai1y4TwTD5Q1" - }, - "outputs": [], - "source": [ - "def palindromify(sequence):\n", - " return list(sequence) + list(reversed(sequence))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "yHkTOXpXD--V" - }, - "source": [ - "Здесь нам требуется несколько раз преобразовывать последовательности в списки, чтобы получить конечный результат. В Python 3.5 можно поступить по-другому:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "DDt9h-cAD_uf" - }, - "outputs": [], - "source": [ - "def palindromify(sequence):\n", - " return [*sequence, *reversed(sequence)]" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "c5lScjQiEExB" - }, - "source": [ - "Этот вариант избавляет нас от необходимости лишний раз вызывать `list` и делает наш код более эффективным и читаемым.\n", - "\n", - "Такой вариант использования оператора `*` является отличной возможностью для конкатенации итерируемых объектов разных типов. Оператор `*` работает с любым итерируемым объектом, в то время как оператор `+` работает только с определёнными последовательностями, которые должны быть одного типа." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 51 - }, - "colab_type": "code", - "executionInfo": { - "elapsed": 941, - "status": "ok", - "timestamp": 1575298166488, - "user": { - "displayName": "Надежда Демиденко", - "photoUrl": "https://lh3.googleusercontent.com/a-/AAuE7mA6D7k5OgtG9hzPe8Abs8DfOKAXQoTXaPfn7EY=s64", - "userId": "05224310221243935536" - }, - "user_tz": -180 - }, - "id": "tnh8VCyAEeNz", - "outputId": "8c891ccb-93aa-492d-ef25-0f2bb24aeaf8" - }, - "outputs": [], - "source": [ - "fruits = ['lemon', 'pear', 'watermelon', 'tomato']\n", - "print((*fruits[1:], fruits[0]))\n", - "\n", - "uppercase_fruits = (f.upper() for f in fruits)\n", - "print({*fruits, *uppercase_fruits}) # новое множество из списка и генератора" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "33KGrE0VFd9z" - }, - "source": [ - "В PEP 448 были также добавлены новые возможности для `**`, благодаря которым стало возможным перемещение пар ключ-значение из одного словаря (словарей) в новый:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 34 - }, - "colab_type": "code", - "executionInfo": { - "elapsed": 910, - "status": "ok", - "timestamp": 1575298163804, - "user": { - "displayName": "Надежда Демиденко", - "photoUrl": "https://lh3.googleusercontent.com/a-/AAuE7mA6D7k5OgtG9hzPe8Abs8DfOKAXQoTXaPfn7EY=s64", - "userId": "05224310221243935536" - }, - "user_tz": -180 - }, - "id": "ULVNl_GfFjNG", - "outputId": "05c7a7b6-ecab-4393-f6d1-1601be3faa5f" - }, - "outputs": [], - "source": [ - "date_info = {'year': \"2020\", 'month': \"01\", 'day': \"01\"}\n", - "track_info = {'artist': \"Beethoven\", 'title': 'Symphony No 5'}\n", - "all_info = {**date_info, **track_info}\n", - "print(all_info)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "k3He4HC5vTDR" - }, - "source": [ - "## Анонимные функции, инструкция lambda\n", - "\n", - "Анонимные функции могут содержать лишь одно выражение, но и выполняются они быстрее.\n", - "\n", - "Анонимные функции создаются с помощью инструкции lambda. Кроме этого, их не обязательно присваивать переменной.\n", - "\n", - "lambda функции, в отличие от обычной, не требуется инструкция return, а в остальном, ведет себя точно так же:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 102 - }, - "colab_type": "code", - "executionInfo": { - "elapsed": 1200, - "status": "ok", - "timestamp": 1575292510850, - "user": { - "displayName": "Надежда Демиденко", - "photoUrl": "https://lh3.googleusercontent.com/a-/AAuE7mA6D7k5OgtG9hzPe8Abs8DfOKAXQoTXaPfn7EY=s64", - "userId": "05224310221243935536" - }, - "user_tz": -180 - }, - "id": "jvOnFFAqvlAK", - "outputId": "2859db61-c49b-4174-ec52-a9bad0ba0b6e" - }, - "outputs": [], - "source": [ - "func = lambda x, y: x + y\n", - "print(func(1, 2))\n", - "print(func('a', 'b'))\n", - "print((lambda x, y: x + y)(1, 2))\n", - "print((lambda x, y: x + y)('a', 'b'))\n", - "\n", - "# lambda функции тоже можно передавать args и kwargs\n", - "func = lambda *args: args\n", - "print(func(1, 2, 3, 4))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "MkL62azYwhWR" - }, - "source": [ - "Как правило, lambda-выражения используются при вызове функций (или классов), которые принимают функцию в качестве аргумента.\n", - "\n", - "К примеру, встроенная функция сортировки Python принимает функцию в качестве ключевого аргумента. Эта ключевая функция использует для вычисления сравнительного ключа при определении порядка сортировки элементов." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 34 - }, - "colab_type": "code", - "executionInfo": { - "elapsed": 1117, - "status": "ok", - "timestamp": 1575292758798, - "user": { - "displayName": "Надежда Демиденко", - "photoUrl": "https://lh3.googleusercontent.com/a-/AAuE7mA6D7k5OgtG9hzPe8Abs8DfOKAXQoTXaPfn7EY=s64", - "userId": "05224310221243935536" - }, - "user_tz": -180 - }, - "id": "Si3CQthew6u4", - "outputId": "9b770a19-c753-4e90-9a79-5cf44b2eb7b2" - }, - "outputs": [], - "source": [ - "colors = [\"Goldenrod\", \"purple\", \"Salmon\", \"turquoise\", \"cyan\"]\n", - "print(sorted(colors, key=lambda s: s.lower()))" - ] - } - ], - "metadata": { - "colab": { - "name": "topic06.ipynb", - "provenance": [] - }, - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/lecture_2/06. Generators.ipynb b/lecture_2/06. Generators.ipynb deleted file mode 100644 index 401bb7c..0000000 --- a/lecture_2/06. Generators.ipynb +++ /dev/null @@ -1,369 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "NaZJVtw1iyEU" - }, - "source": [ - "# Генераторы и ленивые вычисления" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "URnSv8ibiyEW" - }, - "source": [ - "В Python просто **генераторы** (*generator*) и **генераторы списков** (*list comprehension*) - разные вещи. Рассмотрим и то, и другое." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "rgiQ3Or1iyEW" - }, - "source": [ - "## Генераторы списков\n", - "\n", - "В Python генераторы списков позволяют создавать и быстро заполнять списки.\n", - "\n", - "Синтаксическая конструкция генератора списка предполагает наличие итерируемого объекта или итератора, на базе которого будет создаваться новый список, а также выражение, которое будет что-то делать с извлеченными из последовательности элементами перед тем как добавить их в формируемый список. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "CvKmmPBSiyEX", - "outputId": "2cd4db93-40f2-4608-8cab-157acb5cbc15" - }, - "outputs": [], - "source": [ - "a = [1, 2, 3]\n", - "b = [i+10 for i in a]\n", - "\n", - "print(a)\n", - "print(b)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "shNzUj_6iyEa" - }, - "source": [ - "Здесь генератором списка является выражение `[i+10 for i in a]`.\n", - "\n", - "`a` - итерируемый объект. В данном случае это другой список.\\\n", - "Из него извлекается каждый элемент в цикле for.\\\n", - "Перед for описывается действие, которое выполняется над элементом перед его добавлением в новый список.\n", - "\n", - "В генератор списка можно добавить условие:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "NcnulnksiyEa", - "outputId": "a9986a0d-4aef-46ec-8e66-1f2859e0ee03" - }, - "outputs": [], - "source": [ - "from random import randint\n", - "\n", - "nums = [randint(10, 20) for i in range(10)]\n", - "print(nums)\n", - "\n", - "nums = [i for i in nums if i%2 == 0]\n", - "print(nums)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "X1XwV-J7iyEc" - }, - "source": [ - "Генераторы списков могут содержать вложенные циклы:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "HzA3ylUwiyEc", - "outputId": "a4965705-89c2-4d50-f955-99f6ffdf779c" - }, - "outputs": [], - "source": [ - "a = \"12\"\n", - "b = \"3\"\n", - "c = \"456\"\n", - "\n", - "comb = [i+j+k for i in a for j in b for k in c]\n", - "print(comb)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "3Zr4QTCaiyEe" - }, - "source": [ - "### Генераторы словарей и множеств\n", - "\n", - "Если в выражении генератора списка заменить квадратные скобки на фигурные, то можно получить не список, а словарь.\n", - "\n", - "При этом синтаксис выражения до `for` должен быть соответствующий словарю, то есть включать ключ и через двоеточие значение. Если этого нет, будет сгенерировано множество." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "oWBWe1xHiyEf", - "outputId": "8c81f542-9f5b-44aa-f093-e0d80dcaeea6" - }, - "outputs": [], - "source": [ - "a = {i:i**2 for i in range(11,15)}\n", - "print(a)\n", - "\n", - "a = {i for i in range(11,15)}\n", - "print(a)\n", - "b = {1, 2, 3}\n", - "print(b)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "Y2a4aMApozEg" - }, - "source": [ - "Примечание:\n", - "\n", - "В Python3 в словарях при использовании метода `.keys()`, `.values()` и `.items()` для доступа к ключам и значениям создаётся представление соответствующего элемента. По сути это представление является генератором. Копия данных не создаётся.\n", - "\n", - "Тип этих данных - dict_keys, dict_values, dict_items." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "rfH857mspGyQ" - }, - "outputs": [], - "source": [ - "my_dict = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}\n", - "print(my_dict.keys())\n", - "print(my_dict.values())\n", - "print(my_dict.items())" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "yx5_ThfQiyEg" - }, - "source": [ - "## Генераторы\n", - "\n", - "Ленивые вычисления - стратегия вычисления, согласно которой вычисления следует откладывать до тех пор, пока не понадобится их результат. Для ленивых вычислений нам потребуются генераторы.\n", - "\n", - "Выражения, создающие объекты-генераторы, похожи на выражения, генерирующие списки. Чтобы создать генераторный объект, надо использовать круглые скобки." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 136 - }, - "colab_type": "code", - "executionInfo": { - "elapsed": 1438, - "status": "ok", - "timestamp": 1574937028745, - "user": { - "displayName": "Надежда Демиденко", - "photoUrl": "https://lh3.googleusercontent.com/a-/AAuE7mA6D7k5OgtG9hzPe8Abs8DfOKAXQoTXaPfn7EY=s64", - "userId": "05224310221243935536" - }, - "user_tz": -180 - }, - "id": "fromjY0ajnqX", - "outputId": "4007a616-d710-4dc1-d3e5-1fecafbe3eb2" - }, - "outputs": [], - "source": [ - "a = (i for i in range(2, 8))\n", - "print(a)\n", - "\n", - "for i in a:\n", - " print(i)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "XWMxc70Cknuh" - }, - "source": [ - "Второй раз перебрать генератор в цикле for не получится, так как объект-генератор уже сгенерировал все значения по заложенной в него \"формуле\". Поэтому генераторы обычно используются, когда надо единожды пройтись по итерируемому объекту.\n", - "\n", - "Кроме того, генераторы экономят память, так как в ней хранятся не все значения, скажем, большого списка, а только предыдущий элемент, предел и формула, по которой вычисляется следующий элемент. \n", - "\n", - "Выражение, создающее генератор, это сокращенная запись следующего:\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 85 - }, - "colab_type": "code", - "executionInfo": { - "elapsed": 1136, - "status": "ok", - "timestamp": 1574937260584, - "user": { - "displayName": "Надежда Демиденко", - "photoUrl": "https://lh3.googleusercontent.com/a-/AAuE7mA6D7k5OgtG9hzPe8Abs8DfOKAXQoTXaPfn7EY=s64", - "userId": "05224310221243935536" - }, - "user_tz": -180 - }, - "id": "49M-KQKckqS0", - "outputId": "776c2c3a-ddfc-4e8e-b0f7-7f3bebb64784" - }, - "outputs": [], - "source": [ - "def func(start, finish):\n", - " while start < finish:\n", - " yield start * 0.33\n", - " start += 1\n", - "\n", - "a = func(1, 4)\n", - "print(a)\n", - "\n", - "for i in a:\n", - " print(i)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "XWinvS2JlGnf" - }, - "source": [ - "Функция, содержащая `yield`, возвращает объект-генератор, а не выполняет свой код сразу. Тело функции исполняется при каждом вызове метода `__next__()`. В цикле for это делается автоматически.\n", - "\n", - "При этом после выдачи результата командой yield состояние генератора, все его внутренние переменные сохраняются. При следующей попытке выдернуть элемент из генератора работа начнётся со строчки, следующей за yield." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "EIQZJ2xxld2T" - }, - "source": [ - "Пример генератора чисел Фибоначчи:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 85 - }, - "colab_type": "code", - "executionInfo": { - "elapsed": 1351, - "status": "ok", - "timestamp": 1574937601981, - "user": { - "displayName": "Надежда Демиденко", - "photoUrl": "https://lh3.googleusercontent.com/a-/AAuE7mA6D7k5OgtG9hzPe8Abs8DfOKAXQoTXaPfn7EY=s64", - "userId": "05224310221243935536" - }, - "user_tz": -180 - }, - "id": "oMYZrqnwlghq", - "outputId": "e2c7a252-b05d-48be-a517-1af853e8a6ac" - }, - "outputs": [], - "source": [ - "def fibonacci(n):\n", - " fib1, fib2 = 0, 1\n", - " for i in range(n):\n", - " fib1, fib2 = fib2, fib1 + fib2\n", - " yield fib1\n", - "\n", - "for fib in fibonacci(20):\n", - " print(fib, end=' ')\n", - "\n", - "print('Сумма первых 100 чисел Фибоначчи равна', sum(fibonacci(100)))\n", - "print(list(fibonacci(16)))\n", - "print([x*x for x in fibonacci(14)])" - ] - } - ], - "metadata": { - "colab": { - "name": "topic05.ipynb", - "provenance": [] - }, - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/lecture_2/07. Libraries.ipynb b/lecture_2/07. Libraries.ipynb deleted file mode 100644 index 8c718c4..0000000 --- a/lecture_2/07. Libraries.ipynb +++ /dev/null @@ -1,659 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "ThHYoaTjFv4m" - }, - "source": [ - "# Импорт библиотек и создание рабочего окружения" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "Lxqk2gccLbn-" - }, - "source": [ - "Модулем в Python называется некоторая небольшая программа.\n", - "\n", - "Каждая программа может импортировать модуль и получить доступ к его классам, функциям и объектам. Нужно заметить, что модуль может быть написан не только на Python, а например, на C или C++." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "oawrGkLQLjwd" - }, - "source": [ - "## Подключение модуля из стандартной библиотеки\n", - "\n", - "Подключить модуль можно с помощью инструкции `import`. Модули обычно подключаются в самом начале кода." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 34 - }, - "colab_type": "code", - "executionInfo": { - "elapsed": 1538, - "status": "ok", - "timestamp": 1575366877695, - "user": { - "displayName": "Надежда Демиденко", - "photoUrl": "https://lh3.googleusercontent.com/a-/AAuE7mA6D7k5OgtG9hzPe8Abs8DfOKAXQoTXaPfn7EY=s64", - "userId": "05224310221243935536" - }, - "user_tz": -180 - }, - "id": "swPqYbkPFqKh", - "outputId": "1ff8a720-a12e-431c-a51a-35572eca530a" - }, - "outputs": [], - "source": [ - "import os\n", - "print(os.getcwd())" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "7G8CGVg3LxBh" - }, - "source": [ - "После ключевого слова `import` указывается название модуля.\n", - "\n", - "Одной инструкцией можно подключить несколько модулей, хотя этого не рекомендуется делать, так как это снижает читаемость кода.\n", - "\n", - "> Когда вы импортируете модуль, интерпретатор Python ищет этот модуль в следующих местах:\n", - "- Директория, в которой находится файл, в котором вызывается команда импорта\n", - "- Если модуль не найден, Python ищет в каждой директории, определенной в переменной окружения PYTHONPATH.\n", - "- Если и там модуль не найден, Python проверяет путь заданный по умолчанию\n", - ">\n", - "> Путь поиска модулей сохранен в системном модуле `sys` в переменной `path`. Переменная `sys.path` содержит все три вышеописанных места поиска модулей." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 51 - }, - "colab_type": "code", - "executionInfo": { - "elapsed": 1606, - "status": "ok", - "timestamp": 1575366915458, - "user": { - "displayName": "Надежда Демиденко", - "photoUrl": "https://lh3.googleusercontent.com/a-/AAuE7mA6D7k5OgtG9hzPe8Abs8DfOKAXQoTXaPfn7EY=s64", - "userId": "05224310221243935536" - }, - "user_tz": -180 - }, - "id": "0zbFRQdzLxzR", - "outputId": "16c57093-355e-46c6-d17c-d1c9b08f61be" - }, - "outputs": [], - "source": [ - "import time, random\n", - "print(time.time())\n", - "print(random.random())" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "0jJgLsTuL623" - }, - "source": [ - "После импортирования модуля его название становится переменной, через которую можно получить доступ к атрибутам модуля. Например, можно обратиться к константе e, расположенной в модуле math:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 34 - }, - "colab_type": "code", - "executionInfo": { - "elapsed": 890, - "status": "ok", - "timestamp": 1575366946777, - "user": { - "displayName": "Надежда Демиденко", - "photoUrl": "https://lh3.googleusercontent.com/a-/AAuE7mA6D7k5OgtG9hzPe8Abs8DfOKAXQoTXaPfn7EY=s64", - "userId": "05224310221243935536" - }, - "user_tz": -180 - }, - "id": "pF4b11-_L7sH", - "outputId": "c7285068-f8fb-4def-c0e2-2366ac25313c" - }, - "outputs": [], - "source": [ - "import math\n", - "print(math.e)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "p13DEJvfNlvh" - }, - "source": [ - "### Использование псевдонимов\n", - "\n", - "Если название модуля слишком длинное, или оно вам не нравится по каким-то другим причинам, то для него можно создать псевдоним, с помощью ключевого слова `as`.\n", - "\n", - "Теперь доступ ко всем атрибутам модуля math осуществляется только с помощью переменной m, а переменной math в этой программе уже не будет." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 34 - }, - "colab_type": "code", - "executionInfo": { - "elapsed": 1063, - "status": "ok", - "timestamp": 1575367509174, - "user": { - "displayName": "Надежда Демиденко", - "photoUrl": "https://lh3.googleusercontent.com/a-/AAuE7mA6D7k5OgtG9hzPe8Abs8DfOKAXQoTXaPfn7EY=s64", - "userId": "05224310221243935536" - }, - "user_tz": -180 - }, - "id": "-ySNfWHIOE0G", - "outputId": "d5bf9f55-1135-4c90-aa2c-71056f943a76" - }, - "outputs": [], - "source": [ - "import math as m\n", - "print(m.e)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "TATqdSrcObfK" - }, - "source": [ - "### Инструкция from\n", - "\n", - "Подключить определенные атрибуты модуля можно с помощью инструкции from. Она имеет несколько форматов:\n", - "\n", - "```\n", - "from <Название модуля> import <Атрибут 1> [ as <Псевдоним 1> ], [<Атрибут 2> [ as <Псевдоним 2> ] ...]\n", - "from <Название модуля> import *\n", - "```\n", - "\n", - "Первый формат позволяет подключить из модуля только указанные вами атрибуты. Для длинных имен также можно назначить псевдоним, указав его после ключевого слова `as`." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 51 - }, - "colab_type": "code", - "executionInfo": { - "elapsed": 824, - "status": "ok", - "timestamp": 1575368355165, - "user": { - "displayName": "Надежда Демиденко", - "photoUrl": "https://lh3.googleusercontent.com/a-/AAuE7mA6D7k5OgtG9hzPe8Abs8DfOKAXQoTXaPfn7EY=s64", - "userId": "05224310221243935536" - }, - "user_tz": -180 - }, - "id": "nHbMYOWPRSeQ", - "outputId": "a6f7402e-fc7f-41d5-c2f5-336a70a59253" - }, - "outputs": [], - "source": [ - "from math import e, ceil as c\n", - "print(e)\n", - "print(c(4.6))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "9h5cUJTPRd-2" - }, - "source": [ - "Импортируемые атрибуты можно разместить на нескольких строках, если их много, для лучшей читаемости кода:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "64cizz-9Rmee" - }, - "outputs": [], - "source": [ - "from math import (sin, cos,\n", - " tan, atan)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "YDQ-IEEzRvnv" - }, - "source": [ - "Второй формат инструкции from позволяет почти все переменные из модуля. Для примера импортируем все атрибуты из модуля sys.\n", - "\n", - "Следует заметить, что не все атрибуты будут импортированы. Если в модуле определена переменная `__all__` (список атрибутов, которые могут быть подключены), то будут подключены только атрибуты из этого списка. Если переменная `__all__` не определена, то будут подключены все атрибуты, не начинающиеся с нижнего подчёркивания. Кроме того, необходимо учитывать, что импортирование всех атрибутов из модуля может нарушить пространство имен главной программы, так как переменные, имеющие одинаковые имена, будут перезаписаны." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 68 - }, - "colab_type": "code", - "executionInfo": { - "elapsed": 1297, - "status": "ok", - "timestamp": 1575370503286, - "user": { - "displayName": "Надежда Демиденко", - "photoUrl": "https://lh3.googleusercontent.com/a-/AAuE7mA6D7k5OgtG9hzPe8Abs8DfOKAXQoTXaPfn7EY=s64", - "userId": "05224310221243935536" - }, - "user_tz": -180 - }, - "id": "BrDBzuJ2R8kE", - "outputId": "ce8acf51-f196-4d6c-8b90-8fe54f04127a" - }, - "outputs": [], - "source": [ - "from sys import *\n", - "print(version)\n", - "print(version_info)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "DxaRLoUESbIl" - }, - "source": [ - "## Создание модуля\n", - "\n", - "Можно использовать как библиотеку и самостоятельно созданный файл с функциями. Он подключается так же, как и стандартные библиотеки - через имя файла.\n", - "\n", - "При импортировании модуля его код выполняется полностью. То есть, если программа что-то печатает, то при её импортировании это будет напечатано. Этого можно избежать, если проверять, запущен ли скрипт как программа, или импортирован. Это можно сделать с помощью переменной `__name__`, которая определена в любой программе, и равна \"`__main__`\", если скрипт запущен в качестве главной программы, и имя, если он импортирован.\n", - "\n", - "Пример такого кода:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "LUiv-bPZTHfK" - }, - "outputs": [], - "source": [ - "def hello():\n", - " print('Hello, world!')\n", - "\n", - "def fib(n):\n", - " a = b = 1\n", - " for i in range(n - 2):\n", - " a, b = b, a + b\n", - " return b\n", - "\n", - "if __name__ == \"__main__\":\n", - " hello()\n", - " for i in range(10):\n", - " print(fib(i))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "ehBiYfGsU9v5" - }, - "source": [ - "## Система управления пакетами pip\n", - "\n", - "Для установки пакетов Python будет использоваться pip. Это система управления пакетами, которая используется для установки пакетов из Python Package Index (PyPI). Скорее всего, если у вас уже установлен Python, то установлен и pip.\n", - "\n", - "Проверка версии pip:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 34 - }, - "colab_type": "code", - "executionInfo": { - "elapsed": 3373, - "status": "ok", - "timestamp": 1575369458409, - "user": { - "displayName": "Надежда Демиденко", - "photoUrl": "https://lh3.googleusercontent.com/a-/AAuE7mA6D7k5OgtG9hzPe8Abs8DfOKAXQoTXaPfn7EY=s64", - "userId": "05224310221243935536" - }, - "user_tz": -180 - }, - "id": "30l9alUrVBS8", - "outputId": "ac135ac4-dac5-49f9-802a-c22ffa42754c" - }, - "outputs": [], - "source": [ - "!pip --version" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "4k19m70DVqB9" - }, - "source": [ - "> **Примечание:**\n", - ">\n", - "> *В зависимости от того, как установлен и настроен Python в системе, может потребоваться использовать pip3 вместо pip.*" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "NyVkOrs0VUDX" - }, - "source": [ - "Установка пакета:\n", - "\n", - "`pip install tabulate`\n", - "\n", - "Обновление пакета:\n", - "\n", - "`pip install --upgrade tabulate`\n", - "\n", - "Установка пакета конкретной версии:\n", - "\n", - "`pip install tabulate==2.6.0`\n", - "\n", - "Удаление пакета:\n", - "\n", - "`pip uninstall tabulate`" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "5GuZtlZDWSpj" - }, - "source": [ - "По умолчанию pip устанавливает пакеты в системную директорию.\n", - "\n", - "Опция `--user` позволяет установить пакет в домашнюю директорию пользователя от имени пользователя." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "ynhzpADeXecs" - }, - "outputs": [], - "source": [ - "!pip install --user mypackage" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "9EXmMfXXaHuO" - }, - "source": [ - "`pip show` выведет информацию о пакете." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 187 - }, - "colab_type": "code", - "executionInfo": { - "elapsed": 5190, - "status": "ok", - "timestamp": 1575639193333, - "user": { - "displayName": "Надежда Демиденко", - "photoUrl": "https://lh3.googleusercontent.com/a-/AAuE7mA6D7k5OgtG9hzPe8Abs8DfOKAXQoTXaPfn7EY=s64", - "userId": "05224310221243935536" - }, - "user_tz": -180 - }, - "id": "yiOIM1c0aLWn", - "outputId": "7d25c527-0b8f-4eee-910e-ba6597416884" - }, - "outputs": [], - "source": [ - "!pip show astor" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "rHb1iJHqaiAm" - }, - "source": [ - "`pip list` выведет список всех установленных в данном окружении пакетов" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 1000 - }, - "colab_type": "code", - "executionInfo": { - "elapsed": 3310, - "status": "ok", - "timestamp": 1575639234779, - "user": { - "displayName": "Надежда Демиденко", - "photoUrl": "https://lh3.googleusercontent.com/a-/AAuE7mA6D7k5OgtG9hzPe8Abs8DfOKAXQoTXaPfn7EY=s64", - "userId": "05224310221243935536" - }, - "user_tz": -180 - }, - "id": "i6EZDhoOap0M", - "outputId": "c14a76f9-0145-4158-ae4c-44c5743b2e96" - }, - "outputs": [], - "source": [ - "!pip list" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "YyQKBXNNW9sL" - }, - "source": [ - "## Виртуальное окружение\n", - "\n", - "Виртуальное окружение - это изолированное окружение среды, которое позволяет нам использовать определенные версии приложений.\n", - "\n", - "Все пакеты, работающие с виртуальным окружением решают одну проблему - они позволяют проектам, которые имеют различные (и часто конфликтующие) зависимости, сосуществовать на одной системе.\n", - "\n", - "Некоторые пакеты для работы с виртуальными окружениями:\n", - "\n", - "- **Virtualenv**\n", - "\n", - "`virtualenv` - стандартный пакет для работы с виртуальным окружением. Используется вместе с virtualenvwrapper для более удобной работы.\n", - "\n", - "Установка: `pip install virtualenv`\n", - "\n", - "\n", - "- **Conda**\n", - "\n", - "Conda - пакетный менеджер, который также позволяет нам создавать виртуальные окружения.\n", - "\n", - "Начиная с Python 3.3 и 3.4, рекомендуемый способ создания виртуального пространства – это использование инструмента командной строки **pyvenv**, который также включен в инсталляцию Python 3 по умолчанию. Однако, в версии 3.6 и выше, вам нужен **python3 -m venv**." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "JFh_bdmtRt86" - }, - "source": [ - "Новая виртуальная среда в **venv** создается при помощи команды:\n", - "\n", - "```\n", - "python3 -m venv env\n", - "```\n", - "\n", - "Эта команда создает каталог под названием \"env\", структура каталога которого схожа со следующей:\n", - "\n", - "```\n", - "├── bin\n", - "│ ├── activate\n", - "│ ├── activate.csh\n", - "│ ├── activate.fish\n", - "│ ├── easy_install\n", - "│ ├── easy_install-3.5\n", - "│ ├── pip\n", - "│ ├── pip3\n", - "│ ├── pip3.5\n", - "│ ├── python -> python3.5\n", - "│ ├── python3 -> python3.5\n", - "│ └── python3.5 -> /Library/Frameworks/Python.framework/Versions/3.5/bin/python3.5\n", - "├── include\n", - "├── lib\n", - "│ └── python3.5\n", - "│ └── site-packages\n", - "└── pyvenv.cfg\n", - "```\n", - "\n", - "- **bin** – файлы, которые взаимодействуют с виртуальной средой;\n", - "- **include** – С-заголовки, компилирующие пакеты Python;\n", - "- **lib** – копия версии Python вместе с папкой \"site-packages\", в которой установлена каждая зависимость.\n", - "\n", - "Чтобы использовать эти пакеты (или ресурсы) среды в изоляции, вам нужно «активировать» их, запустив скрипт **activate** в каталоге \"bin\":\n", - "\n", - "```\n", - "source env/bin/activate\n", - "```\n", - "\n", - "Приглашение командной строки теперь носит префикс вашей среды (в нашем случае – env). Это индикатор того, что env в данный момент активен, что в свою очередь говорит о том, что выполнимые файлы Python используют пакеты и настройки только этой среды.\n", - "\n", - "```\n", - "(env) $\n", - "```\n", - "\n", - "Находясь в одном из окружений, можно ставить пакеты через pip, как обычно:\n", - "\n", - "```\n", - "pip install flask\n", - "```\n", - "\n", - "Список зависимостей проекта принято сохранять в файл с именем requirements.txt:\n", - "\n", - "```\n", - "pip3 freeze > requirements.txt\n", - "```\n", - "\n", - "Этот подход позволяет одной командой установить все зависимости, необходимые проекту:\n", - "\n", - "```\n", - "pip3 install -r requirements.txt\n", - "```\n", - "\n", - "Команда **deactivate** возвращает назад в контекст «system»." - ] - } - ], - "metadata": { - "colab": { - "name": "topic08.ipynb", - "provenance": [] - }, - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/lecture_2/Lecture 2.ipynb b/lecture_2/Lecture 2.ipynb deleted file mode 100644 index 7cf5668..0000000 --- a/lecture_2/Lecture 2.ipynb +++ /dev/null @@ -1,2159 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Lecture 2 - continuation" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Tuple + asterisk = many fun" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Tuple unpacking \n", - " \n", - "Как мы помним, ```tuple``` - неизменяемый контейнер, хранящий каждый объект в заданной позиции \n", - "Python позволяет нам \"распаковывать\" кортеж в разного рода присвоениях:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "3\n", - "Playing 'Only for the Weak' from the album 'Clayman', composed by In Flames\n", - "Playing 'Change (In the House of Flies)' from the album 'White Pony', composed by Deftones\n", - "Playing 'Blood and Thunder' from the album 'Leviathan', composed by Mastodon\n" - ] - } - ], - "source": [ - "a, b = (1,2)\n", - "print(a+b)\n", - "\n", - "songs = [\n", - " ('In Flames', 'Clayman', 'Only for the Weak'),\n", - " ('Deftones', 'White Pony', 'Change (In the House of Flies)'),\n", - " ('Mastodon', 'Leviathan', 'Blood and Thunder')\n", - "]\n", - "for band, album, track in songs:\n", - " print(\"Playing '%s' from the album '%s', composed by %s\" % (track, album, band))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Более того, этот механизм работает на любых итерируемых значениях! \n", - "Вариативность принимает одно значение, обозначенное звездочкой\n" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "ename": "SyntaxError", - "evalue": "two starred expressions in assignment (, line 4)", - "output_type": "error", - "traceback": [ - "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m4\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m two starred expressions in assignment\n" - ] - } - ], - "source": [ - "first_name, *secondary_names, *last_name = (\"Daniel\", \"Michael\", \"Blake\", \"Day-Lewis\")" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "del Toro Sánchez\n", - "['Monserrate', 'Rafael']\n" - ] - } - ], - "source": [ - "first_name, *secondary_names, last_name = (\"Benicio\", \"Monserrate\", \"Rafael\", \"del Toro Sánchez\")\n", - "print(last_name)\n", - "print(secondary_names)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[803, 746, 1200]\n" - ] - } - ], - "source": [ - "item, *prices = ('Absolut', 803, 746, 1200)\n", - "print(prices)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Как насчет вложенных значений? \n", - "Без проблем, нужно задать присваивание на каждом уровне. " - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "'Only for the Weak' / 'Clayman' -- In Flames => released in 2000 by label 'Nuclear Blast'\n", - "'Change (In the House of Flies)' / 'White Pony' -- Deftones => released in 2000 by label 'Maverick Recording Company'\n", - "'Blood and Thunder' / 'Leviathan' -- Mastodon => released in 2004 by label 'Relapse'\n" - ] - } - ], - "source": [ - "songs = [\n", - " ('In Flames', 'Clayman', 'Only for the Weak', (2000, 'Nuclear Blast')),\n", - " ('Deftones', 'White Pony', 'Change (In the House of Flies)', (2000, 'Maverick Recording Company')),\n", - " ('Mastodon', 'Leviathan', 'Blood and Thunder', (2004, 'Relapse'))\n", - "]\n", - "for band, album, track, (year, label) in songs:\n", - " print(\"'%s' / '%s' -- %s => released in %d by label '%s'\" % (track, album, band, year, label))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Вариативность также применяется на каждом уровне" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['Nuclear Blast', 1, 2, 3]" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "band, album, track, (year, *label), *stuff = ('In Flames', 'Clayman', 'Only for the Weak', (2000, 'Nuclear Blast', 1,2,3), 7,8,9,)\n", - "label" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[7, 8, 9]" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "stuff" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Function signatures " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Как мы помним с прошлой лекции, параметры для функции бывают позиционные и именованные. " - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "def func(pos_arg1, pos_arg2, kw_arg1=None, kw_arg2=None):\n", - " pass" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Python обладает удивительно элегантной обработкой параметров функции" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "I do sum => 300\n", - "Have no idea what to do with that: (1, 2, 3, 4, 5)\n", - "And of course with those ones: {'mode': 'tractor'}\n", - "Guess I have received param 'k' = No\n" - ] - } - ], - "source": [ - "def mega_function(a,b, *args, **kwargs):\n", - " print(\"I do sum => %d\" % (a+b))\n", - " print(\"Have no idea what to do with that: %s\" % str(args))\n", - " print(\"And of course with those ones: %s\" % str(kwargs))\n", - " print(\"Guess I have received param 'k' = %s\" % kwargs.get('k', 'No'))\n", - "\n", - "mega_function(150, 150, 1,2,3,4,5, mode='tractor')" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "I do sum => 400\n", - "Have no idea what to do with that: (1, 2, 3, 4, 5)\n", - "And of course with those ones: {'mode': 'tractor', 'k': 'Yes'}\n", - "Guess I have received param 'k' = Yes\n" - ] - } - ], - "source": [ - "mega_function(150, 250, 1,2,3,4,5, mode='tractor', k='Yes')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Эластичная сигнатура добавляет гибкость, если не известен заранее объем входных параметров. \n", - "Также это помогает обеспечить совместимость с функциями, которые зависит от определяемой функции. \n", - "На мой взгляд, сигнатура вида ```(*args, **kwargs)``` может снизить наглядность использования" - ] - }, - { - "cell_type": "code", - "execution_count": 60, - "metadata": {}, - "outputs": [], - "source": [ - "# Пример из реальной жизни\n", - "from sqlalchemy import create_engine\n", - "create_engine??" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Начиная с Python 3.0, появился keyword-only стиль. \n", - "Радость этого в том, что не надо выставлять keyword-параметру значение по умолчанию. \n", - "Позиционные и ключевые параметры разделяются все той же звездочкой" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "3\n" - ] - } - ], - "source": [ - "def my_func(a, *, b, **kwargs):\n", - " print(a+b)\n", - "\n", - "my_func(1,b=2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Object I \n", - " \n", - "(подробнее про объекты и классы у Ивана, 18.03) \n", - " \n", - "Все в Python является объектом. \n", - "Даже нативные вещи вроде int, byte-строк. \n", - "Почему? \n", - "\n", - "Подсказка - CPython разработан на C\n", - "\n", - "Каждый объект имеет:\n", - " 1. идентичность (зависит от интерпретатора, в CPython - адрес в памяти)\n", - " 2. тип значения\n", - " 3. собственно само значение \n", - " 4. счетчик ссылок\n", - " \n", - "**Объект тождественен классу** \n", - "\n", - "Счетчик ссылок инкрементируется при каждом обращении.\n", - "\n", - "Если счетчик ссылок обнуляется - память переменной помечается для удаления - **garbage collection**" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Memory layout \n", - " \n", - "После этой ячейки Ваша жизнь питониста никогда не будет прежней" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Stack and Heap + PyMalloc\n", - "При запуске исполняемого файла, созданный процесс получает адресное пространство (виртуальная адресация в защищенном режиме CPU). \n", - "https://www.kernel.org/doc/gorman/html/understand/understand007.html \n", - " \n", - "На большинcтве Unix-like системах полученное пространство разбивается на несколько секций: \n", - "* Text - машинный код \n", - "* Data - содержит инициазированные глобальные переменные \n", - "* BSS - неявно инициализированные глобальные переменные (нули/NULL) \n", - "* Stack - подчитывается при компиляции, на Linux - <= 8мб\n", - "* Heap - практически бесконечна. Аллокаторы памяти увеличивают пространство кучи вызывая brk()\n", - "\n", - "![memlayout](./ipynb_content/memlayout.png) \n", - " \n", - " \n", - "**Stack**: \n", - "* LIFO-очередь. Каждый вызов создаюет новую запись в стеке - фрейм\n", - "* У каждого потока процесса есть свой стек\n", - "* Выделение памяти для объектов и последующее освобождение происходит автоматически \n", - "* Работать с переменными в стеке - быстро (если сравнить с кучей) \n", - "* Переменные в стеке жестко привязаны к размеру. Можно переполнить \n", - " \n", - "\"SO\"\n", - " \n", - "**Heap** \n", - "* Протяженная область памяти \n", - "* Получить оттуда память - через аллокатор (malloc,calloc,new,...)\n", - "* Нужно не забывать вернуть (free, ...)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Python** хранит все объекты в выделенной зоне приватной кучи процесса интерпретатора. \n", - "\"Zones\"\n", - "\n", - "Управление памятью - высокуровневое, каждый тип имеет свою стратегию выделения памяти. \n", - "На нижних уровнях работает pymalloc \n", - "\n", - "\"Mem \n", - " \n", - "**pymalloc** оптимизирован для выделения памяти < 512 байт. \n", - "Для этого он разбивает память на арены (каждая по 256КБ). \n", - "Арена в свою очередь состоит из пулов по 4КБ, а они уже из блоков (по 8, 16, 24, ... байт - класс хранения) \n", - "```\n", - "Арена (256КБ)\n", - "|\n", - "|__Пул (4КБ)\n", - " |\n", - " |__Блок (зависит от категории)\n", - "``` \n", - "\n", - "Каждый класс хранения оптимизирован под определенный внутренний тип данных - int4, int8, char ... \n", - " \n", - "В зависимости от обстоятельств pymalloc выберет нужную арену и свободные пулы. \n", - " \n", - "**Память CPython освобождает аренами. Поэтому если память плохо освобождается, она может начать 'протекать'**\n", - "(не так как в C/C++, но тоже ощутимо. Пока что ни один Garbage Collector не справится полностью с ними)\n", - " \n", - "\"Arena\" \n", - "\n", - "https://github.com/python/cpython/blob/master/Objects/obmalloc.c \n", - "Подробный обзор по obmalloc.c\n", - "https://rushter.com/blog/python-memory-managment/ \n", - " \n", - "Реализация списка: \n", - "https://github.com/python/cpython/blob/master/Objects/listobject.c \n", - " \n", - "Пища для размышления и огромное спасибо за картинку \n", - "https://stackoverflow.com/questions/18522574/cpython-memory-allocation\n", - "\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Stack machine \n", - " \n", - "\"SO\" \n", - " \n", - "Многие интепретируемые языки (в том числе и **Python**) реализуют стек-машину. \n", - "Принцип прост - на вершину стека в нужной последовательности закидываются объекты (переменные, функции, методы). \n", - "Затем исполняем команду (**opcode**), которая забирает для себя нужное число операндов. \n", - "Команда может вернуть итоговое значение на вершину стека. \n", - " \n", - " \n", - " \n", - "Каждый вложенный вызов порождает новый фрейм (элемент стека)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Python bytecode \n", - "\n", - "Компиляция в байткод происходит: \n", - "* собственно при запуске (python my_script.py) \n", - "* при импорте компилируемого модуля (при этом сохраняется \\*.pyc-файл)\n", - "* при вызове метода compile()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Для наших манипуляция отлично подойдет **compile** \n", - " \n", - " \n", - "```compile(source, filename, mode, **kwargs)``` \n", - " \n", - "* Код пользователя подается через source/filename\n", - "* ```mode``` - что компилируем? \n", - " * exec - последовательность выражений\n", - " * eval - одно выражение\n", - " * single - одно интерактивное выражение \n", - " \n", - "Нв выходе получим объект типа ```code```" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "code" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "src_code = \"\"\"a = 123\n", - "b = 12\n", - "c = a+b\n", - "print(\"c is {}\".format(c))\n", - "\"\"\"\n", - "\n", - "ccode = compile(src_code, \"\", mode='exec')\n", - "type(ccode)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Самые полезные атрибуты объекта ```code```: \n", - "\n", - "| Атрибут |Назначение |\n", - "| -------------- |----------------------------------------------------|\n", - "|```co_consts```|кортеж из констант, используемых конкретным байткодом|\n", - "|```co_names```|кортеж из глобальных переменных|\n", - "|```co_varnames```|кортеж из локальных переменных|\n", - "|```co_code```|собственно сам байткод|\n" - ] - }, - { - "cell_type": "code", - "execution_count": 56, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(123, 12, 'c is {}', None)" - ] - }, - "execution_count": 56, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ccode.co_consts" - ] - }, - { - "cell_type": "code", - "execution_count": 57, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "('a', 'b', 'c', 'print', 'format')" - ] - }, - "execution_count": 57, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ccode.co_names" - ] - }, - { - "cell_type": "code", - "execution_count": 58, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/plain": [ - "()" - ] - }, - "execution_count": 58, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ccode.co_varnames" - ] - }, - { - "cell_type": "code", - "execution_count": 59, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "b'd\\x00Z\\x00d\\x01Z\\x01e\\x00e\\x01\\x17\\x00Z\\x02e\\x03d\\x02\\xa0\\x04e\\x02\\xa1\\x01\\x83\\x01\\x01\\x00d\\x03S\\x00'" - ] - }, - "execution_count": 59, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ccode.co_code" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Давайте раскодируем байткод! \n" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "# Мы поговорим за генераторы чуть позже\n", - "import dis \n", - "\n", - "def unpack_op(bytecode): \n", - " extended_arg = 0\n", - " for i in range(0, len(bytecode), 2):\n", - " opcode = bytecode[i]\n", - " if opcode >= dis.HAVE_ARGUMENT:\n", - " oparg = bytecode[i+1] | extended_arg\n", - " extended_arg = (oparg << 8) if opcode == dis.EXTENDED_ARG else 0\n", - " else:\n", - " oparg = None\n", - " yield (i, opcode, oparg)" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " 0 100 0\n", - " 2 90 0\n", - " 4 100 1\n", - " 6 90 1\n", - " 8 101 0\n", - "10 101 1\n", - "12 23 None\n", - "14 90 2\n", - "16 101 3\n", - "18 100 2\n", - "20 160 4\n", - "22 101 2\n", - "24 161 1\n", - "26 131 1\n", - "28 1 None\n", - "30 100 3\n", - "32 83 None\n" - ] - } - ], - "source": [ - "for offset, opcode, oparg in unpack_op(ccode.co_code):\n", - " arg = 'None' if oparg is None else oparg\n", - " outs = '{:>2} {:>3} {:>5}'.format(offset, opcode, arg)\n", - " print(outs)" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " 0 LOAD_CONST 0\n", - " 2 STORE_NAME 0\n", - " 4 LOAD_CONST 1\n", - " 6 STORE_NAME 1\n", - " 8 LOAD_NAME 0\n", - "10 LOAD_NAME 1\n", - "12 BINARY_ADD None\n", - "14 STORE_NAME 2\n", - "16 LOAD_NAME 3\n", - "18 LOAD_CONST 2\n", - "20 LOAD_METHOD 4\n", - "22 LOAD_NAME 2\n", - "24 CALL_METHOD 1\n", - "26 CALL_FUNCTION 1\n", - "28 POP_TOP None\n", - "30 LOAD_CONST 3\n", - "32 RETURN_VALUE None\n" - ] - } - ], - "source": [ - "for offset, opcode, oparg in unpack_op(ccode.co_code):\n", - " arg = 'None' if oparg is None else oparg\n", - " outs = '{:>2} {:>15} {:>5}'.format(offset, dis.opname[opcode], arg)\n", - " print(outs)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Описание использованных опкодов** \n", - "https://docs.python.org/3/library/dis.html#python-bytecode-instructions \n", - " \n", - " **TOS** (top of stack) \n", - " Приcвоить TOS - закинуть элемент на вершину стека\n", - "\n", - "\n", - "|opcode|description|arguments| \n", - "|------|-----------|---------|\n", - "|LOAD_CONST|TOS = константа из ```co_consts```|индекс константы\n", - "|LOAD_NAME|TOS = значение переменной из ```co_names```|индекс переменной\n", - "|STORE_NAME|Переменная из ```co_names``` = TOS|индекс переменной\n", - "|BINARY_ADD|Сложение двух верхних элементов стека|нет параметров\n", - "|CALL_FUNCTION|Вызов функции с указанием числа параметров|число параметров\n", - "|CALL_METHOD|Вызов метода объекта с указанием числа параметров|число параметров\n", - "|POP_TOP|удаление текущего TOS|\n", - "|RETURN_VALUE|вернуть текущий TOS родительскому вызову" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Байт-код CPython, в отличии от Java Virtual Machine, не совместим между разными версиями. \n", - "Но это не беда, Python - по настоящему интепретируемый ЯП! \n", - " \n", - "Чтобы получить красивую декомпиляцию со всеми тонкостями используемой версии, воспользуемся модулем **dis** из стандартной библиотеки" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0 a = 123\n", - "1 b = 12\n", - "2 c = a+b\n", - "3 print(\"c is {}\".format(c))\n", - "4 \n" - ] - } - ], - "source": [ - "# исходная нумерация строк\n", - "for i,s in enumerate(src_code.split(\"\\n\")):\n", - " print(\"{} {}\".format(i,s))" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " 1 0 LOAD_CONST 0 (123)\n", - " 2 STORE_NAME 0 (a)\n", - "\n", - " 2 4 LOAD_CONST 1 (12)\n", - " 6 STORE_NAME 1 (b)\n", - "\n", - " 3 8 LOAD_NAME 0 (a)\n", - " 10 LOAD_NAME 1 (b)\n", - " 12 BINARY_ADD\n", - " 14 STORE_NAME 2 (c)\n", - "\n", - " 4 16 LOAD_NAME 3 (print)\n", - " 18 LOAD_CONST 2 ('c is {}')\n", - " 20 LOAD_METHOD 4 (format)\n", - " 22 LOAD_NAME 2 (c)\n", - " 24 CALL_METHOD 1\n", - " 26 CALL_FUNCTION 1\n", - " 28 POP_TOP\n", - " 30 LOAD_CONST 3 (None)\n", - " 32 RETURN_VALUE\n", - "\n", - "\n", - "\n", - " [TODO] Визуализация выполнения - на доске\n" - ] - } - ], - "source": [ - "import dis\n", - "from dis import dis as disasm\n", - "\n", - "# dis сохраняет порядок строк\n", - "disasm(src_code)\n", - "\n", - "print(\"\\n\\n\\n [TODO] Визуализация выполнения - на доске\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Objects II" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Давайте уясним одну вещь. \n", - "Переменная в Python (и любом современном языке) - указатель на объект (некая область в памяти). \n", - "Переменная сама по себе не является контейнером для объектов \n", - " \n", - "\"SO\" " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Парадигмы передачи объектов: " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Call by reference \n", - " \n", - "\"SO\" " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Call by value \n", - "\n", - "\"SO\" \n", - " \n", - " \n", - "Thanks to https://robertheaton.com/2014/02/09/pythons-pass-by-object-reference-as-explained-by-philip-k-dick/" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Variable Scopes \n", - " \n", - "В **Python** предусмотрено три ключевых слова, определяющих зону действия переменной: \n", - "* global\n", - "* local\n", - "* nonlocal" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### global" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1\n" - ] - } - ], - "source": [ - "a = 1\n", - "def f1():\n", - " print(a)\n", - "f1()" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " 1 0 LOAD_CONST 0 (1)\n", - " 2 STORE_NAME 0 (a)\n", - "\n", - " 2 4 LOAD_CONST 1 (\", line 2>)\n", - " 6 LOAD_CONST 2 ('f1')\n", - " 8 MAKE_FUNCTION 0\n", - " 10 STORE_NAME 1 (f1)\n", - "\n", - " 4 12 LOAD_NAME 1 (f1)\n", - " 14 CALL_FUNCTION 0\n", - " 16 POP_TOP\n", - " 18 LOAD_CONST 3 (None)\n", - " 20 RETURN_VALUE\n", - "\n", - "Disassembly of \", line 2>:\n", - " 3 0 LOAD_GLOBAL 0 (print)\n", - " 2 LOAD_GLOBAL 1 (a)\n", - " 4 CALL_FUNCTION 1\n", - " 6 POP_TOP\n", - " 8 LOAD_CONST 0 (None)\n", - " 10 RETURN_VALUE\n" - ] - } - ], - "source": [ - "disasm(\"\"\"a = 1\n", - "def f1():\n", - " print(a)\n", - "f1()\"\"\")" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1000\n" - ] - } - ], - "source": [ - "# изменим глобальную переменную\n", - "a = 1\n", - "def f1():\n", - " global a\n", - " a *= 1000\n", - " print(a)\n", - "f1()" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " 1 0 LOAD_CONST 0 (1)\n", - " 2 STORE_GLOBAL 0 (a)\n", - "\n", - " 2 4 LOAD_CONST 1 (\", line 2>)\n", - " 6 LOAD_CONST 2 ('f1')\n", - " 8 MAKE_FUNCTION 0\n", - " 10 STORE_NAME 1 (f1)\n", - "\n", - " 6 12 LOAD_NAME 1 (f1)\n", - " 14 CALL_FUNCTION 0\n", - " 16 POP_TOP\n", - " 18 LOAD_CONST 3 (None)\n", - " 20 RETURN_VALUE\n", - "\n", - "Disassembly of \", line 2>:\n", - " 4 0 LOAD_GLOBAL 0 (a)\n", - " 2 LOAD_CONST 1 (1000)\n", - " 4 INPLACE_MULTIPLY\n", - " 6 STORE_GLOBAL 0 (a)\n", - "\n", - " 5 8 LOAD_GLOBAL 1 (print)\n", - " 10 LOAD_GLOBAL 0 (a)\n", - " 12 CALL_FUNCTION 1\n", - " 14 POP_TOP\n", - " 16 LOAD_CONST 0 (None)\n", - " 18 RETURN_VALUE\n" - ] - } - ], - "source": [ - "disasm(\"\"\"a = 1\n", - "def f1():\n", - " global a\n", - " a *= 1000\n", - " print(a)\n", - "f1()\"\"\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### local" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2\n" - ] - } - ], - "source": [ - "a = 1\n", - "def f1():\n", - " a = 2\n", - " print(a)\n", - "f1()" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " 1 0 LOAD_CONST 0 (1)\n", - " 2 STORE_NAME 0 (a)\n", - "\n", - " 2 4 LOAD_CONST 1 (\", line 2>)\n", - " 6 LOAD_CONST 2 ('f1')\n", - " 8 MAKE_FUNCTION 0\n", - " 10 STORE_NAME 1 (f1)\n", - "\n", - " 5 12 LOAD_NAME 1 (f1)\n", - " 14 CALL_FUNCTION 0\n", - " 16 POP_TOP\n", - " 18 LOAD_CONST 3 (None)\n", - " 20 RETURN_VALUE\n", - "\n", - "Disassembly of \", line 2>:\n", - " 3 0 LOAD_CONST 1 (2)\n", - " 2 STORE_FAST 0 (a)\n", - "\n", - " 4 4 LOAD_GLOBAL 0 (print)\n", - " 6 LOAD_FAST 0 (a)\n", - " 8 CALL_FUNCTION 1\n", - " 10 POP_TOP\n", - " 12 LOAD_CONST 0 (None)\n", - " 14 RETURN_VALUE\n" - ] - } - ], - "source": [ - "disasm(\"\"\"a = 1\n", - "def f1():\n", - " a = 2\n", - " print(a)\n", - "f1()\"\"\")" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "ename": "UnboundLocalError", - "evalue": "local variable 'a' referenced before assignment", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mUnboundLocalError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0mf1\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m\u001b[0m in \u001b[0;36mf1\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mf1\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 4\u001b[0m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mf1\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mUnboundLocalError\u001b[0m: local variable 'a' referenced before assignment" - ] - } - ], - "source": [ - "a = 1\n", - "def f1():\n", - " print(a)\n", - " a = 2\n", - "f1()" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " 1 0 LOAD_CONST 0 (1)\n", - " 2 STORE_NAME 0 (a)\n", - "\n", - " 2 4 LOAD_CONST 1 (\", line 2>)\n", - " 6 LOAD_CONST 2 ('f1')\n", - " 8 MAKE_FUNCTION 0\n", - " 10 STORE_NAME 1 (f1)\n", - "\n", - " 5 12 LOAD_NAME 1 (f1)\n", - " 14 CALL_FUNCTION 0\n", - " 16 POP_TOP\n", - " 18 LOAD_CONST 3 (None)\n", - " 20 RETURN_VALUE\n", - "\n", - "Disassembly of \", line 2>:\n", - " 3 0 LOAD_GLOBAL 0 (print)\n", - " 2 LOAD_FAST 0 (a)\n", - " 4 CALL_FUNCTION 1\n", - " 6 POP_TOP\n", - "\n", - " 4 8 LOAD_CONST 1 (2)\n", - " 10 STORE_FAST 0 (a)\n", - " 12 LOAD_CONST 0 (None)\n", - " 14 RETURN_VALUE\n" - ] - } - ], - "source": [ - "disasm(\"\"\"a = 1\n", - "def f1():\n", - " print(a)\n", - " a = 2\n", - "f1()\"\"\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### nonlocal and closure" - ] - }, - { - "cell_type": "code", - "execution_count": 63, - "metadata": {}, - "outputs": [], - "source": [ - "# TODO - скользящее среднее -> иллюстрация на доске\n", - "def make_rolling_avg():\n", - " count = 0\n", - " total = 0\n", - " \n", - " def avg(new_val):\n", - " count += 1\n", - " total += new_val;\n", - " return total / count\n", - " \n", - " return avg" - ] - }, - { - "cell_type": "code", - "execution_count": 64, - "metadata": {}, - "outputs": [ - { - "ename": "UnboundLocalError", - "evalue": "local variable 'count' referenced before assignment", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mUnboundLocalError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mavg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmake_rolling_avg\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;31m# TODO uncomment me\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mavg\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m\u001b[0m in \u001b[0;36mavg\u001b[0;34m(new_val)\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mavg\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnew_val\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 7\u001b[0;31m \u001b[0mcount\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 8\u001b[0m \u001b[0mtotal\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0mnew_val\u001b[0m\u001b[0;34m;\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mtotal\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mcount\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mUnboundLocalError\u001b[0m: local variable 'count' referenced before assignment" - ] - } - ], - "source": [ - "avg = make_rolling_avg()\n", - "# TODO uncomment me\n", - "avg(1)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Что не так с этой функцией?** \n", - "| \n", - "| \n", - "| \n", - "| \n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Переменные ```count, total``` есть в скоупах обеих функций. \n", - "Нужно, чтобы ```avg``` работал с внешними переменными. \n", - "Они для нее ни локальные, ни глобальные. \n", - "Что остается? **nonlocal**" - ] - }, - { - "cell_type": "code", - "execution_count": 65, - "metadata": {}, - "outputs": [], - "source": [ - "def make_rolling_avg():\n", - " count = 0\n", - " total = 0\n", - " \n", - " def avg(new_val):\n", - " nonlocal count, total\n", - " count += 1\n", - " total += new_val;\n", - " return total / count\n", - " \n", - " return avg" - ] - }, - { - "cell_type": "code", - "execution_count": 66, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2.0 3.0\n" - ] - } - ], - "source": [ - "avg2 = make_rolling_avg()\n", - "print(avg2(2), avg2(4))" - ] - }, - { - "cell_type": "code", - "execution_count": 67, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " 7 0 LOAD_DEREF 0 (count)\n", - " 2 LOAD_CONST 1 (1)\n", - " 4 INPLACE_ADD\n", - " 6 STORE_DEREF 0 (count)\n", - "\n", - " 8 8 LOAD_DEREF 1 (total)\n", - " 10 LOAD_FAST 0 (new_val)\n", - " 12 INPLACE_ADD\n", - " 14 STORE_DEREF 1 (total)\n", - "\n", - " 9 16 LOAD_DEREF 1 (total)\n", - " 18 LOAD_DEREF 0 (count)\n", - " 20 BINARY_TRUE_DIVIDE\n", - " 22 RETURN_VALUE\n" - ] - } - ], - "source": [ - "disasm(avg2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "LOAD_DEREF(i)\n", - "\n", - " Loads the cell contained in slot i of the cell and free variable storage. Pushes a reference to the object the cell contains on the stack.\n", - " \n", - "Свободная переменная - локальная переменная внешней функции, запрашиваемая вложенной" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Вывод** \n", - "```avg``` сохраняет доступ к внешним переменным, даже после того как породившая их функция была задана \n", - " \n", - "```avg``` - **замыкание**" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Copy.copy()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Shallow copies" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 33, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "a = [1,2,[3,4]]\n", - "b = list(a)\n", - "a[2] is b[2]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\"SO\" " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Deep copies" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from copy import deepcopy\n", - "a = [1,2,[3,4]]\n", - "b = deepcopy(a)\n", - "a[2] is b[2]" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "4597363280\n", - "4597363280\n" - ] - }, - { - "data": { - "text/plain": [ - "1002302" - ] - }, - "execution_count": 35, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "def func(i):\n", - " print(id(i))\n", - " return 2+i\n", - "\n", - "base = 1002300\n", - "print(id(base))\n", - "func(base)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "https://robertheaton.com/2014/02/09/pythons-pass-by-object-reference-as-explained-by-philip-k-dick/" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Equality and identity \n", - " \n", - "В каждого объекта есть идентификатор. \n", - "В CPython - адрес в памяти \n", - " \n", - " \n", - "Идентичность проверяется по ```id()```\n", - "Равенство - ```==```" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Вопрос для внимательных** - почему None is None == True?" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 36, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "None is None" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 37, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "NotImplemented is NotImplemented" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Identity**" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/plain": [ - "4597357936" - ] - }, - "execution_count": 38, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "id(int(1237829))" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "4597363472" - ] - }, - "execution_count": 39, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "id(int(1237829))" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "My identity is 4592544896\n", - "True\n", - "True\n" - ] - } - ], - "source": [ - "bigmac = ['tasty', 'delicious', 'crunchy']\n", - "evil = bigmac\n", - "normfood = bigmac\n", - "\n", - "print(\"My identity is %d\" % id(bigmac))\n", - "print(bigmac is evil)\n", - "print(normfood == bigmac)" - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 41, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "romans_lived = {'italy'}\n", - "itailians_live = {'italy'}\n", - "romans_lived == itailians_live" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![2vars1obj](./ipynb_content/2vars2obj.png)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Хозяйке на заметку** - Отличный визуализатор работы интерпретатора: \n", - "http://pythontutor.com/visualize.html#mode=edit" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Классы \n", - " \n", - "Задать свой класс в питоне - нет ничего проще." - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [], - "source": [ - "class Animal:\n", - " pass\n", - "\n", - "кошак = Animal()\n", - "собакен = Animal()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Класс имеет атрибуты и методы. \n", - "Атрибуты - ```per class / per instance``` \n", - "Что из них статичное?" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'mammal'" - ] - }, - "execution_count": 43, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "class Animal:\n", - " creature_type = 'mammal'\n", - "\n", - "кошак = Animal()\n", - "собакен = Animal()\n", - "\n", - "кошак.creature_type" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'arthropods'" - ] - }, - "execution_count": 44, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "Animal.creature_type = 'arthropods'\n", - "\n", - "кошак.creature_type" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Создание класса происходит в два этапа. \n", - "```__new__``` - получение экземпляра класса (instance) \n", - "```__init__``` - инициализация полученного экземпляра \n", - " \n", - "Разница сразу видна в сигнатурах. \n", - "```cls``` - указатель на класс \n", - "```self``` - указатель на экземпляр" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Все класс в Python происходят от ```object```" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": {}, - "outputs": [], - "source": [ - "CAT_COUNTER = 0\n", - "\n", - "class Cat():\n", - " def __new__(cls, *args, **kwargs):\n", - " global CAT_COUNTER\n", - " CAT_COUNTER += 1\n", - " return object.__new__(cls)\n", - " \n", - " def __init__(self, name):\n", - " self.name = name" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "4\n" - ] - } - ], - "source": [ - "for i in range(4):\n", - " Cat(i)\n", - "\n", - "print(CAT_COUNTER)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**BTW - в Python нет приватных атрибутов, все по взрослому**" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'murzik'" - ] - }, - "execution_count": 47, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "Cat('murzik').name" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Object III" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Объект предоставляет свой протокол (проще говоря - набор функций). \n", - "Если реализовать часть таких функций - объект может быть принят различными функциями Python \n", - "Некоторые их этих функций: \n", - "\n", - "| Функция | Что делает |\n", - "|---------|------------|\n", - "|```__new__```|создание экземпляра класса|\n", - "|```__init__```|инициализация атрибутов класса\n", - "|```__del__```|финализатор класса (но не его деструктор)\n", - "|```__str__```|текстовое представление класса (используется в ```print```, ```format```)\n", - "|```__repr__```|текстовое представление класса \"для разработчика\"\n", - "|```__bytes__```|представление класса в байтах (не совсем строка) \n", - " \n", - "Методы, название которых имеет вид **__XYZ__** часто называются \"магическими\". \n", - "Праивльно произношение - **dunder**. Например: dunder-**init**" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Методы всегда принимают первым параметром указатель на экземпляр" - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "metadata": {}, - "outputs": [], - "source": [ - "class Cat():\n", - " def __init__(self, name):\n", - " self.name = name\n", - " \n", - "\n", - "class CatStr():\n", - " def __init__(self, name):\n", - " self.name = name\n", - " \n", - " def __str__(self):\n", - " return \"\".format(self.name)" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "<__main__.Cat object at 0x11205b890>\n" - ] - } - ], - "source": [ - "print(Cat(\"murzik\"))" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n" - ] - } - ], - "source": [ - "print(CatStr(\"murzik\"))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Collections \n", - "\n", - "Чтобы выступать в роли коллекции, объекту нужно предоставлять опеределенные методы. \n", - "В типизированных языках (Java, C#) такое явление называют интерфейсом, в Python/Smalltalk - протоколом \n", - "Протокол, в отличии от интерфейса, не является типом и выражает \"договоренность\" \n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Фреймворк коллекций в Python формализован в стандартном модуле ```collections.abc``` \n", - " \n", - "https://asvetlov.blogspot.com/2014/09/abstract-containers.html" - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "''\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "%%html \n", - "''" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Рассмотрим один из базовых протоколов - **Sequence**" - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "''\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "%%html \n", - "''" - ] - }, - { - "cell_type": "code", - "execution_count": 156, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "3\n", - "3\n" - ] - } - ], - "source": [ - "data = [1,2,3]\n", - "print(len(data))\n", - "print(data.__len__())" - ] - }, - { - "cell_type": "code", - "execution_count": 160, - "metadata": {}, - "outputs": [], - "source": [ - "from collections.abc import Sequence\n", - "from random import randint" - ] - }, - { - "cell_type": "code", - "execution_count": 166, - "metadata": {}, - "outputs": [], - "source": [ - "class FakeCollection(Sequence):\n", - " def __init__(self):\n", - " self.length = randint(1,15)\n", - " self.data = []\n", - " for i in range(self.length):\n", - " self.data.append(randint(1,100))\n", - " \n", - " def __len__(self):\n", - " return self.length\n", - " \n", - " def __getitem__(self, index):\n", - " return self.data[index]" - ] - }, - { - "cell_type": "code", - "execution_count": 167, - "metadata": {}, - "outputs": [], - "source": [ - "fc = FakeCollection()" - ] - }, - { - "cell_type": "code", - "execution_count": 168, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "52\n", - "29\n", - "44\n", - "28\n", - "41\n", - "39\n", - "91\n", - "37\n" - ] - } - ], - "source": [ - "# iter works\n", - "for d in fc:\n", - " print(d)" - ] - }, - { - "cell_type": "code", - "execution_count": 169, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "52" - ] - }, - "execution_count": 169, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# getitem works\n", - "fc[0]" - ] - }, - { - "cell_type": "code", - "execution_count": 170, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "8" - ] - }, - "execution_count": 170, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# len also works\n", - "len(fc)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Duck typing \n", - " \n", - "```Если это выглядит как утка, плавает как утка и крякает как утка, то это, вероятно, и есть утка. ``` \n", - " \n", - "Пример с ```FakeCollection``` - объект реализовал метод **__iter__**, поэтому считается итерируемым (иначе говоря, реализовывает протокол итерации). \n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Домашнее задание \n", - " \n", - " \n", - "Реализовать свой домашний ```ArrayList``` \n", - "В отличии от стандартного списка, ваш должен быть типизированным. \n", - "Для проходного балла - класс должен реализовать протокол ```Sequence``` \n", - "Для мотивированных и любопытных - класс должен реализовать протокол ```MutableSequence``` \n", - " \n", - "Каждый метод из протокола должен быть проверен. \n", - " \n", - "ДЗ - нужно сделать форк от нашего репозитория и прислать в Slack ссылку на Pull Request \n", - "\n", - "Hint 1 - изучите плоский массив: ```array.array```, внутреннее хранение должно быть на нем. \n", - "Hint 2 - наследование от классов из ```collections.abc``` **не лопускается!**" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# На десерт (по внутренностям)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "* Воспроизвести патчинг Python (рекомендуется делать строго на виртуалке/docker под linux) \n", - "\n", - "https://eli.thegreenplace.net/2010/06/30/python-internals-adding-a-new-statement-to-python/" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "* Детали реализации питоновского спика\n", - "\n", - "http://www.laurentluce.com/posts/python-list-implementation/" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "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.7.4" - }, - "toc": { - "base_numbering": 1, - "nav_menu": { - "height": "280px", - "width": "160px" - }, - "number_sections": true, - "sideBar": true, - "skip_h1_title": false, - "title_cell": "Table of Contents", - "title_sidebar": "Contents", - "toc_cell": false, - "toc_position": {}, - "toc_section_display": true, - "toc_window_display": false - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/lecture_2/ipynb_content/2vars2obj.png b/lecture_2/ipynb_content/2vars2obj.png deleted file mode 100644 index ef085ab..0000000 Binary files a/lecture_2/ipynb_content/2vars2obj.png and /dev/null differ diff --git a/lecture_2/ipynb_content/arena.png b/lecture_2/ipynb_content/arena.png deleted file mode 100644 index 4951398..0000000 Binary files a/lecture_2/ipynb_content/arena.png and /dev/null differ diff --git a/lecture_2/ipynb_content/cbr.jpg b/lecture_2/ipynb_content/cbr.jpg deleted file mode 100644 index ca6b98c..0000000 Binary files a/lecture_2/ipynb_content/cbr.jpg and /dev/null differ diff --git a/lecture_2/ipynb_content/cbv.jpg b/lecture_2/ipynb_content/cbv.jpg deleted file mode 100644 index 8074eb7..0000000 Binary files a/lecture_2/ipynb_content/cbv.jpg and /dev/null differ diff --git a/lecture_2/ipynb_content/collections.pdf b/lecture_2/ipynb_content/collections.pdf deleted file mode 100644 index a966af6..0000000 Binary files a/lecture_2/ipynb_content/collections.pdf and /dev/null differ diff --git a/lecture_2/ipynb_content/hierarchy.png b/lecture_2/ipynb_content/hierarchy.png deleted file mode 100644 index 05a6776..0000000 Binary files a/lecture_2/ipynb_content/hierarchy.png and /dev/null differ diff --git a/lecture_2/ipynb_content/machine.gif b/lecture_2/ipynb_content/machine.gif deleted file mode 100644 index 4c51bd7..0000000 Binary files a/lecture_2/ipynb_content/machine.gif and /dev/null differ diff --git a/lecture_2/ipynb_content/memlayout.png b/lecture_2/ipynb_content/memlayout.png deleted file mode 100644 index ea3d86c..0000000 Binary files a/lecture_2/ipynb_content/memlayout.png and /dev/null differ diff --git a/lecture_2/ipynb_content/sequence.pdf b/lecture_2/ipynb_content/sequence.pdf deleted file mode 100644 index 4747558..0000000 Binary files a/lecture_2/ipynb_content/sequence.pdf and /dev/null differ diff --git a/lecture_2/ipynb_content/shallow.png b/lecture_2/ipynb_content/shallow.png deleted file mode 100644 index 162df91..0000000 Binary files a/lecture_2/ipynb_content/shallow.png and /dev/null differ diff --git a/lecture_2/ipynb_content/stackoverflow.jpg b/lecture_2/ipynb_content/stackoverflow.jpg deleted file mode 100644 index 2170a67..0000000 Binary files a/lecture_2/ipynb_content/stackoverflow.jpg and /dev/null differ diff --git a/lecture_2/ipynb_content/sticker.png b/lecture_2/ipynb_content/sticker.png deleted file mode 100644 index 543281f..0000000 Binary files a/lecture_2/ipynb_content/sticker.png and /dev/null differ diff --git a/lecture_2/ipynb_content/zones.png b/lecture_2/ipynb_content/zones.png deleted file mode 100644 index 94e7295..0000000 Binary files a/lecture_2/ipynb_content/zones.png and /dev/null differ diff --git a/lecture_3/Classes.ipynb b/lecture_3/Classes.ipynb deleted file mode 100755 index 44726e3..0000000 --- a/lecture_3/Classes.ipynb +++ /dev/null @@ -1,2084 +0,0 @@ -{ - "cells": [ - { - "attachments": { - "0_instance-of.png": { - "image/png": "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" - } - }, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Классы в Python\n", - "\n", - "Python - это в первую очередь язык программирования, реализованный в объектно-ориентированной парадигме, поэтому мы никак не можем обойтись без понятия класса. В отличие от многих других ООП-языков, в питоне реализовано всего два вида классов - классический класс и метакласс. На уровне языка интерфейсов и структур здесь нет.\n", - "\n", - "![0_instance-of.png](attachment:0_instance-of.png)\n", - "\n", - "Что ж, довольно слов, пора программировать =)\n", - "\n", - "Объявим простейший класс, который ничего не умеет:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "class Nothing:\n", - " pass" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Итак, мы объявили класс. Теперь мы можем создавать объекты этого класса." - ] - }, - { - "attachments": { - "0_class_objects.jpg": { - "image/jpeg": "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BQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFAHlfxZ1N9b13T/h/Hn7FHCNW1fDcSR7ylvAw7q7pI7DuIAOjEVw4ud2qS9X+n9eR9JkeHVOEsY978sfXdv5KyXr5FCsD1AoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAL/AMJtTfRNd1D4fSZ+xPCdW0jLcRx7wlxAo7KjvG6joBOR0UVvhJ2bpP1X6/15nl55h1UhHGLe/LL13T+aun6eZ6pXcfNhQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQB4pfObj4i+NJ3OTBfWdkueyLYW8oH0zO35mvMq61ZfL8kfZ4NcuBopdVJ/+TSX6FipNQoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAK9i5t/iN4KnQ4M99eWTY7o1hcSkfTMC/kKqlpVj8/yZljFzYGsn0UX/AOTRX6ntdemfGBQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQB4lN/yP8A48/7DVt/6arGvLqfxZ+v6I+0wv8AuND/AAv/ANLmWqRoFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQBVh/5H/wH/2Grn/01X1On/Fh6/ozPFf7jX/wr/0uB7bXqHxYUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAeJTf8AI/8Ajz/sNW3/AKarGvLqfxZ+v6I+0wv+40P8L/8AS5lqkaBQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFA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CgAoAKACgAoAKACgAoAKACgAoAKAKsP/ACP/AID/AOw1c/8ApqvqdP8Aiw9f0Zniv9xr/wCFf+lwPba9Q+LCgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgDxKb/kf/Hn/AGGrb/01WNeXU/iz9f0R9phf9xof4X/6XMtUjQKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgCrD/yP/gP/ALDVz/6ar6nT/iw9f0Zniv8Aca/+Ff8ApcD22vUPiwoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoA8Y8RQ/2X8UdetJSB/bFtaatBz9/an2eQD3XyYif+ui15tZctZ+dn+h9hl0/a4CDX2W4v5vmX33f3MkqDoCgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAj8PQ/2p8UdAtIiD/Y9td6tP/sbkNtGD7t50pH/AFzarormrLyu/wBDnzGfssBNv7TUV9/M/usvvR7PXpHx4UAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAcX8TPB974jsrPWNAWL+3NEkea0VztFzE4xLbFv4Q4CkE8B0QngGufEUnUjeO6/qx6uVY6OEqOFX4JaPy7P5fk2cJpWrWmr2xuLbzEaNzFPBMhSa3lH3o5EPKOO4P8sGuFO59NODg9dns1s13T6ouUyAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgCnqurWmkWwuLnzHaRhFBBChea4lP3Y40HLuewH8smk3YuEHN6bLdvZLu30R3fwz8H33h2yvNY19YxrmtyJNdqh3C2iQYitg3Rgg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" - } - }, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![0_class_objects.jpg](attachment:0_class_objects.jpg)" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "nothing1 = Nothing()\n", - "nothing2 = Nothing()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "В Jupyter Notebook'е можем посмотреть на то, что это за объекты:" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "<__main__.Nothing at 0x110ebda90>" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "nothing1" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "nothing2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Посмотрим на тип созданного объекта - это и будет наш объявленный класс" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(__main__.Nothing, __main__.Nothing)" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "type(nothing1), type(nothing2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Методы объектов классов\n", - "\n", - "Давайте создадим класс, который хоть что-то умеет. Например, пусть у него будет метод, при вызове которого наш объект нашего класса будет мяукать =)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "class Meower:\n", - " def meow():\n", - " print(\"meow!\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Инстанцируем объект нового класса:" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "ename": "TypeError", - "evalue": "meow() takes 0 positional arguments but 1 was given", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mcat\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mMeower\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mcat\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmeow\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m: meow() takes 0 positional arguments but 1 was given" - ] - } - ], - "source": [ - "cat = Meower()\n", - "cat.meow()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "И мы столкнулись с ошибкой, которая говорит, что почему-то в эту функцию подается какой-то аргумент, несмотря на то, что мы ничего туда не подавали. Давайте посмотрим, а что вообще за объект наш объявленный метод?" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - ">" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "cat.meow" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Обратите внимание, как различаются типы этих двух функций. В этом и кроется суть ошибки: meow - это не просто функция, а bound method, с которым нужно обращаться немного по-другому: он всегда должен принимать не меньше одного аргумента, и первый аргумент - это instance класса. Первый аргумент bound method'ов принято называть self.\n", - "\n", - "Давайте перепишем наш класс в соответствии с этим." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "class Meower:\n", - " def meow(self):\n", - " print(\"meow!\")" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "meow!\n" - ] - } - ], - "source": [ - "cat = Meower()\n", - "cat.meow()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Заметим еще одну интересную вещь. Наш метод можно вызвать не только у инстанса класса, но и у самого класса. Но в этом случае он будет уже не bound method'ом, а обычной функцией." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "Meower.meow" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "ename": "TypeError", - "evalue": "meow() missing 1 required positional argument: 'self'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mMeower\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmeow\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m: meow() missing 1 required positional argument: 'self'" - ] - } - ], - "source": [ - "Meower.meow()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Но в таком виде в эту функцию не подается автоматически аргумент self. Мы должны явно указать, для какого объекта должна быть вызвана эта функция." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "meow!\n" - ] - } - ], - "source": [ - "Meower.meow(cat)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "А теперь немного треша. Вглядитесь в код нашей функции meow: он внутри никак не использует объект кота. Поэтому текущий код сработает и вот так:" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "meow!\n" - ] - } - ], - "source": [ - "Meower.meow(None)" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "meow!\n" - ] - } - ], - "source": [ - "Meower.meow(\"дикая дичь\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "Meower.meow(cat.meow)" - ] - }, - { - "attachments": { - "1_excited_cat.jpg": { - "image/jpeg": "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" - } - }, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![1_excited_cat.jpg](attachment:1_excited_cat.jpg)\n", - "\n", - "Но так, конечно, делать не стоит. Код должен быть понятным =)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Конструктор класса\n", - "\n", - "Конструктор - это метод, который вызывается при создании класса. Давайте напишем класс с конструктором, в котором выведем на экран уведомление о том, что класс создан." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "class Alien:\n", - " def __init__(self):\n", - " print(\"Я родился!\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "luntik = Alien()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Вообще говоря, классы и объекты классов нам нужны для того, чтобы хранить какие-то значения. Давайте посмотрим, как можно инициализировать какие-то значения внутри объекта при его создании." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "INITIAL_BONUS = 100\n", - "INTERMEDIATE_BALANCE = 5000\n", - "ADVANCED_BALANCE = 15000\n", - "\n", - "class Client:\n", - " def __init__(self, name, balance):\n", - " self.name = name\n", - " self.balance = balance + INITIAL_BONUS\n", - " \n", - " if self.balance < INTERMEDIATE_BALANCE:\n", - " self.level = \"Basic\"\n", - " elif self.balance < ADVANCED_BALANCE:\n", - " self.level = \"Intermediate\"\n", - " else:\n", - " self.level = \"Advanced\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Мы определили какую-то логику в конструкторе класса и задали поля объекта name, balance и level. Инстанцируем несколько объектов, чтобы увидеть, как это работает:" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "John_Doe = Client(\"John Doe\", 500)\n", - "Jane_Defoe = Client(\"Jane Defoe\", 150000)" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'John Doe'" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "John_Doe.name" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'Advanced'" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "Jane_Defoe.level" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "150100" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "Jane_Defoe.balance" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Мы можем определять поля объекта в любой момент во время или после его создания. Давайте добавим поле email к уже созданному объекту." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'johndoe23@gmail.com'" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "John_Doe.email = \"johndoe23@gmail.com\"\n", - "John_Doe.email" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "ename": "AttributeError", - "evalue": "'Client' object has no attribute 'email'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mJane_Defoe\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0memail\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mAttributeError\u001b[0m: 'Client' object has no attribute 'email'" - ] - } - ], - "source": [ - "Jane_Defoe.email" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "При этом видим, что объект Jane_Defoe не поменялся.\n", - "\n", - "Получить значение поля объекта или назначить его можно еще одним способом - специальными встроенными в интерпретатор питона функциями getattr и setattr:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "getattr(John_Doe, 'email')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "getattr(Jane_Defoe, 'email')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "setattr(Jane_Defoe, 'email', 'jane@goo.gl')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "Jane_Defoe.email" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Удалить атрибут объекта можно двумя способами:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "del John_Doe.email" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "delattr(Jane_Defoe, 'email')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "И еще одна полезная функция, с помощью которой можно посмотреть, есть ли такой атрибут у класса:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "hasattr(John_Doe, 'name')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "hasattr(John_Doe, 'email')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Это работает так же и для поиска методов:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "hasattr(cat, 'meow')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Атрибуты класса\n", - "\n", - "Выше мы рассматривали атрибуты, хранящиеся в каждом конкретном объекте. А что если нам нужно значение, которое нам понадобится использовать внутри всех объектов класса? Для этого предназначены атрибуты класса. Добавим таким образом название банка, которым пользуется клиент." - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "global_var = 'ghj'\n", - "\n", - "class Client:\n", - " bank_name = \"Sberbank\"\n", - " \n", - " def __init__(self, name, balance):\n", - " self.name = name\n", - " self.balance = balance + INITIAL_BONUS\n", - " \n", - " if self.balance < INTERMEDIATE_BALANCE:\n", - " self.level = \"Basic\"\n", - " elif self.balance < ADVANCED_BALANCE:\n", - " self.level = \"Intermediate\"\n", - " else:\n", - " self.level = \"Advanced\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Так же, как и в случае с изменением объектов на лету, на лету можно изменять и структуру класса. Но так делать не рекомендуется из-за того, что сложно будет предсказать поведение кода человеку, который увидит его в первый раз." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "Client.country = \"Russia\"" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "John_Doe = Client(\"John Doe\", 500)\n", - "Jane_Defoe = Client(\"Jane Defoe\", 150000)" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'Russia'" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "John_Doe.country" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'Sberbank'" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "Jane_Defoe.bank_name" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "При этом, если мы изменяем хоть какой-то атрибут класса на лету, он меняется у всех объектов." - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'Russian Federation'" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "Client.country = \"Russian Federation\"\n", - "Jane_Defoe.country" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Однако если мы изменим этот атрибут только у конкретного объекта, все остальные объекты останутся неизменными, поскольку в такой записи мы назначаем объекту атрибут объекта, а не всего класса." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "John_Doe.country = 'Britain'\n", - "Jane_Defoe.country" - ] - }, - { - "attachments": { - "2_class_attributes.jpg": { - "image/jpeg": "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AKCpfgH15f8APtB/wr+X/obNW/77X/Cj6pjP+gqX4B9eX/PtB/wr+X/obNW/77X/AAo+qYz/AKCpfgH15f8APtB/wr+X/obNW/77X/Cj6pjP+gqX4B9eX/PtB/wr+X/obNW/77X/AAo+qYz/AKCpfgH15f8APtB/wr+X/obNW/77X/Cj6pjP+gqX4B9eX/PtB/wr+X/obNW/77X/AAo+qYz/AKCpfgH15f8APtB/wr+X/obNW/77X/Cj6pjP+gqX4B9eX/PtB/wr+X/obNW/77X/AAo+qYz/AKCpfgH15f8APtB/wr+X/obNW/77X/Cj6pjP+gqX4B9eX/PtB/wr+X/obNW/77X/AAo+qYz/AKCpfgH15f8APtB/wr+X/obNW/77X/Cj6pjP+gqX4B9eX/PtB/wr+X/obNW/77X/AAo+qYz/AKCpfgH15f8APtB/wr+X/obNW/77X/Cj6pjP+gqX4B9eX/PtB/wr+X/obNW/77X/AAo+qYz/AKCpfgH15f8APtB/wr+X/obNW/77X/Cj6pjP+gqX4B9eX/PtB/wr+X/obNW/77X/AAo+qYz/AKCpfgH15f8APtB/wr+X/obNW/77X/Cj6pjP+gqX4B9eX/PtB/wr+X/obNW/77X/AAo+qYz/AKCpfgH15f8APtB/wr+X/obNW/77X/Cj6pjP+gqX4B9eX/PtB/wr+X/obNW/77X/AAo+qYz/AKCpfgH15f8APtB/wr+X/obNW/77X/Cj6pjP+gqX4B9eX/PtB/wr+X/obNW/77X/AAo+qYz/AKCpfgH15f8APtB/wr+X/obNW/77X/Cj6pjP+gqX4B9eX/PtB/wr+X/obNW/77X/AAo+qYz/AKCpfgH15f8APtB/wr+X/obNW/77X/Cj6pjP+gqX4B9eX/PtB/wr+X/obNW/77X/AAo+qYz/AKCpfgH15f8APtB/wr+X/obNW/77X/Cj6pjP+gqX4B9eX/PtB/wr+X/obNW/77X/AAo+qYz/AKCpfgH15f8APtB/wr+X/obNW/77X/Cj6pjP+gqX4B9eX/PtB/wr+X/obNW/77X/AAo+qYz/AKCpfgH15f8APtB/wr+X/obNW/77X/Cj6pjP+gqX4B9eX/PtB/wr+X/obNW/77X/AAo+qYz/AKCpfgH15f8APtB/wr+X/obNW/77X/Cj6pjP+gqX4B9eX/Pt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" - } - }, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![2_class_attributes.jpg](attachment:2_class_attributes.jpg)" - ] - }, - { - "attachments": { - "3_static_class_methods.png": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAyEAAADdCAYAAACsVn0MAAAG3HRFWHRteGZpbGUAJTNDbXhmaWxlJTIwaG9zdCUzRCUyMnd3dy5kcmF3LmlvJTIyJTIwbW9kaWZpZWQlM0QlMjIyMDE5LTEyLTAxVDAwJTNBNDklM0EyMi4yNzJaJTIyJTIwYWdlbnQlM0QlMjJNb3ppbGxhJTJGNS4wJTIwKFdpbmRvd3MlMjBOVCUyMDEwLjAlM0IlMjBXaW42NCUzQiUyMHg2NCUzQiUyMHJ2JTNBNzAuMCklMjBHZWNrbyUyRjIwMTAwMTAxJTIwRmlyZWZveCUyRjcwLjAlMjIlMjBldGFnJTNEJTIyQ0FSRUFQQXFyOXcwaFhLZXoxRnElMjIlMjB2ZXJzaW9uJTNEJTIyMTIuMy4zJTIyJTIwdHlwZSUzRCUyMmRldmljZSUyMiUyMHBhZ2VzJTNEJTIyMSUyMiUzRSUzQ2RpYWdyYW0lMjBpZCUzRCUyMnF1c1ktclZmS1VsQm82Mkc3RTV1JTIyJTIwbmFtZSUzRCUyMlBhZ2UtMSUyMiUzRTdWbkxjcHN3RlAwYXp6U0xlQVRZRUM5ZHAyMW0lMkJweG0wYlE3QVRLb2taRXJSR3ozNjN1RnhCdkhzV3RuTWhOblFkRFI1VWk2OXlDZGtJRXpXNnclMkZDTHlNUCUyRk9Rc0lHTnd2WEF1UjdZOXNSejRhcUFqUVpjYTZ5QlNOQlFRMVlGM05LJTJGeElESW9Ca05TZG9JbEp3elNaZE5NT0JKUWdMWndMQVFmTlVNbTNQV0hIV0pJOUlCYmdQTXV1Z1BHc3BZbzFlMlYlMkJFM2hFWnhNYkxsVG5UUEFoZkJaaVZwakVPJTJCcWtIT3U0RXpFNXhMZmJkWXp3aFR1U3Z5b3A5N3Y2VzNuSmdnaVh6S0E5JTJGSE41SHZlSiUyRiUyQnJqNXVmdjI1bTJiNDV2N1NWT2NCczh3c2VHQzdEUGplU3V4RERtRGFjbU55NGY3SjFGemZyblFlcHRCcElSZ1RDb29BaG10c010SFQ1WE1SRW5FWmNNYndNaVU2cG15VjNBQ3V5alFYWUVGVkN3cGdiVXNjaGpTSkdxR2pScFFldE1sVkQzQWo4MXV2Mk9lZzBqWW9Pa2lzcE1Wb2xEU0lBeWdERWR2WjV4eksxSmRPMVhHWjVzSlhPWEhjNVhvN1M3ckVTUyUyQkxqNFA3U1BBc0NWV091ZEJrSXZMZjJPTzhDdllNcnZiSXJ1N1I2T0pVMDMxUFJTcnprVFFicUZJVEhuT1FxWWl5QmNsWkh4dkU3d0Nka3NLVG5TakFkTEk3Y044Z0FDdGRkTUd1ZkxwSSUyQkJvRTFadjFQVE1jbmpOOGhGZldIdlZOZDhad21rSXZuNnVMJTJGMXNkcGpaNlU1RFRJaTVnYVMzN0pYenhhSjIzRlBSazVUJTJCZzJGMzI0NVQlMkYlMkY2cnl0U2dFVFZLSms0RHMydXoyeVA0VDg2bkF2cE5SNGRvakZMamRXS2N0eVZyaHNWd3dBQ3oxS2tqQjc4bE1peDFDbk5EMTNiR3Jra0VacSUyQkh6JTJCZHdPQXNENUF4RnpsdHNtRlZJT0F6RFFiM1ZDVnVtdndKY1N2aUJTd1B5UmVlREtPREpqU1NlbVdSa1AyeGtaTEs1NXU5TEpZZU1wbzVLNXNsMXdZNXpYSGk3TU83dXdzd3M3JTJGblElMkZFeGx6ZGZSZGs0QmhnU1hseWE3OTQwa2J5dGtzdlpDNnR3OE5OTWRCODRFWnp3UlZtVUZmeUtwbndCRU1Bc0lJRmtZciUyQjU4dVp3JTJGM0FncmZ5M0tBR0FMbEFnJTJGWHd0bm5IVmk1TE0yd3NnbEhUJTJGMnJOWGxqYTdmTDg1N1Y1VjMxdUx4V05ra1NUdFZIUzJqbGJ5SU5tcmtsYXlydjFQMFFJY2UwZjBJYkRSM1BNJTJCMXJsUUJVTkRhMXhqY2lLQ3dsOTJJNWxzQ3k3dXFOQnBjQ0tySzh0YW0zMm5SNk5TVHNmRkJ0bFF4V0RQdVEyWm9lJTJGU3dwc1lpSTNHV2N1eEtvMVhqY1UlMkJJQ0U0VEIwZmZRbkc1ZjJjMEkzempOMzNHak1LY3BNT2VxSlJ5OVN2TlElMkZjTnNpNmYxNTRqanRIaDBGam84dVFiTFJSOHV5OGxabGx0Mmt1ZVIwY2hHUTh0RDVZJTJGVlVBTnNYTVBKcU9wRjQ4TkVOa2FUdlhoUExMcGljejZyN21XcXpqdVI2bmJ3SHF3NmFGYiUyRlNkUGgxYjhqblhmJTJGQUElM0QlM0QlM0MlMkZkaWFncmFtJTNFJTNDJTJGbXhmaWxlJTNFq/rf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" - } - }, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Статические методы и методы класса\n", - "\n", - "Итак, мы разобрались, как объявлять поля класса, а также поля и методы объекты. В питоне (как и во многих других языках) есть еще две группы методов - статические и методы класса.\n", - "\n", - "* Статические методы объявляются внутри класса, но их поведение полностью совпадает с поведением обычных функций. Они не требуют никаких специальных параметров типа self и пр.\n", - "* Методы класса больше похожи на bound методы, но первым аргументом передается не инстанс объекта self, а ссылка на сам класс cls.\n", - "![3_static_class_methods.png](attachment:3_static_class_methods.png)\n", - "\n", - "Методами класса удобно задавать такие функции, которые будут общими для всего класса и которые используют внутри себя какие-то другие атрибуты класса. Например, добавим функцию, которая для клиента красиво выведет полную информацию о его банке." - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [], - "source": [ - "class Client(object):\n", - " bank = \"Sberbank\"\n", - " location = \"Russia\"\n", - " \n", - " def __init__(self, name, balance):\n", - " self.name = name\n", - " self.balance = balance + INITIAL_BONUS\n", - " \n", - " #define account level\n", - " if self.balance < INTERMEDIATE_BALANCE:\n", - " self.level = \"Basic\"\n", - " elif self.balance < ADVANCED_BALANCE:\n", - " self.level = \"Intermediate\"\n", - " else:\n", - " self.level = \"Advanced\"\n", - " \n", - " @classmethod\n", - " def bank_location(cls):\n", - " return str(cls.bank + \" \" + cls.location)\n", - " \n", - " @staticmethod\n", - " def on_salary_date():\n", - " print(\"Ура! Зарплата пришла! %s\" % (Client.bank))" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'Sberbank Russia'" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "Client.bank_location()" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Ура! Зарплата пришла! Sberbank\n" - ] - } - ], - "source": [ - "Client.on_salary_date()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "client = Client(\"Ivan\", 100)\n", - "client.bank_location()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Статические методы не используют никакой информации об атрибутах класса или объекта. По сути, они нужны просто для разделения логики каких-то общих методов." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "Client.on_salary_date()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "client.on_salary_date()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Properties\n", - "\n", - "В питоне есть еще один интересный тип атрибутов - property. Это нечто среднее между полем и методом: объявляем метод, но используем как поле. Чаще всего это нужно либо для удобства доступа к какому-то динамически вычисляемому значению, либо для поддержки совместимости со старой версией кода. Еще распространенный случай - создание поля, значение которого нельзя менять извне. (На самом деле, можно, но об этом чуть ниже.) Посмотрим, как это работает: пусть нам иногда бывает нужно выводить деньги клиента в копейках, но при этом нельзя изменять баланс." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "class Client(object):\n", - " bank = \"Sberbank\"\n", - " location = \"Russia\"\n", - " \n", - " def __init__(self, name, balance):\n", - " self.name = name\n", - " self.balance = balance + INITIAL_BONUS\n", - " \n", - " #define account level\n", - " if self.balance < INTERMEDIATE_BALANCE:\n", - " self.level = \"Basic\"\n", - " elif self.balance < ADVANCED_BALANCE:\n", - " self.level = \"Intermediate\"\n", - " else:\n", - " self.level = \"Advanced\"\n", - " \n", - " @property\n", - " def pence(self):\n", - " return self.balance * 100" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Последние три строчки и задают наше property. При обращении к полю pence будет выполнен код, написанный в методе pence" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "client = Client(\"Ivan\", 100)\n", - "client.balance" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "client.pence" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Но что если мы хотим иметь возможность и \"присваивать\" значения этому полю?" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "client.pence = 100" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Добавим специальный атрибут к нашему классу, который будет называться так же pence, и обернем его в @pence.setter. Это будет метод, который будет исполняться при попытке присвоить в поле pence значение." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "class Client(object):\n", - " bank = \"Sberbank\"\n", - " location = \"Russia\"\n", - " \n", - " def __init__(self, name, balance):\n", - " self.name = name\n", - " self.balance = balance + INITIAL_BONUS\n", - " \n", - " #define account level\n", - " if self.balance < INTERMEDIATE_BALANCE:\n", - " self.level = \"Basic\"\n", - " elif self.balance < ADVANCED_BALANCE:\n", - " self.level = \"Intermediate\"\n", - " else:\n", - " self.level = \"Advanced\"\n", - " \n", - " @property\n", - " def pence(self):\n", - " return self.balance * 100\n", - " \n", - " @pence.setter\n", - " def pence(self, value):\n", - " self.balance = value / 100" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Итак, мы обозначили 2 сущности: саму property (т.е. в данном случае метод-getter того, что мы хотим отдавать этим атрибутов) и setter - метод, который специальным образом обрабатывает входное значение value" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "client = Client(\"Ivan\", 100)\n", - "client.pence = 100" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "client.balance" - ] - }, - { - "attachments": { - "4_property.jpg": { - "image/jpeg": "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" - } - }, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "В общем случае у property есть 3 метода:\n", - "* getter\n", - "* setter\n", - "* deleter\n", - "\n", - "![4_property.jpg](attachment:4_property.jpg)\n", - "\n", - "Рассмотрим еще пару способов задания property:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "class PropertyClass1:\n", - " def __init__(self):\n", - " self._x = NotImplemented\n", - "\n", - " def get_x(self):\n", - " return self._x\n", - "\n", - " def set_x(self, value):\n", - " self._x = value\n", - "\n", - " def del_x(self):\n", - " self._x = None\n", - "\n", - " x = property(get_x, set_x, del_x, 'Property x.')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "class PropertyClass2:\n", - " def __init__(self):\n", - " self._x = NotImplemented\n", - "\n", - " x = property()\n", - "\n", - " @x.getter\n", - " def x(self):\n", - " \"\"\"Property x.\"\"\"\n", - " return self._x\n", - "\n", - " @x.setter\n", - " def x(self, value):\n", - " self._x = value\n", - "\n", - " @x.deleter\n", - " def x(self):\n", - " self._x = None" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "p1 = PropertyClass1()\n", - "p2 = PropertyClass2()\n", - "\n", - "p1.x, p2.x" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "p1.x, p2.x = 1, 2\n", - "p1.x, p2.x" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "del p1.x\n", - "del p2.x\n", - "p1.x, p2.x" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Наследование в Python\n", - "\n", - "Отнаследоваться от какого-то класса в питоне очень легко. Сразу рассмотрим на примере." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "class Base:\n", - " class_field = 42\n", - " \n", - " def __init__(self):\n", - " self.instance_field = \"I'm instance field\"\n", - " \n", - " def some_instance_method(self, x):\n", - " return x ** 2\n", - " \n", - " \n", - "class Inherited(Base):\n", - " inherited_class_field = 24\n", - " \n", - " def inherited_class_method(self):\n", - " return self.inherited_class_field / 2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Base - наш базовый класс с некоторым набором полей и методов. Inherited - класс-наследник. У него будут доступны все атрибуты класса Base." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "base = Base()\n", - "print(base.class_field, base.instance_field, base.some_instance_method(10), sep='\\n')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "inherited = Inherited()\n", - "print(inherited.class_field, inherited.instance_field, inherited.some_instance_method(10), sep='\\n')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Кроме того, конечно, можно добавлять и свои атрибуты." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "inherited.inherited_class_field, inherited.inherited_class_method()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "А что если нужно не только переиспользовать какой-то метод, но и дописать туда какие-то действия? Для этого есть системная функция super." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "class Builder: \n", - " def __init__(self, name):\n", - " self.name = name\n", - " self.helmet = None\n", - " print(f\"Строитель {self.name} проснулся и готов работать\")\n", - " \n", - " def put_on_helmet(self, helmet_number):\n", - " self.helmet = helmet_number\n", - " print(f\"Строитель {self.name} надел каску с номером {helmet_number}\")\n", - " \n", - "\n", - "class Driver(Builder):\n", - " def __init__(self, name):\n", - " super(Driver, self).__init__(name)\n", - " print(f\"Строитель {self.name} сегодня назначен водителем и везёт всех на стройку\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Синтаксис функции super:\n", - "* класс, метод родителя которого нужно вызвать\n", - "* [опционально] первый аргумент метода класса-родителя, который нужно вызвать. Для обычных методов это self - инстанс объекта\n", - "\n", - "На самом деле, у этой функции несколько сигнатур, и для каждой она возвращает что-то свое. Процитируем документацию:\n", - "\n", - "* super() -> same as super(__class__, [first argument])\n", - "* super(type) -> unbound super object\n", - "* super(type, obj) -> bound super object; requires isinstance(obj, type)\n", - "* super(type, type2) -> bound super object; requires issubclass(type2, type)\n", - "\n", - "В нашем текущем случае функция вернет bound super object, т.е. специальный \"привязанный\" к нашему инстансу объект класса-родителя." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "b1 = Builder(\"Вася\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "b1.put_on_helmet(25)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "b2 = Driver(\"Евпатий\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "b2.put_on_helmet(34)" - ] - }, - { - "attachments": { - "5_multiple_inheritance.png": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAtsAAALlCAYAAAAVACp1AAAGwHRFWHRteGZpbGUAJTNDbXhmaWxlJTIwaG9zdCUzRCUyMnd3dy5kcmF3LmlvJTIyJTIwbW9kaWZpZWQlM0QlMjIyMDE5LTEyLTAyVDIzJTNBMDQlM0EyOS42MzRaJTIyJTIwYWdlbnQlM0QlMjJNb3ppbGxhJTJGNS4wJTIwKFdpbmRvd3MlMjBOVCUyMDEwLjAlM0IlMjBXaW42NCUzQiUyMHg2NCUzQiUyMHJ2JTNBNzAuMCklMjBHZWNrbyUyRjIwMTAwMTAxJTIwRmlyZWZveCUyRjcwLjAlMjIlMjBldGFnJTNEJTIyX2ZWX3NOMHBrOTVmS1lYV3pXQlolMjIlMjB2ZXJzaW9uJTNEJTIyMTIuMy41JTIyJTIwdHlwZSUzRCUyMmRldmljZSUyMiUyMHBhZ2VzJTNEJTIyMSUyMiUzRSUzQ2RpYWdyYW0lMjBpZCUzRCUyMk1fWG0yZkR2RHhtR0VpRG9lR0tkJTIyJTIwbmFtZSUzRCUyMlBhZ2UtMSUyMiUzRTdWbkxjdHNnRlAwYXo3UUxleVQwWHFaMmttNHlrell6YmJPVUpXVFJZdUZnJTJGT3JYRnlTRWhLVFljUkk1eWRSZWVMZ0h1TURsM0lPRUJ0WjR2cjJtNFNLOUlUSEVBMkRFMjRFMUdRQVFlQzclMkZGOEN1QUZ6VEtZQVpSWEVCbVJWd2glMkY1Q0NSb1NYYUVZTHJXR2pCRE0wRUlISTVKbE1HSWFGbEpLTm5xemhHQjkxRVU0Z3kzZ0xncHhHJTJGMkpZcFlXcUElMkI4Q3Y4SzBTd3RSemJkb0tpWmgyVmp1WkpsR3Naa1U0T3N5NEUxcG9Td29qVGZqaUVXc1N2alV2UzdlcVJXVFl6Q2pEMmx3NCUyRkolMkJ2YUJRanpaWnV2dyUyQiUyRlhOOElwJTJCRzhyTldJZDRKUmM4QUM3bSUyRnI3RWFNMkxNMUVzb1lUd2tmaEMyRTVHeDMxWWtiSml1TXozN29JM3NOekZ0cW9zdlpEcGI3RkIwaGVmWiUyQkZPSDRMREhRTjNRQ3ZjUkRCNjdueE52MnUlMkJwUmZsTm1TTW91bUtjVG9DZ3lRaSUyQkR1V2tvd1hwdUVTQ2hMaWNDa3FoNkpCYzdtdDZUMGVndlpTT05oZWNUTllRRnNzb0dTVnhWRHN2c21yTnlsaThHNFJScUoydzNPVll5bWJZMWt0WmlLekQ5akNSaGlQQ1NZMDkyVkZNWno2VTQ0dkdTViUyRllLM0djcTNBaXRYNGEwZ1ozRDVLVVZNUm53c0dKSFBJNkk0M2tSMkFMWE5GaW9VbHpVMlZlVllnc2JTZWRZNEVRNW50TSUyQlc2U2doZWtEbHhSSDY0cDh1UElrem11MHdRZTElMkJDOUo1bUwwbWxKMmZZUjRsT0hDT0dTQllLNm1xaGltR0NNcDd1bk5HWnlqcEZweW50aUVJZmNYeHpwWXFna3lSOUs1V25DNVVTcnJwUzJSMUtwWjVyWGwycCUyRkZNckZUak1qck5TblpYcXFVcWw2UFRmS0ZXU1JQelh0MUxaN3J1VHF1QjBVaFdsQ01lZjFGazRydWoyZVMlMkZmem9KMkZyUzkwZG4lMkZ0SFVPMUVHeE41RGdGMHZoTHIlMkJwRWElMkZQR1dIbmVCNTFrdVk1bW12Y2YzbDZCa0hmcDZjWk9OcnA2Wmp0MDlQMnUwNVB0NiUyRlRzNXlCZG53MkFnMnolMkJFSmNmbklydjVOQzBmN1k4bWpRM1M5dUdTUGJCeVZ3TDF2bnhrUkV4RkRXcm03ZFFvcjQ0aUNWWUxFbDVYMnBwN1lDeHEzTDFzWkc4RldRRlkzZzRhY0hGdElaWklldWJ0b2JXOXM0cDJQZlNveDdDeGxhNjlQdDJrczV3aTFCZWM1M3Z4JTJGNm9NR0dZcFd5VSUyRjNTdHVISEJMb2p6MnM0S3NMUWNwUXpTNjM2QldRemV5V2Jjd3pWM2dXciUyRkxka0ZRak1FVENBNVlEQU5rM1A5V3hkbkl4bnNnelkxc2ozRGZVek5iZDJVOHI2NWh6b2xYUGdoYVNEVzhScTdPWFdmZG1UbHlzM3dpaTl2Q0pSM1NjUzFYbExvanFCUFJJRXRUM0Q4WDMlMkJmdms2UEhVYjN3ZE96a3k3VjJaNkg1dVolMkZrZGdwdkt6YTlqSGN0R3l2WkglMkJiTmk2TUhrMkc3bFpmUmN1bWxjZjE2M0xmdyUzRCUzRCUzQyUyRmRpYWdyYW0lM0UlM0MlMkZteGZpbGUlM0XsSt54AAAgAElEQVR4nOy9f5BU1Z3331WJW1oVUR+z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YfJtMqexQZatbJF/3LhRTr54ynWXQMiQBdkmZJjkgw8+kIGBATlx4oTs27dPtm/fLg888IAsWLBAJk+eLNXV1XLFFVfIxRdfLIlEIotHHnnEdRMIKZs88sgj1t+Tiy++WK644gqprq6WyZMny4IFC+SBBx6Q7du3y759++TEiRMyMDAgH3zwgesmEEKGKMg2IR7nzJkz8i//8i/S29srjz32mGzcuFFWrFghc+bMkVtvvVVSqZR87nOfk8985jNWMYjKjTfe6LqphJRdbrzxxqJ+rz7zmc/I5z73OfnKV74it956q8yZM0dWrFghGzdulMcee0x6e3vlX/7lX+TMmTOum0oIKSLINiGe5L/+67/kO9/5jnzpS1+SSy65RM4555yiOvp8+MlPfuK6+YSUXV599dUh+x0855xz5JJLLpEvfelL8p3vfEf+67/+y3XzCSERg2wT4lleeOEF+drXvjZknfzKlStdN5mQss3KlSuH7Hfxa1/7mhw7dsx1kwkheQbZJsTTPPTQQ3LuueeWtHO/8sorXTeTkLLPlVdeWdLfw3PPPVceeugh180khBQYZJsQj/PWW2/JHXfcUbJOvru723UTCSn7dHd3l+x38I477pC3337bdRMJIUUE2SakAvLkk0/KZZddFmsnP336dNfNIsSbTJ8+Pdbfv8suu0yefPJJ180ihMQQZJuQCsrSpUtj6ejPP/98OX36tOvmEOJNTp8+Leeff34sv39Lly513RxCSIxBtgmpsLz00ktyxRVXFNXZb9q0yXUzCPEumzZtKur37oorrpCXXnrJdTMIITEH2SakgtLf3y81NTVFdfhjxoxx3QxCvM2YMWOK+v2rqamR/v5+180ghMQYZJuQCsjHH38c2xSSkydPum4OId7m5MmTsU0l+fjjj103hxASQ5BtQjzP448/Lp///Odj6eDvvfde180hxPvce++9sfw+fv7zn5fHH3/cdXMIIUUG2SbE07zxxhtSV1cXS6eeSCSkqqpK/vCHP7huFiHe5w9/+INUVVXF9rtZV1cnb7zxhutmEUIKDLJNiIdpa2uTT33qU7F15olEQh577DHXzSKkYvLYY4/F+vv5qU99Stra2lw3ixBSQJBtQjzKoUOH5Mtf/nJenfSf/umfyjnnnJNz5IwQEm9y/eXpnHPOkT/90z/N6/f5y1/+shw6dMh10wgh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" - } - }, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Множественное наследование\n", - "\n", - "В питоне реализовано множественное наследование, т.е. наследование от нескольких классов.\n", - "\n", - "![5_multiple_inheritance.png](attachment:5_multiple_inheritance.png)\n", - "\n", - "Иерархия типов в питоне довольно простая: абсолютно любая сущность - это объект, отнаследованный от базового класса object." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "class Person(object):\n", - " def __init__(self, name):\n", - " self.name = name\n", - " print(f\"Человек {self.name} проснулся\")\n", - " \n", - " def move(self):\n", - " print(f\"Человек {self.name} пытается встать с кровати\")\n", - " \n", - "\n", - "class Pedestrian(Person):\n", - " def move(self):\n", - " print(f\"Человек {self.name} пошел пешком\")\n", - " \n", - " def wave(self):\n", - " print(\"Помахал рукой\")\n", - " \n", - "\n", - "class Driver(Person):\n", - " def move(self):\n", - " print(f\"Человек {self.name} поехал на машине\")\n", - " \n", - " def beep(self):\n", - " print(\"Побибикал\")\n", - " \n", - "\n", - "class Ivan(Driver, Pedestrian):\n", - " pass" - ] - }, - { - "attachments": { - "6_attribute_search.png": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAA6kAAABlCAYAAACvHaXhAAAE6HRFWHRteGZpbGUAJTNDbXhmaWxlJTIwaG9zdCUzRCUyMnd3dy5kcmF3LmlvJTIyJTIwbW9kaWZpZWQlM0QlMjIyMDE5LTEyLTAyVDIzJTNBMTglM0EwNS43ODFaJTIyJTIwYWdlbnQlM0QlMjJNb3ppbGxhJTJGNS4wJTIwKFdpbmRvd3MlMjBOVCUyMDEwLjAlM0IlMjBXaW42NCUzQiUyMHg2NCUzQiUyMHJ2JTNBNzAuMCklMjBHZWNrbyUyRjIwMTAwMTAxJTIwRmlyZWZveCUyRjcwLjAlMjIlMjBldGFnJTNEJTIyRFVNZzJTMTFfSUNnNlJjLTFlWjclMjIlMjB2ZXJzaW9uJTNEJTIyMTIuMy41JTIyJTIwdHlwZSUzRCUyMmRldmljZSUyMiUyMHBhZ2VzJTNEJTIyMSUyMiUzRSUzQ2RpYWdyYW0lMjBpZCUzRCUyMkV2Z0I4bWYzQ1lTMkZNVVp0dTMxJTIyJTIwbmFtZSUzRCUyMlBhZ2UtMSUyMiUzRTVWZGRiNXN3RlAwMVBIWWlPQkR5dUNaWkYybVRKbVhhdWtjSFg4Q3R3MlhHSkxCZlB3TW1nSkpHcVpTa25mYVMlMkJKNzd3YldQancwV21XMktCMG5UJTJCQ3N5RUpaanM4SWljOHR4cGhOUCUyRjFaQTJRRGV5RzJBU0hMV1FLTU9XUEUlMkZZRURib0RsbmtBMENGYUpRUEIyQ0FTWUpCR3FBVVNseE53d0xVUXlmbXRJSURvQlZRTVVoJTJCcE16RlRlbzcwdzYlMkZEUHdLRzZmUFBLbWpXZEQyMkF6a3l5bURIYzlpQ3dzTXBPSXFobHRpaG1JYXUzYWRXbnlQcjNnM1RjbUlWSG5KSVRDcHQlMkY5Nlk5Y0xKZFBhMW1XNDFsJTJCWjhqSVZObE9HSmlldnpGUnFoZ2pUS2hZZE9pOXhEeGhVRlcxdGRYRmZFRk1OVGpTNEJNb1ZSb3lhYTVRUTdIYUNPT0ZncXZIM3ZoWFZlcURhNng1WVNyWFJ0a2FpWkxsWTklMkZvWlZWbWwxWmJiVjR6djJwU0x5NmJnVExNWlFBbjFxcmRmbFJHb0U3RU9YdHl0U2dBTjZENzBYa1NCRlY4TyUyQnlEbXUwWjdl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" - } - }, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "В предыдущей ячейке мы определили 4 класса: базовый \"Человек\", два его наследника \"Пешеход\" и \"Водитель\" и класс \"Иван\", который отнаследован от обоих этих классов. \"Иван\" будет уметь всё, что умеют его классы-родители, но в приоритете будут те классы, которые ближе по иерархии. Ниже приведена схема, в каком порядке \"Иван\" будет искать у себя или у классов-родителей запрашиваемые атрибуты.\n", - "\n", - "![6_attribute_search.png](attachment:6_attribute_search.png)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "Person(\"Владимир\").move()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "Driver(\"Ольга\").move()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "Pedestrian(\"Вася\").move()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "Ivan(\"Иван\").move()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Объект класса Ivan пытается найти у себя метод move, но он не определен в самом классе. Поиск продолжается в классе ближайшего родителя, т.е. первого, указанного при объявлении класса. В классе Driver этот метод уже определен, и поэтому дальше поиск прекращается и вызывается этот метод." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Для каждого класса можно посмотреть стек поиска атрибутов (иерархию наследования):" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "Ivan.mro()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Области видимости атрибутов\n", - "\n", - "В питоне все атрибуты классов публичные. Но как быть с теми полями, изменения которых извне мы не хотим учитывать в нашем коде? Для того, чтобы другие программисты знали, какие атрибуты класса использовать во внешнем коде нельзя, были придуманы согласования о наименовании атрибутов:\n", - "\n", - "### Naming conventions:\n", - "\n", - "* interface\n", - "* \\_internal\n", - "* __private\n", - "* \\__magicattrs__ (о них - ниже)\n", - "\n", - "Приведем пример internal-аттрибутов:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "class Circle:\n", - " _pi = 3.14\n", - " \n", - " def __init__(self, radius):\n", - " self.radius = radius\n", - " \n", - " def _compute_diameter(self):\n", - " return 2 * self.radius\n", - " \n", - " def get_square(self):\n", - " return self._pi * (self.radius ** 2)\n", - " \n", - " def get_length(self):\n", - " return self._pi * self._compute_diameter()\n", - "\n", - "class CircleChild(Circle):\n", - " def show_pi(self):\n", - " return self._pi" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "circle = Circle(50)\n", - "circle.get_square()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "circle.get_length()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "circle._pi" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "circle._compute_diameter()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "CircleChild(5).show_pi()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Мы можем достучаться извне до любого атрибута. Но тем не менее надо иметь в виду, что использование таких названий атрибутов в классах означает, что код задуман так, что не подразумевает их использование где-то вовне.\n", - "\n", - "Более интересная ситуация возникает с т.н. private-атрибутами. В питоне их всё равно можно получить из внешней среды. Чтобы понять, для чего они нужны, объявим следующие классы:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "class Worker:\n", - " __premium_coef = 1\n", - " \n", - " def __init__(self, salary):\n", - " self.salary = salary\n", - " \n", - " def overall_salary(self):\n", - " return self.salary * 12 + self.salary * self.__premium_coef\n", - "\n", - "\n", - "class SeniorWorker(Worker):\n", - " __senior_bonus = 300_000\n", - " \n", - " def overall_salary(self):\n", - " return self.salary * 12 + self.salary * self.__premium_coef + self.__senior_bonus" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "В базовом классе Worker объявлен метод, который считает зарплату с учетом премии. Отнаследуем от него класс опытного работника, у которого коэффициент премии будет выше." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "w = Worker(100_000)\n", - "w.overall_salary()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "w.__premium_coef" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sw = SeniorWorker(200_000)\n", - "sw.overall_salary()" - ] - }, - { - "attachments": { - "7_bug_feature.jpg": { - "image/jpeg": "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" - } - }, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Видим, что возникают странные ошибки. В первом случае: 'Worker' object has no attribute '\\__premium_coef'. У класса Worker почему-то не определено поле \\__premium_coef, которое мы явно определили.\n", - "\n", - "Кроме того, когда мы пытаемся вызвать это поле у класса-наследника, интерпретатор почему-то обращается не к тому полю, которое мы определили, а к \\_SeniorWorker__premium_coef. Однако\n", - "\n", - "![7_bug_feature.jpg](attachment:7_bug_feature.jpg)\n", - "\n", - "Атрибут, название которого при объявлении начинается на двойное подчеркивание (но не заканчивается им же), можно получить, обращаясь по схеме:\n", - "\n", - "* _[ClassName]__[attribute_name]\n", - "\n", - "Это сделано для того, чтобы самые важные поля и методы класса-родителя не были случайно переопределены у классов-наследников." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "w._Worker__premium_coef" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "class SeniorWorker(Worker):\n", - " __senior_bonus = 300_000\n", - " \n", - " def overall_salary(self):\n", - " return self.salary * 12 + self.salary * self._Worker__premium_coef + self.__senior_bonus\n", - "\n", - "sw = SeniorWorker(200_000)\n", - "sw.overall_salary()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Magic methods\n", - "\n", - "Итак, мы разобрались с областью видимости различных атрибутов классов. Ниже мы рассмотрим еще один интересный и важный тип публичных атрибутов.\n", - "\n", - "Давайте рассмотрим, как работает функция len, которая считает длину коллекции." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "a = [1, 2, 4, 8, 16]\n", - "len(a)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Может быть, она вызывает какой-то внутренний метод коллекции? Посмотрим, какие есть:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "dir(a)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "В этом списке мы видим метод \\__len__. Как раз он и возвращает длину коллекции. Встроенная функция len просто пытается вызвать у объекта метод \\__len__. Если он определен, то возвращается его возвращаемое значение, если нет - возникает TypeError, т.е. ошибка типа подаваемого значения. Таким образом, мы можем написать свою функцию определения длины коллекции (разве что ошибка в случае неопределенного \\__len__ будет другой:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import collections\n", - "\n", - "def our_len(some_object):\n", - " return some_object.__len__()\n", - "\n", - "our_len(a)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "our_len(5)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "len(5)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Для чего нам вообще может понадобиться определение метода \\__len__? Например, чтобы считать \"длиной\" приближенную продолжительность музыкального трека. Почему приближенную? Потому что одно из требований к методу \\__len__ - возвращать int." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "class Track:\n", - " def __init__(self, values_list, sample_rate=22050):\n", - " self.values_list = values_list\n", - " self.sample_rate = sample_rate\n", - " \n", - " def __len__(self):\n", - " return round(self.values_list.__len__() / self.sample_rate)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "track = Track([25] * 100_000)\n", - "len(track), our_len(track)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Текстовое представление класса\n", - "\n", - "Рассмотрим еще пару часто встречаемых случаев. Например, очень часто требуется задать какое-то текстовое представление класса. Делается этого методом \\__str__" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "class Student:\n", - " def __init__(self, name, group):\n", - " self.name = name\n", - " self.group = group" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "По умолчанию текстовым представлением является строка с типом объекта и его адресом в памяти, что нам, как разработчикам, скорее всего неинформативно." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "s = Student(\"Никодим\", \"21\")\n", - "print(s)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "str(s)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Переопределим метод так, чтобы можно было понять, какого студента в данный момент обрабатывает скрипт" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "class Student:\n", - " def __init__(self, name, group):\n", - " self.name = name\n", - " self.group = group\n", - " \n", - " def __str__(self):\n", - " return f\"Student {self.name} from the group {self.group}\"" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "s = Student(\"Никодим\", \"21\")\n", - "print(s)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Определение математических операторов\n", - "\n", - "Допустим, мы пишем класс, объекты которого мы хотим как-то складывать." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "class Meal:\n", - " def __init__(self, title, price):\n", - " self.title = title\n", - " self.price = price\n", - " \n", - " def __str__(self):\n", - " return ': '.join([self.title, str(self.price)])\n", - " \n", - " def __repr__(self):\n", - " \"\"\"Функция, которая используется для текстового представления объекта в случаях, когда это происходит не\n", - " через функцию str(obj)\"\"\"\n", - " return str(self)\n", - " \n", - " def __add__(self, other):\n", - " \"\"\"Функция, которая описывает прибавление к нашему объекту объекта other\"\"\"\n", - " # если у нас оба объекта данного класса, сложим их атрибуты\n", - " if isinstance(other, Meal):\n", - " new_title = ', '.join([self.title, other.title])\n", - " new_price = self.price + other.price\n", - " else:\n", - " # а если второй объект не этого класса, то попробуем его привести к типу float\n", - " new_title = self.title + \" и что-то еще\"\n", - " new_price = self.price + float(other)\n", - " return Meal(new_title, new_price)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "Meal(\"БигМак\", 200)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "Meal(\"БигМак\", 200) + Meal(\"Картошка\", 50)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "Meal(\"БигМак\", 200) + 25" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Всё работает по нашей логике, но в следующем коде будет ошибка:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "25 + Meal(\"БигМак\", 200)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Это произошло, поскольку у нас определено сложение только Meal + что-то, но не что-то + Meal. В случаях, когда складываемые объекты разных типов, операция сложения в питоне некоммутативна. Чтобы определить обратное сложение, добавим метод \\__radd__" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "Meal.__radd__ = Meal.__add__" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "25 + Meal(\"БигМак\", 200)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "И совсем высший пилотаж: добавим метод, который позволит по вызову нашего объекта как функции \"съедать\" его =)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def our_call_method(self):\n", - " self.title = \"Ты всё съел!\"\n", - " self.price = -self.price\n", - " print(self)\n", - " \n", - "Meal.__call__ = our_call_method" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "m = Meal(\"Борщ\", 150)\n", - "m()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "m" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Неплохая статья по магическим методам: https://habr.com/ru/post/186608/" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Задание\n", - "\n", - "Написать классы, которые будут использованы как децибелы" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "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.7.4" - }, - "toc": { - "base_numbering": 1, - "nav_menu": {}, - "number_sections": true, - "sideBar": true, - "skip_h1_title": false, - "title_cell": "Table of Contents", - "title_sidebar": "Contents", - "toc_cell": false, - "toc_position": {}, - "toc_section_display": true, - "toc_window_display": false - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/lecture_3/VCS Basics.ipynb b/lecture_3/VCS Basics.ipynb deleted file mode 100644 index 103b9b5..0000000 --- a/lecture_3/VCS Basics.ipynb +++ /dev/null @@ -1,1435 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Системы контроля версий \n", - "**Version Control System, VCS**\n", - " \n", - " \n", - "Современные VCS позволяют \n", - "* сохранить состояние файла и нужные метаданные (кто и когда сделал изменение)\n", - "* откатить файл к предыдущей версии если что-то пошло не так\n", - "* откатить целый проект к нужному состоянию \n", - "* сраванивать разные версии файла между собой \n", - "\n", - "## Локальные VCS \n", - " \n", - "Самые ранние VCS начали появляться в 70-х и работали в пределах на одной машине. \n", - "Наиболее яркий представитель - **RCS**. \n", - "Все работало через запись дельты между версиями файлов. \n", - " \n", - "Пример вычисления дельты с помощью **diff**\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "--- curr_v1.txt\t2020-03-18 03:03:23.000000000 +0300\r\n", - "+++ curr_v2.txt\t2020-03-18 03:03:23.000000000 +0300\r\n", - "@@ -1,4 +1,5 @@\r\n", - " Курс USDRUB_TOM\r\n", - "- был 30.23\r\n", - "+ стал 75.80\r\n", - "+Эх, трудно стало жить\r\n", - " По кайфу\r\n", - "- Прекрасная сырьевая экономика\r\n", - "+ Прекрасная сырьевая экономика?\r\n" - ] - } - ], - "source": [ - "!echo \"Курс USDRUB_TOM\\n был 30.23\\n По кайфу\\n Прекрасная сырьевая экономика\" > curr_v1.txt\n", - "!echo \"Курс USDRUB_TOM\\n стал 75.80\\nЭх, трудно стало жить\\n По кайфу\\n Прекрасная сырьевая экономика?\" > curr_v2.txt\n", - "!diff -u curr_v1.txt curr_v2.txt" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "!rm curr_v1.txt curr_v2.txt" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Централизированные VCS \n", - "\n", - "\"SO\" \n", - " \n", - " \n", - "Они появились с развитием командной разработки, и стали стандартом на протяжении 90-х и первой половины нулевых. \n", - "Возможности: \n", - "* все всегда знают кто и что делает \n", - "* единое пространство для контроля \n", - "\n", - "Минусы: \n", - "* клиенты хранят только одно состояние репозитория\n", - "* единая точка отказа - сервер недоступен, никто не внесет новых изменений\n", - "* история изменений хранится только на сервере - риск потерять все за один раз \n", - " \n", - "Представители: \n", - "* Subversion (SVN)\n", - "* CVS\n", - "* Microsoft Team Foundation Server (TFS) \n", - "* SourceSafe" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Распределенные VCS \n", - "**Distributed VCS (DVCS)**\n", - "\n", - "\"SO\" \n", - "\n", - " \n", - "Все участники DVCS хранят у себя историю изменений, не только на общем сервере. \n", - "Более того, каждый участник может работать с несколькими удаленными репозиториями. \n", - "\n", - "Например, экспериментальные части проекта отправляются на один сервер, а стабильные - на другой. \n", - " \n", - "Реализации: \n", - "* Git\n", - "* Mercurial\n", - "* Bazaar" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## GIt \n", - " \n", - "Самая популярная VCS и одна из самых мощных. \n", - "\n", - "### История появления \n", - "В 2005 году разработчики ядра Linux были вынуждены мигрировать с VCS BitKeeper. \n", - "Разработчик BitKeeper предложил неприемлимые условия проекту, что взбесило их. \n", - "Так появился Git, при разработке которого преследовались: \n", - "* скорость\n", - "* простота архитектуры\n", - "* поддержка большого числа веток (>> 1000)\n", - "* полная распределенность\n", - "* способность поддерживать огромные проекты (~28 млн строк - Linux Kernel) \n", - "\n", - "Разумеется, со времен первого релиза, Git стал только лучше :)\n", - " \n", - "### Главный миф о Git \n", - "Говорят, что Git - очень сложная штука. \n", - "Когда-то это действительно было так. \n", - "Однако сейчас, существует разделение команд на два класса - **plumber** и **porcelain**. \n", - " \n", - "Plumber-команды позволяют работать с Git на самом низком уровне. \n", - "Porcelain-команды работают поверх Plumber-слоя. \n", - " \n", - "В большинстве кейсов для жизни хватает **porcelain**-команд\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Поработаем с GIt \n", - " \n", - "### Установка\n", - "По умолчанию, Git в комплекте со многими Linux-дистрибутивами и macOS. \n", - "Для Windows также есть пакет, при установке нужно выбрать режим терминала (встроенный windows/cygwin).\n", - " \n", - " \n", - "### Начало работы \n", - "Для примеров мы будем использовать два репозитория - курсовой и пустой" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Cloning into '/tmp/git_workshop'...\n", - "remote: Enumerating objects: 67, done.\u001b[K\n", - "remote: Counting objects: 100% (67/67), done.\u001b[K\n", - "remote: Compressing objects: 100% (61/61), done.\u001b[K\n", - "remote: Total 67 (delta 14), reused 53 (delta 6), pack-reused 0\u001b[K\n", - "Unpacking objects: 100% (67/67), done.\n", - "Checking connectivity... done.\n" - ] - } - ], - "source": [ - "!git clone https://github.com/kib-courses/python_developer.git /tmp/git_workshop" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Мы только что склонировали удаленный репозиторий. \n", - "Посмотрим что получилось: " - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "total 776\r\n", - "drwxr-xr-x 11 lancer wheel 352 Mar 18 03:45 \u001b[34m.\u001b[m\u001b[m\r\n", - "drwxrwxrwt 12 root wheel 384 Mar 18 03:45 \u001b[30m\u001b[42m..\u001b[m\u001b[m\r\n", - "drwxr-xr-x 13 lancer wheel 416 Mar 18 03:45 \u001b[34m.git\u001b[m\u001b[m\r\n", - "-rw-r--r-- 1 lancer wheel 1799 Mar 18 03:45 .gitignore\r\n", - "-rw-r--r-- 1 lancer wheel 7048 Mar 18 03:45 LICENSE\r\n", - "-rw-r--r-- 1 lancer wheel 371024 Mar 18 03:45 Python_Lecture1.pptx\r\n", - "-rw-r--r-- 1 lancer wheel 140 Mar 18 03:45 README.md\r\n", - "-rw-r--r-- 1 lancer wheel 58 Mar 18 03:45 interpreted.py\r\n", - "drwxr-xr-x 10 lancer wheel 320 Mar 18 03:45 \u001b[34mlecture_1\u001b[m\u001b[m\r\n", - "drwxr-xr-x 7 lancer wheel 224 Mar 18 03:45 \u001b[34mlecture_2\u001b[m\u001b[m\r\n", - "-rw-r--r-- 1 lancer wheel 165 Mar 18 03:45 ~$Python_Lecture1.pptx\r\n" - ] - } - ], - "source": [ - "!ls -al /tmp/git_workshop" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Узнаем все файлы, которые уже видели на GitHub. \n", - "При создании репозитория или клонировании существующего, создается каталог **.git**. \n", - "Все что необходимо, **git** хранит именно там" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "total 40\r\n", - "drwxr-xr-x 13 lancer wheel 416 Mar 18 03:45 \u001b[34m.\u001b[m\u001b[m\r\n", - "drwxr-xr-x 11 lancer wheel 352 Mar 18 03:45 \u001b[34m..\u001b[m\u001b[m\r\n", - "-rw-r--r-- 1 lancer wheel 23 Mar 18 03:45 HEAD\r\n", - "drwxr-xr-x 2 lancer wheel 64 Mar 18 03:45 \u001b[34mbranches\u001b[m\u001b[m\r\n", - "-rw-r--r-- 1 lancer wheel 321 Mar 18 03:45 config\r\n", - "-rw-r--r-- 1 lancer wheel 73 Mar 18 03:45 description\r\n", - "drwxr-xr-x 11 lancer wheel 352 Mar 18 03:45 \u001b[34mhooks\u001b[m\u001b[m\r\n", - "-rw-r--r-- 1 lancer wheel 3512 Mar 18 03:45 index\r\n", - "drwxr-xr-x 3 lancer wheel 96 Mar 18 03:45 \u001b[34minfo\u001b[m\u001b[m\r\n", - "drwxr-xr-x 4 lancer wheel 128 Mar 18 03:45 \u001b[34mlogs\u001b[m\u001b[m\r\n", - "drwxr-xr-x 63 lancer wheel 2016 Mar 18 03:45 \u001b[34mobjects\u001b[m\u001b[m\r\n", - "-rw-r--r-- 1 lancer wheel 107 Mar 18 03:45 packed-refs\r\n", - "drwxr-xr-x 5 lancer wheel 160 Mar 18 03:45 \u001b[34mrefs\u001b[m\u001b[m\r\n" - ] - } - ], - "source": [ - "!ls -al /tmp/git_workshop/.git" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Основные понятия GIt (from low-level to high) \n", - "**На основе Pro Git, глава Git Internals** \n", - " \n", - "Рассмотрим три основных вида объектов - blob, tree, commit \n", - "\n", - "Для начала, создадим чистый Git-репозиторий. \n", - "И прежде чем смотреть дальше, нужно представить что Git работает как файловая система" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Initialized empty Git repository in /private/tmp/git_clean/.git/\r\n" - ] - } - ], - "source": [ - "!git init /tmp/git_clean" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "total 0\r\n", - "drwxr-xr-x 3 lancer wheel 96 Mar 18 04:01 \u001b[34m.\u001b[m\u001b[m\r\n", - "drwxrwxrwt 13 root wheel 416 Mar 18 04:01 \u001b[30m\u001b[42m..\u001b[m\u001b[m\r\n", - "drwxr-xr-x 10 lancer wheel 320 Mar 18 04:01 \u001b[34m.git\u001b[m\u001b[m\r\n" - ] - } - ], - "source": [ - "!cd /tmp/git_clean/ && ls -al " - ] - }, - { - "cell_type": "code", - "execution_count": 168, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "total 40\r\n", - "drwxr-xr-x 13 lancer wheel 416 Mar 18 06:09 \u001b[34m.\u001b[m\u001b[m\r\n", - "drwxr-xr-x 5 lancer wheel 160 Mar 18 06:03 \u001b[34m..\u001b[m\u001b[m\r\n", - "-rw-r--r-- 1 lancer wheel 14 Mar 18 06:09 COMMIT_EDITMSG\r\n", - "-rw-r--r-- 1 lancer wheel 41 Mar 18 06:09 HEAD\r\n", - "drwxr-xr-x 2 lancer wheel 64 Mar 18 04:01 \u001b[34mbranches\u001b[m\u001b[m\r\n", - "-rw-r--r-- 1 lancer wheel 137 Mar 18 04:01 config\r\n", - "-rw-r--r-- 1 lancer wheel 73 Mar 18 04:01 description\r\n", - "drwxr-xr-x 11 lancer wheel 352 Mar 18 04:01 \u001b[34mhooks\u001b[m\u001b[m\r\n", - "-rw-r--r-- 1 lancer wheel 336 Mar 18 06:08 index\r\n", - "drwxr-xr-x 3 lancer wheel 96 Mar 18 04:01 \u001b[34minfo\u001b[m\u001b[m\r\n", - "drwxr-xr-x 3 lancer wheel 96 Mar 18 06:00 \u001b[34mlogs\u001b[m\u001b[m\r\n", - "drwxr-xr-x 13 lancer wheel 416 Mar 18 06:09 \u001b[34mobjects\u001b[m\u001b[m\r\n", - "drwxr-xr-x 4 lancer wheel 128 Mar 18 04:01 \u001b[34mrefs\u001b[m\u001b[m\r\n" - ] - } - ], - "source": [ - "!cd /tmp/git_clean/ && ls -al .git" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### blob objects\n", - "\n", - "Хранение сырых данных в Git устроено как в обычном словаре. \n", - "Каждому блобу выдается метка. \n", - "Для добавления есть plumbing-команда hash-object" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "d670460b4b4aece5915caf5c68d12f560a9fe3e4\r\n" - ] - } - ], - "source": [ - "!cd /tmp/git_clean/ && echo 'test content' | git hash-object -w --stdin" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "total 8\r\n", - "drwxr-xr-x 3 lancer wheel 96 Mar 18 04:06 \u001b[34m.\u001b[m\u001b[m\r\n", - "drwxr-xr-x 5 lancer wheel 160 Mar 18 04:06 \u001b[34m..\u001b[m\u001b[m\r\n", - "-r--r--r-- 1 lancer wheel 29 Mar 18 04:06 70460b4b4aece5915caf5c68d12f560a9fe3e4\r\n" - ] - } - ], - "source": [ - "!cd /tmp/git_clean/ && ls -al .git/objects/d6" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Наш объект добавился в каталог objects/d6. \n", - "Взглянуть на него снова мы сможем с помощью его метки и команды cat-file" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "test content\r\n" - ] - } - ], - "source": [ - "!cd /tmp/git_clean/ && git cat-file -p d670460b4b4aece5915caf5c68d12f560a9fe3e4" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Тип объекта - blob. \n", - "**Вся информация о файлах хранится в таких блобах** " - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "blob\r\n" - ] - } - ], - "source": [ - "!cd /tmp/git_clean/ && git cat-file -t d670460b4b4aece5915caf5c68d12f560a9fe3e4" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### tree objects \n", - " \n", - "Отлично, что git работает как обычный словарь. \n", - "Но как нам сохранить отношение между блобами и названиями файлов? \n", - "**tree-объект** - своего рода каталог, который знает свои файлы, их режим чтения, и где получить их содержимое\n", - " \n", - "Их SHA-1 можно получить из коммитов (**о них чуть ниже**). \n", - "Посмотрим на текущее состояние репозитория" - ] - }, - { - "cell_type": "code", - "execution_count": 53, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "tree f6ea389a06e9b5b0f943b554c0f727a304c880b6\r\n", - "parent 2bd4ec2df932ed1d02b6bbc4f9b133f50ac1b440\r\n", - "author Nikolay Matkheev 1583960806 +0300\r\n", - "committer Nikolay Matkheev 1583960806 +0300\r\n", - "\r\n", - "Brushup for secondary ipynb\r\n" - ] - } - ], - "source": [ - "!cd /tmp/git_workshop/ && git cat-file -p HEAD" - ] - }, - { - "cell_type": "code", - "execution_count": 61, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "100644 blob b6e47617de110dea7ca47e087ff1347cc2646eda\t.gitignore\r\n", - "100644 blob 0e259d42c996742e9e3cba14c677129b2c1b6311\tLICENSE\r\n", - "100644 blob c2ca4e0a0714ca85ba97ebc4603b7a0a848529ee\tPython_Lecture1.pptx\r\n", - "100644 blob c9e3ccb5ce6cd381e4328f85ac2bd60d60ecd256\tREADME.md\r\n", - "100644 blob 35fabf864661e68768290a4d7b596c9a12752f18\tinterpreted.py\r\n", - "040000 tree 08b1124f341c612b57049f9ea58c416538d37363\tlecture_1\r\n", - "040000 tree 5744d351a88ca2b36f1957f0c78f0e5b585103e9\tlecture_2\r\n", - "100644 blob cfb570fc3c0f196d3c90d3ec916cf63b376158c8\t~$Python_Lecture1.pptx\r\n" - ] - } - ], - "source": [ - "!cd /tmp/git_workshop/ && git cat-file -p f6ea389a06e9b5b0f943b554c0f727a304c880b6" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Предыдущее состояние репозитория " - ] - }, - { - "cell_type": "code", - "execution_count": 62, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "tree a4e6162c8b3cc7a9ba4c635ff2e965bc5da9b558\r\n", - "parent 812f041b21ab556a974bdf0df4bd2b203c3a0f4a\r\n", - "author Ivan 1583940552 +0300\r\n", - "committer Ivan 1583940552 +0300\r\n", - "\r\n", - "ivan 2 lecture\r\n" - ] - } - ], - "source": [ - "!cd /tmp/git_workshop/ && git cat-file -p 2bd4ec2df932ed1d02b6bbc4f9b133f50ac1b440" - ] - }, - { - "cell_type": "code", - "execution_count": 63, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "100644 blob b6e47617de110dea7ca47e087ff1347cc2646eda\t.gitignore\r\n", - "100644 blob 0e259d42c996742e9e3cba14c677129b2c1b6311\tLICENSE\r\n", - "100644 blob c2ca4e0a0714ca85ba97ebc4603b7a0a848529ee\tPython_Lecture1.pptx\r\n", - "100644 blob c9e3ccb5ce6cd381e4328f85ac2bd60d60ecd256\tREADME.md\r\n", - "100644 blob 35fabf864661e68768290a4d7b596c9a12752f18\tinterpreted.py\r\n", - "040000 tree 08b1124f341c612b57049f9ea58c416538d37363\tlecture_1\r\n", - "040000 tree cd1a372d5ab06057d39e780660883ecf566913e4\tlecture_2\r\n", - "100644 blob cfb570fc3c0f196d3c90d3ec916cf63b376158c8\t~$Python_Lecture1.pptx\r\n" - ] - } - ], - "source": [ - "!cd /tmp/git_workshop/ && git cat-file -p a4e6162c8b3cc7a9ba4c635ff2e965bc5da9b558" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Подкаталог в репозитории - дочерний tree-объект. \n", - "Заглянем в каталог **lecture_2**, когда с ним что-то делал Иван" - ] - }, - { - "cell_type": "code", - "execution_count": 65, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "100644 blob 96fd1409306aa0c8d13d26ec277b02ea69f98900\t05. Functions.ipynb\r\n", - "100644 blob 401bb7c666aa1ad916252f0a2f167613fe34583c\t06. Generators.ipynb\r\n", - "100644 blob 8c718c4012db09aded2176146a73c3af1278d90f\t07. Libraries.ipynb\r\n", - "100644 blob 3a0019f1934faa0f8ecb4b6acd8e629d5f6cc781\tLecture 2.ipynb\r\n", - "040000 tree 3bcd86e80e5b2f346c16d81517d305f77cb37b54\tipynb_content\r\n" - ] - } - ], - "source": [ - "!cd /tmp/git_workshop/ && git cat-file -p cd1a372d5ab06057d39e780660883ecf566913e4" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "staging-area > tree object" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### commit-objects \n", - " \n", - "Единомоментный набор изменений выражается в Git с помощью коммита. \n", - "В нем есть ссылка на tree-объект, id предыдщего коммита, время и инфа о создателе. \n", - " \n", - "Мы уже добавляли новый объект в пустой репозиторий (ячейка №36). \n", - "Создадим tree-объект. обновим индекс и создадим коммит \n", - "\n", - "В каждый момент времени активен tree-объект - working tree" - ] - }, - { - "cell_type": "code", - "execution_count": 67, - "metadata": {}, - "outputs": [], - "source": [ - "!cd /tmp/git_clean/ && git update-index --add --cacheinfo 100644 d670460b4b4aece5915caf5c68d12f560a9fe3e4 hello.wrd" - ] - }, - { - "cell_type": "code", - "execution_count": 68, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "31ce1651aa5db4dde43a532a5bb30921aeb04f32\r\n" - ] - } - ], - "source": [ - "!cd /tmp/git_clean/ && git write-tree" - ] - }, - { - "cell_type": "code", - "execution_count": 69, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "100644 blob d670460b4b4aece5915caf5c68d12f560a9fe3e4\thello.wrd\r\n" - ] - } - ], - "source": [ - "!cd /tmp/git_clean/ && git cat-file -p 31ce1651aa5db4dde43a532a5bb30921aeb04f32" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Снова добавим новую фигню и обновим working tree" - ] - }, - { - "cell_type": "code", - "execution_count": 70, - "metadata": {}, - "outputs": [], - "source": [ - "!cd /tmp/git_clean/ && echo 'great_day' > pumpkins.wrd" - ] - }, - { - "cell_type": "code", - "execution_count": 71, - "metadata": {}, - "outputs": [], - "source": [ - "!cd /tmp/git_clean/ && git update-index --add pumpkins.wrd" - ] - }, - { - "cell_type": "code", - "execution_count": 72, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "aed1646ec85d9097531e7230ee9c611a1a2ee8a8\r\n" - ] - } - ], - "source": [ - "!cd /tmp/git_clean/ && git write-tree" - ] - }, - { - "cell_type": "code", - "execution_count": 73, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "100644 blob d670460b4b4aece5915caf5c68d12f560a9fe3e4\thello.wrd\r\n", - "100644 blob 410f4bbf3e44ba7d3cfe0ef8c5c8982b383a788a\tpumpkins.wrd\r\n" - ] - } - ], - "source": [ - "!cd /tmp/git_clean/ && git cat-file -p aed1646ec85d9097531e7230ee9c611a1a2ee8a8" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Создадим вложенный каталог 'whoa' и поместим в него файлы из предыдущего tree" - ] - }, - { - "cell_type": "code", - "execution_count": 74, - "metadata": {}, - "outputs": [], - "source": [ - "!cd /tmp/git_clean/ && git read-tree --prefix=whoa 31ce1651aa5db4dde43a532a5bb30921aeb04f32" - ] - }, - { - "cell_type": "code", - "execution_count": 75, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "eef1341de0ac629cc4bbc0ed82faa37056feb7de\r\n" - ] - } - ], - "source": [ - "!cd /tmp/git_clean/ && git write-tree" - ] - }, - { - "cell_type": "code", - "execution_count": 76, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "100644 blob d670460b4b4aece5915caf5c68d12f560a9fe3e4\thello.wrd\r\n", - "100644 blob 410f4bbf3e44ba7d3cfe0ef8c5c8982b383a788a\tpumpkins.wrd\r\n", - "040000 tree 31ce1651aa5db4dde43a532a5bb30921aeb04f32\twhoa\r\n" - ] - } - ], - "source": [ - "!cd /tmp/git_clean/ && git cat-file -p eef1341de0ac629cc4bbc0ed82faa37056feb7de" - ] - }, - { - "cell_type": "code", - "execution_count": 77, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "100644 blob d670460b4b4aece5915caf5c68d12f560a9fe3e4\thello.wrd\r\n" - ] - } - ], - "source": [ - "!cd /tmp/git_clean/ && git cat-file -p 31ce1651aa5db4dde43a532a5bb30921aeb04f32" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Сделаем собственно коммит" - ] - }, - { - "cell_type": "code", - "execution_count": 79, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "637c1127f20ec446c94addf41d0b6e9517ff9b00\r\n" - ] - } - ], - "source": [ - "!cd /tmp/git_clean/ && echo 'First plumber commit' | git commit-tree eef1341de0ac629cc4bbc0ed82faa37056feb7de" - ] - }, - { - "cell_type": "code", - "execution_count": 80, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "tree eef1341de0ac629cc4bbc0ed82faa37056feb7de\r\n", - "author Nikolay Matkheev 1584497278 +0300\r\n", - "committer Nikolay Matkheev 1584497278 +0300\r\n", - "\r\n", - "First plumber commit\r\n" - ] - } - ], - "source": [ - "!cd /tmp/git_clean/ && git cat-file -p 637c1127f20ec446c94addf41d0b6e9517ff9b00" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Вот что получилось: \n", - "\n", - "\"SO\" " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### references \n", - " \n", - "Очень напряжно помнить короткий sha1 коммита. \n", - "В git есть reference-объекты. \n", - "Давайте создадим указатель 'master', который будет ссылаться на наш рукотворный коммит" - ] - }, - { - "cell_type": "code", - "execution_count": 170, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "total 0\r\n", - "drwxr-xr-x 4 lancer wheel 128 Mar 18 04:01 \u001b[34m.\u001b[m\u001b[m\r\n", - "drwxr-xr-x 13 lancer wheel 416 Mar 18 06:09 \u001b[34m..\u001b[m\u001b[m\r\n", - "drwxr-xr-x 3 lancer wheel 96 Mar 18 05:37 \u001b[34mheads\u001b[m\u001b[m\r\n", - "drwxr-xr-x 2 lancer wheel 64 Mar 18 04:01 \u001b[34mtags\u001b[m\u001b[m\r\n" - ] - } - ], - "source": [ - "!cd /tmp/git_clean/ && ls -al .git/refs" - ] - }, - { - "cell_type": "code", - "execution_count": 96, - "metadata": {}, - "outputs": [], - "source": [ - "!cd /tmp/git_clean/ && echo '637c1127f20ec446c94addf41d0b6e9517ff9b00' > .git/refs/heads/master" - ] - }, - { - "cell_type": "code", - "execution_count": 98, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[33m637c1127f20ec446c94addf41d0b6e9517ff9b00\u001b[m First plumber commit\r\n" - ] - } - ], - "source": [ - "!cd /tmp/git_clean/ && git log --pretty=oneline master" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Ветки тоже являются своего рода указателями" - ] - }, - { - "cell_type": "code", - "execution_count": 167, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "6c410d638881b09272d80d1b0dc3bd2eb6703193\r\n" - ] - } - ], - "source": [ - "!cd /tmp/git_workshop/ && cat .git/refs/heads/master" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Жизненный цикл данных в Git \n", - " \n", - "Дано: подготовленный локальный репозиторий, в котором происходят изменения. \n", - "\n", - "\"SO\" \n", - " \n", - "Каждый файл проходит через 4 состояния: \n", - "* untracked \n", - " Файл создан и не добавлен в репозиторий \n", - "* staged\n", - " Файл добавлен в индекс (еще называют staging area, working tree). \n", - " Но пока он не содержится ни в одном коммите\n", - "* unmodified \n", - " Файл уже содержится в репозитории, и не был изменен.\n", - "* modified \n", - " Файл уже содержится в репозитории, и претерпел изменения. \n", - " \n", - "**Важно помнить - Git не хранит изменения дельтами. При каждом изменении индексированного файла в базу добавляется новый blob**" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Переходные состояния файлов. Индекс и рабочая директория \n", - "\"SO\" " - ] - }, - { - "cell_type": "code", - "execution_count": 122, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Initialized empty Git repository in /private/tmp/git_clean2/.git/\r\n" - ] - } - ], - "source": [ - "!git init /tmp/git_clean2" - ] - }, - { - "cell_type": "code", - "execution_count": 123, - "metadata": {}, - "outputs": [], - "source": [ - "!cd /tmp/git_clean2/ && touch buffalo" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Могут быть нюансы при последовательном выполнении Plumbing-команд, поэтому получаем необычный результат - файлы удалены из индекса" - ] - }, - { - "cell_type": "code", - "execution_count": 124, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "On branch master\r\n", - "\r\n", - "Initial commit\r\n", - "\r\n", - "Untracked files:\r\n", - " (use \"git add ...\" to include in what will be committed)\r\n", - "\r\n", - "\t\u001b[31mbuffalo\u001b[m\r\n", - "\r\n", - "nothing added to commit but untracked files present (use \"git add\" to track)\r\n" - ] - } - ], - "source": [ - "!cd /tmp/git_clean2/ && git status" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Добавить untracked файл в индекс: " - ] - }, - { - "cell_type": "code", - "execution_count": 125, - "metadata": {}, - "outputs": [], - "source": [ - "!cd /tmp/git_clean2/ && git add buffalo" - ] - }, - { - "cell_type": "code", - "execution_count": 126, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "On branch master\r\n", - "\r\n", - "Initial commit\r\n", - "\r\n", - "Changes to be committed:\r\n", - " (use \"git rm --cached ...\" to unstage)\r\n", - "\r\n", - "\t\u001b[32mnew file: buffalo\u001b[m\r\n", - "\r\n" - ] - } - ], - "source": [ - "!cd /tmp/git_clean2/ && git status" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Попробуем совершить коммит" - ] - }, - { - "cell_type": "code", - "execution_count": 127, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[master (root-commit) d41aa02] First commit\r\n", - " 1 file changed, 0 insertions(+), 0 deletions(-)\r\n", - " create mode 100644 buffalo\r\n" - ] - } - ], - "source": [ - "!cd /tmp/git_clean2/ && git commit -m \"First commit\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Изменим проиндексированный файл " - ] - }, - { - "cell_type": "code", - "execution_count": 128, - "metadata": {}, - "outputs": [], - "source": [ - "!cd /tmp/git_clean2/ && echo \"123\" > buffalo" - ] - }, - { - "cell_type": "code", - "execution_count": 129, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "On branch master\r\n", - "Changes not staged for commit:\r\n", - " (use \"git add ...\" to update what will be committed)\r\n", - " (use \"git checkout -- ...\" to discard changes in working directory)\r\n", - "\r\n", - "\t\u001b[31mmodified: buffalo\u001b[m\r\n", - "\r\n", - "no changes added to commit (use \"git add\" and/or \"git commit -a\")\r\n" - ] - } - ], - "source": [ - "!cd /tmp/git_clean2/ && git status" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### remotes and push" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Время закинуть изменения на удаленку. \n", - "Создадим пустую репу на GitLab.com. \n", - "\n", - "После чего сможем добавить remote origin и передать ему изменения \n", - "Опция -u создаем маппинг на remote-версию ветки" - ] - }, - { - "cell_type": "code", - "execution_count": 137, - "metadata": {}, - "outputs": [], - "source": [ - "!cd /tmp/git_clean2/ && git remote add origin2 git@gitlab.com:lancerx/garbage_repo.git" - ] - }, - { - "cell_type": "code", - "execution_count": 138, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Warning: Permanently added the RSA host key for IP address '35.231.145.151' to the list of known hosts.\n", - "Counting objects: 3, done.\n", - "Writing objects: 100% (3/3), 218 bytes | 0 bytes/s, done.\n", - "Total 3 (delta 0), reused 0 (delta 0)\n", - "To git@gitlab.com:lancerx/garbage_repo.git\n", - " * [new branch] master -> master\n", - "Branch master set up to track remote branch master from origin2.\n" - ] - } - ], - "source": [ - "!cd /tmp/git_clean2/ && git push -u origin2 master" - ] - }, - { - "cell_type": "code", - "execution_count": 175, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "total 8\r\n", - "drwxr-xr-x 3 lancer wheel 96 Mar 18 06:43 \u001b[34m.\u001b[m\u001b[m\r\n", - "drwxr-xr-x 3 lancer wheel 96 Mar 18 06:28 \u001b[34m..\u001b[m\u001b[m\r\n", - "-rw-r--r-- 1 lancer wheel 41 Mar 18 06:43 master\r\n" - ] - } - ], - "source": [ - "!cd /tmp/git_clean2/ && ls -al .git/refs/remotes/origin2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### fetch, log and pull\n", - "Сделаем имитацию изменений репозитория через GitLab UI" - ] - }, - { - "cell_type": "code", - "execution_count": 148, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "remote: Enumerating objects: 5, done.\u001b[K\n", - "remote: Counting objects: 100% (5/5), done.\u001b[K\n", - "remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0\u001b[K\n", - "Unpacking objects: 100% (3/3), done.\n", - "From gitlab.com:lancerx/garbage_repo\n", - " d41aa02..a580d90 master -> origin2/master\n" - ] - } - ], - "source": [ - "!cd /tmp/git_clean2/ && git fetch origin2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Наш локальный master отстает от origin2 на один коммит" - ] - }, - { - "cell_type": "code", - "execution_count": 150, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "* \u001b[33ma580d90\u001b[m\u001b[33m (\u001b[1;31morigin2/master\u001b[m\u001b[33m)\u001b[m Update buffalo\r\n", - "* \u001b[33md41aa02\u001b[m\u001b[33m (\u001b[1;36mHEAD\u001b[m\u001b[33m, \u001b[1;32mmaster\u001b[m\u001b[33m)\u001b[m First commit\r\n" - ] - } - ], - "source": [ - "!cd /tmp/git_clean2/ && git log --oneline --decorate --graph --all" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Накатим новые изменения. \n", - "Не получится из-за пересекающихся изменений" - ] - }, - { - "cell_type": "code", - "execution_count": 151, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Updating d41aa02..a580d90\r\n", - "error: Your local changes to the following files would be overwritten by merge:\r\n", - "\tbuffalo\r\n", - "Please, commit your changes or stash them before you can merge.\r\n", - "Aborting\r\n" - ] - } - ], - "source": [ - "!cd /tmp/git_clean2/ && git pull origin2" - ] - }, - { - "cell_type": "code", - "execution_count": 156, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "On branch master\r\n", - "Your branch is behind 'origin2/master' by 1 commit, and can be fast-forwarded.\r\n", - " (use \"git pull\" to update your local branch)\r\n", - "\r\n", - "Changes not staged for commit:\r\n", - " (use \"git add ...\" to update what will be committed)\r\n", - " (use \"git checkout -- ...\" to discard changes in working directory)\r\n", - "\r\n", - "\t\u001b[31mmodified: buffalo\u001b[m\r\n", - "\r\n", - "Untracked files:\r\n", - " (use \"git add ...\" to include in what will be committed)\r\n", - "\r\n", - "\t\u001b[31mbuf.bkp\u001b[m\r\n", - "\r\n", - "no changes added to commit (use \"git add\" and/or \"git commit -a\")\r\n" - ] - } - ], - "source": [ - "!cd /tmp/git_clean2/ && git status" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Один из вариантов - очистить индекс от пересекающихся изменений" - ] - }, - { - "cell_type": "code", - "execution_count": 153, - "metadata": {}, - "outputs": [], - "source": [ - "!cd /tmp/git_clean2/ && cp buffalo buf.bkp" - ] - }, - { - "cell_type": "code", - "execution_count": 157, - "metadata": {}, - "outputs": [], - "source": [ - "!cd /tmp/git_clean2/ && git checkout HEAD -- buffalo" - ] - }, - { - "cell_type": "code", - "execution_count": 158, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "On branch master\r\n", - "Your branch is behind 'origin2/master' by 1 commit, and can be fast-forwarded.\r\n", - " (use \"git pull\" to update your local branch)\r\n", - "\r\n", - "Untracked files:\r\n", - " (use \"git add ...\" to include in what will be committed)\r\n", - "\r\n", - "\t\u001b[31mbuf.bkp\u001b[m\r\n", - "\r\n", - "nothing added to commit but untracked files present (use \"git add\" to track)\r\n" - ] - } - ], - "source": [ - "!cd /tmp/git_clean2/ && git status" - ] - }, - { - "cell_type": "code", - "execution_count": 159, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Updating d41aa02..a580d90\n", - "Fast-forward\n", - " buffalo | 1 \u001b[32m+\u001b[m\n", - " 1 file changed, 1 insertion(+)\n" - ] - } - ], - "source": [ - "!cd /tmp/git_clean2/ && git pull origin2" - ] - }, - { - "cell_type": "code", - "execution_count": 160, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "* \u001b[33ma580d90\u001b[m\u001b[33m (\u001b[1;36mHEAD\u001b[m\u001b[33m, \u001b[1;31morigin2/master\u001b[m\u001b[33m, \u001b[1;32mmaster\u001b[m\u001b[33m)\u001b[m Update buffalo\r\n", - "* \u001b[33md41aa02\u001b[m First commit\r\n" - ] - } - ], - "source": [ - "!cd /tmp/git_clean2/ && git log --oneline --decorate --graph --all" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "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.7.4" - }, - "toc": { - "base_numbering": 1, - "nav_menu": {}, - "number_sections": true, - "sideBar": true, - "skip_h1_title": false, - "title_cell": "Table of Contents", - "title_sidebar": "Contents", - "toc_cell": false, - "toc_position": {}, - "toc_section_display": true, - "toc_window_display": false - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/lecture_3/ipynb_content/commit.png b/lecture_3/ipynb_content/commit.png deleted file mode 100644 index 9d53690..0000000 Binary files a/lecture_3/ipynb_content/commit.png and /dev/null differ diff --git a/lecture_3/ipynb_content/cycle.png b/lecture_3/ipynb_content/cycle.png deleted file mode 100644 index 867d097..0000000 Binary files a/lecture_3/ipynb_content/cycle.png and /dev/null differ diff --git a/lecture_3/ipynb_content/distr.png b/lecture_3/ipynb_content/distr.png deleted file mode 100644 index fc83892..0000000 Binary files a/lecture_3/ipynb_content/distr.png and /dev/null differ diff --git a/lecture_3/ipynb_content/plumbing.png b/lecture_3/ipynb_content/plumbing.png deleted file mode 100644 index d25e6eb..0000000 Binary files a/lecture_3/ipynb_content/plumbing.png and /dev/null differ diff --git a/lecture_3/ipynb_content/shared.png b/lecture_3/ipynb_content/shared.png deleted file mode 100644 index fbf1cd0..0000000 Binary files a/lecture_3/ipynb_content/shared.png and /dev/null differ diff --git a/test.py b/test.py new file mode 100644 index 0000000..dadc13e --- /dev/null +++ b/test.py @@ -0,0 +1,176 @@ +import unittest +from ArrayList import ArrayList + +''' +Реализовать свой домашний ArrayList +В отличии от стандартного списка, ваш должен быть типизированным. +Для проходного балла - класс должен реализовать протокол Sequence +Для мотивированных и любопытных - класс должен реализовать протокол MutableSequence + +Каждый метод из протокола должен быть проверен. + +ДЗ - нужно сделать форк от нашего репозитория и прислать в Slack ссылку на Pull Request + +Hint 1 - изучите плоский массив: array.array, внутреннее хранение должно быть на нем. +Hint 2 - наследование от классов из collections.abc не лопускается! + +array: + Type code C Type Minimum size in bytes + 'b' signed integer 1 + 'B' unsigned integer 1 + 'u' Unicode character 2 (see note) + 'h' signed integer 2 + 'H' unsigned integer 2 + 'i' signed integer 2 + 'I' unsigned integer 2 + 'l' signed integer 4 + 'L' unsigned integer 4 + 'q' signed integer 8 (see note) + 'Q' unsigned integer 8 (see note) + 'f' floating point 4 + 'd' floating point 8 + +("['__add__', '__class__', '__contains__', '__copy__', '__deepcopy__', " + "'__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', " + "'__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', " + "'__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', " + "'__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', " + "'__reduce_ex__', '__repr__', '__rmul__', '__setattr__', '__setitem__', " + "'__sizeof__', '__str__', '__subclasshook__', 'append', 'buffer_info', " + "'byteswap', 'count', 'extend', 'frombytes', 'fromfile', 'fromlist', " + "'fromstring', 'fromunicode', 'index', 'insert', 'itemsize', 'pop', 'remove', " + "'reverse', 'tobytes', 'tofile', 'tolist', 'tostring', 'tounicode', " + "'typecode']") + +list: +("['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', " + "'__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', " + "'__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', " + "'__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', " + "'__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', " + "'__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', " + "'__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', " + "'index', 'insert', 'pop', 'remove', 'reverse', 'sort']") + +''' + +class TestStringMethods(unittest.TestCase): + def __init__(self, methodName: str = ...) -> None: + self.arri = ArrayList('i') + self.arrf = ArrayList('f') + self.arru = ArrayList('u') + super().__init__(methodName) + + def test_append(self): + self.arri.append(1) + self.assertEqual(self.arri[0], 1) + self.assertEqual(type(self.arri), ArrayList) + self.assertEqual(type(self.arri[0]), int) + self.assertTrue(isinstance(self.arri, ArrayList)) + + with self.assertRaises(Exception): + self.arri.append('a') + + def test_insert(self): + self.arri.append(1) + + self.arri.insert(2, 3) + self.assertEqual(self.arri[1], 3) + + self.arri.insert(121, 56) + self.assertEqual(self.arri[2], 56) + + self.arri.insert(-21, -1) + self.assertEqual(self.arri[0], -1) + + with self.assertRaises(Exception): + self.arri.insert(-2123, 'a') + + def test_count(self): + self.arri.append(1) + self.arri.insert(2, 3) + self.arri.insert(121, 56) + self.arri.insert(-21, -1) + self.arri.append(1) + + self.assertEqual(self.arri.count(-1), 1) + self.assertEqual(self.arri.count(1), 2) + + def test_reverse(self): + self.arri.append(1) + self.arri.insert(2, 3) + self.arri.insert(121, 56) + self.arri.insert(-21, -1) + self.arri.append(8) + + self.arri.reverse() + + arr = ArrayList('i') + arr.append(8) + arr.append(56) + arr.append(3) + arr.append(1) + arr.append(-1) + + self.assertTrue(self.arri.array == arr.array) + + def test_remove(self): + self.arri.append(1) + self.arri.insert(2, 3) + self.arri.insert(121, 56) + self.arri.insert(-21, -1) + self.arri.append(8) + self.arri.append(1) + + self.arri.remove(-1) + self.arri.remove(1) + + self.assertEqual(self.arri.count(-1), 0) + self.assertEqual(self.arri.count(1), 1) + + def test_pop(self): + self.arri.append(1) + self.arri.insert(2, 3) + self.arri.insert(121, 56) + self.arri.insert(-21, -1) + self.arri.append(8) + self.arri.append(1) + + a = self.arri.pop(0) + self.assertEqual(a, -1) + + a = self.arri.pop(-1) + self.assertEqual(a, 1) + + a = self.arri.pop(1) + self.assertEqual(a, 3) + + def test_index(self): + self.arri.append(1) + self.arri.insert(2, 3) + self.arri.insert(121, 56) + self.arri.insert(-21, -1) + self.arri.append(8) + self.arri.append(1) + + self.assertEqual(self.arri.index(1), 1) + + def test_extend(self): + arr = ArrayList('i') + arr.append(8) + arr.append(56) + + self.arri.append(8) + self.arri.append(1) + self.arri.extend(arr) + + tmp = ArrayList('i') + tmp.append(8) + tmp.append(1) + tmp.append(8) + tmp.append(56) + + self.assertEqual(self.arri.array, tmp.array) + +if __name__ == '__main__': + unittest.main() \ No newline at end of file