Web/Фреймворки — PYTHON https://chel-center.ru/python-yfc курс молодого бойца Tue, 22 Dec 2020 16:34:10 +0000 ru-RU hourly 1 https://wordpress.org/?v=5.9.3 https://chel-center.ru/python-yfc/wp-content/uploads/sites/15/2020/06/cropped-kmb-icon-2-1-32x32.png Web/Фреймворки — PYTHON https://chel-center.ru/python-yfc 32 32 Python — идеальный инструмент для любой проблемы https://chel-center.ru/python-yfc/2019/09/29/python-idealnyj-instrument-dlya-ljuboj-problemy/ https://chel-center.ru/python-yfc/2019/09/29/python-idealnyj-instrument-dlya-ljuboj-problemy/#respond Sun, 29 Sep 2019 05:30:13 +0000 http://chel-center.ru/python-yfc/?p=102 Читать далее «Python — идеальный инструмент для любой проблемы»

]]>
Размышления о моей первой программе на Python.

Размышления это всегда помогающее (а иногда и развлекающее) занятие. Из ностальгических соображений, конечно, если можно испытывать ностальгию по чему-то, что было два года назад — я хочу поделиться моей программой на Python. Изначально я начал работать с Python, когда был ещё студентом и изучал аэрокосмическую технику. Используя Python, я хотел избежать работ с электронными таблицами. Тогда я ещё не подозревал, насколько хорошее решение я принял.

Моё изучение Python началось с книги «Автоматизация рутинных задач с помощью Python»  (в оригинале «Automate the Boring Stuff with Python») Эла Свейгарта. Великолепная приложение-ориентированная книга с простыми программами, которые делают полезные вещи. Когда я изучаю что-то новое, я ищу любую возможность использовать свои новые знания, поэтому я хотел найти проблему, которую я мог бы решить с помощью Python. Такой проблемой стал учебник для класса, который стоил 200 долларов. Мой персональный лимит для учебника около 20 долларов («Автоматизация рутинных задач с помощью Python» бесплатна в онлайне), поэтому я отказался даже арендовать эту книгу. Отчаявшись получить книгу к своему первому занятию, я заметил, что её можно получить в свободное пользование на неделю через Amazon, сделав новый аккаунт. Я получил книгу на одну неделю и смог выполнить своё первое учебное занятие. И пока я продолжал создавать новые аккаунты каждую неделю, я понимал, что мне нужно решение получше. Именно так я и решил создать своё первое приложение на Python.

Одной из многих полезных библиотек, описанных в «Автоматизация рутинных задач с помощью Python», являлась PyAutoGUI, которая позволяет контролировать мышь и клавиатуру через Python. Как говорится, «когда у тебя есть молоток, то каждая проблема выглядит как гвоздь», и это было идеальное описание моей ситуации. Python и PyAutoGUI позволили мне нажимать стрелки на клавиатуре и делать скриншоты, и я использовал обе эти возможности чтобы решить свою книжную проблему. Я написал свою первую программу, чтобы автоматически пролистать каждую страницу книги и сделать скриншот. В программе всего 10 строк кода, но я горжусь ими настолько же, насколько горжусь всем, что я сделал в аэрокосмической технике. Далее пример всего кода, что я написал:

import pyautogui
import time

# Sleep for 5 seconds to allow me to open book
time.sleep(5)

# Range can be changed depending on the number of pages
for i in range(1000):
# Turn page
     pyautogui.keyDown('right')
     pyautogui.keyUp('right')

# Take and save a screenshot
     pyautogui.screenshot('images/page_%d.pdf' % i)
     time.sleep(0.05)

Запустить программу очень просто (и я настаиваю каждому попробовать). Я сохранил скрипт как book_screenshot.py, затем переместился в командой строке в ту же директорию, где лежит этот файл, и ввёл:

python book_screenshot.py

После запуска у меня есть 5 секунд, чтобы развернуть книгу в полный экран. Программа же сделает всё остальное, пролистав каждую страницу и сделав скриншот, который сохранится в pdf. После я смогу объединить все pdf-файлы в один и получить (сомнительно легальную) полноценную копию книги! Правда, копия ужасная, ведь через скриншоты нельзя сделать поиск по тексту, но для меня это было не так важно.

Программа же сделает всё остальное, пролистав каждую страницу и сделав скриншот, который сохранится в pdf

Это демонстрирует две главные мысли, которые остались со мной на протяжении всего моего обучения:

  • Лучший способ что-то изучать — это найти проблему, которую ты сможешь решить с помощью нового навыка.
  • Не нужно обладать навыком в совершенстве, чтобы использовать его.

Всего с парой строк кода и бесплатной книгой я смог написать программу, которая по-настоящему полезна. Учить базовые вещи может быть скучно и мои первые попытки учить Python потерпели крах спустя пару часов, когда я читал про структуры данных и циклы. Сменив тактику, я начал создавать решения для реальных проблем и выучил фундаментальные знания параллельно. Программирование очень объёмно, но вам не нужно учить всё и сразу. Просто найдите проблему, которую вы бы хотели решить с помощью программирования и начните!

С тех пор я сделал ещё пару сложных программ, но до сих пор с любовью вспоминаю свой первый скрипт!

Перевод статьи William Koehrsen: Python is the Perfect Tool for any Problem

]]>
https://chel-center.ru/python-yfc/2019/09/29/python-idealnyj-instrument-dlya-ljuboj-problemy/feed/ 0
Практикум №1 — набиваем руку https://chel-center.ru/python-yfc/2019/10/01/metodicheskie-ukazaniya-dlya-samostoyatelnoj-raboty-v-i-semestre/ https://chel-center.ru/python-yfc/2019/10/01/metodicheskie-ukazaniya-dlya-samostoyatelnoj-raboty-v-i-semestre/#respond Tue, 01 Oct 2019 01:34:52 +0000 http://chel-center.ru/python-yfc/?p=18 Читать далее «Практикум №1 — набиваем руку»

]]>
Как показывает многолетняя практика, если решить все 1052 задачи из книги Задачи по программированию, то можно приобрести уверенность в таком дел, как программирование, и смело браться за решение практических задач. Но это для особо усердных и тех кому программирование действительно нравится, тех кто хочет сделать программирование своей работой. Завидуйте им.

В курсе «Программирование» на Бизнес-информатике предлагается всего лишь 101 задача, которые приведены ниже, для упражнений на Phyton и каждому необходимо решить самостоятельно.

Решение всех задач хотелось бы видеть в вашем репозитарии на Github

Задачи для самостоятельной работы

Линейные алгоритмы

  1. Нарисуйте блок-схему к следующей задаче: Преобразовать дату в «компьютерном» представлении (системную дату) в «российский» формат, т.е. день/месяц/год (например, 17/05/2009).
    Постановка задачи: Системная дата имеет вид 2009-06-15. Нужно преобразовать это значение в строку, строку разделить на компоненты (символ→разделитель→дефис), потом из этих компонентов сконструировать нужную строку.
  2. Даны действительные числа А, В, С. Найти максимальное и минимальное из этих чисел.
  3. Известны длины трёх сторон треугольника. Вычислить периметр треугольника и площадь по формуле Герона (указание: использовать модуль math и функцию sqrt ()).
  4. Задан вес в граммах. Определить вес в тоннах и килограммах.
  5. Известен объем информации в байтах. Перевести в килобайты, мегабайты.
  6. Определить значение функции Z = \frac{1}{(XY)} при X и Y не равных 0.

Ветвления и оператор выбора

  1. Дано натуральное число. Определить, будет ли это число: чётным, кратным 4.
  2. Дано натуральное число. Определить, будет ли это число: нечётным, кратным 5.
  3. Дано натуральное число. Определить, будет ли это число: нечётным, кратным 7.
  4. Дано натуральное число. Определить, будет ли это число: чётным, кратным 10.
  5. Имеется коробка со сторонами: A \times B \times C. Определить, пройдёт ли она в дверь с размерами M \times K.
  6. Дано вещественное число. Определить, какое это число: положительное, отрицательное, ноль.
  7. Можно ли из бревна, имеющего диаметр поперечного сечения D, выпилить квадратный брус шириной A?
  8. Можно ли в квадратном зале площадью S поместить круглую сцену радиусом R так, чтобы от стены до сцены был проход не менее K?
  9. Дан номер места в плацкартном вагоне. Определить, какое это место: верхнее или нижнее, в купе или боковое.
  10. Известна денежная сумма. Разменять её купюрами 500, 100, 10 и монетой 2 руб., если это возможно.
  11. Имеются две ёмкости: кубическая с ребром A, цилиндрическая с высотой H и радиусом основания R. Определить, поместится ли жидкость объёма M литров в первую ёмкость, во вторую, в обе.
  12. Имеются две ёмкости: кубическая с ребром A, цилиндрическая с высотой H и радиусом основания R. Определить, можно ли заполнить жидкостью объёма M литров первую ёмкость, вторую, обе.
  13. Даны вещественные числа: X, Y, Z. Определить, существует ли треугольник с такими длинами сторон и если существует, будет ли он прямоугольным.
  14. Дано число X. Определить, принадлежит ли это число заданному промежутку [a, b].
  15. Определить значение функции Z = \frac{1}{XY}\text{ при произвольных }X\text{ и }Y.
  16. Даны вещественные числа A, B, C. Определить, выполняются ли неравенства A < B < C\text{ или }A > B > C, и какое именно неравенство выполняется.
  17. Даны два вещественных числа X\text{ и }Y. Вычислить Z = \sqrt{X \times Y} при X > Y, Z = ln{(X + Y)} в противном случае.
  18. Даны вещественные положительные числа a, b, c, d. Выясните, может ли прямоугольник со сторонами a, b уместиться внутри прямоугольника со сторонами c, d так, чтобы каждая сторона внутреннего прямоугольника была параллельна или перпендикулярна стороне внешнего прямоугольника.
  19. Дано вещественное число A. Вычислить f(A), если f(x) = x^2 + 4x +5, при x \leq 2; в противном случае f(x) = \frac{1}{x^2 + 4x + 5}.
  20. Дано вещественное число A. Вычислить f(A), если f(x) = 0, при x \leq 2. f(x) = x, при (x \geq 1), в противном случае f(x) = x^4.
  21. Дано вещественное число A. Вычислить f(A), если f(x) = 0, при x \leq 0. f(x) = x^2 - x, при (x \geq 1), в противном случае f(x) = x^2 - \sin{(\pi x^2)}.
  22. Составить алгоритм и программу для реализации логических операций «И» и «ИЛИ» для двух переменных.
  23. Известен ГОД. Определить, будет ли этот год високосным, и к какому веку этот год относится

Указание.

При вычислении корней и логарифмов используйте функции sqrt() и log() модуля math. В этом же модуле определена константа pi (math.pi).

Циклические алгоритмы. Обработка последовательностей и одномерных массивов

  1. Составьте блок-схему поиска максимального элемента в одномерном массиве.
  2. Нарисуйте полную блок-схему алгоритма сортировки массива «методом пузырька».
  3. Дан одномерный массив числовых значений, насчитывающий N элементов. Поменять местами элементы, стоящие на чётных и нечётных местах: A[1] ↔ A[2]; A[3] ↔ A[4] …
  4. Дан одномерный массив числовых значений, насчитывающий N элементов. Выполнить перемещение элементов массива по кругу вправо, т. е. A[1] → A[2]; A[2] → A[3]; … A[n] → A[1].
  5. Дан одномерный массив числовых значений, насчитывающий N элементов. Поменять местами первую и вторую половины массива.
  6. Дан одномерный массив числовых значений, насчитывающий N элементов. Поменять местами группу из M элементов, начинающихся с позиции K с группой из M элементов, начинающихся с позиции P.
  7. Дан одномерный массив числовых значений, насчитывающий N элементов. Вставить группу из M новых элементов, начиная с позиции K.
  8. Дан одномерный массив числовых значений, насчитывающий N элементов. Сумму элементов массива и количество положительных элементов поставить на первое и второе место.
  9. Дан одномерный массив числовых значений, насчитывающий N элементов.Исключить из него M элементов, начиная с позиции K.
  10. Дан одномерный массив числовых значений, насчитывающий N элементов. Исключить все нулевые элементы.
  11. Дан одномерный массив числовых значений, насчитывающий N элементов. После каждого отрицательного элемента вставить новый элемент, равный квадрату этого отрицательного элемента.
  12. Дан одномерный массив числовых значений, насчитывающий N элементов. Определить, образуют ли элементы массива, расположенные перед первым отрицательным элементом, возрастающую последовательность.
  13. Дан одномерный массив числовых значений, насчитывающий N элементов. Определить, образуют ли элементы массива, расположенные перед первым отрицательным элементом, убывающую последовательность.
  14. Дан одномерный массив числовых значений, насчитывающий N элементов. Из элементов исходного массива построить два новых. В первый должны входить только элементы с положительными значениями, а во второй — только элементы с отрицательными значениями.
  15. Дан одномерный массив числовых значений, насчитывающий N элементов. Добавить столько элементов, чтобы элементов с положительными и отрицательными значениями стало бы поровну.
  16. Дан одномерный массив числовых значений, насчитывающий N элементов. Добавить к элементам массива такой новый элемент, чтобы сумма элементов с положительными значениями стала бы равна модулю суммы элементов с отрицательными значениями.
  17. Дан одномерный массив числовых значений, насчитывающий N элементов. Дано положительное число T. Разделить это число между положительными элементами массива пропорционально значениям этих элементов и добавить полученные доли к соответствующим элементам.
  18. Дан одномерный массив числовых значений, насчитывающий N элементов. Исключить из массива элементы, принадлежащие промежутку [B; C].
  19. Дан одномерный массив числовых значений, насчитывающий N элементов. Вместо каждого элемента с нулевым значением поставить сумму двух предыдущих элементов массива.
  20. Дан одномерный массив числовых значений, насчитывающий N элементов. Определить, имеются ли в массиве два подряд идущих нуля.
  21. Дан одномерный массив числовых значений, насчитывающий N элементов. Подсчитать количество чисел, делящихся на 3 нацело, и среднее арифметическое чисел с чётными значениями. Поставить полученные величины на первое и последнее места в массиве (увеличив массив на 2 элемента).
  22. Заданы M строк символов, которые вводятся с клавиатуры. Найти количество символов в самой длинной строке. Выровнять строки по самой длинной строке, поставив перед каждой строкой соответствующее количество звёздочек.
  23. Заданы M строк символов, которые вводятся с клавиатуры. Из заданных строк, каждая из которых представляет одно слово, составить одну длинную строку, разделяя слова пробелами.
  24. Заданы M строк слов, которые вводятся с клавиатуры. Подсчитать количество гласных букв в каждой из заданных строк.
  25. Заданы M строк слов, которые вводятся с клавиатуры (в каждой строке – одно слово). Вводится слог (последовательность букв). Подсчитать количество таких слогов в каждой строке.
  26. Заданы M строк слов, которые вводятся с клавиатуры (в каждой строке – одно слово). Вводится слог (последовательность букв). Удалить данный слог из каждой строки.
  27. Заданы M строк символов, которые вводятся с клавиатуры. Напечатать все центральные буквы строк нечетной длины.
  28. Заданы M строк символов, которые вводятся с клавиатуры. Каждая строка содержит слово. Записать каждое слово в разрядку (вставить по пробелу между буквами).
  29. Задана строка символов, в которой встречается символ «.». Поставить после каждого такого символа системное время ПК.
  30. Заданы M строк, которые вводятся с клавиатуры. Подсчитать количество пробелов в каждой из строк.
  31. Заданы M строк символов, которые вводятся с клавиатуры. Каждая строка представляет собой последовательность символов, включающих в себя вопросительные знаки. Заменить в каждой строке все имеющиеся вопросительные знаки звёздочками.
  32. Последовательно вводятся числа. Определить сумму чисел с нечётными номерами и произведение чисел с чётными номерами (по порядку ввода). Подсчитать количество слагаемых и количество сомножителей. При вводе числа 55555 закончить работу.
  33. Определить сумму вводимых положительных чисел. Причём числа с нечётными номерами (по порядку ввода) суммировать с обратным знаком, а числа с чётными номерами перед суммированием возводить в квадрат. Подсчитать количество слагаемых. При вводе первого отрицательного числа закончить работу.
  34. Даны число P и число H. Определить сумму чисел меньше P, произведение чисел больше H и количество чисел в диапазоне значений P и H. При вводе числа равного P или H, закончить работу.
  35. Суммировать вводимые числа, среди которых нет нулевых. При вводе нуля обеспечить вывод текущего значения суммы. При вводе числа 99999 закончить работу.
  36. Вводятся положительные числа. Определить сумму чисел, делящихся на положительное число B нацело. При вводе отрицательного числа закончить работу.
  37. Для вводимых чисел определить процент положительных и отрицательных чисел. При вводе числа −65432 закончить работу.

Обработка двумерных массивов (матриц)

  1. Создать прямоугольную матрицу A, имеющую N строк и M столбцов со случайными элементами. Найти наибольший элемент столбца матрицы A, для которого сумма абсолютных значений элементов максимальна.
  2. Создать прямоугольную матрицу A, имеющую N строк и M столбцов со случайными элементами. Найти наибольшее значение среди средних значений для каждой строки матрицы.
  3. Создать прямоугольную матрицу A, имеющую N строк и M столбцов со случайными элементами. Найти наименьший элемент столбца матрицы A, для которого сумма абсолютных значений элементов максимальна.
  4. Создать прямоугольную матрицу A, имеющую N строк и M столбцов со случайными элементами. Найти наименьшее значение среди средних значений для каждой строки матрицы.
  5. Создать прямоугольную матрицу A, имеющую N строк и M столбцов со случайными элементами. Определить средние значения по всем строкам и столбцам матрицы. Результат оформить в виде матрицы из N + 1 строк и M + 1 столбцов.
  6. Создать прямоугольную матрицу A, имеющую N строк и M столбцов со случайными элементами. Найти сумму элементов всей матрицы. Определить, какую долю в этой сумме составляет сумма элементов каждого столбца. Результат оформить в виде матрицы из N + 1 строк и M столбцов.
  7. Создать прямоугольную матрицу A, имеющую N строк и M столбцов со случайными элементами. Найти сумму элементов всей матрицы. Определить, какую долю в этой сумме составляет сумма элементов каждой строки. Результат оформить в виде матрицы из N строк и M+1 столбцов.
  8. Создать прямоугольную матрицу A, имеющую N строк и M столбцов со случайными элементами. Определить, сколько отрицательных элементов содержится в каждом столбце и в каждой строке матрицы. Результат оформить в виде матрицы из N + 1 строк и M + 1 столбцов.
  9. Создать прямоугольную матрицу A, имеющую N строк и M столбцов со случайными элементами. Определить, сколько нулевых элементов содержится в верхних L строках матрицы и в левых К столбцах матрицы.
  10. Создать прямоугольную матрицу A, имеющую N строк и M столбцов со случайными элементами. Перемножить элементы каждого столбца матрицы с соответствующими элементами K-го столбца.Аим
  11. Создать прямоугольную матрицу A, имеющую N строк и M столбцов со случайными элементами. Просуммировать элементы каждой строки матрицы с соответствующими элементами L-й строки.
  12. Создать прямоугольную матрицу A, имеющую N строк и M столбцов со случайными элементами. Разделить элементы каждой строки на элемент этой строки с наибольшим значением.
  13. Создать прямоугольную матрицу A, имеющую N строк и M столбцов со случайными элементами. Разделить элементы каждого столбца матрицы на элемент этого столбца с наибольшим значением.
  14. Создать прямоугольную матрицу A, имеющую N строк и M столбцов со случайными элементами. Разделить элементы матрицы на элемент матрицы с наибольшим значением.
  15. Создать прямоугольную матрицу A, имеющую N строк и M столбцов со случайными элементами. Все элементы имеют целый тип. Дано целое число H. Определить, какие столбцы имеют хотя бы одно такое число, а какие не имеют.
  16. Создать прямоугольную матрицу A, имеющую N строк и M столбцов со случайными элементами. Исключить из матрицы строку с номером L. Сомкнуть строки матрицы.
  17. Создать прямоугольную матрицу A, имеющую N строк и M столбцов со случайными элементами. Добавить к матрице строку и вставить ее под номером L.
  18. Создать прямоугольную матрицу A, имеющую N строк и M столбцов со случайными элементами. Найти сумму элементов, стоящих на главной диагонали, и сумму элементов, стоящих на побочной диагонали (элементы главной диагонали имеют индексы от [0,0] до [N,N], а элементы побочной диагонали – от [N,0] до [0,N]).
  19. Создать квадратную матрицу A, имеющую N строк и N столбцов со случайными элементами. Определить сумму элементов, расположенных параллельно главной диагонали (ближайшие к главной). Элементы главной диагонали имеют индексы от [0,0] до [N,N].
  20. Создать квадратную матрицу A, имеющую N строк и N столбцов со случайными элементами. Определить произведение элементов, расположенных параллельно побочной диагонали (ближайшие к побочной). Элементы побочной диагонали имеют индексы от [N,0] до [0,N].
  21. Создать квадратную матрицу A, имеющую N строк и N столбцов со случайными элементами. Каждой паре элементов, симметричных относительно главной диагонали (ближайшие к главной), присвоить значения, равные полусумме этих симметричных значений (элементы главной диагонали имеют индексы от [0,0] до [N,N]).
  22. Создать прямоугольную матрицу A, имеющую N строк и M столбцов со случайными элементами. Исходная матрица состоит из нулей и единиц. Добавить к матрице еще один столбец, каждый элемент которого делает количество единиц в каждой строке чётным.
  23. Создать квадратную матрицу A, имеющую N строк и N столбцов со случайными элементами. Найти сумму элементов, расположенных выше главной диагонали, и произведение элементов, расположенных выше побочной диагонали (элементы главной диагонали имеют индексы от [0,0] до [N,N], а элементы побочной диагонали — от [N,0] до [0,N]).
  24. Создать прямоугольную матрицу A, имеющую N строк и M столбцов со случайными элементами. Дан номер строки L и номер столбца K, при помощи которых исходная матрица разбивается на четыре части. Найти сумму элементов каждой части.
  25. Создать прямоугольную матрицу A, имеющую N строк и M столбцов со случайными элементами. Определить, сколько нулевых элементов содержится в каждом столбце и в каждой строке матрицы. Результат оформить в виде матрицы из N + 1 строк и M + 1 столбцов.
  26. Создать прямоугольную матрицу A, имеющую N строк и M столбцов со случайными элементами. Дан номер строки L и номер столбца K, при помощи которых исходная матрица разбивается на четыре части. Найти среднее арифметическое элементов каждой части.
  27. Создать прямоугольную матрицу A, имеющую N строк и M столбцов со случайными элементами. Все элементы имеют целый тип. Дано целое число H. Определить, какие строки имеют хотя бы одно такое число, а какие не имеют.
  28. Создать прямоугольную матрицу A, имеющую N строк и M столбцов со случайными элементами. Исключить из матрицы столбец с номером K. Сомкнуть столбцы матрицы.
  29. Создать прямоугольную матрицу A, имеющую N строк и M столбцов со случайными элементами. Добавить к матрице столбец чисел и вставить его под номером K.
  30. Создать прямоугольную матрицу A, имеющую N строк и M столбцов со случайными элементами. Добавить к элементам каждого столбца такой новый элемент, чтобы сумма положительных элементов стала бы равна модулю суммы отрицательных элементов. Результат оформить в виде матрицы из N + 1 строк и M столбцов.
  31. Создать прямоугольную матрицу A, имеющую N строк и M столбцов со случайными элементами. Добавить к элементам каждой строки такой новый элемент, чтобы сумма положительных элементов стала бы равна модулю суммы отрицательных элементов. Результат оформить в виде матрицы из N строк и M + 1 столбцов.

Работа с ассоциативными массивами (таблицами данных)

  1. Используя данные таблицы отсортировать блюда по возрастанию цены. Вывести отсортированный вариант списка блюд.
    Блюдо
    Цена

    Борщь
    35

    Котлета
    40

    Каша
    20

    Чай
    3

  2. Имеется список учеников и результаты трёх тестов (баллы от 0 до 100).Определить средний балл каждого ученика по трём тестам, вывести список учеников по убыванию среднего балла.
  3. Известны данные о количестве мальчиков и девочек в нескольких классах. Отсортировать названия классов по возрастанию процента мальчиков, определить количество классов, в которых мальчиков больше, чем девочек, и вывести названия этих классов отдельно.
  4. Решить задачу, связанную с оценкой экономической деятельности группы предприятий на основе известных данных:

    • название предприятий;
    • плановый объем розничного товарооборота;
    • фактический объем розничного товарооборота.

    Требуется определить:

    1. процент выполнения плана каждым предприятием;
    2. количество предприятий, недовыполнивших план на 10% и более;
    3. наименьший плановый товарооборот;
    4. упорядочить предприятия по убыванию планового товара.
]]>
https://chel-center.ru/python-yfc/2019/10/01/metodicheskie-ukazaniya-dlya-samostoyatelnoj-raboty-v-i-semestre/feed/ 0
Как оформлять код https://chel-center.ru/python-yfc/2019/10/01/kak-oformlyat-kod/ https://chel-center.ru/python-yfc/2019/10/01/kak-oformlyat-kod/#respond Tue, 01 Oct 2019 01:35:18 +0000 http://chel-center.ru/python-yfc/?p=502 Читать далее «Как оформлять код»

]]>
Этот документ описывает соглашение о том, как писать код для языка python, включая стандартную библиотеку, входящую в состав python.

PEP 8 (Python Enhancement Proposals, англ. или предложения по улучшению Python, рус.) создан на основе рекомендаций Гуидо ван Россума с добавлениями от Барри. Если где-то возникал конфликт, мы выбирали стиль Гуидо. И, конечно, этот PEP может быть неполным (фактически, он, наверное, никогда не будет закончен).

Ключевая идея Гуидо такова: код читается намного больше раз, чем пишется. Собственно, рекомендации о стиле написания кода направлены на то, чтобы улучшить читаемость кода и сделать его согласованным между большим числом проектов. В идеале, весь код будет написан в едином стиле, и любой сможет легко его прочесть.

Это руководство о согласованности и единстве. Согласованность с этим руководством очень важна. Согласованность внутри одного проекта еще важнее. А согласованность внутри модуля или функции — самое важное. Но важно помнить, что иногда это руководство неприменимо, и понимать, когда можно отойти от рекомендаций. Когда вы сомневаетесь, просто посмотрите на другие примеры и решите, какой выглядит лучше.

Две причины для того, чтобы нарушить данные правила:

  1. Когда применение правила сделает код менее читаемым даже для того, кто привык читать код, который следует правилам.
  2. Чтобы писать в едином стиле с кодом, который уже есть в проекте и который нарушает правила (возможно, в силу исторических причин) — впрочем, это возможность переписать чужой код.

Внешний вид кода

Отступы

Используйте 4 пробела на каждый уровень отступа.

Продолжительные строки должны выравнивать обернутые элементы либо вертикально, используя неявную линию в скобках (круглых, квадратных или фигурных), либо с использованием висячего отступа. При использовании висячего отступа следует применять следующие соображения: на первой линии не должно быть аргументов, а остальные строки должны четко восприниматься как продолжение линии.

Правильно:

# Выровнено по открывающему разделителю
foo = long_function_name(var_one, var_two,
                         var_three, var_four)

# Больше отступов включено для отличения его от остальных
def long_function_name(
        var_one, var_two, var_three,
        var_four):
    print(var_one)

Неправильно:

# Аргументы на первой линии запрещены, если не используется вертикальное выравнивание
foo = long_function_name(var_one, var_two,
    var_three, var_four)

# Больше отступов требуется, для отличения его от остальных
def long_function_name(
    var_one, var_two, var_three,
    var_four):
    print(var_one)

Опционально:

# Нет необходимости в большем количестве отступов.
foo = long_function_name(
  var_one, var_two,
  var_three, var_four)

Закрывающие круглые/квадратные/фигурные скобки в многострочных конструкциях могут находиться под первым непробельным символом последней строки списка, например:

my_list = [
    1, 2, 3,
    4, 5, 6,
    ]
result = some_function_that_takes_arguments(
    'a', 'b', 'c',
    'd', 'e', 'f',
    )

либо быть под первым символом строки, начинающей многострочную конструкцию:

my_list = [
    1, 2, 3,
    4, 5, 6,
]
result = some_function_that_takes_arguments(
    'a', 'b', 'c',
    'd', 'e', 'f',
)

Табуляция или пробелы?

Пробелы — самый предпочтительный метод отступов.

Табуляция должна использоваться только для поддержки кода, написанного с отступами с помощью табуляции.

Python 3 запрещает смешивание табуляции и пробелов в отступах.

Python 2 пытается преобразовать табуляцию в пробелы.

Когда вы вызываете интерпретатор Python 2 в командной строке с параметром -t, он выдает предупреждения (warnings) при использовании смешанного стиля в отступах, а запустив интерпретатор с параметром -tt, вы получите в этих местах ошибки (errors). Эти параметры очень рекомендуются!

Максимальная длина строки

Ограничьте длину строки максимум 79 символами.

Для более длинных блоков текста с меньшими структурными ограничениями (строки документации или комментарии), длину строки следует ограничить 72 символами.

Ограничение необходимой ширины окна редактора позволяет иметь несколько открытых файлов бок о бок, и хорошо работает при использовании инструментов анализа кода, которые предоставляют две версии в соседних столбцах.

Некоторые команды предпочитают большую длину строки. Для кода, поддерживающегося исключительно или преимущественно этой группой, в которой могут прийти к согласию по этому вопросу, нормально увеличение длины строки с 80 до 100 символов (фактически увеличивая максимальную длину до 99 символов), при условии, что комментарии и строки документации все еще будут 72 символа.

Стандартная библиотека Python консервативна и требует ограничения длины строки в 79 символов (а строк документации/комментариев в 72).

Предпочтительный способ переноса длинных строк является использование подразумеваемых продолжений строк Python внутри круглых, квадратных и фигурных скобок. Длинные строки могут быть разбиты на несколько строк, обернутые в скобки. Это предпочтительнее использования обратной косой черты для продолжения строки.

Обратная косая черта все еще может быть использована время от времени. Например, длинная конструкция with не может использовать неявные продолжения, так что обратная косая черта является приемлемой:

with open('/path/to/some/file/you/want/to/read') as file_1, \
        open('/path/to/some/file/being/written', 'w') as file_2:
    file_2.write(file_1.read())

Ещё один случай — assert.

Сделайте правильные отступы для перенесённой строки. Предпочтительнее вставить перенос строки после логического оператора, но не перед ним. Например:

class Rectangle(Blob):

    def __init__(self, width, height,
                 color='black', emphasis=None, highlight=0):
        if (width == 0 and height == 0 and
                color == 'red' and emphasis == 'strong' or
                highlight > 100):
            raise ValueError("sorry, you lose")
        if width == 0 and height == 0 and (color == 'red' or
                                           emphasis is None):
            raise ValueError("I don't think so -- values are %s, %s" %
                             (width, height))
        Blob.__init__(self, width, height,
                      color, emphasis, highlight)

Пустые строки

Отделяйте функции верхнего уровня и определения классов двумя пустыми строками.

Определения методов внутри класса разделяются одной пустой строкой.

Дополнительные пустые строки возможно использовать для разделения различных групп похожих функций. Пустые строки могут быть опущены между несколькими связанными однострочниками (например, набор фиктивных реализаций).

Используйте пустые строки в функциях, чтобы указать логические разделы.

Python расценивает символ control+L как незначащий (whitespace), и вы можете использовать его, потому что многие редакторы обрабатывают его как разрыв страницы — таким образом логические части в файле будут на разных страницах. Однако, не все редакторы распознают control+L и могут на его месте отображать другой символ.

Кодировка исходного файла

Кодировка Python должна быть UTF-8 (ASCII в Python 2).

Файлы в ASCII (Python 2) или UTF-8 (Python 3) не должны иметь объявления кодировки.

В стандартной библиотеке, нестандартные кодировки должны использоваться только для целей тестирования, либо когда комментарий или строка документации требует упомянуть имя автора, содержащего не ASCII символы; в остальных случаях использование \x, \u, \U или \N — наиболее предпочтительный способ включить не ASCII символы в строковых литералах.

Начиная с версии python 3.0 в стандартной библиотеке действует следующее соглашение: все идентификаторы обязаны содержать только ASCII символы, и означать английские слова везде, где это возможно (во многих случаях используются сокращения или неанглийские технические термины). Кроме того, строки и комментарии тоже должны содержать лишь ASCII символы. Исключения составляют: (а) test case, тестирующий не-ASCII особенности программы, и (б) имена авторов. Авторы, чьи имена основаны не на латинском алфавите, должны транслитерировать свои имена в латиницу.

Проектам с открытым кодом для широкой аудитории также рекомендуется использовать это соглашение.

Импорты

  • Каждый импорт, как правило, должен быть на отдельной строке.

    Правильно:

    import os
    import sys

    Неправильно:

    import sys, os

    В то же время, можно писать так:

    from subprocess import Popen, PIPE
  • Импорты всегда помещаются в начале файла, сразу после комментариев к модулю и строк документации, и перед объявлением констант.

    Импорты должны быть сгруппированы в следующем порядке:

    1. импорты из стандартной библиотеки
    2. импорты сторонних библиотек
    3. импорты модулей текущего проекта

    Вставляйте пустую строку между каждой группой импортов.

    Указывайте спецификации __all__ после импортов.

  • Рекомендуется абсолютное импортирование, так как оно обычно более читаемо и ведет себя лучше (или, по крайней мере, даёт понятные сообщения об ошибках) если импортируемая система настроена неправильно (например, когда каталог внутри пакета заканчивается на sys.path):

    import mypkg.sibling
    from mypkg import sibling
    from mypkg.sibling import example

    Тем не менее, явный относительный импорт является приемлемой альтернативой абсолютному импорту, особенно при работе со сложными пакетами, где использование абсолютного импорта было бы излишне подробным:

    from . import sibling
    from .sibling import example

    В стандартной библиотеке следует избегать сложной структуры пакетов и всегда использовать абсолютные импорты.

    Неявные относительно импорты никогда не должны быть использованы, и были удалены в Python 3.

  • Когда вы импортируете класс из модуля, вполне можно писать вот так:

    from myclass import MyClass
    from foo.bar.yourclass import YourClass

    Если такое написание вызывает конфликт имен, тогда пишите:

    import myclass
    import foo.bar.yourclass

    И используйте «myclass.MyClass» и «foo.bar.yourclass.YourClass».

  • Шаблоны импортов (from import *) следует избегать, так как они делают неясным то, какие имена присутствуют в глобальном пространстве имён, что вводит в заблуждение как читателей, так и многие автоматизированные средства. Существует один оправданный пример использования шаблона импорта, который заключается в опубликовании внутреннего интерфейса как часть общественного API (например, переписав реализацию на чистом Python в модуле акселератора (и не будет заранее известно, какие именно функции будут перезаписаны).

Пробелы в выражениях и инструкциях

Избегайте использования пробелов в следующих ситуациях:

  • Непосредственно внутри круглых, квадратных или фигурных скобок.

    Правильно:

    spam(ham[1], {eggs: 2})

    Неправильно:

    spam( ham[ 1 ], { eggs: 2 } )
  • Непосредственно перед запятой, точкой с запятой или двоеточием:

    Правильно:

    if x == 4: print(x, y); x, y = y, x

    Неправильно:

    if x == 4 : print(x , y) ; x , y = y , x
  • Сразу перед открывающей скобкой, после которой начинается список аргументов при вызове функции:

    Правильно:

    spam(1)

    Неправильно:

    spam (1)
  • Сразу перед открывающей скобкой, после которой следует индекс или срез:

    Правильно:

    dict['key'] = list[index]

    Неправильно:

    dict ['key'] = list [index]
  • Использование более одного пробела вокруг оператора присваивания (или любого другого) для того, чтобы выровнять его с другим:

    Правильно:

    x = 1
    y = 2
    long_variable = 3

    Неправильно:

    x             = 1
    y             = 2
    long_variable = 3

Другие рекомендации

  • Всегда окружайте эти бинарные операторы одним пробелом с каждой стороны: присваивания (=, +=, -= и другие), сравнения (==, <, >, !=, <>, <=, >=, in, not in, is, is not), логические (and, or, not).
  • Если используются операторы с разными приоритетами, попробуйте добавить пробелы вокруг операторов с самым низким приоритетом. Используйте свои собственные суждения, однако, никогда не используйте более одного пробела, и всегда используйте одинаковое количество пробелов по обе стороны бинарного оператора.

    Правильно:

    i = i + 1
    submitted += 1
    x = x*2 - 1
    hypot2 = x*x + y*y
    c = (a+b) * (a-b)

    Неправильно:

    i=i+1
    submitted +=1
    x = x * 2 - 1
    hypot2 = x * x + y * y
    c = (a + b) * (a - b)
  • Не используйте пробелы вокруг знака =, если он используется для обозначения именованного аргумента или значения параметров по умолчанию.

    Правильно:

    def complex(real, imag=0.0):
        return magic(r=real, i=imag)

    Неправильно:

    def complex(real, imag = 0.0):
        return magic(r = real, i = imag)
  • Не используйте составные инструкции (несколько команд в одной строке).

    Правильно:

    if foo == 'blah':
        do_blah_thing()
    do_one()
    do_two()
    do_three()

    Неправильно:

    if foo == 'blah': do_blah_thing()
    do_one(); do_two(); do_three()
  • Иногда можно писать тело циклов while, for или ветку if в той же строке, если команда короткая, но если команд несколько, никогда так не пишите. А также избегайте длинных строк!

    Точно неправильно:

    if foo == 'blah': do_blah_thing()
    for x in lst: total += x
    while t < 10: t = delay()

    Вероятно, неправильно:

    if foo == 'blah': do_blah_thing()
    else: do_non_blah_thing()
    
    try: something()
    finally: cleanup()
    
    do_one(); do_two(); do_three(long, argument,
                                 list, like, this)
    
    if foo == 'blah': one(); two(); three()

Комментарии

Комментарии, противоречащие коду, хуже, чем отсутствие комментариев. Всегда исправляйте комментарии, если меняете код!

Комментарии должны являться законченными предложениями. Если комментарий — фраза или предложение, первое слово должно быть написано с большой буквы, если только это не имя переменной, которая начинается с маленькой буквы (никогда не изменяйте регистр переменной!).

Если комментарий короткий, можно опустить точку в конце предложения. Блок комментариев обычно состоит из одного или более абзацев, составленных из полноценных предложений, поэтому каждое предложение должно оканчиваться точкой.

Ставьте два пробела после точки в конце предложения.

Программисты, которые не говорят на английском языке, пожалуйста, пишите комментарии на английском, если только вы не уверены на 120%, что ваш код никогда не будут читать люди, не знающие вашего родного языка.

Блоки комментариев

Блок комментариев обычно объясняет код (весь, или только некоторую часть), идущий после блока, и должен иметь тот же отступ, что и сам код. Каждая строчка такого блока должна начинаться с символа # и одного пробела после него (если только сам текст комментария не имеет отступа).

Абзацы внутри блока комментариев разделяются строкой, состоящей из одного символа #.

«Встрочные» комментарии

Старайтесь реже использовать подобные комментарии.

Такой комментарий находится в той же строке, что и инструкция. «Встрочные» комментарии должны отделяться по крайней мере двумя пробелами от инструкции. Они должны начинаться с символа # и одного пробела.

Комментарии в строке с кодом не нужны и только отвлекают от чтения, если они объясняют очевидное. Не пишите вот так:

x = x + 1                 # Increment x

Впрочем, такие комментарии иногда полезны:

x = x + 1                 # Компенсация границы

Строки документации

  • Пишите документацию для всех публичных модулей, функций, классов, методов. Строки документации необязательны для приватных методов, но лучше написать, что делает метод. Комментарий нужно писать после строки с def.
  • PEP 257 объясняет, как правильно и хорошо документировать. Заметьте, очень важно, чтобы закрывающие кавычки стояли на отдельной строке. А еще лучше, если перед ними будет ещё и пустая строка, например:

    """Return a foobang
    
    Optional plotz says to frobnicate the bizbaz first.
    
    """
  • Для однострочной документации можно оставить закрывающие кавычки на той же строке.

Контроль версий

Если вам нужно использовать Subversion, CVS или RCS в ваших исходных кодах, делайте вот так:

__version__ = "$Revision: 1a40d4eaa00b $"
# $Source$

Вставляйте эти строки после документации модуля перед любым другим кодом и отделяйте их пустыми строками по одной до и после.

Соглашения по именованию

Соглашения по именованию переменных в python немного туманны, поэтому их список никогда не будет полным — тем не менее, ниже мы приводим список рекомендаций, действующих на данный момент. Новые модули и пакеты должны быть написаны согласно этим стандартам, но если в какой-либо уже существующей библиотеке эти правила нарушаются, предпочтительнее писать в едином с ней стиле.

Главный принцип

Имена, которые видны пользователю как часть общественного API должны следовать конвенциям, которые отражают использование, а не реализацию.

Описание: Стили имен

Существует много разных стилей. Поможем вам распознать, какой стиль именования используется, независимо от того, для чего он используется.

Обычно различают следующие стили:

  • b (одиночная маленькая буква)
  • B (одиночная заглавная буква)
  • lowercase (слово в нижнем регистре)
  • lower_case_with_underscores (слова из маленьких букв с подчеркиваниями)
  • UPPERCASE (заглавные буквы)
  • UPPERCASE_WITH_UNDERSCORES (слова из заглавных букв с подчеркиваниями)
  • CapitalizedWords (слова с заглавными буквами, или CapWords, или CamelCase). Замечание: когда вы используете аббревиатуры в таком стиле, пишите все буквы аббревиатуры заглавными — HTTPServerError лучше, чем HttpServerError.
  • mixedCase (отличается от CapitalizedWords тем, что первое слово начинается с маленькой буквы)
  • Capitalized_Words_With_Underscores (слова с заглавными буквами и подчеркиваниями — уродливо!)

Ещё существует стиль, в котором имена, принадлежащие одной логической группе, имеют один короткий префикс. Этот стиль редко используется в python, но мы упоминаем его для полноты. Например, функция os.stat() возвращает кортеж, имена в котором традиционно имеют вид st_mode, st_size, st_mtime и так далее. (Так сделано, чтобы подчеркнуть соответствие этих полей структуре системных вызовов POSIX, что помогает знакомым с ней программистам).

В библиотеке X11 используется префикс Х для всех public-функций. В python этот стиль считается излишним, потому что перед полями и именами методов стоит имя объекта, а перед именами функций стоит имя модуля.

В дополнение к этому, используются следующие специальные формы записи имен с добавлением символа подчеркивания в начало или конец имени:

  • _single_leading_underscore: слабый индикатор того, что имя используется для внутренних нужд. Например, from M import * не будет импортировать объекты, чьи имена начинаются с символа подчеркивания.
  • single_trailing_underscore_: используется по соглашению для избежания конфликтов с ключевыми словами языка python, например:

    Tkinter.Toplevel(master, class_='ClassName')
  • __double_leading_underscore: изменяет имя атрибута класса, то есть в классе FooBar поле __boo становится _FooBar__boo.
  • __double_leading_and_trailing_underscore__ (двойное подчеркивание в начале и в конце имени): магические методы или атрибуты, которые находятся в пространствах имен, управляемых пользователем. Например, __init__, __import__ или __file__. Не изобретайте такие имена, используйте их только так, как написано в документации.

Предписания: соглашения по именованию

Имена, которых следует избегать

Никогда не используйте символы l (маленькая латинская буква «эль»), O (заглавная латинская буква «о») или I (заглавная латинская буква «ай») как однобуквенные идентификаторы.

В некоторых шрифтах эти символы неотличимы от цифры один и нуля. Если очень нужно l, пишите вместо неё заглавную L.

Имена модулей и пакетов

Модули должны иметь короткие имена, состоящие из маленьких букв. Можно использовать символы подчеркивания, если это улучшает читабельность. То же самое относится и к именам пакетов, однако в именах пакетов не рекомендуется использовать символ подчёркивания.

Так как имена модулей отображаются в имена файлов, а некоторые файловые системы являются нечувствительными к регистру символов и обрезают длинные имена, очень важно использовать достаточно короткие имена модулей — это не проблема в Unix, но, возможно, код окажется непереносимым в старые версии Windows, Mac, или DOS.

Когда модуль расширения, написанный на С или C++, имеет сопутствующий python-модуль (содержащий интерфейс высокого уровня), С/С++ модуль начинается с символа подчеркивания, например, _socket.

Имена классов

Имена классов должны обычно следовать соглашению CapWords.

Вместо этого могут использоваться соглашения для именования функций, если интерфейс документирован и используется в основном как функции.

Обратите внимание, что существуют отдельные соглашения о встроенных именах: большинство встроенных имен — одно слово (либо два слитно написанных слова), а соглашение CapWords используется только для именования исключений и встроенных констант.

Имена исключений

Так как исключения являются классами, к исключениями применяется стиль именования классов. Однако вы можете добавить Error в конце имени (если, конечно, исключение действительно является ошибкой).

Имена глобальных переменных

Будем надеяться, что глобальные переменные используются только внутри одного модуля. Руководствуйтесь теми же соглашениями, что и для имен функций.

Добавляйте в модули, которые написаны так, чтобы их использовали с помощью from M import *, механизм __all__, чтобы предотвратить экспортирование глобальных переменных. Или же, используйте старое соглашение, добавляя перед именами таких глобальных переменных один символ подчеркивания (которым вы можете обозначить те глобальные переменные, которые используются только внутри модуля).

Имена функций

Имена функций должны состоять из маленьких букв, а слова разделяться символами подчеркивания — это необходимо, чтобы увеличить читабельность.

Стиль mixedCase допускается в тех местах, где уже преобладает такой стиль, для сохранения обратной совместимости.

Аргументы функций и методов

Всегда используйте self в качестве первого аргумента метода экземпляра объекта.

Всегда используйте cls в качестве первого аргумента метода класса.

Если имя аргумента конфликтует с зарезервированным ключевым словом python, обычно лучше добавить в конец имени символ подчеркивания, чем исказить написание слова или использовать аббревиатуру. Таким образом, class_ лучше, чем clss. (Возможно, хорошим вариантом будет подобрать синоним).

Имена методов и переменных экземпляров классов

Используйте тот же стиль, что и для имен функций: имена должны состоять из маленьких букв, а слова разделяться символами подчеркивания.

Используйте один символ подчёркивания перед именем для непубличных методов и атрибутов.

Чтобы избежать конфликтов имен с подклассами, используйте два ведущих подчеркивания.

Python искажает эти имена: если класс Foo имеет атрибут с именем __a, он не может быть доступен как Foo.__a. (Настойчивый пользователь все еще может получить доступ, вызвав Foo._Foo__a.) Вообще, два ведущих подчеркивания должны использоваться только для того, чтобы избежать конфликтов имен с атрибутами классов, предназначенных для наследования.

Примечание: есть некоторые разногласия по поводу использования __ имена (см. ниже).

Константы

Константы обычно объявляются на уровне модуля и записываются только заглавными буквами, а слова разделяются символами подчеркивания. Например: MAX_OVERFLOW, TOTAL.

Проектирование наследования

Обязательно решите, каким должен быть метод класса или экземпляра класса (далее — атрибут) — публичный или непубличный. Если вы сомневаетесь, выберите непубличный атрибут. Потом будет проще сделать его публичным, чем наоборот.

Публичные атрибуты — это те, которые будут использовать другие программисты, и вы должны быть уверены в отсутствии обратной несовместимости. Непубличные атрибуты, в свою очередь, не предназначены для использования третьими лицами, поэтому вы можете не гарантировать, что не измените или не удалите их.

Мы не используем термин «приватный атрибут», потому что на самом деле в python таких не бывает.

Другой тип атрибутов классов принадлежит так называемому API подклассов (в других языках они часто называются protected). Некоторые классы проектируются так, чтобы от них наследовали другие классы, которые расширяют или модифицируют поведение базового класса. Когда вы проектируете такой класс, решите и явно укажите, какие атрибуты являются публичными, какие принадлежат API подклассов, а какие используются только базовым классом.

Теперь сформулируем рекомендации:

  • Открытые атрибуты не должны иметь в начале имени символа подчеркивания.
  • Если имя открытого атрибута конфликтует с ключевым словом языка, добавьте в конец имени один символ подчеркивания. Это более предпочтительно, чем аббревиатура или искажение написания (однако, у этого правила есть исключение — аргумента, который означает класс, и особенно первый аргумент метода класса (class method) должен иметь имя cls).
  • Назовите простые публичные атрибуты понятными именами и не пишите сложные методы доступа и изменения (accessor/mutator, get/set, — прим. перев.) Помните, что в python очень легко добавить их потом, если потребуется. В этом случае используйте свойства (properties), чтобы скрыть функциональную реализацию за синтаксисом доступа к атрибутам.

    Примечание 1: Свойства (properties) работают только в классах нового стиля (в Python 3 все классы являются таковыми).

    Примечание 2: Постарайтесь избавиться от побочных эффектов, связанным с функциональным поведением; впрочем, такие вещи, как кэширование, вполне допустимы.

    Примечание 3: Избегайте использования вычислительно затратных операций, потому что из-за записи с помощью атрибутов создается впечатление, что доступ происходит (относительно) быстро.

  • Если вы планируете класс таким образом, чтобы от него наследовались другие классы, но не хотите, чтобы подклассы унаследовали некоторые атрибуты, добавьте в имена два символа подчеркивания в начало, и ни одного — в конец. Механизм изменения имен в python сработает так, что имя класса добавится к имени такого атрибута, что позволит избежать конфликта имен с атрибутами подклассов.

    Примечание 1: Будьте внимательны: если подкласс будет иметь то же имя класса и имя атрибута, то вновь возникнет конфликт имен.

    Примечание 2: Механизм изменения имен может затруднить отладку или работу с __getattr__(), однако он хорошо документирован и легко реализуется вручную.

    Примечание 3: Не всем нравится этот механизм, поэтому старайтесь достичь компромисса между необходимостью избежать конфликта имен и возможностью доступа к этим атрибутам.

Общие рекомендации

  • Код должен быть написан так, чтобы не зависеть от разных реализаций языка (PyPy, Jython, IronPython, Pyrex, Psyco и пр.).

    Например, не полагайтесь на эффективную реализацию в CPython конкатенации строк в выражениях типа a+=b или a=a+b. Такие инструкции выполняются значительно медленнее в Jython. В критичных к времени выполнения частях программы используйте ».join() — таким образом склеивание строк будет выполнено за линейное время независимо от реализации python.

  • Сравнения с None должны обязательно выполняться с использованием операторов is или is not, а не с помощью операторов сравнения. Кроме того, не пишите if x, если имеете в виду if x is not None — если, к примеру, при тестировании такая переменная может принять значение другого типа, отличного от None, но при приведении типов может получиться False!
  • При реализации методов сравнения, лучше всего реализовать все 6 операций сравнения (__eq__, __ne__, __lt__, __le__, __gt__, __ge__), чем полагаться на то, что другие программисты будут использовать только конкретный вид сравнения.

    Для минимизации усилий можно воспользоваться декоратором functools.total_ordering() для реализации недостающих методов.

    PEP 207 указывает, что интерпретатор может поменять y > х на х < y, y >= х на х <= y, и может поменять местами аргументы х == y и х != y. Гарантируется, что операции sort() и min() используют оператор <, а max() использует оператор >. Однако, лучше всего осуществить все шесть операций, чтобы не возникало путаницы в других местах.

  • Всегда используйте выражение def, а не присваивание лямбда-выражения к имени.

    Правильно:

    def f(x): return 2*x

    Неправильно:

    f = lambda x: 2*x
  • Наследуйте свой класс исключения от Exception, а не от BaseException. Прямое наследование от BaseException зарезервировано для исключений, которые не следует перехватывать.
  • Используйте цепочки исключений соответствующим образом. В Python 3, «raise X from Y» следует использовать для указания явной замены без потери отладочной информации.

    Когда намеренно заменяется исключение (использование «raise X» в Python 2 или «raise X from None» в Python 3.3+), проследите, чтобы соответствующая информация передалась в новое исключение (такие, как сохранение имени атрибута при преобразовании KeyError в AttributeError или вложение текста исходного исключения в новом).

  • Когда вы генерируете исключение, пишите raise ValueError(‘message’) вместо старого синтаксиса raise ValueError, message.

    Старая форма записи запрещена в python 3.

    Такое использование предпочтительнее, потому что из-за скобок не нужно использовать символы для продолжения перенесенных строк, если эти строки длинные или если используется форматирование.

  • Когда код перехватывает исключения, перехватывайте конкретные ошибки вместо простого выражения except:.

    К примеру, пишите вот так:

    try:
        import platform_specific_module
    except ImportError:
        platform_specific_module = None

    Простое написание «except:» также перехватит и SystemExit, и KeyboardInterrupt, что породит проблемы, например, сложнее будет завершить программу нажатием control+C. Если вы действительно собираетесь перехватить все исключения, пишите «except Exception:».

    Хорошим правилом является ограничение использования «except:», кроме двух случаев:

    1. Если обработчик выводит пользователю всё о случившейся ошибке; по крайней мере, пользователь будет знать, что произошла ошибка.
    2. Если нужно выполнить некоторый код после перехвата исключения, а потом вновь «бросить» его для обработки где-то в другом месте. Обычно же лучше пользоваться конструкцией «try…finally».
  • При связывании перехваченных исключений с именем, предпочитайте явный синтаксис привязки, добавленный в Python 2.6:

    try:
        process_data()
    except Exception as exc:
        raise DataProcessingFailedError(str(exc))

    Это единственный синтаксис, поддерживающийся в Python 3, который позволяет избежать проблем неоднозначности, связанных с более старым синтаксисом на основе запятой.

  • При перехвате ошибок операционной системы, предпочитайте использовать явную иерархию исключений, введенную в Python 3.3, вместо анализа значений errno.
  • Постарайтесь заключать в каждую конструкцию try…except минимум кода, чтобы легче отлавливать ошибки. Опять же, это позволяет избежать замаскированных ошибок.

    Правильно:

    try:
        value = collection[key]
    except KeyError:
        return key_not_found(key)
    else:
        return handle_value(value)

    Неправильно:

    try:
        # Здесь много действий!
        return handle_value(collection[key])
    except KeyError:
        # Здесь также перехватится KeyError, который может быть сгенерирован handle_value()
        return key_not_found(key)
  • Когда ресурс является локальным на участке кода, используйте выражение with для того, чтобы после выполнения он был очищен оперативно и надёжно.
  • Менеджеры контекста следует вызывать с помощью отдельной функции или метода, всякий раз, когда они делают что-то другое, чем получение и освобождение ресурсов. Например:

    Правильно:

    with conn.begin_transaction():
        do_stuff_in_transaction(conn)

    Неправильно:

    with conn:
        do_stuff_in_transaction(conn)

    Последний пример не дает никакой информации, указывающей на то, что __enter__ и __exit__ делают что-то кроме закрытия соединения после транзакции. Быть явным важно в данном случае.

  • Используйте строковые методы вместо модуля string — они всегда быстрее и имеют тот же API для unicode-строк. Можно отказаться от этого правила, если необходима совместимость с версиями python младше 2.0.

    В Python 3 остались только строковые методы.

  • Пользуйтесь ».startswith() и ».endswith() вместо обработки срезов строк для проверки суффиксов или префиксов.

    startswith() и endswith() выглядят чище и порождают меньше ошибок. Например:

    Правильно:

    if foo.startswith('bar'):

    Неправильно:

    if foo[:3] == 'bar':
  • Сравнение типов объектов нужно делать с помощью isinstance(), а не прямым сравнением типов:

    Правильно:

    if isinstance(obj, int):

    Неправильно:

    if type(obj) is type(1):

    Когда вы проверяете, является ли объект строкой, обратите внимание на то, что строка может быть unicode-строкой. В python 2 у str и unicode есть общий базовый класс, поэтому вы можете написать:

    if isinstance(obj, basestring):

    Отметим, что в Python 3, unicode и basestring больше не существуют (есть только str) и bytes больше не является своего рода строкой (это последовательность целых чисел).

  • Для последовательностей (строк, списков, кортежей) используйте тот факт, что пустая последовательность есть false:

    Правильно:

    if not seq:
    if seq:

    Неправильно:

    if len(seq)
    if not len(seq)
  • Не пользуйтесь строковыми константами, которые имеют важные пробелы в конце — они невидимы, а многие редакторы (а теперь и reindent.py) обрезают их.
  • Не сравнивайте логические типы с True и False с помощью ==:

    Правильно:

    if greeting:

    Неправильно:

    if greeting == True:

    Совсем неправильно:

    if greeting is True:
  • Оригинал

    Специальные требования для оформления текстов для моих курсантов

    В самом начале скрипта с кодом Python необходимо указывать следующие атрибуты:

    #имя проекта: numpy-example
    #номер версии: 1.0
    #имя файла: example_2.py
    #автор и его учебная группа: Е. Волков, ЭУ-142
    #дата создания: 20.03.2019
    #дата последней модификации: 25.03.2019
    #связанные файлы: пакеты numpy, matplotlib
    #описание: простейшие статистические вычисления
    #версия Python: 3.6
    ]]> https://chel-center.ru/python-yfc/2019/10/01/kak-oformlyat-kod/feed/ 0 Документирование кода в Python. PEP 257 https://chel-center.ru/python-yfc/2019/10/01/dokumentirovanie-koda-v-python-pep-ndsp-257/ https://chel-center.ru/python-yfc/2019/10/01/dokumentirovanie-koda-v-python-pep-ndsp-257/#respond Tue, 01 Oct 2019 01:36:52 +0000 http://chel-center.ru/python-yfc/?p=508 Читать далее «Документирование кода в Python. PEP 257»

    ]]>
    Документирование кода в python — достаточно важный аспект, ведь от нее порой зависит читаемость и быстрота понимания вашего кода, как другими людьми, так и вами через полгода.

    PEP 257 описывает соглашения, связанные со строками документации python, рассказывает о том, как нужно документировать python код.

    Цель этого PEP — стандартизировать структуру строк документации: что они должны в себя включать, и как это написать (не касаясь вопроса синтаксиса строк документации). Этот PEP описывает соглашения, а не правила или синтаксис.

    При нарушении этих соглашений, самое худшее, чего можно ожидать — некоторых неодобрительных взглядов. Но некоторые программы (например, docutils), знают о соглашениях, поэтому следование им даст вам лучшие результаты.

    Что такое строки документации?

    Строки документации — строковые литералы, которые являются первым оператором в модуле, функции, классе или определении метода. Такая строка документации становится специальным атрибутом __doc__ этого объекта.

    Все модули должны, как правило, иметь строки документации, и все функции и классы, экспортируемые модулем также должны иметь строки документации. Публичные методы (в том числе __init__) также должны иметь строки документации. Пакет модулей может быть документирован в __init__.py.

    Для согласованности, всегда используйте """три двойных кавычки""" для строк документации. Используйте """три двойных кавычки""", если вы будете использовать обратную косую черту в строке документации.

    Существует две формы строк документации: однострочная и многострочная.

    Однострочные строки документации

    Однострочники предназначены для действительно очевидных случаев. Они должны умещаться на одной строке. Например:

    def kos_root():
        """Return the pathname of the KOS root directory."""
        global _kos_root
        if _kos_root: return _kos_root

    Используйте тройные кавычки, даже если документация умещается на одной строке. Потом будет проще её дополнить.

    Закрывающие кавычки на той же строке. Это смотрится лучше.

    Нет пустых строк перед или после документации.

    Однострочная строка документации не должна быть «подписью» параметров функции / метода (которые могут быть получены с помощью интроспекции). Не делайте:

    def function(a, b):
        """function(a, b) -> list"""

    Этот тип строк документации подходит только для C функций (таких, как встроенные модули), где интроспекция не представляется возможной. Тем не менее, возвращаемое значение не может быть определено путем интроспекции. Предпочтительный вариант для такой строки документации будет что-то вроде:

    def function(a, b):
        """Do X and return a list."""

    (Конечно, «Do X» следует заменить полезным описанием!)

    Многострочные строки документации

    Многострочные строки документации состоят из однострочной строки документации с последующей пустой строкой, а затем более подробным описанием. Первая строка может быть использована автоматическими средствами индексации, поэтому важно, чтобы она находилась на одной строке и была отделена от остальной документации пустой строкой. Первая строка может быть на той же строке, где и открывающие кавычки, или на следующей строке. Вся документация должна иметь такой же отступ, как кавычки на первой строке (см. пример ниже).

    Вставляйте пустую строку до и после всех строк документации (однострочных или многострочных), которые документируют класс — вообще говоря, методы класса разделены друг от друга одной пустой строкой, а строка документации должна быть смещена от первого метода пустой строкой; для симметрии, поставьте пустую строку между заголовком класса и строкой документации. Строки документации функций и методов, как правило, не имеют этого требования.

    Строки документации скрипта (самостоятельной программы) должны быть доступны в качестве «сообщения по использованию», напечатанной, когда программа вызывается с некорректными или отсутствующими аргументами (или, возможно, с опцией «-h», для помощи). Такая строка документации должна документировать функции программы и синтаксис командной строки, переменные окружения и файлы. Сообщение по использованию может быть довольно сложным (несколько экранов) и должно быть достаточным для нового пользователя для использования программы должным образом, а также полный справочник со всеми вариантами и аргументами для искушенного пользователя.

    Строки документации модуля должны, как правило, перечислять классы, исключения, функции (и любые другие объекты), которые экспортируются модулем, с краткими пояснениями (в одну строчку) каждого из них. (Эти строки, как правило, дают меньше деталей, чем первая строка документации к объекту). Строки документации пакета модулей (т.е. строка документации в __init__.py) также должны включать модули и подпакеты.

    Строки документации функции или метода должны обобщить его поведение и документировать свои аргументы, возвращаемые значения, побочные эффекты, исключения, дополнительные аргументы, именованные аргументы, и ограничения на вызов функции.

    Строки документации класса обобщают его поведение и перечисляют открытые методы и переменные экземпляра. Если класс предназначен для подклассов, и имеет дополнительный интерфейс для подклассов, этот интерфейс должен быть указан отдельно (в строке документации). Конструктор класса должен быть задокументирован в документации метода __init__. Отдельные методы должны иметь свои строки документации.

    Если класс — подкласс другого класса, и его поведение в основном унаследовано от этого класса, строки документации должны отмечать это и обобщить различия. Используйте глагол «override», чтобы указать, что метод подкласса заменяет метод суперкласса и не вызывает его; используйте глагол «extend», чтобы указать, что метод подкласса вызывает метод суперкласса (в дополнение к собственному поведению).

    И, напоследок, пример:

    def complex(real=0.0, imag=0.0):
        """Form a complex number.
    
        Keyword arguments:
        real -- the real part (default 0.0)
        imag -- the imaginary part (default 0.0)
    
        """
        if imag == 0.0 and real == 0.0: return complex_zero
        ...

    А ещё больше примеров можно посмотреть в стандартной библиотеке Python (например, в папке Lib вашего интерпретатора Python).

    Оригинал

    ]]>
    https://chel-center.ru/python-yfc/2019/10/01/dokumentirovanie-koda-v-python-pep-ndsp-257/feed/ 0
    10 полезных библиотек Python https://chel-center.ru/python-yfc/2019/10/01/10-poleznyh-bibliotek-python/ https://chel-center.ru/python-yfc/2019/10/01/10-poleznyh-bibliotek-python/#respond Tue, 01 Oct 2019 01:55:49 +0000 http://chel-center.ru/python-yfc/?p=37 Читать далее «10 полезных библиотек Python»

    ]]>
    Пакетов для Python создано уже очень много, поэтому ни один человек физически не может изучить их все. Только PyPi насчитывает 47 000 пакетов. В то время как pandas, scikit-learn или numpy у многих на слуху, про перечисленные здесь — уже достаточно старые, но всё ещё полезные — библиотеки часто забывают.

    Delorean

    Это – отличная библиотека для работы с датами и временем. Работа с временем с помощью неё в Python мне кажется наиболее естественной. Delorean чем-то похожа на Moment.js. Так же стоит отметить отличную документацию и бесчисленное количество отсылок к «Назад в будущее».

    from delorean import Delorean
    EST = "US/Eastern"
    d = Delorean(timezone=EST)
    
    Назад в будущее
    Назад в будущее

    Prettytable

    Я почти уверен, что про эту библиотеку вы не слышали, ведь она выложена на GoogleCode, который в мире кодеров является точным аналогом Якутии.

    Несмотря на то, что она была сослана в это холодное, заснеженное и пустынное место, Prettytable остаётся отличной библиотекой для формирования красивого вывода в терминал:

    from prettytable import PrettyTable
    table = PrettyTable(["животное", "свирепость"])
    table.add_row(["Оборотень", 100])
    table.add_row(["Гризли", 87])
    table.add_row(["Кролик из Кэрбенног", 110])
    table.add_row(["Кот", -1])
    table.add_row(["Утконос", 23])
    table.add_row(["Дельфин", 63])
    table.add_row(["Альбатрос", 44])
    table.sort_key("свирепость")
    table.reversesort = True
    +----------------------+------------+
    |       животное       | свирепость |
    +----------------------+------------+
    | Кролик из Кэрбенног |   110      |
    |      Оборотень       |   100      |
    |        Гризли        |    87      |
    |       Дельфин        |    63      |
    |       Альбатрос      |    44      |
    |        Утконос       |    23      |
    |         Кот          |    -1      |
    +----------------------+------------+
    

    Snowballstemmer

    Ладно, признаюсь, первый раз я установил snowballstemmer из-за крутого названия. Но оказалось, что это действительно очень удобная маленькая библиотечка. Она содержит алгоритмы стемминга для 15 языков (включая русский).

    from snowballstemmer import EnglishStemmer, SpanishStemmer
    EnglishStemmer().stemWord("Gregory")
    # Gregori
    SpanishStemmer().stemWord("amarillo")
    # amarill
    

    Wget

    Наверняка вам ни раз приходилось писать методы для какой-то специфической работы с вебом. Но я вас огорчу – вы делали это зря. Ведь уже есть wget. Рекурсивно скачать сайт? Забрать со страницы все изображения? Для wget это не проблема.

    import wget
    wget.download("http://www.cnn.com/")
    # 100% [............................................................................] 280385 / 280385
    

    PyMC

    А эта библиотека предназначена для Байесовского анализа. По непонятным причинам эта библиотека используется гораздо реже, чем scikit-learn, а ведь очень зря.

    from pymc.examples import disaster_model
    from pymc import MCMC
    M = MCMC(disaster_model)
    M.sample(iter=10000, burn=1000, thin=10)
    [-----------------100%-----------------] 10000 of 10000 complete in 1.4 sec
    
    

    Sh

    Я не могу себе позволить, чтобы вы ушли с этой страницы, не зная о sh. Как можно догадаться, sh импортирует в Python команды shell в виде функций. Это – суперудобная возможность, когда вы помните, как сделать что-то с помощью bash, но не помните, как это реализуется на Python (например, рекурсивный поиск по файлам).

    from sh import find
    find("/tmp")
    /tmp/foo
    /tmp/foo/file1.json
    /tmp/foo/file2.json
    /tmp/foo/file3.json
    /tmp/foo/bar/file3.json
    

    Fuzzywuzzy

    Эта библиотека добавляет классных фич для сравнения данных. Может быть использована для связи записей в различных базах данных.

    from fuzzywuzzy import fuzz
    fuzz.ratio("Hit me with your best shot", "Hit me with your pet shark")
    # 85
    

    Progressbar

    Да, да, эта библиотека делает именно то, о чём вы подумали – выводит прогрессбар.

    from progressbar import ProgressBar
    import time
    pbar = ProgressBar(maxval=10)
    for i in range(1, 11):
        pbar.update(i)
        time.sleep(1)
    pbar.finish()
    # 60% |########################################################                                      |
    

    Colorama

    Если уж вы занимаетесь добавление прогрессбаров в свои программы, то, может, стоит добавить ещё немного цвета? Справиться с этим вам поможет Colorama.

    Сolorama
    Сolorama

    Uuid

    Наверняка вам приходилось генерировать для пользователей ID, или рассылать покупателям промокоды, или делать ещё что-то, где нужно создать уникальные последовательности. UUID вам в этом поможет:

    import uuid
    print uuid.uuid4()
    # e7bafa3d-274e-4b0a-b9cc-d898957b4b61
    

    И если вы переживаете, что ID кончатся, то не стоит: их количество сравнимо с количеством атомов во вселенной.

    Источник: blog.yhat.com

    ]]>
    https://chel-center.ru/python-yfc/2019/10/01/10-poleznyh-bibliotek-python/feed/ 0
    Dash — передовой web‑фреймворк Python https://chel-center.ru/python-yfc/2019/11/06/dash-nbsp-mdash-peredovoj-web-8209-frejmvork-python/ https://chel-center.ru/python-yfc/2019/11/06/dash-nbsp-mdash-peredovoj-web-8209-frejmvork-python/#respond Tue, 05 Nov 2019 22:11:02 +0000 http://chel-center.ru/python-yfc/?p=330 Читать далее «Dash — передовой web‑фреймворк Python»

    ]]>
    Библиотека пользовательского интерфейса

    Посмотрите на эти великолепные web‑приложения, где вы изменяя состояние элементов в окне своего браузера, управляете картинкой, в том числе, и отображением актуальной информации в реальном времени:

    1. Интерактивная карта изменения границ России на протяжении веков;
    2. Живая карта;
    3. Экспедиция Хритофора Колумба и Васко де Гама;
    4. Александр Македонский;
    5. Карта семантических полей мозга;
    6. 3D‑карта загрязнения воздуха на планете в реальном времени;
    7. What can a technologist do about climate change? A personal view.

    Одним из инструментов подобного рода шедевров является Dash — библиотека пользовательского интерфейса для создания аналитических веб-приложений. Те, кто использует Python для анализа данных, исследования данных, визуализации, моделирования, управления приборами и отчетности, сразу же найдут применение для Dash.

    Dash убийственно просто позволяет построить графический интерфейс в вашем коде анализа и обработки данных. Вот 43‑строчный пример приложения Dash, которое связывает выпадающее меню с графиком. Когда пользователь выбирает значение в раскрывающемся списке, код приложения динамически экспортирует данные из Google Finance в фрейм данных Pandas. Это приложение было написано всего в 43 строках кода, (посмотрите ). Все просто.

    Dash-приложение — «Привет Мир». Дополнительные примеры см. в руководстве пользователя.

    Код приложения Dash является декларативным, что позволяет легко создавать сложные приложения, содержащие множество интерактивных элементов. Вот пример с 5 элементами управления, 3 диаграммами и перекрестной фильтрацией. Для реализации этого приложения потребовалось всего около 160 строчек кода на Python.

    Dash-приложение
    Dash-приложение с 5 элементами управления, 3 диаграммами и перекрестной фильтрацией. Реализовано приблизительно в 163 строчках кода Python. Посмотрите код

    Каждый эстетический элемент приложения настраивается: размер, позиционирование, цвета, шрифты. Приложения Dash создаются и публикуются в интернете, поэтому доступна полная мощность CSS. Вот пример интерактивного приложения для отчетов Dash, выполненного в фирменном стиле отчета Goldman Sachs, где без CSS просто невозможно.

    Стилизованное под отчет компании <a href=
    Goldman Sachs приложение Dash. Стилизованное под отчет компании Goldman Sachs приложение Dash со сложными каскадными таблицами стилей CSS.

    Dash‑приложения просматриваются в веб-браузере, но вам не надо писать никаких Javascript или HTML. В Dash есть полный интерфейс Python для богатого набора интерактивных веб-компонентов.

    import dash_core_components as dcc
    
    dcc.Slider(value=4, min=-10, max=20, step=0.5,
        labels={-5: '-5 Degrees', 0: '0', 10: '10 Degrees'})
    
    Пример простого компонента Dash — ползунок
    Пример простого компонента Dash — ползунок

    Для привязки пользовательского кода анализа данных к пользовательскому интерфейсу в Dash используется простой реактивный декоратор.

    @dash_app.callback(Output('graph-id', 'figure'),
        [Input('slider-id', 'value')])
    
    def your_data_analysis_function(new_slider_value):
        new_figure = your_compute_figure_function(new_slider_value)
        return new_figure
    

    Когда элемент управления изменяет своё состояние (например, вы открыли раскрывающийся список или перетаскиваете ползунок), декоратор Dash передаёт вашему коду Python новое значение элемента управления.

    С этим новым значением ваша функция Python может делать все, что угодно: фильтровать DataFrame Pandas, сделать SQL‑запрос, запустить моделирование, выполнить расчет или начать эксперимент. Dash ожидает, что в результате ваша функция вернет какое-то новое свойство некоторого элемента в пользовательском интерфейсе, будь то новый график, новая таблица или новый элемент текста.

    Например, вот простое Dash‑приложение, которое обновляет текстовое поле при взаимодействии с Graph элементом. Код приложения фильтрует данные в DataFrame Pandas, используя значение в текущей выбранной точке.

    Dash-приложение, которое отображает пользовательские метаданные.
    Dash-приложение для отображения метаданных. При наведении указателя мыши на точку данные фрейма Pandas фильтруются. Всего 60 строчек кода. Просмотрите пример

    Следующее Dash‑приложение отображает мета-информацию о наркотиках при наведении курсора мыши на точки в Graph элементе. Код приложения также добавляет строки в Table компонент, когда элементы добавляются в мульти Dropdown элемент.

    Dash-приложение для обнаружения наркотиков
    Dash-приложение для обнаружения наркотиков. При наведении курсора на точки отображается описание препарата. Выбор препаратов в выпадающем списке подчеркивает их положение на графике и добавляет их символ в таблицу ниже. Встроенный в несколько сотен строк кода Python

    С помощью этих двух компонентов — абстракций Python и реактивных функциональных декораторов, Dash абстрагирует все технологии и протоколы, необходимые для создания интерактивного веб-приложения. Dash достаточно прост, чтобы вы могли связать пользовательский интерфейс вокруг своего кода Python после обеда.

    Архитектура

    Flask & React

    Dash‑приложения — это веб-серверы, работающие под управлением Flask и передающие пакеты JSON в запросах HTTP. Внешний интерфейс Dash отображает компоненты с помощью React.js, библиотеки пользовательского интерфейса Javascript, написанной и поддерживаемой Facebook.

    Flask (веб-фреймворк) — это классно. Он с радостью принят сообществом Python и повсюду развернут в production. Базовый экземпляр Flask и все его настраиваемые свойства доступны разработчикам приложений Dash. Продвинутые смогут расширить приложения Dash с помощью богатого набора плагинов Flask.

    React.js так-же фантастичен. В Plotly была переписана вся веб‑платформа и онлайн-редактор диаграмм на React. Одна из невероятных вещей, связанных с React — это плодовитость и талант участников сообщества. Open source сообщество React опубликовало тысячи высококачественных интерактивных компонентов: от раскрывающихся списков до ползунков, от подборщиков календарей до интерактивных таблиц.

    Dash использует силу Flask и React, включая их в обработку данных Python аналитиками c не богатым опытом веб‑разработки.

    От React.js к Python Dash-компонентам

    Компоненты Dash — это классы Python, которые кодируют свойства и значения конкретного компонента React и сериализуются как JSON. Dash предоставляет набор инструментов для быстрого пакетирования компонентов React (написанных на Javascript) в качестве компонентов, которые могут быть использованы в Dash. Эта группа инструментов использует динамическое программирование для автоматического генерирования стандартных классов Python из аннотированных React propTypes. Полученные классы Python, представляющие компоненты Dash, удобны для пользователя: они поставляются с автоматической проверкой аргументов, записями документов и т. д.

    Вот пример проверки динамически генерируемого аргумента:

    >>> import dash_core_components as dcc
    
    >>> dcc.Dropdown(valu=3)
    
    Exception: Unexpected keyword argument 'valu'
    Allowed arguments: id, className, disabled, multi, options, placeholder, value
    

    и пример динамически генерируемых компонентов docstrings:

    >>> help(dcc.Dropdown)
    
    class Dropdown(dash.development.base_component.Component)
     | A Dropdown component. 
     | Dropdown is an interactive dropdown element for selecting one or more
     | items. 
     | The values and labels of the dropdown items are specified in the 'options'
     | property and the selected item(s) are specified with the 'value' property. 
    | 
     | Use a dropdown when you have many options (more than 5) or when you are
     | constrained for space. Otherwise, you can use RadioItems or a Checklist,
     | which have the benefit of showing the users all of the items at once. 
    / 
     | Keyword arguments:
     | - id (string; optional)
     | - className (string; optional)
     | - disabled (boolean; optional): If true, the option is disabled
     | - multi (boolean; optional): If true, the user can select multiple values
     | - options (list; optional)
     | - placeholder (string; optional): The grey, default text shown when no option is selected
     | - value (string | list; optional): The value of the input. If 'multi' is false (the default)
     | then value is just a string that corresponds to the values
     | provided in the 'options' property. If 'multi' is true, then
     | multiple values can be selected at once, and 'value' is an
     | array of items with values corresponding to those in the
     | 'options' prop. 
    | 
     | Available events: 'change
    

    Полный набор HTML-тегов, например, div, img, table также отображается динамически с помощью React, и их классы Python доступны через dash_html_component библиотеку. Основной набор интерактивных компонентов, таких как, Dropdown, Graph, Slider будет поддерживаться командой Dash core через библиотеку dash_core_components. Обе эти библиотеки используют стандартную цепочку инструментов React-to-Dash с открытым исходным кодом, которую можно использовать, если вы захотите написать свою собственную библиотеку компонентов.

    Вы не привязаны к стандартной библиотеке компонентов Dash. Библиотеки компонентов Dash импортируются отдельно от основной библиотеки. С помощью цепочки инструментов React-to-Dash вы можете легко написать или перенести React.компонент js в класс Python, который можно использовать в своём приложении Dash. Вот учебник по созданию собственных компонентов или команда Dash, которая всегда рада помочь и сделать для вас что-то абсолютно оригинальное.

    Параллельные многопользовательские приложения

    Состояние приложения Dash хранится во внешнем интерфейсе (т. е. в веб-браузере). Это позволяет использовать приложения Dash одновременно несколькими пользователями, создавая независимые сеансы при одновременном взаимодействии. Dash‑код приложения является функциональным и ваш код имеет доступ к значениям глобального состояния Python, однако, не может их изменить. Такой функциональный подход легко понять и проверить — это просто элементы управления и элементы отображения без побочных эффектов или состояний.

    CSS и стили по умолчанию

    CSS и стили по умолчанию не включаются в основную библиотеку для обеспечения модульности, независимого управления версиями и поощрения разработчиков приложений Dash к настройке индивидуального внешнего вида своих приложений. Команда Dash core поддерживает CSS ядра.

    Визуализация данных

    В Dash включён компонент Graph, который отображает диаграммы с помощью plotly.js. Plotly.js отлично подходит для Dash — декларативный, с открытым исходным кодом, быстрый и поддерживает полный спектр научных, финансовых и бизнес‑диаграмм. Plotly.js построен поверх D3.js (для качественной публикации, векторизованного экспорта изображений) и WebGL (для высокопроизводительной визуализации).

    Компонент Graph имеет тот же синтаксис, что и библиотека с открытым кодом plotly.py, так что вы можете легко переключаться между ними. Компонент Graph Dash подключается к plotly.js через события js, и позволяет писать приложения, реагирующие на наведение курсора, щелчок мыши или выбор точки на графике.

    Доступные шаблоны диаграмм Dash
    Некоторые из доступных шаблонов диаграмм в Dash‑компонента Graph для Plotly.js. Подробней посмотрие в соответствующем разделе документации plotly.py.

    Dash-приложение с Plotly.diagram js из галереи приложений Dash.
    Dash-приложение с диаграммами Plotly.js из галереии Dash.

    Репозитарии с открытым исходным кодом

    Вы можете проверить код самостоятельно в нескольких репозиториях.:

    До нашей эры

    Dash — новинка в экосистеме Python, но концепции и мотивы Dash существуют на протяжении десятилетий в различных языках и приложениях.

    Если вы хотите что-то лучшее, чем Excel, то ваша голова в нужном месте и работает в нужном направлении. И Dash, и Excel используют «реактивную» модель программирования. В Excel все ячейки обновляются автоматически при изменении в одной из них. Вот пример приложения Excel:

    По аналогии с Excel в Dash вместо ячеек у нас есть множество управляющих веб-компонентов, таких как слайдеры, ячейки данных, выпадающие списки и графики. Вместо того чтобы писать сценарии, как в Excel или VBA, мы пишем код Python. Вот то же самое приложение для работы с электронными таблицами, переписанное в Dash:

    app.layout = html.Div([
        html.Label('Hours per Day'),
        dcc.Slider(id='hours', value=5, min=0, max=24, step=1),
    html.Label('Rate'),
        dcc.Input(id='rate', value=2, type='number'),
    html.Label('Amount per Day'),
        html.Div(id='amount'),
    html.Label('Amount per Week'),
        html.Div(id='amount-per-week')
    ])
    @app.callback(Output('amount', 'children'),
                  [Input('hours', 'value'), Input('rate', 'value')])
    def compute_amount(hours, rate):
        return float(hours) * float(rate)
    @app.callback(Output('amount-per-week', 'children'),
                  [Input('amount', 'children')])
    def compute_amount(amount):
        return float(amount) * 7
    

    И посмотрите, как оно теперь выглядит:

    Мне очень нравится этот пример. Excel по-прежнему царит в финансах и даже в технических вычислениях. Я не думаю, что доминирование Excel — это вопрос технических возможностей. В конце концов, есть огромное количество программистов электронных таблиц, которые уже знают нюансы Excel, VBA и даже SQL.

    Более того, электронные таблицы Excel частенько легче распространить, чем программы Python, а ячейки Excel легче редактировать, чем аргументы командной строки.

    Тем не менее, моделирование в Excel имеет хорошо известные ограничения: таблицы часто перерастают сами себя. Они становятся слишком большими или слишком хрупкими для миграции в производственную среду, для рецензирования, тестирования и обслуживания. Помните опечатку 2013 года про экономию в Excel?


    Если в бизнес-аналитике вы полагаетесь на язык программирования R, то вам повезло. Shiny — среда для генерации веб-приложений на чистом R великолепна! Вы даже можете создавать интерактивную графику с библиотекой Plotly’s R Shiny. Dash и Shiny похожи, но Dash не стремится быть точной копией Shiny. Идиомы и философии между Python и R достаточно различны, чтобы гарантировать иной синтаксис.

    Интерактивное веб-приложение, сделанное блестящим Shiny для R
    Интерактивное веб-приложение, сделанное блестящим Shiny для R

    Если вы программируете в MATLAB, то можете быть знакомы с руководством по библиотеке пользовательского интерфейса MATLAB «GUIDE». Mathworks был одним из подлинных новаторов в области технических вычислений — «GUIDE» было написано в 2004 году, 15 лет назад!

    Управляющее приложение, встроенное в MATLAB
    Управляющее приложение, встроенное в MATLAB

    Если вы работаете с базами данных, то, возможно, используете Tableau или другие похожие инструменты бизнес-аналитики. Tableau невероятен. Он оправдал новые ожидания в отрасли — конечные пользователи должны иметь автономию и инструменты для исследования данных своей организации. Он помог популяризировать концепции «детализации» и перекрестной фильтрации.

    Таблица перекрестная фильтрация
    Таблица перекрестная фильтрация

    Dash дополняет инструменты бизнес-аналитики, подобные этим. Такие инструменты отлично работают на структурированных данных. Но когда дело доходит до преобразования данных, то трудно превзойти широту и гибкость языков программирования и сообществ, таких как Python. Dash абстрагирует от множества сложностей в создании пользовательских интерфейсов, позволяя вам создать красивый внешний интерфейс для манипулирования пользовательской базой данных при анализе.


    И наконец, я хотел бы сказать несколько добрых слов в пользу Jupyter. Виджеты Jupyter предоставляют действительно хороший ход в рамках интерфейса ноутбука. Вы можете добавить ползунки на свои графики в записных книжках Jupyter, используя его локально.

    Виджеты в Dash похожи на виджеты в Jupyter. В Jupyter Notebooks вы можете добавлять виджеты прямо рядом со своим кодом. В Dash элементы управления и приложения хранятся отдельно от кода. Dash больше ориентирован на разделяемые приложения, чем на разделяемый код и ноутбуки. Вы всегда можете смешивать и сочетать инструменты и писать свои Dash-приложения в среде Jupyter Notebook.

    Честь и хвала проекту nteract, который действительно снижает барьер для входа на ноутбуки Python и Jupyter, заключая Jupyter Notebook и настольное приложение.


    Я надеюсь, что Dash облегчит использование Python для ваших проектов, связанных с анализом данных. Используя одни и те же функциональные и реактивные принципы, написать приложение для Dash почти так же просто, как написать аналитическую таблицу. Но это, вне всяких сомнений, более мощно и презентабельно.

    Дополнительные ресурсы и ссылки

    1. Вся документация Dash по адресу https://plot.ly/dash;
    2. Вся наша работа с открытым исходным кодом находится на GitHub по адресу https://github.com/plotly.

    Если вы ищете вдохновение в построении пользовательских интерфейсах для технических вычислений, я настоятельно рекомендую эссе Брета Виктора о том, «What can a technologist do about climate change? A personal view» В частности, разделы Languages for technical computing и Model-driven debate.

    Источник вдохновения: Introducing Dash

    P.S. Большинство приведенных выше примеров проверены и хранятся на github, но прежде, чем вы их скачаете и попробуете запустить (а без этого ничему не научиться), рекомендую пройти объемный видео-курс, рассматривающий как основы языка Python, так и его специализированное применение для работы с данными. Кроме того, для освоения инструмента, с помощью которого, были проверены все упомянутые примеры, обязательно прочитайте статью «Начинаем с инструментов или как зарядить свой компьютер«.

    ]]>
    https://chel-center.ru/python-yfc/2019/11/06/dash-nbsp-mdash-peredovoj-web-8209-frejmvork-python/feed/ 0
    Самые быстрые веб‑фреймворки Python в 2019 году https://chel-center.ru/python-yfc/2019/11/09/samye-bystrye-python-veb-frejmvorki-v-2019/ https://chel-center.ru/python-yfc/2019/11/09/samye-bystrye-python-veb-frejmvorki-v-2019/#respond Sat, 09 Nov 2019 17:03:13 +0000 http://chel-center.ru/python-yfc/?p=467 Читать далее «Самые быстрые веб‑фреймворки Python в 2019 году»

    ]]>
    В 2018 году Python укрепил свои позиции популярности среди программистов и вошел в Top 3 самых популярных языков на github. Все больше и больше людей переходит на светлую сторону…то есть Python. Появилось еще большее количество разработчиков, которые интересуются данным языком и ведут разработку своих проектов с его помощью. Одним из популярных направлений для Python является web‑разработка. Хочется, чтобы не только процесс разработки был удобным и быстрым, но и сами проекты могли похвастаться скоростью и стабильностью работы.

    Python имеет множество фреймворков, которые избавляют программиста от рутинных операций и позволяют сосредоточиться на решении задач. В 2018 году обновились существующие фреймворки и появились новые инструменты.

    Поэтому мы решили составить сравнительный анализ популярных фреймворков, которые не потеряют, мы надеемся, своей актуальности на протяжении всего 2019 года и определить самый быстрый из них.

    Участники тестирования

    Django

    Версия: 2.1.4

    Описание: самый популярный комбайн для Python, который из коробки решает множество проблем (админка, авторизация, логирование, ORM, и т.д). Это упрощает жизнь разработчика, но если мы ставим в приоритет скорость работы — то иногда такой комбайн играет против нас и это сказывается на производительности. По этой причине номинацию Fastest Python Web Framework in 2019 он скорее всего не возьмет.

    Flask

    Версия: 1.0.2

    Описание: самый популярный фреймворк на Python (по звездам в GitHub обгоняет даже Django). Популярный выбор в случаях разработки мелких проектов, для которых не нужны те плюшки, которые есть в Django. Позволяет быстро развернуть приложение. Возможно быстрее чем Django по скорости работы, но имеет очень маленькую функциональность “из коробки”.

    AioHTTP

    Версия: 3.5.1

    Описание: очень привлекательный асинхронный Python Framework. Имеет версию клиента и сервера, что значительно развязывает руки при разработке. Обладает очень удобными асинхронными запросами с версии клиента, а также очень хорошие показатели скорости работы сервера при большом количество запросов. Точно должен попасть в тройку лидеров.

    Sanic

    Версия: 18.12

    Описание: можно сказать, что это “многопоточный Flask” со всеми вытекающими. По этой причине мы думаем, что результаты должны быть очень хороши.

    Tornado

    Версия: 5.1.1

    Описание: асинхронный ветеран Python движения, задавший тренд асинхронности в 2010 году. Не теряет своей актуальности и получил 5ю версию в 2018 году. Достаточно высокий порог входа для новичков. Популярен среди олдскульных питонистов, и мы думаем не зря. Должен показать хорошие результаты.

    Vibora

    Тестируемая версия: релизов на GitHub нет

    Описание: многообещающий фреймворк, появившийся в июне 2018 и за последнии полгода набравший более 4000 звезд. Имеет впечатляющие замеры производительности в GitHub. Мы думали именно Vibora станет фаворитом нашей гонки, но к сожалению из-за отсутствия возможности запуска под Python >=3.7 и отсутствия стабильной версии фреймворка мы исключили Vibora.

    В GitHub разработчики обещают “кардинально новый” Vibora уже скоро. Посмотрим, что у них получится и обязательно напишем об этом.

    Методика тестирования

    Тестирование проводилось на Apple iMac 27» Retina 5K 2017, CPU: 3.5GHz i5, RAM: 8GB, 1000GB Fusion Drive, OSX 10.14.2 при помощи утилиты WRK:

    wrk -t12 -c400 -d30s http://127.0.0.1:8080/db/

    Тесты проводились на Python 3.7.2. Все фреймворки запускались при помощи Gunicorn с двумя воркерами. Возможно в каких-то случаях использование uwsgi сказалось бы на результатах, но так как мы поставили цель тестировать фреймворки, а не способы их запуска — решили этим пренебречь.

    У нас был всего один вид тестов: DB Test, в котором мы получаем строковые данные из базы данных и возвращаем их в виде html-ответа (1 запись в 79 bytes). В качестве базы данных использовался Postgres 11. В качестве драйвера обращений к базе использовался psycopg2 в случае синхронных фреймворков и asyncpg в случае асинхронных.

    В качестве event loop библиотеки для асинхронных фреймворков решили использовать uvloop.

    Результаты

    Запросов в секунду

    Вполне ожидаемые лидирующие позиции aiohttp и Sanic, но неожиданные результаты от Tornado.

    Передача данных в секунду (Кб)

    По количеству переданных данных в секунду Django сильно отстает.

    Среднее время запроса (мс)

    Снова неприятно удивляет Tornado, на который мы изначально делали ставку. Впечатляет Flask, который по среднему времени запроса конкурирует с потенциальными лидерами.

    Максимальное время запроса (сек)

    Все “подопытные” показали практически одинаковые результаты по максимальному времени запроса. Все, как мы и ожидали.

    Финальные результаты

    12 threads

    400 connections

    Avg Max Requests/sec Transfer/sec (KB)
    Latency (ms) Req/Sec Latency (ms) Req/Sec
    Django 147,99 120,91 1,98 640 425,71 78,99
    Flask 186,8 65,65 1,75 280 546,2 127,48
    aiohttp 165,07 247,16 1,98 585 1966,28 439,72
    Sanic 194,8 170,85 1,98 470 1520,9 292,6
    Tornado 279,3 101,71 1,74 272 778,75 222,07

    Итоги

    Aiohttp: лидер по производительности на начало 2019 года. Если ваша задача требует ультимативной производительности — то стоит к нему присмотреться. К тому же можно поэкспериментировать с параметрами запуска Aiohttp, чтобы выжать из него еще больше. Имеет версию клиента, что позволяет без дополнительных библиотек делать асинхронные запросы. Поэтому для реализации своего нового высоконагруженного сервиса мы выбрали его.

    Sanic: популярность фреймворка идет впереди его производительности. Чуда не случилось и обогнать лидера не вышло. В совокупности с тредом на Reddit о проблемах c безопасностью — мы бы не стали использовать Sanic прямо сейчас и подождали действий от разработчиков.

    Tornado: “разочарование года”. В связи с результатами — не думаем, что Tornado стоит выбирать для реализации каких-либо новых проектов. Надеемся разработчики что-нибудь придумают и исправят ситуацию.

    Django показал ожидаемый результат. Мы любим Django за его возможности и избавление нас от рутины, а не за скорость работы. Обширное community, большое количество материалов в Сети, большое количество реализованных проектов в открытом доступе — все это делает его привлекательным для новичков. Если бы у нас стояла задача быстро разработать MVP типичного web-сервиса — мы бы выбрали в 2019 именно его.

    Flask тоже показал ожидаемый результат. Обошел Django за счет того, что имеет не такой богатый функционал из коробки. Не дотянул до скорости асинхронных фреймворков. Мы бы выбрали его в 2019 для реализации небольших pet-проектов или тогда, когда уже важна скорость, но разбираться с асинхронными фреймворками желания еще нет.

    Все исходные файлы бенчмарков вы можете посмотреть в репозитории Python Frameworks Benchmark.

    Оригинал на Habr

    ]]>
    https://chel-center.ru/python-yfc/2019/11/09/samye-bystrye-python-veb-frejmvorki-v-2019/feed/ 0
    Мобильная разработка на Python: Kivy vs BeeWare https://chel-center.ru/python-yfc/2019/11/14/ispolzovanie-python-dlja-mobilnoj-razrabotki-kivy-vs-beeware/ https://chel-center.ru/python-yfc/2019/11/14/ispolzovanie-python-dlja-mobilnoj-razrabotki-kivy-vs-beeware/#respond Thu, 14 Nov 2019 16:40:34 +0000 http://waksoft.susu.ru/?p=27058 Читать далее «Мобильная разработка на Python: Kivy vs BeeWare»

    ]]>
      Разработка мобильных приложений для Android и iOS не была сильной стороной Python в прошлом, но ситуация может измениться…

    Фактически, о разработке на Python под iOS и Android не могло быть и речи. Однако благодаря некоторым изменениям, произошедшим в последние годы, перспектива использования Python для написания мобильных приложений значительно улучшилась.

    Мобильная разработка на Python постепенно прогрессирует. Результатом этого прогресса являются несколько современных инструментов, которые мы рассмотрим в этой статье. Два фреймворка, которые следует выделить — это Kivy и BeeWare.

    Kivy — кроссплатформенная мобильная разработка на Python

    Kivy — это библиотека Python, имеющая открытый код, предназначенная для разработки кроссплатформенных GUI приложений. Она позволяет писать вам приложения с графическим интерфейсом на чистом Python, которые работают на основных платформах (Windows, Linux, MacOS, Android, IOS).

    Теперь каждый раз, когда я слышу о новом GUI toolkit, мне всегда интересно насколько «родным» для меня это будет — я считаю, что GUI приложений должен опираться на сильные стороны платформы, на которой он работает.

    Например, когда я использую свой iPhone, я хочу видеть именно приложение, разработанное специально под IOS. Иногда раздражает использование приложения, которое было разработано с шаблонами пользовательского интерфейса из другой платформы.

    В Kivy встроен настраиваемый набор инструментов пользовательского интерфейса, который предоставляет собственные кнопки, формы ввода текста, radiobutton’ы и т. д. Это означает, что эти виджеты не отображаются с помощью элементов управления пользовательского интерфейса собственной платформы. У этого есть свои плюсы и минусы.

    С одной стороны, это гарантирует нормальное функционирование приложения на различных платформах. С другой стороны, это также означает то, что ваше приложение под Android не будет выглядеть как приложение для Android. Однако всё зависит от типа приложения, которое вы разрабатываете. Например, для большинства игр нативность пользовательского интерфейса не очень важна.

    То же самое относится к определенным видам приложений, таких как графические MIDI-контроллеры для создания музыки. Но для других типов приложений это имеет огромное влияние на удобство использования.

    Итак, если вы можете работать с не нативным набором инструментов пользовательского интерфейса в своих приложениях, Kivy — отличный выбор. Этот фреймворк позволяет вам писать мобильные приложения, используя свои навыки программирования на Python, без необходимости изучать другой язык для определённой платформы, например, Swift от Apple.

    BeeWare Project — нативные мобильные приложения на Python

    Второй Python GUI и фреймворк для разработки под мобильные устройства — BeeWare. Он предлагает набор инструментов, который вы можете использовать для написания мобильных и десктопных приложений с использованием Python.

    Ключевое различие между Kivy и BeeWare в том, что BeeWare использует нативный набор инструментов UI для определённой платформы. Kivy использует кастомный набор инструментов UI, который задействует те же элементы управления на всех платформах.

    В BeeWare UI контроллерами будут кнопки, чекбоксы и другие форменные элементы, предоставляемые системой, под которую разработано приложение. Это означает, что вы можете создавать приложения, которые выглядят и чувствуются стопроцентно нативными для каждой мобильной и десктоп платформы.

    Звучит неплохо, правда?

    Единственным недостатком является то, что проект BeeWare всё ещё находится в разработке, возглавляемой Pythonista Russel Keith-Magee. Как и с любым фреймворком, который ещё не успел развиться, вы работаете в качестве разработчика из-за (потенциально частых) изменений API, ошибок и отсутствия необходимых функций.

    Мобильная разработка на Python: заключение

    Если перед вами встанет выбор между этими двумя фреймворками, то скажу сразу: вам стоит попробовать как Kivy, так и BeeWare. Что касается “зрелости”, то Kivy, на мой взгляд, является более “зрелым” фреймворком.

    В тех случаях, когда речь идёт о создании десктопных приложений на чистом Python, я думаю, что BeeWare в конечном итоге одержит верх из-за нативных UI контроллеров.

    Но, честно говоря, если вы думаете о создании крупного мобильного приложения сегодня, то не имеет смысла писать его на Python. Если вы хотите получить лучший результат и использовать самые современные функции систем, лучше всего вам подойдёт Java (Android) и Swift (IOS).

    Однако я считаю, что это может измениться в будущем. Будущее Python в области мобильных устройств выглядит светлее. Рост популярности Python — большой аргумент в пользу его использования для разработки мобильных приложений.

    Лично я бы хотел иметь возможность писать кроссплатформенные приложения на Python просто потому, что Python – приятный язык для работы.

    Итак, если вы ищете хороший фреймворк с открытым исходным кодом, посмотрите в сторону Kivy и BeeWare.

    Перевод статьи Using Python for Mobile Development: Kivy vs BeeWare

    ]]>
    https://chel-center.ru/python-yfc/2019/11/14/ispolzovanie-python-dlja-mobilnoj-razrabotki-kivy-vs-beeware/feed/ 0
    Как написать телеграмм-бота на Python https://chel-center.ru/python-yfc/2019/11/18/kak-napisat-telegramm-bota-na-python/ https://chel-center.ru/python-yfc/2019/11/18/kak-napisat-telegramm-bota-na-python/#respond Mon, 18 Nov 2019 15:11:27 +0000 http://waksoft.susu.ru/?p=24486 Читать далее «Как написать телеграмм-бота на Python»

    ]]>
    Сие есть краткий видеокурс с просторов Youtube, где наблюдается полный цикл разработки бота на Python без лишнего пафоса. Только практика.

    Знакомство с Bot API Телеграмма, рассказ о ботах, как их создавать и как получать сообщения, отправленные ему. Чем отличаются WebHook и GetUpdate, и об остальном понемножку…

     

    Про JSON объекты, работу с документами загрузкой(POST) и по id, getFile, и по быстрому про остальные методы из API

    Код Html формы из урока тут

     

    Про то, как и в чём написать скрипт, управляющий поведением бота. Обработка текстовых сообщений и команд, знакомство с библиотекой telebot и просто примеры кода — всё тут

     

    Наращиваем функционал нашему боту. Отправка фотографий, аудио и всех остальных методов send_. Скачивание и отправка файла по URL, случайный выбор и чат экшены

     

    Внимательное чтение документации хорошо способствует проникновению в процесс botAPI, документация и примеры кода библиотеки telebot на GitHub

    ]]>
    https://chel-center.ru/python-yfc/2019/11/18/kak-napisat-telegramm-bota-na-python/feed/ 0
    Букварь разработки: полезные трюки Python от А до Z https://chel-center.ru/python-yfc/2020/01/07/bukvar-razrabotki-ot-a-do-z-poleznyh-trjukov-python/ https://chel-center.ru/python-yfc/2020/01/07/bukvar-razrabotki-ot-a-do-z-poleznyh-trjukov-python/#respond Tue, 07 Jan 2020 07:07:46 +0000 http://chel-center.ru/python-yfc/?p=29231 Читать далее «Букварь разработки: полезные трюки Python от А до Z»

    ]]>
    Букварь известных и не очень возможностей Python для простой и приятной разработки. 26 модулей, приемов и хитростей, о которых вы могли не знать.

    Python сейчас находится на пике популярности. Он очень востребован во всех сферах программирования, и это неслучайно, ведь язык:

    Чтобы работать с ним стало еще удобнее, возьмите на вооружение несколько полезных советов. Некоторые из них найдены в документации стандартной библиотеки, другие — в PyPi. Четыре или пять обнаружились на awesome-python.com.

    all or any: все или хоть что-нибудь

    Python — удивительно простой и выразительный язык. Его даже иногда называют «выполняемым псевдокодом». И с этим трудно поспорить, когда вы можете себе позволить конструкции, подобные этим:

    x = [True, True, False]
    
    if any(x):
       print("По крайней мере один элемент True")
    if all(x):
       print("Все элементы True")
    if any(x) and not all(x):
      print("Хотя бы один элемент True и один False")

    bashplotlib: графики в терминале

    А вы знали, что можно строить графики прямо в командной строке? Теперь знаете. За одну из самых удобных возможностей языка отвечает модуль bashplotlib.

    $ pip install bashplotlib

    collections: коллекции на любой вкус

    Встроенные типы данных в Python — высший класс, но иногда хочется чего-то большего. Что ж, если хочется, обратитесь к модулю collections и выбирайте дополнительную структуру на свой вкус.

    from collections import OrderedDict, Counter
    
    # Упорядоченный список сохранит последовательность элементов
    x = OrderedDict(a=1, b=2, c=3)
    
    # Счетчик рассортирует символы по частотам
    y = Counter("Hello World!")

    dir: что внутри?

    Хотелось ли вам когда-нибудь заглянуть в объект и увидеть, какими свойствами он обладает? Разумеется, в Python вы можете это сделать.

    >>> dir()
    >>> dir("Привет, мир!")
    >>> dir(dir)

    Это одна из самых важных возможностей Python для интерактивного запуска и отладки кода. Подробнее функция dir() описана в документации.

    emoji: Python — ?

    Серьезно ?? Абсолютно серьезно ?.

    $ pip install emoji

    Не притворяйтесь, что не будете этого делать.

    from emoji import emojize
    
    print(emojize(":thumbs_up:"))

    __future__: импорт из будущего

    Следствием популярности языка является постоянная разработка новых версий. Это значит, что регулярно появляется множество новых функций и возможностей Python. Но как быть, если у вас устаревшая версия?

    Модуль __future__  позволяет импортировать функциональность из будущего. Это практически путешествие во времени — настоящее волшебство.

    from __future__ import print_function
    
    print("Привет, мир!")

    Попробуйте, например, использовать фигурные скобки.

    geopy: где я нахожусь?

    Программист может легко запутаться в географических объектах, но не с модулем geopy.

    $ pip install geopy

    Он взаимодействует с различными сервисами геокодирования и позволяет легко получить адрес искомого места, а также географические характеристики, включая даже высоту над уровнем моря.

    Кроме того, вы можете подсчитать расстояние между двумя объектами в ваших любимых единицах.

    from geopy import GoogleV3
    
    place = "221b Baker Street, London"
    location = GoogleV3().geocode(place)
    
    print(location.address)
    print(location.location)

    howdoi: StackOverflow прямо в терминале

    Застряли во время разработки и никак не можете поймать за хвост решение, которое уже точно где-то видели? Надо идти на StackOverflow, но не хочется выходить из консоли?

    Тогда вам нужен это суперполезный CLI-инструмент.

    $ pip install howdoi

    Задавайте любой вопрос, howdoi найдет что вам посоветовать.

    $ howdoi vertical align css
    $ howdoi for loop in java
    $ howdoi undo commits in git

    Инструмент собирает самые популярные ответы со StackOverflow, хотя они не всегда могут помочь…

    $ howdoi exit vim

    inspect: что здесь происходит?

    Модуль inspect — отличный помощник, когда нужно разобраться, что происходит в вашем коде. Он может инспектировать даже сам себя!

    В примере метод getsource() применяется, чтобы вывести исходный код inspect. А getmodule() распечатает модуль, в котором он был определен.

    Последняя строчка просто выводит номер строки.

    import inspect
    
    print(inspect.getsource(inspect.getsource))
    print(inspect.getmodule(inspect.getmodule))
    print(inspect.currentframe().f_lineno)

    Конечно же, эти примитивные примеры не описывают все возможности модуля inspect. Это отличное решение для создания самодокументированного кода.

    Jedi: будь джедаем

    Библиотека создана для автодополнения в процессе разработки и статического анализа. С ней можно кодить быстрее и продуктивнее.

    Jedi можно подключить как плагин для редактора. Но возможно, что вы уже имеете с ней дело. Например, IPython использует ее функциональность.

    **kwargs: словарь аргументов

    Понимание таинственного звездного синтаксиса — важный этап в изучении Python.

    Двойная звездочка означает, что содержимое словаря kwargs будет передаваться в функцию в виде именованных аргументов. При этом ключи станут именами параметров.

    Нет необходимости использовать именно слово kwargs, это лишь общепринятый пример.

    dictionary = {"a": 1, "b": 2}
    
    def someFunction(a, b):
      print(a + b)
      return
    
    # а это то же самое:
    someFunction(**dictionary)
    someFunction(a=1, b=2)

    Это полезно, если вы создаете функцию, которая оперирует именованными аргументами, не определенными на стадии написания кода.

    List comprehensions: Генераторы списков

    Одна из самых удобных возможностей Python — это генераторы списков. Написанный с их помощью код выглядит очень чистым и легко читается, практически как обычный человеческий язык.

    numbers = [1,2,3,4,5,6,7]
    evens = [x for x in numbers if x % 2 is 0]
    odds = [y for y in numbers if y not in evens]
    
    
    cities = ['Лондон', 'Дублин', 'Осло']
    
    def visit(city):
       print("Добро пожаловать в " + city)
    
    for city in cities:
       visit(city)

    Если вы хотите узнать о генераторах больше, загляните сюда.

    map: перебор коллекций

    Существует много встроенных возможностей Python, предназначенных для программирования в функциональном стиле. Среди них метод map(), который в паре с лямбда-функциями творит чудеса.

    x = [1, 2, 3]
    y = map(lambda x : x + 1 , x)
    
    # выведет [2,3,4]
    print(list(y))

    Для каждого элемента коллекции x выполняется простая функция. Результатом работы метода map() является специальный объект, который легко конвертировать в любую итерируемую структуру, например, в список.

    newspaper3k: все новости мира

    Модуль newspaper позволяет получать новостные статьи из ведущих международных изданий. Доступны изображения, авторы и даже некоторые встроенные методы обработки естественного языка.

    Так что если вы думали об использовании BeautifulSoup или какой-либо другой библиотеки вебскраппинга, не тратьте время и просто возьмите newspape.

    $ pip install newspaper3k

    Operator overloading: перегрузка операторов

    Термин перегрузка операторов звучит так глубокомысленно, что произнося его, вы выглядите как настоящий ученый в области компьютерных наук. На самом же деле это очень простая концепция.

    Например, вы думали о том, почему с помощью оператора + можно и складывать числа, и конкатенировать строки? Это живой пример перегрузки.

    Можно создать объекты, которые по-своему интерпретируют обычные операторы языка.

    class Thing:
      def __init__(self, value):
        self.__value = value
    
        # перегрузка оператора >
        def __gt__(self, other):
          return self.__value > other.__value
    
        # перегрузка оператора <
        def __lt__(self, other):
          return self.__value < other.__value
    
    something = Thing(100)
    nothing = Thing(0)
    
    # True
    something > nothing
    
    # False
    something < nothing
    
    # Error
    something + nothing

    pprint: красивая печать

    Функция print отлично справляется со своей работой. Но если вы захотите вывести на печать какой-нибудь громоздкий многоуровневый объект, результат будет довольно уродливым.

    На помощь спешит модуль pretty-print из стандартной библиотеки. Он предоставляет массу возможностей Python для тех, кто имеет дело с нетривиальными структурами и сложными объектами. Теперь все что угодно можно вывести в удобном для чтения формате.

    import requests
    import pprint
    
    url = 'https://randomuser.me/api/?results=1'
    users = requests.get(url).json()
    
    pprint.pprint(users)

    Queue: реализация очередей

    Python позволяет многопоточную разработку, а модуль Queue дает возможность создавать очереди. Это особые структуры данных, элементы которых добавляются и извлекаются по определенным правилам.

    Например, FIFO-очереди (первый на вход — первый на выход) отдают элементы в том порядке, в котором они были добавлены. LIFO-очереди (последний на вход — первый на выход), наоборот, дают доступ к элементу, добавленному последним. И наконец, в приоритетных очередях значение имеет порядок сортировки.

    Взгляните, как применяются очереди для многопоточного программирования.

    __repr__: вывод в виде строки

    Когда вы создаете собственный класс или объект, для него следует предоставить способ строкового вывода. Это может выглядеть примерно так:

    >>> file = open('file.txt', 'r')
    >>> print(file)
    <open file 'file.txt', mode 'r' at 0x10d30aaf0>

    Прежде всего это нужно для удобной отладки, поэтому не ленитесь добавлять вашим классам метод __repr__. А если вам нужно красивое строковое представление для пользовательского интерфейса, пригодится метод __str__.

    class someClass:
      def __repr__(self):
        return "<какое-то описание>"
    
    someInstance = someClass()
    
    # выведет <какое-то описание>
    print(someInstance)

    sh: команды терминала прямо из кода

    Порой применение стандартных библиотек os и subprocess превращается в головную боль для разработчика. Но есть удобная альтернатива — библиотека sh.

    Она дает возможность вызвать программу, как если бы это была просто функция языка. Таким образом, можно автоматизировать процессы и задачи непосредственно из кода Python.

    from sh import *
    
    sh.pwd()
    sh.mkdir('new_folder')
    sh.touch('new_file.txt')
    sh.whoami()
    sh.echo('This is great!')

    Type hints: указания типов

    Типизация в Python динамическая, поэтому нам не нужно определять конкретные типы данных для переменных и параметров функций.

    Да, это ускоряет процесс разработки, но нет ничего более раздражающего, чем ошибки типов, возникающие во время выполнения.

    В современном стандарте Python появилась возможность добавлять определение типа на стадии разработки.

    def addTwo(x : Int) -> Int:
      return x + 2

    Для типов можно даже создавать псевдонимы:

    from typing import List
    
    Vector = List[float]
    Matrix = List[Vector]
    
    def addMatrix(a : Matrix, b : Matrix) -> Matrix:
      result = []
    
      for i,row in enumerate(a):
        result_row =[]
        for j, col in enumerate(row):
          result_row += [a[i][j] + b[i][j]]
        result += [result_row]
      return result
    
    x = 1.0, 0.0], [0.0, 1.0
    y = 2.0, 1.0], [0.0, -2.0
    
    z = addMatrix(x, y)

    Подобные аннотации необязательны, но они делают код проще, а также дают возможность использовать инструменты автоматического анализа для отлова случайных ошибок. Очень полезная вещь в больших проектах!

    uuid

    Одна из встроенных возможностей Python — генерация универсальных уникальных идентификаторов. За это отвечает модуль uuid.

    import uuid
    
    user_id = uuid.uuid4()
    
    print(user_id)

    Результат работы этого кода — одно из 2122 возможных 128-битных чисел. Вероятность дублирования меньше, чем одна миллиардная доля — это совсем неплохо.

    Virtual environments: виртуальные среды

    Одна из самых полезных возможностей Python.

    Часто бывает так, что два проекта используют одну и ту же зависимость, но в разных версиях. Что вы устанавливаете в этом случае?

    Нет нужды делать сложный выбор, ведь Python поддерживает виртуальные среды.

    python -m venv my-project
    source my-project/bin/activate
    pip install all-the-modules

    На одном компьютере теперь может работать сразу несколько автономных версий языка.

    wikipedia: мировые запасы информации к вашим услугам

    Википедия имеет отличный API для программного доступа к огромному количеству информации, а модуль wikipedia позволяет с легкостью с ним взаимодействовать.

    import wikipedia
    
    result = wikipedia.page('freeCodeCamp')
    
    print(result.summary)
    
    for link in result.links:
      print(link)

    Как и сам сайт, модуль поддерживает несколько языков, позволяет случайно выбирать страницу и даже имеет метод donate().

    xkcd: комиксы

    Язык получил свое название в честь комедийного шоу Монти Пайтона, поэтому у него неплохое чувство юмора. В документации множество отсылок к известным скетчам, но это еще не все. Просто запустите эту команду:

    import antigravity

    Ты прекрасен, Python!

    YAML

    YAML — это надмножество JSON, предназначенное для форматирования данных. Он отлично справляется со сложными объектами, поддерживает комментарии и даже способен обрабатывать циклические ссылки. В целом это идеальный выбор для создания файлов конфигурации.

    Ряд возможностей для комбинации YAML и Python дает модуль PyYAML.

    Просто инсталлируйте его:

    $ pip install pyyaml

    и используйте в вашем проекте:

    import yaml

    Теперь можно с удобством хранить данные любого типа.

    zip: упаковка нескольких коллекций

    Последняя, но не худшая, из букваря возможностей Python — функция zip(). Используйте ее, если необходимо объединить два списка в один словарь:

    keys = ['a', 'b', 'c']
    vals = [1, 2, 3]
    
    zipped = dict(zip(keys, vals))

    На вход метод принимает итерируемые объекты, на выходе получается список кортежей сгруппированных по индексу элементов.

    Вы также можете «распаковать» объекты, вызвав функцию zip(*list).

    Надеемся, что в A-Z списке возможностей Python вы нашли что-нибудь полезное для своих проектов. Делитесь вашими любимыми трюками в комментариях.

    Оригинал: An A-Z of useful Python tricks

    ]]>
    https://chel-center.ru/python-yfc/2020/01/07/bukvar-razrabotki-ot-a-do-z-poleznyh-trjukov-python/feed/ 0