├── 1.ipynb ├── 2.ipynb ├── 3.ipynb ├── Homework_files └── week_2 │ ├── sentences.txt │ ├── submission-1.txt │ └── submission-2.txt ├── README.md └── files └── polynomial_graphics ├── 1.png ├── 10.png ├── 11.png ├── 12.png ├── 13.png ├── 14.png ├── 15.png ├── 16.png ├── 2.png ├── 3.png ├── 4.png ├── 5.png ├── 6.png ├── 7.png ├── 8.png └── 9.png /1.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Решение систем линейных уравнений в Python" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "## Пример 1. Система 2 уравнений\n", 15 | "Рассмотрим простую систему из 2 линейных уравнений с 2 неизвестными:\n", 16 | "\n", 17 | "\\begin{matrix}\n", 18 | "2x+5y=1 &(1)\n", 19 | "\\\\\n", 20 | "x-10y=3 &(2)\n", 21 | "\\end{matrix}" 22 | ] 23 | }, 24 | { 25 | "cell_type": "markdown", 26 | "metadata": {}, 27 | "source": [ 28 | "### Аналитическое решение\n", 29 | "Система легко решается аналитически. Для этого достаточно выразить из уравнения (2) переменную x:\n", 30 | "\n", 31 | "\\begin{matrix}\n", 32 | "x=3 + 10y &(3)\n", 33 | "\\end{matrix}\n", 34 | "После чего подставить её в уравнение (1):\n", 35 | "\\begin{matrix}\n", 36 | "2\\cdot(3 + 10y)+5y=1,\n", 37 | "\\end{matrix}\n", 38 | "и решить получившееся линейное уравнение относительно переменной y:\n", 39 | "\\begin{matrix}\n", 40 | "25y+6=1 \\\\ \n", 41 | "\\end{matrix}\n", 42 | "\n", 43 | "\n", 44 | "\\begin{matrix}\n", 45 | "25y=-5 \\\\ \n", 46 | "\\end{matrix}\n", 47 | "\n", 48 | "\n", 49 | "\\begin{matrix}\n", 50 | "y=-0.2\n", 51 | "\\end{matrix}\n", 52 | "Полученное значение y можно подставить в выражение для x в уравнение (3):\n", 53 | "\\begin{matrix}\n", 54 | "x=3 + 10\\cdot (-0.2)\n", 55 | "\\end{matrix}\n", 56 | "и получить значение переменной x:\n", 57 | "\\begin{matrix}\n", 58 | "x=1\n", 59 | "\\end{matrix}\n", 60 | "Таким образом **решением системы будет: (1; -0,2)**\n", 61 | "\n", 62 | "*(1-е значение в ответе - x, 2-е - y)*" 63 | ] 64 | }, 65 | { 66 | "cell_type": "markdown", 67 | "metadata": {}, 68 | "source": [ 69 | "### Решение матричным методом (python numpy)\n", 70 | "\n", 71 | "Запишем исходную систему уравнений в виде матрицы (левая часть) и вектора (правая часть):\n", 72 | "\\begin{matrix}\n", 73 | "2x+5y=1\n", 74 | "\\\\\n", 75 | "x-10y=3\n", 76 | "\\end{matrix}\n", 77 | "\n", 78 | "Для этого выпишем по порядку все коэффициенты перед неизвестными в матрицу.\n", 79 | "\n", 80 | "Коэффициент перед переменной х 1й строки на место в матрице с координатами 0,0. (2)\n", 81 | "\n", 82 | "Коэффициент перед переменной y 1й строки на место в матрице с координатами 0,1. (5)\n", 83 | "\n", 84 | "Коэффициент перед переменной х 2й строки на место в матрице с координатами 1,0. (1)\n", 85 | "\n", 86 | "Коэффициент перед переменной y 2й строки на место в матрице с координатами 1,1. (-10)\n", 87 | "\n", 88 | "\\begin{pmatrix}\n", 89 | " 2& 5\n", 90 | "\\\\ \n", 91 | "1 & -10\n", 92 | "\\end{pmatrix}\n", 93 | "\n", 94 | "Значение свободного члена (число, не умноженное ни на одну переменную системы) после знака равенства 1й строки на место 0 в векторе.\n", 95 | "\n", 96 | "Значение свободного члена 2й строки на место 1 в векторе.\n", 97 | "\n", 98 | "\\begin{pmatrix}\n", 99 | "1\n", 100 | "\\\\ \n", 101 | "3\n", 102 | "\\end{pmatrix}\n", 103 | "\n", 104 | "Для этого воспользуемся numpy массивами:" 105 | ] 106 | }, 107 | { 108 | "cell_type": "code", 109 | "execution_count": 1, 110 | "metadata": { 111 | "collapsed": false 112 | }, 113 | "outputs": [], 114 | "source": [ 115 | "import numpy # импортируем библиотеку \n", 116 | "\n", 117 | "M1 = numpy.array([[2., 5.], [1., -10.]]) # Матрица (левая часть системы)\n", 118 | "v1 = numpy.array([1., 3.]) # Вектор (правая часть системы)\n", 119 | "#Запишем все числа с точкой, т.к. иначе в Python 2 они будут участвовать в целочисленных операциях (остатки от деления будут отбрасываться)" 120 | ] 121 | }, 122 | { 123 | "cell_type": "markdown", 124 | "metadata": {}, 125 | "source": [ 126 | "Для решения системы воспользуемся функцией numpy.linalg.solve модуля numpy (документация - http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.solve.html). Функция принимает на вход 2 параметра:\n", 127 | "\n", 128 | "1й - матрица коэффициентов перед переменными\n", 129 | "\n", 130 | "2й - вектор свободных членов" 131 | ] 132 | }, 133 | { 134 | "cell_type": "code", 135 | "execution_count": 2, 136 | "metadata": { 137 | "collapsed": false 138 | }, 139 | "outputs": [ 140 | { 141 | "data": { 142 | "text/plain": [ 143 | "array([ 1. , -0.2])" 144 | ] 145 | }, 146 | "execution_count": 2, 147 | "metadata": {}, 148 | "output_type": "execute_result" 149 | } 150 | ], 151 | "source": [ 152 | "numpy.linalg.solve(M1, v1)" 153 | ] 154 | }, 155 | { 156 | "cell_type": "markdown", 157 | "metadata": {}, 158 | "source": [ 159 | "Обратим внимание, что ответом так же является numpy массив!\n", 160 | "\n", 161 | "при этом порядок следования ответов в массиве соответствует порядку столбцов исходной матрицы. Т.е. на 0 месте находится x=1, т.к. мы в матрице внесли в 0 столбец коэффициенты перед переменной х!\n", 162 | "\n", 163 | "**Ответ: (1; -0,2)**" 164 | ] 165 | }, 166 | { 167 | "cell_type": "markdown", 168 | "metadata": {}, 169 | "source": [ 170 | "## Пример 2. Система 4 уравнений\n", 171 | "Рассмотрим простую систему из 2 линейных уравнений с 2 неизвестными:\n", 172 | "\\begin{matrix}\n", 173 | "A + C = 2 &(4)\n", 174 | "\\\\\n", 175 | "-A + B - 2C + D = -2 &(5)\n", 176 | "\\\\\n", 177 | "4A + C - 2D = 0 &(6)\n", 178 | "\\\\\n", 179 | "-4A + 4B + D = 5 &(7)\n", 180 | "\\end{matrix}\n", 181 | "\n", 182 | "Для наглядности решения данной системы матричным методом запишем её в таком виде, чтобы каждое уравнение содержало все 4 переменных, и чтобы они занимали в каждой строке одно и то же порядковое место (А - 0, B - 1, C - 2, D - 3):\n", 183 | "\n", 184 | "\\begin{matrix}\n", 185 | "A + 0B + C + 0D = 2 &(8)\n", 186 | "\\\\\n", 187 | "-A + B - 2C + D = -2 &(9)\n", 188 | "\\\\\n", 189 | "4A + 0B + C - 2D = 0 &(10)\n", 190 | "\\\\\n", 191 | "-4A + 4B + 0C + D = 5 &(11)\n", 192 | "\\end{matrix}\n", 193 | "\n", 194 | "теперь аналогично примеру 1 выпишем матрицу (коэффициенты перед переменными из левой части системы построчно в порядке следования переменных) и вектор (свободные члены из правой части системы):\n", 195 | "\n", 196 | "\n", 197 | "\\begin{pmatrix}\n", 198 | "1 & 0 & 1 & 0\n", 199 | "\\\\ \n", 200 | "-1 & 1 & -2 & 1\n", 201 | "\\\\\n", 202 | "4 & 0 & 1 & -2\n", 203 | "\\\\\n", 204 | "-4 & 4 & 0 & 1\n", 205 | "\\end{pmatrix}\n", 206 | "\n", 207 | "\n", 208 | "\\begin{pmatrix}\n", 209 | "2\n", 210 | "\\\\ \n", 211 | "-2\n", 212 | "\\\\\n", 213 | "0\n", 214 | "\\\\\n", 215 | "5\n", 216 | "\\end{pmatrix}" 217 | ] 218 | }, 219 | { 220 | "cell_type": "code", 221 | "execution_count": 3, 222 | "metadata": { 223 | "collapsed": false 224 | }, 225 | "outputs": [ 226 | { 227 | "data": { 228 | "text/plain": [ 229 | "array([ 0., 1., 2., 1.])" 230 | ] 231 | }, 232 | "execution_count": 3, 233 | "metadata": {}, 234 | "output_type": "execute_result" 235 | } 236 | ], 237 | "source": [ 238 | "import numpy # импортируем библиотеку \n", 239 | "\n", 240 | "M2 = numpy.array([[1., 0., 1., 0.], [-1., 1., -2., 1.], [4., 0., 1., -2.], [-4., 4., 0., 1.]]) # Матрица (левая часть системы)\n", 241 | "v2 = numpy.array([2., -2., 0., 5.]) # Вектор (правая часть системы)\n", 242 | "\n", 243 | "numpy.linalg.solve(M2, v2)" 244 | ] 245 | }, 246 | { 247 | "cell_type": "markdown", 248 | "metadata": {}, 249 | "source": [ 250 | "**Ответ: (0; 1; 2; 1)**\n", 251 | "\n", 252 | "*A = 0, B = 1, C =2, D = 1*" 253 | ] 254 | }, 255 | { 256 | "cell_type": "markdown", 257 | "metadata": {}, 258 | "source": [ 259 | "## Пример 3. Система 3 уравнений (с приведением к линейному виду)\n", 260 | "\n", 261 | "Матричный метод применим только для решения линейных уравнений. Однако иногда можно встретить нелинейные уравнения, легко приводимые к линейной форме, например:\n", 262 | "\n", 263 | "\\begin{matrix}\n", 264 | "2x_{1}+x_{2}^2+x_{3} = 2 &(12)\n", 265 | "\\\\\n", 266 | "x_{1}-x_{2}^2 = -2 &(13)\n", 267 | "\\\\\n", 268 | "3x_{1}-x_{2}^2+2x_{3} = 2 &(14)\n", 269 | "\\end{matrix}\n", 270 | "\n", 271 | "Можно заметить, что переменная x2 входит во все 3 уравнения только в квадратичной форме. Это означает, что мы можем осуществить замену:\n", 272 | "\n", 273 | "\\begin{matrix}\n", 274 | "x_{2}^2 = a &(15)\n", 275 | "\\end{matrix}\n", 276 | "\n", 277 | "С учётом этой подстановки запишем систему, аналогично примеру 2 с вхождением всех 3 переменных:\n", 278 | "\n", 279 | "\\begin{matrix}\n", 280 | "2x_{1}+a+x_{3} = 2 &(16)\n", 281 | "\\\\\n", 282 | "x_{1}-a+0x_{3} = -2 &(17)\n", 283 | "\\\\\n", 284 | "3x_{1}-a+2x_{3} = 2 &(18)\n", 285 | "\\end{matrix}\n", 286 | "\n", 287 | "Для новой системы мы уже умеем записывать матрицу (коэффициенты перед переменными из левой части системы) и вектор (свободные члены из правой части):\n", 288 | "\n", 289 | "\\begin{pmatrix}\n", 290 | "2 & 1 & 1\n", 291 | "\\\\ \n", 292 | "1 & -1 & 0\n", 293 | "\\\\\n", 294 | "3 & -1 & 2\n", 295 | "\\end{pmatrix}\n", 296 | "\n", 297 | "\\begin{pmatrix}\n", 298 | "2\n", 299 | "\\\\\n", 300 | "-2\n", 301 | "\\\\\n", 302 | "2\n", 303 | "\\end{pmatrix}" 304 | ] 305 | }, 306 | { 307 | "cell_type": "code", 308 | "execution_count": 4, 309 | "metadata": { 310 | "collapsed": false 311 | }, 312 | "outputs": [ 313 | { 314 | "data": { 315 | "text/plain": [ 316 | "array([-1., 1., 3.])" 317 | ] 318 | }, 319 | "execution_count": 4, 320 | "metadata": {}, 321 | "output_type": "execute_result" 322 | } 323 | ], 324 | "source": [ 325 | "import numpy # импортируем библиотеку \n", 326 | "\n", 327 | "M3 = numpy.array([[2., 1., 1.], [1., -1., 0.], [3., -1., 2.]]) # Матрица (левая часть системы)\n", 328 | "v3 = numpy.array([2., -2., 2.]) # Вектор (правая часть системы)\n", 329 | "\n", 330 | "numpy.linalg.solve(M3, v3)" 331 | ] 332 | }, 333 | { 334 | "cell_type": "markdown", 335 | "metadata": {}, 336 | "source": [ 337 | "Мы получили промежуточный результат:\n", 338 | "\n", 339 | "$x_{1}= -1, a= 1, x_{3}= 3,$\n", 340 | "\n", 341 | "или\n", 342 | "\n", 343 | "$x_{1}= -1, x_{2}^2= 1, x_{3}= 3,$\n", 344 | "\n", 345 | "$x_{2}^2=1$ соответствует 2 значениям $x_{2}$: 1 и -1.\n", 346 | "\n", 347 | "Таким образом мы получаем 2 решения нашей системы: $x_{1}= -1, x_{2}= 1, x_{3}= 3,$ и $x_{1}= -1, x_{2}= -1, x_{3}= 3,$\n", 348 | "\n", 349 | "**Ответ: (-1; 1; 3) и (-1; -1; 3)**" 350 | ] 351 | }, 352 | { 353 | "cell_type": "markdown", 354 | "metadata": {}, 355 | "source": [ 356 | "### Пример 4. Решение простой задачи с помощью системы линейных уравнений.\n", 357 | "\n", 358 | "Навстречу друг другу из одного города в другой, расстояние между которыми составляет 30 км, едут два велосипедиста. Предположим, что если велосипедист 1 выедет на 2 ч раньше своего товарища, то они встретятся через 2,5 часа после отъезда велосипедиста 2; если же велосипедист 2 выедет 2мя часами ранее велосипедсита 1, то встреча произойдет через 3 часа после отъезда первого. С какой скоростью движется каждый велосипедист?\n", 359 | "\n", 360 | "Обозначим за неизвестные x и y скорости велосипедистов.\n", 361 | "\n", 362 | "Путь = скорость * время\n", 363 | "\n", 364 | "Расстояние между велосипедистами = путь 1 велосипедиста + путь 2 велосипедиста\n", 365 | "\n", 366 | "На основании этих простых рассуждений и данных задачи можно записать уравнения:\n", 367 | "\n", 368 | "\\begin{matrix}\n", 369 | "(2.5 + 2)x+2.5y=30 &(19)\n", 370 | "\\\\\n", 371 | "3x + (3+2)y=30 &(20)\n", 372 | "\\end{matrix}\n", 373 | "\n", 374 | "или\n", 375 | "\n", 376 | "\\begin{matrix}\n", 377 | "4.5x+2.5y=30 &(21)\n", 378 | "\\\\\n", 379 | "3x + 5y=30 &(22)\n", 380 | "\\end{matrix}\n", 381 | "\n", 382 | "Аналогично примеру 1 легко составим матрицу коэффициентов перед неизвестными (левая часть системы) и вектор со свободными членами (права часть системы):\n", 383 | "\n", 384 | "\\begin{pmatrix}\n", 385 | " 4.5& 2.5\n", 386 | "\\\\ \n", 387 | "3 & 5\n", 388 | "\\end{pmatrix}\n", 389 | "\n", 390 | "\\begin{pmatrix}\n", 391 | " 30\n", 392 | "\\\\ \n", 393 | " 30\n", 394 | "\\end{pmatrix}" 395 | ] 396 | }, 397 | { 398 | "cell_type": "code", 399 | "execution_count": 5, 400 | "metadata": { 401 | "collapsed": false 402 | }, 403 | "outputs": [ 404 | { 405 | "data": { 406 | "text/plain": [ 407 | "array([ 5., 3.])" 408 | ] 409 | }, 410 | "execution_count": 5, 411 | "metadata": {}, 412 | "output_type": "execute_result" 413 | } 414 | ], 415 | "source": [ 416 | "import numpy # импортируем библиотеку \n", 417 | "\n", 418 | "M4 = numpy.array([[4.5, 2.5], [3., 5.]]) # Матрица (левая часть системы)\n", 419 | "v4 = numpy.array([30., 30.]) # Вектор (правая часть системы)\n", 420 | "\n", 421 | "numpy.linalg.solve(M4, v4)" 422 | ] 423 | }, 424 | { 425 | "cell_type": "markdown", 426 | "metadata": {}, 427 | "source": [ 428 | "** Ответ: 5км/ч и 3км/ч**" 429 | ] 430 | }, 431 | { 432 | "cell_type": "markdown", 433 | "metadata": {}, 434 | "source": [ 435 | "### Пример 5. Нахождение уравнения плоскости по точкам, через которые она проходит.\n", 436 | "Уравнение плоскости в 3-х мерном пространстве задаётся уравнением:\n", 437 | "\\begin{matrix}\n", 438 | "z = ax + by + c & (23)\n", 439 | "\\end{matrix}\n", 440 | "Уравнение плоскости однозначно задаётся 3 точками через которые она проходит.\n", 441 | "\n", 442 | "Таким образом легко понять, что если мы знаем координаты точек, через которые проходит плоскость, то в уравнении (23) у вас 3 переменных: a, b, c. А значения x, y, z нам известны для 3 точек.\n", 443 | "\n", 444 | "Если плоскость проходит через точки (1;-6;1), (0;-3;2) и (-3;0;-1), то мы легко можем найти коэффициенты, подставив значения соответсвующих координат для всех 3 точек в уравнение (23) и получив систему из 3 уравнений.\n", 445 | "\n", 446 | "Для точки x = 1, y = -6, z = 1:\n", 447 | "\\begin{matrix}\n", 448 | "a\\cdot 1 + b\\cdot (-6) + c = 1 &(24)\n", 449 | "\\end{matrix}\n", 450 | "\n", 451 | "Для точки x = 0, y = -3, z = 2:\n", 452 | "\\begin{matrix}\n", 453 | "a\\cdot 0 + b\\cdot (-3) + c = 2 &(25)\n", 454 | "\\end{matrix}\n", 455 | "\n", 456 | "Для точки x = -3, y = 0, z = -1:\n", 457 | "\\begin{matrix}\n", 458 | "a\\cdot (-3) + b\\cdot 0 + c = -1 &(26)\n", 459 | "\\end{matrix}\n", 460 | "\n", 461 | "На основании системы уравнений (24), (25), (26) можно записать матрицу коэффициентов перед неизвестными (левая часть матрицы):\n", 462 | "\n", 463 | "\\begin{pmatrix}\n", 464 | "1& -6 & 1\n", 465 | "\\\\ \n", 466 | "0 & -3 & 1\n", 467 | "\\\\ \n", 468 | "-3 & 0 & 1\n", 469 | "\\end{pmatrix}\n", 470 | "\n", 471 | "И вектор свободных членов (правая часть):\n", 472 | "\\begin{pmatrix}\n", 473 | "1\n", 474 | "\\\\ \n", 475 | "2\n", 476 | "\\\\\n", 477 | "-1\n", 478 | "\\end{pmatrix}" 479 | ] 480 | }, 481 | { 482 | "cell_type": "code", 483 | "execution_count": 6, 484 | "metadata": { 485 | "collapsed": false, 486 | "scrolled": true 487 | }, 488 | "outputs": [ 489 | { 490 | "data": { 491 | "text/plain": [ 492 | "array([ 2., 1., 5.])" 493 | ] 494 | }, 495 | "execution_count": 6, 496 | "metadata": {}, 497 | "output_type": "execute_result" 498 | } 499 | ], 500 | "source": [ 501 | "import numpy # импортируем библиотеку \n", 502 | "\n", 503 | "M5 = numpy.array([[1., -6., 1.], [0., -3., 1], [-3, 0, 1]]) # Матрица (левая часть системы)\n", 504 | "v5 = numpy.array([1., 2., -1.]) # Вектор (правая часть системы)\n", 505 | "\n", 506 | "numpy.linalg.solve(M5, v5)\n" 507 | ] 508 | }, 509 | { 510 | "cell_type": "markdown", 511 | "metadata": {}, 512 | "source": [ 513 | "**Ответ: уравнение искомой плоскости в пространстве задаётся уравнением $z = 2x + y + 5$**" 514 | ] 515 | }, 516 | { 517 | "cell_type": "markdown", 518 | "metadata": {}, 519 | "source": [ 520 | "### Пример 6. Нахождение уравнения параболы по 2 точкам и касательной\n", 521 | "\n", 522 | "Найти уравнение параболы ($f(x) = ax^2 + bx + x & (27)$), проходящей через точки (1,1) и (-1,1) и касающейся биссектрисы 1й координатной четверти.\n", 523 | "\n", 524 | "Как и в предыдущем примере неизвестными для нас являются коэффициенты a, b, c.\n", 525 | "\n", 526 | "Подставив в уравнение параболы (27) значения аргумента (x) и функции (f(x)) получим 2 уравнения:\n", 527 | "\n", 528 | "\\begin{matrix}\n", 529 | "a\\cdot 1^2 + b\\cdot 1 + c = 1 &(28)\n", 530 | "\\\\\n", 531 | "a\\cdot (-1)^2 + b\\cdot (-1) + c = 1 &(29)\n", 532 | "\\end{matrix}\n", 533 | "\n", 534 | "Однако для нахождения 3 неизвестных 2 уравнений мало. Необходимо найти ещё одно из оставшихся условий.\n", 535 | "\n", 536 | "Касание биссектрисы 1й координатной четверти означает, что наша парабола имеет касательную $y = x$. Если посмотреть на условие задачи, то мы увидим, что одна из точек (1, 1) лежит на этой прямой. Это означает, что мы знаем точку касания.\n", 537 | "\n", 538 | "Уравнение прямой, делящей 1-ю координатную четверть пополам (биссектрисы) имеет вид $y = kx \\quad (30)$\n", 539 | "\n", 540 | "При этом мы знаем, что угол уравнения касательной (коэффициент k уравнения (30)) равен производной от функции (27) в точке касания.\n", 541 | "\n", 542 | "\\begin{matrix}\n", 543 | "f'(x) = 2ax + bx & (31)\n", 544 | "\\end{matrix}\n", 545 | "\n", 546 | "Подставив значение аргумента (x = 1) в точке касания и коэффициента (k = 1 в качестве производной f'(x)) \n", 547 | "\n", 548 | "\\begin{matrix}\n", 549 | "1 = 2a\\cdot1 + b\\cdot1 & (32)\n", 550 | "\\end{matrix}\n", 551 | "\n", 552 | "Используя уравнения (28), (29) и (32), запишем полную систему уравнений, которую нам необходимо решить:\n", 553 | "\n", 554 | "\\begin{matrix}\n", 555 | "a\\cdot 1 + b\\cdot 1 + c \\cdot 1 = 1 &(33)\n", 556 | "\\\\\n", 557 | "a\\cdot 1 + b\\cdot (-1) + c \\cdot 1 = 1 &(34)\n", 558 | "\\\\\n", 559 | "a\\cdot 2 + b\\cdot 1 + c \\cdot 0 = 1 &(35)\n", 560 | "\\end{matrix}\n", 561 | "\n", 562 | "По привычной уже схеме запишем коэффициенты перед переменными (левую часть системы) в матрицу, а свободные члены (правую часть) в вектор:\n", 563 | "\n", 564 | "\\begin{pmatrix}\n", 565 | "1& 1 & 1\n", 566 | "\\\\ \n", 567 | "1 & -1 & 1\n", 568 | "\\\\ \n", 569 | "2 & 1 & 0\n", 570 | "\\end{pmatrix}\n", 571 | "\n", 572 | "\\begin{pmatrix}\n", 573 | "1\n", 574 | "\\\\ \n", 575 | "1\n", 576 | "\\\\ \n", 577 | "1\n", 578 | "\\end{pmatrix}" 579 | ] 580 | }, 581 | { 582 | "cell_type": "code", 583 | "execution_count": 7, 584 | "metadata": { 585 | "collapsed": false 586 | }, 587 | "outputs": [ 588 | { 589 | "data": { 590 | "text/plain": [ 591 | "array([ 0.5, -0. , 0.5])" 592 | ] 593 | }, 594 | "execution_count": 7, 595 | "metadata": {}, 596 | "output_type": "execute_result" 597 | } 598 | ], 599 | "source": [ 600 | "import numpy # импортируем библиотеку \n", 601 | "\n", 602 | "M6 = numpy.array([[1., 1., 1.], [1., -1., 1], [2, 1, 0]]) # Матрица (левая часть системы)\n", 603 | "v6 = numpy.array([1., 1., 1.]) # Вектор (правая часть системы)\n", 604 | "\n", 605 | "numpy.linalg.solve(M6, v6)" 606 | ] 607 | }, 608 | { 609 | "cell_type": "markdown", 610 | "metadata": {}, 611 | "source": [ 612 | "**Ответ: уравнение искомой параболы задаётся функцией $f(x) = 0.5x^2 + 0.5$**" 613 | ] 614 | }, 615 | { 616 | "cell_type": "markdown", 617 | "metadata": {}, 618 | "source": [ 619 | "#### Примечание к примеру 6\n", 620 | "На иллюстрации ниже изображены графики параболы и биссектрисы, которой она касается. А так же 2 точки, через которых проходит парабола." 621 | ] 622 | }, 623 | { 624 | "cell_type": "code", 625 | "execution_count": 8, 626 | "metadata": { 627 | "collapsed": false 628 | }, 629 | "outputs": [ 630 | { 631 | "data": { 632 | "image/png": "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\nA2/v9DlnWhW6Mow5dURGRuLp6Unp0qVp27atbpvLly/zn//8h379+jFjxox0jtA2v/zyC+3atePG\njRtUrFiR4sWLU7RoUdzc3ChQoACfffaZvUMUIs1Ze1/Mbo9gROqbNAkqVoTu3aF2bXtHI4QQQjiW\nL76A+vUzfqErUl+FChWYPHmy7r5du3bx448/pnNEtrt79y6tW7emWbNmzJw5k3z58tk7JCEcigxj\nziTy5YOvvgI/P4iNTZ0+Zf6YPsmLPsmLJcmJPsmLPsmLvtTIy+nTxgUdp05NeTy2kEI3c9uwYQON\nGzemVKlSuLm5kTNnTl5//XUGDRrEnZfmlMUPlW7dujUHDhygVatWeHh4kCtXLho3bszx48ct+h84\ncCC1atWiSJEiODs74+7uzptvvklISIhF26VLl/L48WO6du3Kxx9/TL58+XBzc6Nhw4asX79eN/6o\nqCh69+7Na6+9Ro4cOShRogT+/v7cvHlTt72Xl5fV4d2+vr5mbRctWkSjRo0oUaIEOXPmxM3NjcqV\nKzNu3DgeP35sa4qFSDVyZTcT6doVgoNhwQLo29fe0QghhBD2p5Txb+LYsemzKJUUupnfgQMHuHDh\nArVr1+bVV18lLi6OY8eOMX36dMLCwjh06BDZsmUzO2bnzp1s3LiRevXq0blzZy5cuMDWrVvx9vbm\n6NGjeHp6mtquXbuWggUL0rRpUwoUKMCdO3fYvn073bt35+bNmwwePNjUdvXq1Tx69IgWLVrg4+ND\n165d+fPPP9m6dSv/+te/mD9/Pj179jS1j4yMpH79+ly7dg0vLy9at27NyZMnmTVrFps3b2bfvn28\n8sorZrFrmkaxYsXo0KGDadu1a9f4/vvvLXITFhbG1atXqV+/PoULF+bJkyfs37+fCRMmcOTIEX76\n6acU51+IJFFKZfmHMQ2Zw6+/KlWwoFLXrtk7EiGEEML+Fi1SqlYtpWJi0v5cv137TRUOKqyW/7o8\nTc/z/HOLfP5JoT///FNpmqZatWpltU1YWJjSNE35+/ubtj169Ei3bbdu3ZTBYFCbN2+2OMerr76q\ntm7datZ+2rRpStM01b17d7Ptev3fvn1beXh4qEKFCpm2xcXFKTc3N/X666+rU6dOmbU/ePCgcnFx\nUbly5VK3b982bW/evLkyGAxq2bJlZu3nzp2rNE1TnTp1sji3l5eX8vb2Ntt2+PBhm2OPi4tTPj4+\n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\nu3btKFOmDD/++CMzZszgl19+YdSoUQwbNiz5+IULF/Lnn38yYMAAihUrBkBERESqa77++uu8+uqr\nXHfddXTv3p3vv/+eJUuWsHHjRn744QdKly6dfGzXrl1ZuHAhVatWpUuXLhw7dozPPvuM6667jjff\nfJM77rgj+di4uDhat27NV199RZMmTejZsydHjx7lo48+ok2bNrz77ru0b98+23E2xmBchtRNnDiR\ndevWpXvtn3/+oVmzZvz++++0bduWWrVqJR8zfvz4LL93kSJFGDx4MGlHMtStWzdV/Ro2bEjp0qW5\n4YYbOH36NMuWLWPw4MGcPn2aoUOHJp+3du1afvvtN6688krOP/98EhIS+O6773jppZeIjo5m/fr1\nBAUFJR8/aNAgXn31VapVq8Zdd93F/v372blzJ+B8gXLDDTdw5MgR/u///o+bbrqJFStW0Lhx40zv\nKz4+np49e5KQkOB6z2ljOnPmTIYNG8bll1/ObbfdRqVKlZJfe//99ylXrhxRUVFERkZy5MgRli9f\nTs+ePTl48CAPPfSQd8H2R9baQv9wwiCFyfbt1l5wgbVvveXrmoiIZN3p09Zee/uPNvTR8+yb3y/w\ndXUknyX+3aK/f3IgOjraGmPs/fff79VrJ06csBERETYyMtLGxMQkl585c8Z269bNejweO3369OTy\nmJgYGxISYqtXr27379+f6vo///yzHTNmTLr3bdGihfV4PPbQoUMZ1uniiy+269evT/XaAw88YD0e\njx07dmxy2cKFC60xxnbo0MH++++/yeXbtm2zF154oS1VqlSq9xk5cqQNCgqyb7/9dqpr79u3z1ao\nUMFWq1YtVbkxxl566aXp6pnRaz169LAej8du2LAhuezXX3+1xYsXt0WLFrUej8euXLky+bXZs2dn\n+N8ns/d2U7lyZRsWFpbpMUmxHz16dKp47dixw5YpU8aWKlXKnjhxIrk8NjbW9TpJ97ls2bLksvXr\n11tjjL322mtTnZf0nocPH04uW7x4cfKxKbnd81NPPWWDg4NtcHCwrVKlSqrXnnjiCevxeOz//d//\nWWutPX36tD3//PNttWrVUt1fZvdz+PBhGx4ebitUqOB6r/4mo8/FLA9jNsZUNsb0NMbMMcZEG2N+\nMsb8aYzZZoz5KrG8rzGmcm4m5ZL/AnlvwypVYNkyGDwYPvooa+cGclxyQnFJTzFxp7i48zYu1sLt\n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\njzJ69Ohs1Tclay1Tp07l9ttvp0OHDuc8fsmSJYwcOZL27dszduzYHL+/N9LG99NPP+Wjjz7iqquu\n4tJLLwWgRo0arl98bNmyhSlTpqTr3e3QoQPWWsaPH3/OYdjTp0/nzz//pHv37ule27x5MytXrmT6\n9OleD4kGZ/GppUuXcvXVV/Pee++laidJ9xMfH588zzzJ3Llz0+2LXCC5LdFc2B4U4qX3Jb0xY6y9\n9FJrDx70dU1EpLCb9u6P1vPwefbpD7S9kJyFth7KsaxuPWSttUuWLLFFihSxxYsXt7fccovt06eP\nrV27tvV4PLZt27Y2ISEh1fEjRoywHo/HhoeH227dutlBgwbZ6667zgYFBdlbb7013ft6s/WQx+Ox\nDRo0sH369LH33XefrVKlivV4PLZ///7pzuncubP1eDy2SpUqtlevXrZTp062VKlSNjg42C5YkPoz\n5fjx47Zx48bW4/HY8uXL206dOtlBgwbZtm3b2hIlSliPx5Pq+OxsPWSMsZGRkfbAgQOpXhs0aFC6\nrYe+++47W6JECVu3bl17/Phxr9/bjbdbDxljbKlSpWynTp3sAw88YDt06GCDg4NtZGSk3bx5c/Kx\np06dsnXr1rUej8e2atXK3n///bZDhw42NDTUhoeHW4/HYydMmJB8fHx8vG3SpIn1eDy2YcOG9v77\n77c33nijDQkJsR6Px15xxRV28ODBtl27dtbj8dhq1arZI0eOpLtnj8dju3Xrlq7uJUuWdN16yBiT\nvPWQtdYeO3bMNmrUyBpj7PDhw5PLV69ebT0ejw0LC7Pdu3e3AwYMsPXr17chISE2LCwswzbpbzL6\nXMzS1kPGmPSzmjM//tyDyTM/v60xJsEY43U9jTEXGGPeNsYcMsacMMasNsZonV3x2pgxzvzdNm0g\nce0GEZF898bHMQz4OorHr5rIqJvVoyuS24wxrnMsM3qtffv2rFq1iuuuu45Vq1Yxb948goKCeO65\n51iyZEm645999lkWL15MgwYN+PDDD5k9ezZ79uzhvvvu45lnnsnwfTPTunVratasyUcffcScOXMo\nWbIkU6ZMcV2Rd+HChbz00kuULl2at956i+XLl3P11Vfz+eefc9ddqT9TSpQowapVq5g4cSJVq1bl\ns88+Y8aMGcTExNCpUyeWLVuWpbq6vWaM4cUXX6RcuXKZ3uP+/ftp3749oaGhLFmyxHWe67nilJ3j\n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\nAElFTkSuQmCC\n", 633 | "text/plain": [ 634 | "" 635 | ] 636 | }, 637 | "metadata": {}, 638 | "output_type": "display_data" 639 | } 640 | ], 641 | "source": [ 642 | "import numpy\n", 643 | "import matplotlib as mpl\n", 644 | "import matplotlib.pyplot as plt\n", 645 | "% matplotlib inline\n", 646 | "\n", 647 | "mpl.rc('font', family='Verdana', size= 16)\n", 648 | "\n", 649 | "w = numpy.linalg.solve(M6, v6) # запишем найденные коэффициенты в переменную\n", 650 | "def f(x):\n", 651 | " return w[0]*x**2 + w[1]*x + w[2] # уравнение параболы\n", 652 | "\n", 653 | "\n", 654 | "fig, ax = plt.subplots(figsize=(10,5))\n", 655 | "\n", 656 | "x = numpy.linspace(-2,2,200)\n", 657 | "ax.axis([-2., 2., 0., 2.])\n", 658 | "ax.grid()\n", 659 | "ax.plot(x, f(x), label = 'Парабола')\n", 660 | "ax.plot(x, x, label = 'Биссектриса 1й\\nкоординатной четверти')\n", 661 | "ax.set_xlabel(u'x',{'fontname':'Arial', 'size': 24})\n", 662 | "ax.set_ylabel(u'f(x)',{'fontname':'Arial', 'size': 24})\n", 663 | "plt.plot([-1, 1], [1, 1], 'ro', label = 'Точки для\\nпостроения графика')\n", 664 | "ax.annotate('Точка\\nкасания', xy=(1., 1.), xytext=(1.5, 0.5),\n", 665 | " arrowprops=dict(facecolor='black', shrink=0.05),\n", 666 | " )\n", 667 | "\n", 668 | "ax.legend(bbox_to_anchor=(1.6, 1.))\n", 669 | "\n", 670 | "plt.show()" 671 | ] 672 | }, 673 | { 674 | "cell_type": "code", 675 | "execution_count": null, 676 | "metadata": { 677 | "collapsed": true 678 | }, 679 | "outputs": [], 680 | "source": [] 681 | } 682 | ], 683 | "metadata": { 684 | "kernelspec": { 685 | "display_name": "Python 3", 686 | "language": "python", 687 | "name": "python3" 688 | }, 689 | "language_info": { 690 | "codemirror_mode": { 691 | "name": "ipython", 692 | "version": 3 693 | }, 694 | "file_extension": ".py", 695 | "mimetype": "text/x-python", 696 | "name": "python", 697 | "nbconvert_exporter": "python", 698 | "pygments_lexer": "ipython3", 699 | "version": "3.5.1" 700 | } 701 | }, 702 | "nbformat": 4, 703 | "nbformat_minor": 0 704 | } 705 | -------------------------------------------------------------------------------- /3.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Регулярные выражения с помощью модуля re\n", 8 | "\n", 9 | "## Документация re (python)\n", 10 | "\n", 11 | "Регулярные выражения по сути микроязык, входящий в состав практически всех современных языков программирования. Их знание не является необходимым для прохождения специализации, однако является полезным.\n", 12 | "\n", 13 | "Если вы не планируете изучать регулярные выражения, а только хотите посмотреть пример использования, необходимый для выполнения для задания 2 недели, просто перейдите к разделу 1.\n", 14 | "\n", 15 | "**Эта памятка не претендует на звание учебника по регулярным выражениям!** Её цель - демонстрация работы нескольких функций модуля и несльких примеров работы с регулярными выражениями." 16 | ] 17 | }, 18 | { 19 | "cell_type": "markdown", 20 | "metadata": {}, 21 | "source": [ 22 | "## Чит-таблица Доктора Чака\n", 23 | "\n", 24 | "Таблица заботливо предоставлена Dr. Charles R. из Университета Мичигана и переведена на русский язык.\n", 25 | "\n", 26 | "Таблица содержит самые простые символы и их комбинации в регулярных выражениях.\n", 27 | "\n", 28 | "\n", 29 | "\n", 30 | "\n", 31 | "\n", 32 | "\n", 33 | "\n", 34 | "\n", 35 | "\n", 36 | "\n", 37 | "\n", 38 | "\n", 39 | "\n", 40 | "\n", 41 | "\n", 42 | "\n", 43 | "\n", 44 | "\n", 45 | "
^Начало новой строки
\\$Окончание строки
.Любой символ
\\sПробел
\\SЛюбой не пробельный символ
\\*Повтор символа 0 и более раз
\\*?Повтор символа 0 и более раз (не жадный)
+Повтор символа 1 и более раз
+?Повтор символа 1 и более раз (не жадный)
[aeiou]1 символ из набора
[^XYZ]1 символ не из набора
[a-z0-9]Набор символов в диапазоне от a до z и от 0 до 9
(Означает начало регулярного выражения
)Означает окончание регулярного выражения
\n", 46 | "\n", 47 | "Больше правил для составления регулярных выражений можно найти здесь - https://docs.python.org/2/howto/regex.html" 48 | ] 49 | }, 50 | { 51 | "cell_type": "markdown", 52 | "metadata": {}, 53 | "source": [ 54 | "В рамках этого документа мы будем работать с небольшим произвольным текстом, состоящим из нескольких строк:" 55 | ] 56 | }, 57 | { 58 | "cell_type": "code", 59 | "execution_count": 1, 60 | "metadata": { 61 | "collapsed": true 62 | }, 63 | "outputs": [], 64 | "source": [ 65 | "a = '''Any large snake that \"constricts\" its prey (see Constriction), if applied loosely, was called anaconda, though this usage is now archaic.\n", 66 | "An anaconda is a large snake found in tropical South America.\n", 67 | "Although the name applies to a group of snakes, it is often used to refer only to one species in particular, the common or green anaconda, Eunectes murinus, which is the largest snake in the world by weight, and the second longest.\n", 68 | "The giant anaconda is a mythical snake of enormous proportions said to be found in South America.\n", 69 | "Anaconda is an unincorporated community in Franklin County, Missouri, in the United States.\n", 70 | "In 1903, the Socialist Party of America won its first victory west of the Mississippi when Anaconda voters elected a socialist mayor, treasurer, police judge, and three councilmen.\n", 71 | "Anaconda was founded by Marcus Daly, one of the Copper Kings, who financed the construction of a smelter on nearby Warm Springs Creek to process copper ore from the Butte mines.\n", 72 | "Это последняя строка\n", 73 | "Win!!!'''" 74 | ] 75 | }, 76 | { 77 | "cell_type": "markdown", 78 | "metadata": {}, 79 | "source": [ 80 | "## Импорт библиотеки\n", 81 | "\n", 82 | "как и все стандартные библиотеки Python, re загружается командой import:" 83 | ] 84 | }, 85 | { 86 | "cell_type": "code", 87 | "execution_count": 2, 88 | "metadata": { 89 | "collapsed": true 90 | }, 91 | "outputs": [], 92 | "source": [ 93 | "import re" 94 | ] 95 | }, 96 | { 97 | "cell_type": "markdown", 98 | "metadata": {}, 99 | "source": [ 100 | "## Раздел 1 - re.split()\n", 101 | "\n", 102 | "Функция split служит для разбиения строки на список подстрок по регулярному выражению. При этом регулярное выражение вырезается.\n", 103 | "\n", 104 | "Функция применяется следующим образом:\n", 105 | "\n", 106 | "
re.split(регулярное_выражение, строка_для_поиска)
\n", 107 | "\n", 108 | "- регулярное выражение может быть как строковой переменной, так и задано в явном виде в теле функции\n", 109 | " \n", 110 | "- строка для поиска может быть как строковой переменной, так и задано в явном виде в теле функции\n", 111 | " \n", 112 | "*Во всех примерах мы будем задавать регулярное выражение прямо в теле функции, а строку передавать в переменной*\n", 113 | "\n", 114 | "Рассмотрим простой пример в которой разделим нашу строку на список подстрок длинной в 1 символ (т.е. просто разделим на отдельные символы), воспользуемся для этого исмволом переноса строки - '\\n':" 115 | ] 116 | }, 117 | { 118 | "cell_type": "code", 119 | "execution_count": 3, 120 | "metadata": { 121 | "collapsed": false, 122 | "scrolled": false 123 | }, 124 | "outputs": [ 125 | { 126 | "data": { 127 | "text/plain": [ 128 | "['Any large snake that \"constricts\" its prey (see Constriction), if applied loosely, was called anaconda, though this usage is now archaic.',\n", 129 | " 'An anaconda is a large snake found in tropical South America.',\n", 130 | " 'Although the name applies to a group of snakes, it is often used to refer only to one species in particular, the common or green anaconda, Eunectes murinus, which is the largest snake in the world by weight, and the second longest.',\n", 131 | " 'The giant anaconda is a mythical snake of enormous proportions said to be found in South America.',\n", 132 | " 'Anaconda is an unincorporated community in Franklin County, Missouri, in the United States.',\n", 133 | " 'In 1903, the Socialist Party of America won its first victory west of the Mississippi when Anaconda voters elected a socialist mayor, treasurer, police judge, and three councilmen.',\n", 134 | " 'Anaconda was founded by Marcus Daly, one of the Copper Kings, who financed the construction of a smelter on nearby Warm Springs Creek to process copper ore from the Butte mines.',\n", 135 | " 'Это последняя строка',\n", 136 | " 'Win!!!']" 137 | ] 138 | }, 139 | "execution_count": 3, 140 | "metadata": {}, 141 | "output_type": "execute_result" 142 | } 143 | ], 144 | "source": [ 145 | "import re\n", 146 | "re.split('\\n', a)" 147 | ] 148 | }, 149 | { 150 | "cell_type": "markdown", 151 | "metadata": {}, 152 | "source": [ 153 | "Как видим в результате получен список строк, раждая из которых соответсвует одной строке исходного документа, все переносы строк исчезли.\n", 154 | "\n", 155 | "В рамках задания рекомендуется:\n", 156 | "* разбить исходный текст на строки, либо считать его построчно из файла с помощью file.readline()\n", 157 | "* привести каждую строку к нижнему регистру с помощью функции lower()\n", 158 | "* токенизировать, т.е. разбить на слова каждую из приведённых к нижнему регистру строк с помощью re.split('[^a-z]', t)\n", 159 | "\n", 160 | "**В рамках этого примера мы выполним только 2 и 3 пункты (т.е. сознательно не будем разделять текст на строки, т.к. это показано выше):**" 161 | ] 162 | }, 163 | { 164 | "cell_type": "code", 165 | "execution_count": 4, 166 | "metadata": { 167 | "collapsed": false 168 | }, 169 | "outputs": [ 170 | { 171 | "data": { 172 | "text/plain": [ 173 | "['any',\n", 174 | " 'large',\n", 175 | " 'snake',\n", 176 | " 'that',\n", 177 | " '',\n", 178 | " 'constricts',\n", 179 | " '',\n", 180 | " 'its',\n", 181 | " 'prey',\n", 182 | " '',\n", 183 | " 'see',\n", 184 | " 'constriction',\n", 185 | " '',\n", 186 | " '',\n", 187 | " 'if',\n", 188 | " 'applied',\n", 189 | " 'loosely',\n", 190 | " '',\n", 191 | " 'was',\n", 192 | " 'called',\n", 193 | " 'anaconda',\n", 194 | " '',\n", 195 | " 'though',\n", 196 | " 'this',\n", 197 | " 'usage',\n", 198 | " 'is',\n", 199 | " 'now',\n", 200 | " 'archaic',\n", 201 | " '',\n", 202 | " 'an',\n", 203 | " 'anaconda',\n", 204 | " 'is',\n", 205 | " 'a',\n", 206 | " 'large',\n", 207 | " 'snake',\n", 208 | " 'found',\n", 209 | " 'in',\n", 210 | " 'tropical',\n", 211 | " 'south',\n", 212 | " 'america',\n", 213 | " '',\n", 214 | " 'although',\n", 215 | " 'the',\n", 216 | " 'name',\n", 217 | " 'applies',\n", 218 | " 'to',\n", 219 | " 'a',\n", 220 | " 'group',\n", 221 | " 'of',\n", 222 | " 'snakes',\n", 223 | " '',\n", 224 | " 'it',\n", 225 | " 'is',\n", 226 | " 'often',\n", 227 | " 'used',\n", 228 | " 'to',\n", 229 | " 'refer',\n", 230 | " 'only',\n", 231 | " 'to',\n", 232 | " 'one',\n", 233 | " 'species',\n", 234 | " 'in',\n", 235 | " 'particular',\n", 236 | " '',\n", 237 | " 'the',\n", 238 | " 'common',\n", 239 | " 'or',\n", 240 | " 'green',\n", 241 | " 'anaconda',\n", 242 | " '',\n", 243 | " 'eunectes',\n", 244 | " 'murinus',\n", 245 | " '',\n", 246 | " 'which',\n", 247 | " 'is',\n", 248 | " 'the',\n", 249 | " 'largest',\n", 250 | " 'snake',\n", 251 | " 'in',\n", 252 | " 'the',\n", 253 | " 'world',\n", 254 | " 'by',\n", 255 | " 'weight',\n", 256 | " '',\n", 257 | " 'and',\n", 258 | " 'the',\n", 259 | " 'second',\n", 260 | " 'longest',\n", 261 | " '',\n", 262 | " 'the',\n", 263 | " 'giant',\n", 264 | " 'anaconda',\n", 265 | " 'is',\n", 266 | " 'a',\n", 267 | " 'mythical',\n", 268 | " 'snake',\n", 269 | " 'of',\n", 270 | " 'enormous',\n", 271 | " 'proportions',\n", 272 | " 'said',\n", 273 | " 'to',\n", 274 | " 'be',\n", 275 | " 'found',\n", 276 | " 'in',\n", 277 | " 'south',\n", 278 | " 'america',\n", 279 | " '',\n", 280 | " 'anaconda',\n", 281 | " 'is',\n", 282 | " 'an',\n", 283 | " 'unincorporated',\n", 284 | " 'community',\n", 285 | " 'in',\n", 286 | " 'franklin',\n", 287 | " 'county',\n", 288 | " '',\n", 289 | " 'missouri',\n", 290 | " '',\n", 291 | " 'in',\n", 292 | " 'the',\n", 293 | " 'united',\n", 294 | " 'states',\n", 295 | " '',\n", 296 | " 'in',\n", 297 | " '',\n", 298 | " '',\n", 299 | " '',\n", 300 | " '',\n", 301 | " '',\n", 302 | " '',\n", 303 | " 'the',\n", 304 | " 'socialist',\n", 305 | " 'party',\n", 306 | " 'of',\n", 307 | " 'america',\n", 308 | " 'won',\n", 309 | " 'its',\n", 310 | " 'first',\n", 311 | " 'victory',\n", 312 | " 'west',\n", 313 | " 'of',\n", 314 | " 'the',\n", 315 | " 'mississippi',\n", 316 | " 'when',\n", 317 | " 'anaconda',\n", 318 | " 'voters',\n", 319 | " 'elected',\n", 320 | " 'a',\n", 321 | " 'socialist',\n", 322 | " 'mayor',\n", 323 | " '',\n", 324 | " 'treasurer',\n", 325 | " '',\n", 326 | " 'police',\n", 327 | " 'judge',\n", 328 | " '',\n", 329 | " 'and',\n", 330 | " 'three',\n", 331 | " 'councilmen',\n", 332 | " '',\n", 333 | " 'anaconda',\n", 334 | " 'was',\n", 335 | " 'founded',\n", 336 | " 'by',\n", 337 | " 'marcus',\n", 338 | " 'daly',\n", 339 | " '',\n", 340 | " 'one',\n", 341 | " 'of',\n", 342 | " 'the',\n", 343 | " 'copper',\n", 344 | " 'kings',\n", 345 | " '',\n", 346 | " 'who',\n", 347 | " 'financed',\n", 348 | " 'the',\n", 349 | " 'construction',\n", 350 | " 'of',\n", 351 | " 'a',\n", 352 | " 'smelter',\n", 353 | " 'on',\n", 354 | " 'nearby',\n", 355 | " 'warm',\n", 356 | " 'springs',\n", 357 | " 'creek',\n", 358 | " 'to',\n", 359 | " 'process',\n", 360 | " 'copper',\n", 361 | " 'ore',\n", 362 | " 'from',\n", 363 | " 'the',\n", 364 | " 'butte',\n", 365 | " 'mines',\n", 366 | " '',\n", 367 | " '',\n", 368 | " '',\n", 369 | " '',\n", 370 | " '',\n", 371 | " '',\n", 372 | " '',\n", 373 | " '',\n", 374 | " '',\n", 375 | " '',\n", 376 | " '',\n", 377 | " '',\n", 378 | " '',\n", 379 | " '',\n", 380 | " '',\n", 381 | " '',\n", 382 | " '',\n", 383 | " '',\n", 384 | " '',\n", 385 | " '',\n", 386 | " '',\n", 387 | " '',\n", 388 | " 'win',\n", 389 | " '',\n", 390 | " '',\n", 391 | " '']" 392 | ] 393 | }, 394 | "execution_count": 4, 395 | "metadata": {}, 396 | "output_type": "execute_result" 397 | } 398 | ], 399 | "source": [ 400 | "import re\n", 401 | "\n", 402 | "re.split('[^a-z]', a.lower())" 403 | ] 404 | }, 405 | { 406 | "cell_type": "markdown", 407 | "metadata": {}, 408 | "source": [ 409 | "Обратите внимание на множество пустых строк - они являеются результатом того, что наше регулярное выражение не полное. Есть много специальных символов, которые не являются буквами: цифры, русские буквы, латинские большие буквы, запятые, точки, апострофы и т.п.\n", 410 | "\n", 411 | "Если вы внимательно посмотрите на список выше, то заметите, что он не содержит числа 1903 и ни одного из слов последней строки, написанно по-русски.\n", 412 | "\n", 413 | "Именно поэтому в рамках задания 2 недели важно:\n", 414 | "\n", 415 | "* разделить текст на строки\n", 416 | "* провести приведение к нижнему регистру перед токенизацией\n", 417 | "* удалить пустые строки после токенизации\n", 418 | "\n", 419 | "\n", 420 | "**Подсказка.** *Для этого можно использовать сравнение с пустой строкой (stackoverflow)*" 421 | ] 422 | }, 423 | { 424 | "cell_type": "markdown", 425 | "metadata": {}, 426 | "source": [ 427 | "# Описанные далее не требуется для выполнения задания 2 недели\n", 428 | "## Но позволит лучше понять регулярные выражения (они крайне полезны во многих ситуациях)\n", 429 | "В нашем случае можно усложнить регулярное выражение, добавив в него заглавные буквы, цифры и кириллические символы:" 430 | ] 431 | }, 432 | { 433 | "cell_type": "code", 434 | "execution_count": 5, 435 | "metadata": { 436 | "collapsed": false 437 | }, 438 | "outputs": [ 439 | { 440 | "data": { 441 | "text/plain": [ 442 | "['Any',\n", 443 | " 'large',\n", 444 | " 'snake',\n", 445 | " 'that',\n", 446 | " '',\n", 447 | " 'constricts',\n", 448 | " '',\n", 449 | " 'its',\n", 450 | " 'prey',\n", 451 | " '',\n", 452 | " 'see',\n", 453 | " 'Constriction',\n", 454 | " '',\n", 455 | " '',\n", 456 | " 'if',\n", 457 | " 'applied',\n", 458 | " 'loosely',\n", 459 | " '',\n", 460 | " 'was',\n", 461 | " 'called',\n", 462 | " 'anaconda',\n", 463 | " '',\n", 464 | " 'though',\n", 465 | " 'this',\n", 466 | " 'usage',\n", 467 | " 'is',\n", 468 | " 'now',\n", 469 | " 'archaic',\n", 470 | " '',\n", 471 | " 'An',\n", 472 | " 'anaconda',\n", 473 | " 'is',\n", 474 | " 'a',\n", 475 | " 'large',\n", 476 | " 'snake',\n", 477 | " 'found',\n", 478 | " 'in',\n", 479 | " 'tropical',\n", 480 | " 'South',\n", 481 | " 'America',\n", 482 | " '',\n", 483 | " 'Although',\n", 484 | " 'the',\n", 485 | " 'name',\n", 486 | " 'applies',\n", 487 | " 'to',\n", 488 | " 'a',\n", 489 | " 'group',\n", 490 | " 'of',\n", 491 | " 'snakes',\n", 492 | " '',\n", 493 | " 'it',\n", 494 | " 'is',\n", 495 | " 'often',\n", 496 | " 'used',\n", 497 | " 'to',\n", 498 | " 'refer',\n", 499 | " 'only',\n", 500 | " 'to',\n", 501 | " 'one',\n", 502 | " 'species',\n", 503 | " 'in',\n", 504 | " 'particular',\n", 505 | " '',\n", 506 | " 'the',\n", 507 | " 'common',\n", 508 | " 'or',\n", 509 | " 'green',\n", 510 | " 'anaconda',\n", 511 | " '',\n", 512 | " 'Eunectes',\n", 513 | " 'murinus',\n", 514 | " '',\n", 515 | " 'which',\n", 516 | " 'is',\n", 517 | " 'the',\n", 518 | " 'largest',\n", 519 | " 'snake',\n", 520 | " 'in',\n", 521 | " 'the',\n", 522 | " 'world',\n", 523 | " 'by',\n", 524 | " 'weight',\n", 525 | " '',\n", 526 | " 'and',\n", 527 | " 'the',\n", 528 | " 'second',\n", 529 | " 'longest',\n", 530 | " '',\n", 531 | " 'The',\n", 532 | " 'giant',\n", 533 | " 'anaconda',\n", 534 | " 'is',\n", 535 | " 'a',\n", 536 | " 'mythical',\n", 537 | " 'snake',\n", 538 | " 'of',\n", 539 | " 'enormous',\n", 540 | " 'proportions',\n", 541 | " 'said',\n", 542 | " 'to',\n", 543 | " 'be',\n", 544 | " 'found',\n", 545 | " 'in',\n", 546 | " 'South',\n", 547 | " 'America',\n", 548 | " '',\n", 549 | " 'Anaconda',\n", 550 | " 'is',\n", 551 | " 'an',\n", 552 | " 'unincorporated',\n", 553 | " 'community',\n", 554 | " 'in',\n", 555 | " 'Franklin',\n", 556 | " 'County',\n", 557 | " '',\n", 558 | " 'Missouri',\n", 559 | " '',\n", 560 | " 'in',\n", 561 | " 'the',\n", 562 | " 'United',\n", 563 | " 'States',\n", 564 | " '',\n", 565 | " 'In',\n", 566 | " '1903',\n", 567 | " '',\n", 568 | " 'the',\n", 569 | " 'Socialist',\n", 570 | " 'Party',\n", 571 | " 'of',\n", 572 | " 'America',\n", 573 | " 'won',\n", 574 | " 'its',\n", 575 | " 'first',\n", 576 | " 'victory',\n", 577 | " 'west',\n", 578 | " 'of',\n", 579 | " 'the',\n", 580 | " 'Mississippi',\n", 581 | " 'when',\n", 582 | " 'Anaconda',\n", 583 | " 'voters',\n", 584 | " 'elected',\n", 585 | " 'a',\n", 586 | " 'socialist',\n", 587 | " 'mayor',\n", 588 | " '',\n", 589 | " 'treasurer',\n", 590 | " '',\n", 591 | " 'police',\n", 592 | " 'judge',\n", 593 | " '',\n", 594 | " 'and',\n", 595 | " 'three',\n", 596 | " 'councilmen',\n", 597 | " '',\n", 598 | " 'Anaconda',\n", 599 | " 'was',\n", 600 | " 'founded',\n", 601 | " 'by',\n", 602 | " 'Marcus',\n", 603 | " 'Daly',\n", 604 | " '',\n", 605 | " 'one',\n", 606 | " 'of',\n", 607 | " 'the',\n", 608 | " 'Copper',\n", 609 | " 'Kings',\n", 610 | " '',\n", 611 | " 'who',\n", 612 | " 'financed',\n", 613 | " 'the',\n", 614 | " 'construction',\n", 615 | " 'of',\n", 616 | " 'a',\n", 617 | " 'smelter',\n", 618 | " 'on',\n", 619 | " 'nearby',\n", 620 | " 'Warm',\n", 621 | " 'Springs',\n", 622 | " 'Creek',\n", 623 | " 'to',\n", 624 | " 'process',\n", 625 | " 'copper',\n", 626 | " 'ore',\n", 627 | " 'from',\n", 628 | " 'the',\n", 629 | " 'Butte',\n", 630 | " 'mines',\n", 631 | " '',\n", 632 | " 'Это',\n", 633 | " 'последняя',\n", 634 | " 'строка',\n", 635 | " 'Win',\n", 636 | " '',\n", 637 | " '',\n", 638 | " '']" 639 | ] 640 | }, 641 | "execution_count": 5, 642 | "metadata": {}, 643 | "output_type": "execute_result" 644 | } 645 | ], 646 | "source": [ 647 | "import re\n", 648 | "\n", 649 | "re.split('[^A-z0-9А-я]', a)" 650 | ] 651 | }, 652 | { 653 | "cell_type": "markdown", 654 | "metadata": {}, 655 | "source": [ 656 | "Напомним, вы использовали конструкцию:\n", 657 | "* [] для обозначения, что внутри квадратных скобок находится один из символов набора, который нас интересует\n", 658 | "* [^] для отрицания (т.е. что нас интересует один из символов, которые НЕ перечислены дальше\n", 659 | "* a-z - любая из строчных букв латинского алфавита от a до z: a, b, c, d, e, ... x, y, z.\n", 660 | "* 0-9 любая из цифры от 0 до 9: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9.\n", 661 | "* A-z - любая из строчных или прописных букв латинского алфавита от a до z: A, a, B, b, C, c, D, d, ... Y, y, Z, z.\n", 662 | "* A-z0-9 - любая из строчных или прописных букв латинского алфавита или цифр от 0 до 9.\n", 663 | "* ...\n", 664 | "* [^A-z0-9А-я] - символ НЕ из набора строчных или прописных букв русского или латинского алфавита или цифр.\n", 665 | "\n", 666 | "В данном случае так же можно было перечислить знаки препинания, которые могут быть разделителями в явном виде. Какие у нас могут быть разделители?\n", 667 | "\n", 668 | "- запятая - ,\n", 669 | "- двойная кавычка - \"\n", 670 | "- перенос строки - \\n\n", 671 | "- пробел - \\s (см чит таблицу выше)\n", 672 | "- открывающаяся кавычка - (\n", 673 | "- закрывающаяся кавычка - )\n", 674 | "\n", 675 | "Но как быть с точкой и одинарной кавычкой? Точка - сама по себе выражение (см чит-таблицу), означающая ЛЮБОЙ символ, а одинарная кавычка просто закроет строковую переменную!\n", 676 | "\n", 677 | "Выход - символ экранирования, которым является обратный слеш \\:\n", 678 | "\n", 679 | "точка - \\.\n", 680 | "одинарная кавычка - \\'\n", 681 | "\n", 682 | "Получится довольно непростая (и даже страшновата конструкция:" 683 | ] 684 | }, 685 | { 686 | "cell_type": "code", 687 | "execution_count": 6, 688 | "metadata": { 689 | "collapsed": false 690 | }, 691 | "outputs": [ 692 | { 693 | "data": { 694 | "text/plain": [ 695 | "['Any',\n", 696 | " 'large',\n", 697 | " 'snake',\n", 698 | " 'that',\n", 699 | " '',\n", 700 | " 'constricts',\n", 701 | " '',\n", 702 | " 'its',\n", 703 | " 'prey',\n", 704 | " '',\n", 705 | " 'see',\n", 706 | " 'Constriction',\n", 707 | " '',\n", 708 | " '',\n", 709 | " 'if',\n", 710 | " 'applied',\n", 711 | " 'loosely',\n", 712 | " '',\n", 713 | " 'was',\n", 714 | " 'called',\n", 715 | " 'anaconda',\n", 716 | " '',\n", 717 | " 'though',\n", 718 | " 'this',\n", 719 | " 'usage',\n", 720 | " 'is',\n", 721 | " 'now',\n", 722 | " 'archaic',\n", 723 | " '',\n", 724 | " 'An',\n", 725 | " 'anaconda',\n", 726 | " 'is',\n", 727 | " 'a',\n", 728 | " 'large',\n", 729 | " 'snake',\n", 730 | " 'found',\n", 731 | " 'in',\n", 732 | " 'tropical',\n", 733 | " 'South',\n", 734 | " 'America',\n", 735 | " '',\n", 736 | " 'Although',\n", 737 | " 'the',\n", 738 | " 'name',\n", 739 | " 'applies',\n", 740 | " 'to',\n", 741 | " 'a',\n", 742 | " 'group',\n", 743 | " 'of',\n", 744 | " 'snakes',\n", 745 | " '',\n", 746 | " 'it',\n", 747 | " 'is',\n", 748 | " 'often',\n", 749 | " 'used',\n", 750 | " 'to',\n", 751 | " 'refer',\n", 752 | " 'only',\n", 753 | " 'to',\n", 754 | " 'one',\n", 755 | " 'species',\n", 756 | " 'in',\n", 757 | " 'particular',\n", 758 | " '',\n", 759 | " 'the',\n", 760 | " 'common',\n", 761 | " 'or',\n", 762 | " 'green',\n", 763 | " 'anaconda',\n", 764 | " '',\n", 765 | " 'Eunectes',\n", 766 | " 'murinus',\n", 767 | " '',\n", 768 | " 'which',\n", 769 | " 'is',\n", 770 | " 'the',\n", 771 | " 'largest',\n", 772 | " 'snake',\n", 773 | " 'in',\n", 774 | " 'the',\n", 775 | " 'world',\n", 776 | " 'by',\n", 777 | " 'weight',\n", 778 | " '',\n", 779 | " 'and',\n", 780 | " 'the',\n", 781 | " 'second',\n", 782 | " 'longest',\n", 783 | " '',\n", 784 | " 'The',\n", 785 | " 'giant',\n", 786 | " 'anaconda',\n", 787 | " 'is',\n", 788 | " 'a',\n", 789 | " 'mythical',\n", 790 | " 'snake',\n", 791 | " 'of',\n", 792 | " 'enormous',\n", 793 | " 'proportions',\n", 794 | " 'said',\n", 795 | " 'to',\n", 796 | " 'be',\n", 797 | " 'found',\n", 798 | " 'in',\n", 799 | " 'South',\n", 800 | " 'America',\n", 801 | " '',\n", 802 | " 'Anaconda',\n", 803 | " 'is',\n", 804 | " 'an',\n", 805 | " 'unincorporated',\n", 806 | " 'community',\n", 807 | " 'in',\n", 808 | " 'Franklin',\n", 809 | " 'County',\n", 810 | " '',\n", 811 | " 'Missouri',\n", 812 | " '',\n", 813 | " 'in',\n", 814 | " 'the',\n", 815 | " 'United',\n", 816 | " 'States',\n", 817 | " '',\n", 818 | " 'In',\n", 819 | " '1903',\n", 820 | " '',\n", 821 | " 'the',\n", 822 | " 'Socialist',\n", 823 | " 'Party',\n", 824 | " 'of',\n", 825 | " 'America',\n", 826 | " 'won',\n", 827 | " 'its',\n", 828 | " 'first',\n", 829 | " 'victory',\n", 830 | " 'west',\n", 831 | " 'of',\n", 832 | " 'the',\n", 833 | " 'Mississippi',\n", 834 | " 'when',\n", 835 | " 'Anaconda',\n", 836 | " 'voters',\n", 837 | " 'elected',\n", 838 | " 'a',\n", 839 | " 'socialist',\n", 840 | " 'mayor',\n", 841 | " '',\n", 842 | " 'treasurer',\n", 843 | " '',\n", 844 | " 'police',\n", 845 | " 'judge',\n", 846 | " '',\n", 847 | " 'and',\n", 848 | " 'three',\n", 849 | " 'councilmen',\n", 850 | " '',\n", 851 | " 'Anaconda',\n", 852 | " 'was',\n", 853 | " 'founded',\n", 854 | " 'by',\n", 855 | " 'Marcus',\n", 856 | " 'Daly',\n", 857 | " '',\n", 858 | " 'one',\n", 859 | " 'of',\n", 860 | " 'the',\n", 861 | " 'Copper',\n", 862 | " 'Kings',\n", 863 | " '',\n", 864 | " 'who',\n", 865 | " 'financed',\n", 866 | " 'the',\n", 867 | " 'construction',\n", 868 | " 'of',\n", 869 | " 'a',\n", 870 | " 'smelter',\n", 871 | " 'on',\n", 872 | " 'nearby',\n", 873 | " 'Warm',\n", 874 | " 'Springs',\n", 875 | " 'Creek',\n", 876 | " 'to',\n", 877 | " 'process',\n", 878 | " 'copper',\n", 879 | " 'ore',\n", 880 | " 'from',\n", 881 | " 'the',\n", 882 | " 'Butte',\n", 883 | " 'mines',\n", 884 | " '',\n", 885 | " 'Это',\n", 886 | " 'последняя',\n", 887 | " 'строка',\n", 888 | " 'Win!!!']" 889 | ] 890 | }, 891 | "execution_count": 6, 892 | "metadata": {}, 893 | "output_type": "execute_result" 894 | } 895 | ], 896 | "source": [ 897 | "import re\n", 898 | "\n", 899 | "re.split('[\\n,\"\\s()\\.\\']', a)" 900 | ] 901 | }, 902 | { 903 | "cell_type": "markdown", 904 | "metadata": {}, 905 | "source": [ 906 | "Заметим, что в результате по прежнему есть пустые строки. Откуда они взялись?\n", 907 | "\n", 908 | "Это те участки текста, где встречаются подряд 2 разделителя, удовлетворяющих регулярному выражению (которое у нас состоит из 1 символа, описанного внутри квадратных скобок). Если мы воспользуемся символом + после квадратных скобок, то в качестве разделителя будет искаться 1 и более символов, идущих подряд, удовлетворяющих набору из квадратных скобок.\n", 909 | "\n", 910 | "**Примечание.** Т.к. по умолчанию выражения \"жадные\", то разделителем станет самое длинное найденное выражение. Если подряд будут идти 3 таких символа, то разделителем станут все 3, а не 1 и не 2. О \"Жадности\" мы ещё поговорим." 911 | ] 912 | }, 913 | { 914 | "cell_type": "code", 915 | "execution_count": 7, 916 | "metadata": { 917 | "collapsed": false 918 | }, 919 | "outputs": [ 920 | { 921 | "data": { 922 | "text/plain": [ 923 | "['Any',\n", 924 | " 'large',\n", 925 | " 'snake',\n", 926 | " 'that',\n", 927 | " 'constricts',\n", 928 | " 'its',\n", 929 | " 'prey',\n", 930 | " 'see',\n", 931 | " 'Constriction',\n", 932 | " 'if',\n", 933 | " 'applied',\n", 934 | " 'loosely',\n", 935 | " 'was',\n", 936 | " 'called',\n", 937 | " 'anaconda',\n", 938 | " 'though',\n", 939 | " 'this',\n", 940 | " 'usage',\n", 941 | " 'is',\n", 942 | " 'now',\n", 943 | " 'archaic',\n", 944 | " 'An',\n", 945 | " 'anaconda',\n", 946 | " 'is',\n", 947 | " 'a',\n", 948 | " 'large',\n", 949 | " 'snake',\n", 950 | " 'found',\n", 951 | " 'in',\n", 952 | " 'tropical',\n", 953 | " 'South',\n", 954 | " 'America',\n", 955 | " 'Although',\n", 956 | " 'the',\n", 957 | " 'name',\n", 958 | " 'applies',\n", 959 | " 'to',\n", 960 | " 'a',\n", 961 | " 'group',\n", 962 | " 'of',\n", 963 | " 'snakes',\n", 964 | " 'it',\n", 965 | " 'is',\n", 966 | " 'often',\n", 967 | " 'used',\n", 968 | " 'to',\n", 969 | " 'refer',\n", 970 | " 'only',\n", 971 | " 'to',\n", 972 | " 'one',\n", 973 | " 'species',\n", 974 | " 'in',\n", 975 | " 'particular',\n", 976 | " 'the',\n", 977 | " 'common',\n", 978 | " 'or',\n", 979 | " 'green',\n", 980 | " 'anaconda',\n", 981 | " 'Eunectes',\n", 982 | " 'murinus',\n", 983 | " 'which',\n", 984 | " 'is',\n", 985 | " 'the',\n", 986 | " 'largest',\n", 987 | " 'snake',\n", 988 | " 'in',\n", 989 | " 'the',\n", 990 | " 'world',\n", 991 | " 'by',\n", 992 | " 'weight',\n", 993 | " 'and',\n", 994 | " 'the',\n", 995 | " 'second',\n", 996 | " 'longest',\n", 997 | " 'The',\n", 998 | " 'giant',\n", 999 | " 'anaconda',\n", 1000 | " 'is',\n", 1001 | " 'a',\n", 1002 | " 'mythical',\n", 1003 | " 'snake',\n", 1004 | " 'of',\n", 1005 | " 'enormous',\n", 1006 | " 'proportions',\n", 1007 | " 'said',\n", 1008 | " 'to',\n", 1009 | " 'be',\n", 1010 | " 'found',\n", 1011 | " 'in',\n", 1012 | " 'South',\n", 1013 | " 'America',\n", 1014 | " 'Anaconda',\n", 1015 | " 'is',\n", 1016 | " 'an',\n", 1017 | " 'unincorporated',\n", 1018 | " 'community',\n", 1019 | " 'in',\n", 1020 | " 'Franklin',\n", 1021 | " 'County',\n", 1022 | " 'Missouri',\n", 1023 | " 'in',\n", 1024 | " 'the',\n", 1025 | " 'United',\n", 1026 | " 'States',\n", 1027 | " 'In',\n", 1028 | " '1903',\n", 1029 | " 'the',\n", 1030 | " 'Socialist',\n", 1031 | " 'Party',\n", 1032 | " 'of',\n", 1033 | " 'America',\n", 1034 | " 'won',\n", 1035 | " 'its',\n", 1036 | " 'first',\n", 1037 | " 'victory',\n", 1038 | " 'west',\n", 1039 | " 'of',\n", 1040 | " 'the',\n", 1041 | " 'Mississippi',\n", 1042 | " 'when',\n", 1043 | " 'Anaconda',\n", 1044 | " 'voters',\n", 1045 | " 'elected',\n", 1046 | " 'a',\n", 1047 | " 'socialist',\n", 1048 | " 'mayor',\n", 1049 | " 'treasurer',\n", 1050 | " 'police',\n", 1051 | " 'judge',\n", 1052 | " 'and',\n", 1053 | " 'three',\n", 1054 | " 'councilmen',\n", 1055 | " 'Anaconda',\n", 1056 | " 'was',\n", 1057 | " 'founded',\n", 1058 | " 'by',\n", 1059 | " 'Marcus',\n", 1060 | " 'Daly',\n", 1061 | " 'one',\n", 1062 | " 'of',\n", 1063 | " 'the',\n", 1064 | " 'Copper',\n", 1065 | " 'Kings',\n", 1066 | " 'who',\n", 1067 | " 'financed',\n", 1068 | " 'the',\n", 1069 | " 'construction',\n", 1070 | " 'of',\n", 1071 | " 'a',\n", 1072 | " 'smelter',\n", 1073 | " 'on',\n", 1074 | " 'nearby',\n", 1075 | " 'Warm',\n", 1076 | " 'Springs',\n", 1077 | " 'Creek',\n", 1078 | " 'to',\n", 1079 | " 'process',\n", 1080 | " 'copper',\n", 1081 | " 'ore',\n", 1082 | " 'from',\n", 1083 | " 'the',\n", 1084 | " 'Butte',\n", 1085 | " 'mines',\n", 1086 | " 'Это',\n", 1087 | " 'последняя',\n", 1088 | " 'строка',\n", 1089 | " 'Win!!!']" 1090 | ] 1091 | }, 1092 | "execution_count": 7, 1093 | "metadata": {}, 1094 | "output_type": "execute_result" 1095 | } 1096 | ], 1097 | "source": [ 1098 | "import re\n", 1099 | "\n", 1100 | "re.split('[\\n,\"\\s()\\.\\']+', a)" 1101 | ] 1102 | }, 1103 | { 1104 | "cell_type": "markdown", 1105 | "metadata": {}, 1106 | "source": [ 1107 | "**Важно!** Данное выражение содержит не все возможные разделители. Например, оно не учитывает символ -. Вы сами можете расширить его. Мы лишь пытались продемонстрировать то насколько громоздкой может получиться полностью универсальная конструкция для сложны задач и насколько простой пример достаточек в рамках задачи - re.split('[^a-z]', t)" 1108 | ] 1109 | }, 1110 | { 1111 | "cell_type": "markdown", 1112 | "metadata": {}, 1113 | "source": [ 1114 | "## Раздел 2 - re.findall()\n", 1115 | "\n", 1116 | "Функция findall служит для нахождениях всех подстрок в строку. Синтаксис аналогичен:\n", 1117 | "\n", 1118 | "
re.findall(регулярное_выражение, строка_для_поиска)
\n", 1119 | "\n", 1120 | "*Частая ошибка в задании 2 недели - подсчёт числа слов с помощью этой функции в тексте/строке*\n", 1121 | "\n", 1122 | "Поясним на примере поиска слова 'is' во всём тесте:" 1123 | ] 1124 | }, 1125 | { 1126 | "cell_type": "code", 1127 | "execution_count": 8, 1128 | "metadata": { 1129 | "collapsed": false 1130 | }, 1131 | "outputs": [ 1132 | { 1133 | "name": "stdout", 1134 | "output_type": "stream", 1135 | "text": [ 1136 | "Результат поиска \"is\" в исходном тексте, с помощью re.findall(): ['is', 'is', 'is', 'is', 'is', 'is', 'is', 'is', 'is', 'is', 'is', 'is']\n", 1137 | "Число вхождений слова \"is\" в исходных текст, подсчитанное с помощью re.findall(): 12\n", 1138 | "Число вхождений слова \"is\" в исходных текст, подсчитанное с помощью count(): 12\n" 1139 | ] 1140 | } 1141 | ], 1142 | "source": [ 1143 | "\n", 1144 | "print ('Результат поиска \"is\" в исходном тексте, с помощью re.findall(): ', re.findall('is', a))\n", 1145 | "print ('Число вхождений слова \"is\" в исходных текст, подсчитанное с помощью re.findall(): ', len(re.findall('is', a)))\n", 1146 | "print ('Число вхождений слова \"is\" в исходных текст, подсчитанное с помощью count(): ', a.count('is'))" 1147 | ] 1148 | }, 1149 | { 1150 | "cell_type": "markdown", 1151 | "metadata": {}, 1152 | "source": [ 1153 | "Если присмотретсья к исходнмоу тексту, то там легко обнаружить следующие слова:\n", 1154 | "\n", 1155 | "* this\n", 1156 | "* Missouri\n", 1157 | "* Socialist\n", 1158 | "* Mississippi\n", 1159 | "* socialist\n", 1160 | "\n", 1161 | "Легко заметить, что такое регулярное выражение, как написано выше посчитало вхождение \"слова\" 'is' и в эти слова тоже! Так же, как и стандартная функция count()!\n", 1162 | "\n", 1163 | "Для того чтобы исправить эту ошибку давайте пойдём на хитрость, будем искать слово 'is' так, чтобы справа и слева от него стояли символы, не являющиеся буквой.\n", 1164 | "\n", 1165 | "* \\W - оператор символа, не являющегося буквой/цифрой.\n", 1166 | "\n", 1167 | "так же возьмём искомое слово 'is' в круглые скобки. Это означает, что вернуть наше регулярное выражение должно только то, что внутир скобок, а то что находится снаружи должно присутствовать там для попадения во внимание нашего регулярного выражения, но в результат добавлено **не будет**." 1168 | ] 1169 | }, 1170 | { 1171 | "cell_type": "code", 1172 | "execution_count": 9, 1173 | "metadata": { 1174 | "collapsed": false, 1175 | "scrolled": true 1176 | }, 1177 | "outputs": [ 1178 | { 1179 | "name": "stdout", 1180 | "output_type": "stream", 1181 | "text": [ 1182 | "['is', 'is', 'is', 'is', 'is', 'is']\n" 1183 | ] 1184 | } 1185 | ], 1186 | "source": [ 1187 | "print (re.findall('\\W(is)\\W', a))" 1188 | ] 1189 | }, 1190 | { 1191 | "cell_type": "markdown", 1192 | "metadata": {}, 1193 | "source": [ 1194 | "Подсчитаем в качестве контрольной меры число вхождений \"в лоб\". Для этого:\n", 1195 | "* разобьём исходный текст на список слов (каждое слово будет строкой) с помощью функции re.split() как было показано выше\n", 1196 | "* пройдём по всем элементам получившегося словаря в цикле for\n", 1197 | "* Если текущий элемент совпадает с эталонной строкой (слово 'is'), то добавим к счётчику 1. Считать начнём с 0." 1198 | ] 1199 | }, 1200 | { 1201 | "cell_type": "code", 1202 | "execution_count": 10, 1203 | "metadata": { 1204 | "collapsed": false 1205 | }, 1206 | "outputs": [ 1207 | { 1208 | "name": "stdout", 1209 | "output_type": "stream", 1210 | "text": [ 1211 | "Число реальных вхождений слова is в исходный текст, посчитанное регуляркой: 6\n", 1212 | "Число реальных вхождений слова is в исходный текст, посчитанное \"в лоб\": 6\n" 1213 | ] 1214 | } 1215 | ], 1216 | "source": [ 1217 | "print ('Число реальных вхождений слова is в исходный текст, посчитанное регуляркой: ', len(re.findall('\\W(is)\\W', a)))\n", 1218 | "\n", 1219 | "c = 0\n", 1220 | "for w in re.split('[\\n,\"\\s()\\.\\']+', a):\n", 1221 | " if w == 'is':\n", 1222 | " c += 1\n", 1223 | "print ('Число реальных вхождений слова is в исходный текст, посчитанное \"в лоб\": ', c)" 1224 | ] 1225 | }, 1226 | { 1227 | "cell_type": "markdown", 1228 | "metadata": {}, 1229 | "source": [ 1230 | "## Раздел 3 - некоторые простые примеры построения регулярных выражений\n", 1231 | "\n", 1232 | "Мы рассмотрим конструирование регулярных выражений с помощью уже знакомого re.findall().\n", 1233 | "\n", 1234 | "*Обратим внимание, что в некоторых ситуациях функция может возвращать пустой список (если ничего не нашлось).*" 1235 | ] 1236 | }, 1237 | { 1238 | "cell_type": "markdown", 1239 | "metadata": {}, 1240 | "source": [ 1241 | "**1** Регулярное выражение, равное конкретному слову:" 1242 | ] 1243 | }, 1244 | { 1245 | "cell_type": "code", 1246 | "execution_count": 11, 1247 | "metadata": { 1248 | "collapsed": false 1249 | }, 1250 | "outputs": [ 1251 | { 1252 | "name": "stdout", 1253 | "output_type": "stream", 1254 | "text": [ 1255 | "['constricts']\n", 1256 | "[]\n" 1257 | ] 1258 | } 1259 | ], 1260 | "source": [ 1261 | "print (re.findall('constricts', a)) # слово есть в тексте\n", 1262 | "print (re.findall('constructor', a)) # слова нет в тексте" 1263 | ] 1264 | }, 1265 | { 1266 | "cell_type": "markdown", 1267 | "metadata": {}, 1268 | "source": [ 1269 | "**2** Регулярное выражение, равное конкретному слову, с которого начинается строка (возвращено будет только слово):" 1270 | ] 1271 | }, 1272 | { 1273 | "cell_type": "code", 1274 | "execution_count": 12, 1275 | "metadata": { 1276 | "collapsed": false 1277 | }, 1278 | "outputs": [ 1279 | { 1280 | "name": "stdout", 1281 | "output_type": "stream", 1282 | "text": [ 1283 | "['Any']\n", 1284 | "[]\n", 1285 | "[]\n" 1286 | ] 1287 | } 1288 | ], 1289 | "source": [ 1290 | "print (re.findall('^Any', a)) # слово есть в тексте и оно первое в строке\n", 1291 | "print (re.findall('^Many', a)) # слова нет в тексте\n", 1292 | "print (re.findall('^is', a)) # слова есть в тексте, но оно не первое в строке" 1293 | ] 1294 | }, 1295 | { 1296 | "cell_type": "markdown", 1297 | "metadata": {}, 1298 | "source": [ 1299 | "**3** Регулярное выражение, возвращающее слово, после которого стоит другой символ, например двоеточие:" 1300 | ] 1301 | }, 1302 | { 1303 | "cell_type": "code", 1304 | "execution_count": 13, 1305 | "metadata": { 1306 | "collapsed": false 1307 | }, 1308 | "outputs": [ 1309 | { 1310 | "name": "stdout", 1311 | "output_type": "stream", 1312 | "text": [ 1313 | "['From']\n" 1314 | ] 1315 | } 1316 | ], 1317 | "source": [ 1318 | "print (re.findall('(From):', 'From:a@coffediz.ru To:info@coursera.org')) " 1319 | ] 1320 | }, 1321 | { 1322 | "cell_type": "markdown", 1323 | "metadata": {}, 1324 | "source": [ 1325 | "**4** Регулярное выражение, возвращающее любое слово (хотя бы из 1 символа), перед которым стоит другой символ, например двоеточие:" 1326 | ] 1327 | }, 1328 | { 1329 | "cell_type": "code", 1330 | "execution_count": 14, 1331 | "metadata": { 1332 | "collapsed": false 1333 | }, 1334 | "outputs": [ 1335 | { 1336 | "name": "stdout", 1337 | "output_type": "stream", 1338 | "text": [ 1339 | "['a@coffediz.ru To:info@coursera.org']\n" 1340 | ] 1341 | } 1342 | ], 1343 | "source": [ 1344 | "print (re.findall(':(.+)', 'From:a@coffediz.ru To:info@coursera.org')) " 1345 | ] 1346 | }, 1347 | { 1348 | "cell_type": "markdown", 1349 | "metadata": {}, 1350 | "source": [ 1351 | "Как видим, регулярное выражение из-за своей жадности съело слишком много лишнего. Попробуем воспользоваться символом ? для ограничения жадности плюса и посмотрим что из этого выйдет:\n", 1352 | "\n", 1353 | "**5** Регулярное выражение, возвращающее любое слово (хотя бы из 1 символа **не жадное**), перед которым стоит другой символ, например двоеточие:" 1354 | ] 1355 | }, 1356 | { 1357 | "cell_type": "code", 1358 | "execution_count": 15, 1359 | "metadata": { 1360 | "collapsed": false 1361 | }, 1362 | "outputs": [ 1363 | { 1364 | "name": "stdout", 1365 | "output_type": "stream", 1366 | "text": [ 1367 | "['a', 'i']\n" 1368 | ] 1369 | } 1370 | ], 1371 | "source": [ 1372 | "print (re.findall(':(.+?)', 'From:a@coffediz.ru To:info@coursera.org')) " 1373 | ] 1374 | }, 1375 | { 1376 | "cell_type": "markdown", 1377 | "metadata": {}, 1378 | "source": [ 1379 | "Как видим, ограничив \"жадность\" регулярного выражения мы сделили только хуже. Зато мы узнали что это такое.\n", 1380 | "\n", 1381 | "**\"Жадность\"** - стремление регулярного выражения найти **максимальное** вхождение, удовлетворяющее правилу.\n", 1382 | "\n", 1383 | "**\"НЕ жадность\"** - стремление регулярного выражения найти **минимальное** вхождение, удовлетворяющее правилу.\n", 1384 | "\n", 1385 | "Поэтому в пункте 4 мы получили одну строку с двумя имейлами, а в пункте 5 две строки из 1 символа каждая.\n", 1386 | "\n", 1387 | "В рамках этого учебного материала мы получим отдельно обма email'а:\n", 1388 | "\n", 1389 | "**6** Регулярные выражения, позвращающие 1 и 2 слово, перед которыми стоит двоеточие (причём пробел есть после 1 блоком и перед 2 блоком):" 1390 | ] 1391 | }, 1392 | { 1393 | "cell_type": "code", 1394 | "execution_count": 16, 1395 | "metadata": { 1396 | "collapsed": false 1397 | }, 1398 | "outputs": [ 1399 | { 1400 | "name": "stdout", 1401 | "output_type": "stream", 1402 | "text": [ 1403 | "['a@coffediz.ru']\n", 1404 | "['info@coursera.org']\n" 1405 | ] 1406 | } 1407 | ], 1408 | "source": [ 1409 | "print (re.findall(':(.+)\\s', 'From:a@coffediz.ru To:info@coursera.org')) # Перед словом есть двоеточие, а после слова пробел\n", 1410 | "print (re.findall('\\s.+:(.+)', 'From:a@coffediz.ru To:info@coursera.org')) # Перед словом есть пробел, не менее 1 любого символа и пробел" 1411 | ] 1412 | }, 1413 | { 1414 | "cell_type": "code", 1415 | "execution_count": null, 1416 | "metadata": { 1417 | "collapsed": true 1418 | }, 1419 | "outputs": [], 1420 | "source": [] 1421 | } 1422 | ], 1423 | "metadata": { 1424 | "kernelspec": { 1425 | "display_name": "Python 3", 1426 | "language": "python", 1427 | "name": "python3" 1428 | }, 1429 | "language_info": { 1430 | "codemirror_mode": { 1431 | "name": "ipython", 1432 | "version": 3 1433 | }, 1434 | "file_extension": ".py", 1435 | "mimetype": "text/x-python", 1436 | "name": "python", 1437 | "nbconvert_exporter": "python", 1438 | "pygments_lexer": "ipython3", 1439 | "version": "3.5.1" 1440 | } 1441 | }, 1442 | "nbformat": 4, 1443 | "nbformat_minor": 0 1444 | } 1445 | -------------------------------------------------------------------------------- /Homework_files/week_2/sentences.txt: -------------------------------------------------------------------------------- 1 | In comparison to dogs, cats have not undergone major changes during the domestication process. 2 | As cat simply catenates streams of bytes, it can be also used to concatenate binary files, where it will just concatenate sequence of bytes. 3 | A common interactive use of cat for a single file is to output the content of a file to standard output. 4 | Cats can hear sounds too faint or too high in frequency for human ears, such as those made by mice and other small animals. 5 | In one, people deliberately tamed cats in a process of artificial selection, as they were useful predators of vermin. 6 | The domesticated cat and its closest wild ancestor are both diploid organisms that possess 38 chromosomes and roughly 20,000 genes. 7 | Domestic cats are similar in size to the other members of the genus Felis, typically weighing between 4 and 5 kg (8.8 and 11.0 lb). 8 | However, if the output is piped or redirected, cat is unnecessary. 9 | cat with one named file is safer where human error is a concern - one wrong use of the default redirection symbol ">" instead of "<" (often adjacent on keyboards) may permanently delete the file you were just needing to read. 10 | In terms of legibility, a sequence of commands starting with cat and connected by pipes has a clear left-to-right flow of information. 11 | Cat command is one of the basic commands that you learned when you started in the Unix / Linux world. 12 | Using cat command, the lines received from stdin can be redirected to a new file using redirection symbols. 13 | When you type simply cat command without any arguments, it just receives the stdin content and displays it in the stdout. 14 | Leopard was released on October 26, 2007 as the successor of Tiger (version 10.4), and is available in two editions. 15 | According to Apple, Leopard contains over 300 changes and enhancements over its predecessor, Mac OS X Tiger. 16 | As of Mid 2010, some Apple computers have firmware factory installed which will no longer allow installation of Mac OS X Leopard. 17 | Since Apple moved to using Intel processors in their computers, the OSx86 community has developed and now also allows Mac OS X Tiger and later releases to be installed on non-Apple x86-based computers. 18 | OS X Mountain Lion was released on July 25, 2012 for purchase and download through Apple's Mac App Store, as part of a switch to releasing OS X versions online and every year. 19 | Apple has released a small patch for the three most recent versions of Safari running on OS X Yosemite, Mavericks, and Mountain Lion. 20 | The Mountain Lion release marks the second time Apple has offered an incremental upgrade, rather than releasing a new cat entirely. 21 | Mac OS X Mountain Lion installs in place, so you won't need to create a separate disk or run the installation off an external drive. 22 | The fifth major update to Mac OS X, Leopard, contains such a mountain of features - more than 300 by Apple's count. 23 | -------------------------------------------------------------------------------- /Homework_files/week_2/submission-1.txt: -------------------------------------------------------------------------------- 1 | 1 1 -------------------------------------------------------------------------------- /Homework_files/week_2/submission-2.txt: -------------------------------------------------------------------------------- 1 | 1.0 -1.0 -1.0 0.5 -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Дополнительные задания для курса Математика и Python 2 | 3 | > Нужен задачник, чтобы у людей выработался условный рефлекс, как применять те или иные фичи. 4 | > От простого к чуть более сложному (но всё равно простому). А сложное в курсе. 5 | 6 | ## Roadmap 7 | 8 | Список идей для ноутбуков: 9 | 10 | * решение систем линейных уравнений в Python :heavy_check_mark: 11 | * центральная предельная теорема 12 | * основные понятия в статистике (генеральная совокупность, среднее, выборочное среднее, дисперсия, стандартное отклонение etc) 13 | * основы работы с `pandas` и `numpy`: 14 | * в чем разница между библиотеками 15 | * общая логика работы 16 | * задачи (например: создать массив, датафрейм, добавить строки, добавить столбцы, считать из файла, записать в файл, поменять названия колонок, убрать столбцы, убрать строки, сабсеты, преобразования) 17 | * [основы работы с `matplotlib`](http://acm.mipt.ru/twiki/bin/view/Cintro/PythonGraphs#__q__ql_i_chkm_): 18 | * общая логика работы с библиотекой 19 | * задачи (например: сделать гистограмму, сделать разноцветную гистограмму, добавить подписи, добавить легенду, сделать гистограмму с легендой и подписями) 20 | * введение в Python: типы данных, функции, циклы etc 21 | * что значит pythonic (tips and tricks для программирования на Python) 22 | -------------------------------------------------------------------------------- /files/polynomial_graphics/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Coursera-machine-learning-data-analysis/1/14b85834ee45ab21f95503188242aacc5d37d6ce/files/polynomial_graphics/1.png -------------------------------------------------------------------------------- /files/polynomial_graphics/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Coursera-machine-learning-data-analysis/1/14b85834ee45ab21f95503188242aacc5d37d6ce/files/polynomial_graphics/10.png -------------------------------------------------------------------------------- /files/polynomial_graphics/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Coursera-machine-learning-data-analysis/1/14b85834ee45ab21f95503188242aacc5d37d6ce/files/polynomial_graphics/11.png -------------------------------------------------------------------------------- /files/polynomial_graphics/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Coursera-machine-learning-data-analysis/1/14b85834ee45ab21f95503188242aacc5d37d6ce/files/polynomial_graphics/12.png -------------------------------------------------------------------------------- /files/polynomial_graphics/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Coursera-machine-learning-data-analysis/1/14b85834ee45ab21f95503188242aacc5d37d6ce/files/polynomial_graphics/13.png -------------------------------------------------------------------------------- /files/polynomial_graphics/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Coursera-machine-learning-data-analysis/1/14b85834ee45ab21f95503188242aacc5d37d6ce/files/polynomial_graphics/14.png -------------------------------------------------------------------------------- /files/polynomial_graphics/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Coursera-machine-learning-data-analysis/1/14b85834ee45ab21f95503188242aacc5d37d6ce/files/polynomial_graphics/15.png -------------------------------------------------------------------------------- /files/polynomial_graphics/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Coursera-machine-learning-data-analysis/1/14b85834ee45ab21f95503188242aacc5d37d6ce/files/polynomial_graphics/16.png -------------------------------------------------------------------------------- /files/polynomial_graphics/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Coursera-machine-learning-data-analysis/1/14b85834ee45ab21f95503188242aacc5d37d6ce/files/polynomial_graphics/2.png -------------------------------------------------------------------------------- /files/polynomial_graphics/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Coursera-machine-learning-data-analysis/1/14b85834ee45ab21f95503188242aacc5d37d6ce/files/polynomial_graphics/3.png -------------------------------------------------------------------------------- /files/polynomial_graphics/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Coursera-machine-learning-data-analysis/1/14b85834ee45ab21f95503188242aacc5d37d6ce/files/polynomial_graphics/4.png -------------------------------------------------------------------------------- /files/polynomial_graphics/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Coursera-machine-learning-data-analysis/1/14b85834ee45ab21f95503188242aacc5d37d6ce/files/polynomial_graphics/5.png -------------------------------------------------------------------------------- /files/polynomial_graphics/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Coursera-machine-learning-data-analysis/1/14b85834ee45ab21f95503188242aacc5d37d6ce/files/polynomial_graphics/6.png -------------------------------------------------------------------------------- /files/polynomial_graphics/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Coursera-machine-learning-data-analysis/1/14b85834ee45ab21f95503188242aacc5d37d6ce/files/polynomial_graphics/7.png -------------------------------------------------------------------------------- /files/polynomial_graphics/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Coursera-machine-learning-data-analysis/1/14b85834ee45ab21f95503188242aacc5d37d6ce/files/polynomial_graphics/8.png -------------------------------------------------------------------------------- /files/polynomial_graphics/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Coursera-machine-learning-data-analysis/1/14b85834ee45ab21f95503188242aacc5d37d6ce/files/polynomial_graphics/9.png --------------------------------------------------------------------------------