Новости/События — PYTHON https://chel-center.ru/python-yfc курс молодого бойца Tue, 23 Feb 2021 04:09:40 +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 Новости/События — PYTHON https://chel-center.ru/python-yfc 32 32 Дзен Python на русском https://chel-center.ru/python-yfc/2019/09/30/dzen-pitona-na-russkom/ https://chel-center.ru/python-yfc/2019/09/30/dzen-pitona-na-russkom/#comments Mon, 30 Sep 2019 06:20:03 +0000 http://waksoft.susu.ru/?p=26480 Читать далее «Дзен Python на русском»

]]>
Разработчики языка Python придерживаются определённой философии программирования, называемой «The Zen of Python» («Дзен Питона», или «Дзен Пайтона»). Её текст выдаётся интерпретатором Python по команде import this (работает один раз за сессию).

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

Текст философии

  • Красивое лучше, чем уродливое.
  • Явное лучше, чем неявное.
  • Простое лучше, чем сложное.
  • Сложное лучше, чем запутанное.
  • Плоское лучше, чем вложенное.
  • Разреженное лучше, чем плотное.
  • Читаемость имеет значение.
  • Особые случаи не настолько особые, чтобы нарушать правила.
  • При этом практичность важнее безупречности.
  • Ошибки никогда не должны замалчиваться.
  • Если они не замалчиваются явно.
  • Встретив двусмысленность, отбрось искушение угадать.
  • Должен существовать один и, желательно, только один очевидный способ сделать это.
  • Хотя он поначалу может быть и не очевиден, если вы не голландец [^1].
  • Сейчас лучше, чем никогда.
  • Хотя никогда зачастую лучше, чем прямо сейчас.
  • Если реализацию сложно объяснить — идея плоха.
  • Если реализацию легко объяснить — идея, возможно, хороша.
  • Пространства имён — отличная штука! Будем делать их больше!

Автор этой философии — Тим Петерс. Оригинал на английском:

λ python
Python 3.6.2 (v3.6.2:5fd33b5, Jul  8 2017, 04:14:34) [MSC v.1900 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
]]>
https://chel-center.ru/python-yfc/2019/09/30/dzen-pitona-na-russkom/feed/ 1
Практикум №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
Hello, World или 5 шагов в Github https://chel-center.ru/python-yfc/2019/10/01/hello-world-ili-5-shagov-v-github/ https://chel-center.ru/python-yfc/2019/10/01/hello-world-ili-5-shagov-v-github/#respond Tue, 01 Oct 2019 01:38:01 +0000 http://chel-center.ru/python-yfc/?p=56 Читать далее «Hello, World или 5 шагов в Github»

]]>
Проект Hello World — давняя традиция в компьютерном мире. Традиционно, с этого простого упражнения вы начинаете постигать что-то новое. Давайте начнем знакомится с GitHub!

Вы узнаете,

  • как создать и использовать репозиторий;
  • как создать и управлять новой веткой;
  • как внесите изменения в файл и отправлять их на GitHub в качестве коммитов;
  • как создать и объединить запрос на подключение.

Что такое GitHub?

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

Здесь вы узнаете основы GitHub, что такое репозитории, ветки, коммиты и запросы на подключение. Вы создадите свой собственный репозиторий Hello World и поймете рабочий процесс GitHub’s Pull Request, популярный способ создания и просмотра кода.

Нет необходимости кодировать

Чтобы пройти этот урок, нужна учетная запись на GitHub.com и доступ в Интернет. Не нужно знать, как кодировать, использовать командную строку или устанавливать Git (программное обеспечение для контроля версий, на котором построен GitHub).

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

Делай 1. Создайте репозиторий

Хранилище обычно используется для организации проекта. Репозитории могут содержать папки и файлы, изображения, видео, электронные таблицы и наборы данных — все, что нужно вашему проекту. Мы рекомендуем начать с файла README или с файл, содержащего описание и информацию о вашем проекте. В GitHub это делается очень просто при создании своего нового репозитория. Кроме того, предлагается описать другие общие атрибуты проекта, например, файл лицензии.

Ваш репозиторий hello-world может быть местом, где вы храните свои идеи, ресурсы или делитесь и обсуждаете полезные вещи с другими.

Создать новый репозиторий

  • В правом верхнем углу, рядом с вашим аватаром или идентификатором, нажмите и затем выберите New repository.
  • Назовите свой репозиторий hello-world.
  • Сделайте краткое описание.
  • Выберите Initialize this repository with a README.
Создание репозитаррия
Создание репозитаррия

Нажмите Create repository..

Делай 2. Создайте ветку

Ветвление — способ одновременной работы с разными версиями хранилища.

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

Когда вы создаете новую ветку, отличную от master, то делаете копию или снимок master на текущий момент. Если ещё кто-то внес изменения в ветку master одновременно с вами, то вы сможете утвердить эти обновления.

На диаграмме показано:

  • master филиал.
  • Новая ветвь под названием feature (после выполнения ‘Feature Work‘ в этой ветке).
  • Траектория, по которое проходит ветка feature прежде чем она объединится с master.
Ветки репозитария Github
Ветки репозитария Github

Вы когда-нибудь сохраняли разные версии файла? Например:

  • story.txt
  • story-joe-edit.txt
  • story-joe-edit-reviewed.txt

Это аналогично в репозиториях GitHub.

Здесь, на GitHub, наши разработчики, писатели и дизайнеры используют ветки для хранения исправлений ошибок и работы с функциями отдельно от нашей master(производственной) ветки. Когда изменение закончены, они объединяют c веткой с master.

Создать новую ветку

  • Зайдите в свой новый репозиторий hello-world.
  • Нажмите на раскрывающийся список в верхней части списка файлов с надписью branch: master.
  • Введите название ветви readme-edits в текстовое поле новой ветви.
  • Выберите синий бокс Create branch или нажмите «Enter» на клавиатуре.
Создать новую ветку
Создать новую ветку

Теперь у вас есть две ветки: master и readme-edits. Они выглядят точно так же, но не надолго! Далее мы добавим свои изменения в новую ветку.

Делай 3. Внесите и сохраните изменения

Браво! Теперь вы находитесь в вашей ветке readme-edits, которая является копией master. Давайте внесем некоторые изменения.

На GitHub сохраненные изменения называются commits. Каждый commit имеет соответствующее commit message, которое представляет собой комментарий к сделанным конкретным изменениям. Сообщения регистрируются в историю ваших изменений для того, чтобы другие участники могли понять, что же вы сделали и почему.

Вносить и фиксировать изменения

  • Нажмите на файл README.md.
  • Нажмите на значок карандаша в правом верхнем углу окна файла для редактирования.
  • В редакторе напишите немного о себе.
  • Напишите commit, который описывает ваши изменения.
  • Нажмите кнопку «Commit changes».
Фиксируем изменения
Фиксируем изменения

Эти изменения будут внесены только в файл README в вашей ветви readme-edits, так что теперь эта ветвь содержит контент, отличный от master.

Делай 4. Откройте запрос на извлечение

Хорошие правки! Теперь, когда у вас есть изменения в ветке отличной от master, вы можете открыть pull request.

Pull Requests — это сердце сотрудничества на GitHub. Когда вы открываете Pull Requests, вы предлагаете свои изменения и просите, чтобы кто-то проверил и внес их в свою ветку. Pull Requests показывают различия в содержимом обеих веток. Изменения, дополнения и удаления показаны зеленым и красным.

Как только вы сделаете Commit, вы можете открыть Pull Requests и начать обсуждение, даже при незавершенном коде.

Используя систему @mention от GitHub в своем сообщении о Pull Requests, вы можете попросить обратную связь от конкретных людей или команд, вне зависимости от того, находятся они рядом или в 10 часовых поясах.

Вы даже можете открывать Pull Requests в своем собственном репозитории и объединять их самостоятельно. Это отличный способ изучить поток GitHub перед началом работы над большими проектами.

Откройте Pull Requests в README

1
1

Когда вы закончите со своим сообщением, нажмите Create pull request!

Совет : вы можете использовать эмодзи и перетаскивать изображения и картинки в Commit и Pull request.

Делай 5. Объедините свой Pull request

На этом последнем этапе пришло время объединить ваши изменения — ветку readme-edits c веткой master.

  • Нажмите зелёную кнопку Merge pull request button для переноса изменений в master.
  • Нажмите Confirm merge.
  • Продолжите и удалите свою ветку, так как изменения сохранены в master, для чего нажмите кнопку Delete branch в фиолетовом поле.

Идите дальше и удалите ветку, так как ее изменения были включены, с помощью кнопки Удалить ветку в фиолетовом поле.

Слияние своей ветки с веткой master
Слияние своей ветки с веткой master

Удаление ветки readme-edits
Удаление ветки readme-edits

Радуйтесь!

Сделав это упражнение, вы научились создавать проект и отправлять запросы на GitHub!

Вот результат урока:

Создан репозиторий с открытым исходным кодом
Начал и управлял новым филиалом
Изменил файл и передал эти изменения в GitHub
Открыт и объединен запрос на извлечение
Взгляните на свой профиль GitHub, и вы увидите ваши новые квадраты вклада !

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

Совет : ознакомьтесь с другими нашими руководствами, каналом YouTube и обучением по требованию, чтобы узнать больше о том, как начать работу с GitHub.

Перевод: Hello World

]]>
https://chel-center.ru/python-yfc/2019/10/01/hello-world-ili-5-shagov-v-github/feed/ 0
Встроенные функции Python: какие нужно просто знать https://chel-center.ru/python-yfc/2019/10/01/vstroennye-funkcii-python-kakie-nuzhno-znat-i-na-kakie-ne-stoit-tratit-vremja/ https://chel-center.ru/python-yfc/2019/10/01/vstroennye-funkcii-python-kakie-nuzhno-znat-i-na-kakie-ne-stoit-tratit-vremja/#respond Tue, 01 Oct 2019 01:39:15 +0000 http://waksoft.susu.ru/?p=27325 Читать далее «Встроенные функции Python: какие нужно просто знать»

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

Чтобы разобраться, на какие функции стоит обратить внимание, их следует разделить на группы:

  • общеизвестные: почти все новички используют эти функции и довольно часто (print, len, str, int, float, list, tuple, dict, set, range);
  • неочевидные для новичков: об этих функциях полезно знать, но их легко пропустить, когда вы новичок в Python (bool, enumerate, zip, reversed, sum, min и max, sorted, any и all);
  • понадобятся позже: об этих встроенных функциях полезно помнить, чтобы найти их потом, когда/если они понадобятся (open, input, repr, super, property, issubclass и isinstance, hasattr, getattr, setattr и delattr, classmethod и staticmethod, next);
  • можно изучить когда-нибудь: это может пригодиться, но только при определённых обстоятельствах;
  • скорее всего, они вам не нужны: они вряд ли понадобятся, если вы не занимаетесь чем-то достаточно специализированным.

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

Общеизвестные функции

Если вы уже писали код на Python, эти модули должны быть вам знакомы.

print

Вряд ли найдётся разработчик, даже начинающий, который не знает эту функцию вывода. Как минимум реализация «Hello, World!» требует использования данного метода. Но вы можете не знать о различных аргументах, которые можно передавать в print.

>>> words = ["Welcome", "to", "Python"]
>>> print(words)
['Welcome', 'to', 'Python']
>>> print(*words, end="!\n")
Welcome to Python!
>>> print(*words, sep="\n")
Welcome
to
Python

len

В Python нет синтаксиса вроде my_list.length() или my_string.length, вместо этого используются поначалу непривычные конструкции len(my_list) и len(my_string).

>>> words = ["Welcome", "to", "Python"]
>>> len(words)

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

str

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

>>> version = 3
>>> "Python " + version
Traceback (most recent call last):
  File "", line 1, in 
TypeError: can only concatenate str (not "int") to str

Python отказывается приводить целое число 3 к типу строка, поэтому нужно сделать это самостоятельно, используя встроенную функцию str (технически это класс, но с целью уменьшить количество ненужной информации будем принимать все методы за функции).

>>> version = 3
>>> "Python " + str(version)
'Python 3'

int

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

>>> program_name = "Python 3"
>>> version_number = program_name.split()[-1]
>>> int(version_number)
3

Эту функцию также можно использовать для отсечения дробной части у числа с плавающей точкой.

>>> from math import sqrt
>>> sqrt(28)
5.291502622129181
>>> int(sqrt(28))
5

Обратите внимание, если нужно обрезать дробную часть при делении, оператор «//» более уместен (с отрицательными числами это работает иначе).

int (3/2) == 3 // 2

float

Если строка, которую надо конвертировать в число, не является целым числом, здесь поможет метод float.

>>> program_name = "Python 3"
>>> version_number = program_name.split()[-1]
>>> float(version_number)
3.0
>>> pi_digits = '3.141592653589793238462643383279502884197169399375'
>>> len(pi_digits)
50
>>> float(pi_digits)
3.141592653589793

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

В Python 2 такое преобразование необходимо, но в Python 3 целочисленное деление больше не является чем-то особенным (если вы специально не используете оператор «//»). Поэтому больше не нужно использовать float для этой цели, теперь float(x)/y можно легко заменить на x/y.

list

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

>>> numbers = [2, 1, 3, 5, 8]
>>> squares = (n**2 for n in numbers)
>>> squares
 at 0x7fd52dbd5930>
>>> list_of_squares = list(squares)
>>> list_of_squares
[4, 1, 9, 25, 64]

При работе со списком метод copy позволяет создать его копию.

>>> copy_of_squares = list_of_squares.copy()

Если вы не знаете, с какими элементами работаете, функция list является более общим способом перебора элементов и их копирования.

>>> copy_of_squares = list(list_of_squares)

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

Обратите внимание, когда вы хотите создать пустой список, следует использовать буквальный синтаксис списка («[ ]»).

>>> my_list = list()  # Так делать нельзя
>>> my_list = []      # Так можно

Использование «[ ]» считается более идиоматическим, так как эти скобки на самом деле выглядят как список Python.

tuple

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

>>> numbers = [2, 1, 3, 4, 7]
>>> tuple(numbers)
(2, 1, 3, 4, 7)

Если вы пытаетесь создать хешируемую коллекцию (например, ключ словаря), стоит отдать предпочтению кортежу вместо списка.

dict

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

>>> color_counts = [('red', 2), ('green', 1), ('blue', 3), ('purple', 5)]

Выведем его на экран с помощью цикла.

>>> colors = {}
>>> for color, n in color_counts:
...     colors[color] = n
...
>>> colors
{'red': 2, 'green': 1, 'blue' 3, 'purple': 5}>

То же самое, но с использованием dist.

>>> colors = dict(color_counts)
>>> colors
{'red': 2, 'green': 1, 'blue' 3, 'purple': 5}>

Функция dist может принимать 2 типа аргументов:

  • другой словарь: в этом случае этот словарь будет скопирован;
  • список кортежей «ключ-значение»: в этом случае из этих слов будет создан новый словарь.

Поэтому следующий код также будет работать.

>>> colors
{'red': 2, 'green': 1, 'blue' 3, 'purple': 5}
>>> new_dictionary = dict(colors)
>>> new_dictionary
{'red': 2, 'green': 1, 'blue' 3, 'purple': 5}

Функция dict также может принимать ключевые слова в качестве аргументов для создания словаря со строковыми ключами.

>>> person = dict(name='Trey Hunner', profession='Python Trainer')
>>> person
{'name': 'Trey Hunner', 'profession': 'Python Trainer'}

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

>>> person = {'name': 'Trey Hunner', 'profession': 'Python Trainer'}
>>> person
{'name': 'Trey Hunner', 'profession': 'Python Trainer'}

Такой синтаксис более гибок и немного быстрее. Но самое главное он более чётко передаёт факт того, что вы создаёте именно словарь.

Как в случае со списком и кортежем, пустой словарь следует создавать с использованием буквального синтаксиса («{}»).

>>> my_list = dict()  # Так делать нельзя
>>> my_list = {}  # Так можно

Использование «{}» более идиоматично и эффективно с точки зрения использования процессора. Обычно для создания словарей используются фигурные скобки, dict встречается гораздо реже.

set

Функция set создаёт новый набор. Она принимает итерации из хешируемых значений (строк, чисел или других неизменяемых типов) и возвращает set.

>>> numbers = [1, 1, 2, 3, 5, 8]
>>> set(numbers)
{1, 2, 3, 5, 8}

Создать пустой набор с «{}» нельзя (фигурные скобки создают пустой словарь). Поэтому функция set — лучший способ создать пустой набор.

>>> numbers = set()
>>> numbers
set()

Можно использовать и другой синтаксис.

>>> {*()}  # Так можно создать пустой набор
set()

Такой способ имеет недостаток — он сбивает с толку (он основан на редко используемой функции оператора *), поэтому он не рекомендуется.

range

Эта функция создаёт объект range, который представляет собой диапазон чисел.

>>> range(10_000)
range(0, 10000)
>>> range(-1_000_000_000, 1_000_000_000)
range(-1000000000, 1000000000)

Результирующий диапазон чисел включает начальный номер, но исключает конечный (range(0, 10) не включает 10). Данная функция полезна при переборе чисел.

>>> for n in range(0, 50, 10):
...     print(n)
...
0
10
20
30
40

Обычный вариант использования — выполнить операцию n раз.

first_five = [get_things() for _ in range(5)]

Функция range в Python 2 возвращает список. Это означает, что примеры кода выше будут создавать очень большие списки. Range в Python 3 работает как xrange в Python 2. Числа вычисляются «более лениво» при проходе по диапазону.

Функции, неочевидные для новичков

bool

Эта функция проверяет достоверность (истинность) объектов Python. Относительно чисел будет выполняться проверка на неравенство нулю.

>>> bool(5)
True
>>> bool(-1)
True
>>> bool(0)
False

Применяя bool к коллекциям, будет проверяться их длина (больше 0 или нет).

>>> bool('hello')
True
>>> bool('')
False
>>> bool(['a'])
True
>>> bool([])
False
>>> bool({})
False
>>> bool({1: 1, 2: 4, 3: 9})
True
>>> bool(range(5))
True
>>> bool(range(0))
False
>>> bool(None)
False

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

# Вместо этого
if len(numbers) == 0:
    print("The numbers list is empty")

# многие делают так
if not numbers:
    print("The numbers list is empty")

Данная функция используется редко. Но, если нужно привести значение к логическому типу для проверки его истинности, bool вам необходима.

enumerate

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

>>> with open('hello.txt', mode='rt') as my_file:
...     for n, line in enumerate(my_file, start=1):
...         print(f"{n:03}", line)
...
001 This is the first line of the file
002 This is the second line
003 This is the last line of the file

Enumerate также часто используется для отслеживания индекса элементов в последовательности.

def palindromic(sequence):
    """Возвращает True, если последовательность является палиндромом."""
    for i, item in enumerate(sequence):
        if item != sequence[-(i+1)]:
            return False
    return True

Также следует обратить внимание, что новички в Python часто используют range(len(sequence)). Если вы когда-нибудь встретите конструкции типа range(len(...)), лучше заменить её на enumerate. Она поможет упростить конструкцию операторов.

def palindromic(sequence):
    """Возвращает True, если последовательность является палиндромом."""
    for i in range(len(sequence)):
        if sequence[i] != sequence[-(i+1)]:
            return False
    return True

zip

Эта функция ещё более специализирована, чем enumerate. Zip используется для перебора сразу нескольких объектов одновременно.

>>> one_iterable = [2, 1, 3, 4, 7, 11]
>>> another_iterable = ['P', 'y', 't', 'h', 'o', 'n']
>>> for n, letter in zip(one_iterable, another_iterable):
...     print(letter, n)
...
P 2
y 1
t 3
h 4
o 7
n 11

По сравнению с enumerate, последняя функция удобна, когда нужна индексация во время цикла. Если нужно обрабатывать несколько объектов одновременно, zip предпочтительнее enumerate.

reversed

Функция reversed, как enumerate и zip, возвращает итератор.

>>> numbers = [2, 1, 3, 4, 7]
>>> reversed(numbers)

Единственное, что можно сделать с этим итератором, пройтись по нему (но только один раз).

>>> reversed_numbers = reversed(numbers)
>>> list(reversed_numbers)
[7, 4, 3, 1, 2]
>>> list(reversed_numbers)
[]

Подобно enumerate и zip, reversed является своего рода вспомогательной функцией в циклах. Её использование можно увидеть исключительно в цикле for.

>>> for n in reversed(numbers):
...     print(n)
...
7
4
3
1
2

Есть несколько и других способов перевернуть списки в Python.

# Синтаксис нарезки
for n in numbers[::-1]:
    print(n)

# Метод переворота на месте
numbers.reverse()
for n in numbers:
    print(n)

Данная функция, как правило, является лучшим способом «перевернуть» любой список (а также набор, массив и т. д.) в Python. В отличие от numbers.reverse(), reversed не изменяет список, а возвращает итератор перевёрнутых элементов. reversed(numbers) (в отличие от numbers [::-1]) не создает новый список. Возвращаемый им итератор извлекает следующий элемент в обратном порядке при проходе по циклу. Также синтаксис reversed(numbers) намного более читабелен, чем numbers [::-1].

Можно использовать факт, что reversed не копирует список. Если объединить его с функцией zip, можно переписать функцию palindromic (из раздела enumerate), не занимая дополнительной памяти (не копируя объект).

def palindromic(sequence):
    """Возвращает True, если последовательность является палиндромом."""
    for n, m in zip(sequence, reversed(sequence)):
        if n != m:
            return False
    return True

sum

Эта функция берёт набор чисел и возвращает их сумму.

>>> sum([2, 1, 3, 4, 7])
17

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

>>> numbers = [2, 1, 3, 4, 7, 11, 18]
>>> sum(n**2 for n in numbers)
524

min и max

Эти функции выдают минимальное и максимальное число из набора соответственно.

>>> numbers = [2, 1, 3, 4, 7, 11, 18]
>>> min(numbers)
1
>>> max(numbers)
18

Данные методы сравнивают элементы, используя оператор <. Поэтому, все передаваемые в них значения должны быть упорядочены и сопоставимы друг с другом. Min и max также принимают key-свойство, позволяющее настроить, что на самом деле означают «минимум» и «максимум» для конкретных объектов.

>>> fruits = ['kumquat', 'Cherimoya', 'Loquat', 'longan', 'jujube']
>>> sorted(fruits, key=len)
['Loquat', 'longan', 'jujube', 'kumquat', 'Cherimoya']

sorted

Эта функция принимает любой набор элементов и возвращает новый список всех значений в отсортированном порядке.

>>> numbers = [1, 8, 2, 13, 5, 3, 1]
>>> words = ["python", "is", "lovely"]
>>> sorted(words)
['is', 'lovely', 'python']
>>> sorted(numbers, reverse=True)
[13, 8, 5, 3, 2, 1, 1]

Данная функция (как min и max) сравнивает элементы, используя оператор <, поэтому все значения, переданные ей, должны быть упорядочены. Sorted также позволяет настраивать сортировку с помощью key-свойства.

any и all

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

Используя all, можно переписать функцию palindromic следующим образом.

def palindromic(sequence):
    """Возвращает True, если последовательность является палиндромом."""
    return all(
        n == m
        for n, m in zip(sequence, reversed(sequence))
    )

Отрицание условия и возвращаемого значения позволит также использовать any в этом примере точно также (что усложнит конструкцию, но вполне сойдёт в качестве примера использования).

def palindromic(sequence):
    """Возвращает True, если последовательность является палиндромом."""
    return not any(
        n != m
        for n, m in zip(sequence, reversed(sequence))
    )

5 функций для отладки

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

breakpoint

Если нужно приостановить выполнение кода и перейти в командную строку Python, эта функция вам пригодится. Вызов breakpoint перебросит вас в отладчик Python. Эта встроенная функция была добавлена в Python 3.7, но если вы работаете в более старых версиях, можете получить тот же результат с помощью import pdb; pdb.set_trace().

dir

Эта функция может использоваться в двух случаях:

  • просмотр списка всех локальных переменных;
  • просмотр списка всех атрибутов конкретного объекта.

Из примера можно увидеть локальные переменные сразу после запуска и после создания новой переменной x.

>>> dir()
['__annotations__', '__doc__', '__name__', '__package__']
>>> x = [1, 2, 3, 4]
>>> dir()
['__annotations__', '__doc__', '__name__', '__package__', 'x']

Если в dir передать созданный список x, на выходе можно увидеть все его атрибуты.

>>> dir(x)
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

В выведенном списке атрибутов можно увидеть его типичные методы (append, pop, remove и т. д.) , а также множество более сложных методов для перегрузки операторов.

vars

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

>>> vars()
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': , '__spec__': None, '__annotations__': {}, '__builtins__': }

Когда вызов происходит с аргументом, vars получает доступ к атрибуту __dict__, который представляет собой словарь всех атрибутов экземпляра.

>>> from itertools import chain
>>> vars(chain)
mappingproxy({'__getattribute__': , '__iter__': , '__next__': , '__new__': , 'from_iterable': , '__reduce__': , '__setstate__': , '__doc__': 'chain(*iterables) --> chain object\n\nReturn a chain object whose .__next__() method returns elements from the\nfirst iterable until it is exhausted, then elements from the next\niterable, until all of the iterables are exhausted.'})

Перед использованием vars было бы неплохо сначала обратиться к dir.

type

Эта функция возвращает тип объекта, который вы ей передаете.

Тип экземпляра класса есть сам класс.

>>> x = [1, 2, 3]
>>> type(x)

Тип класса — это его метакласс, обычно это type.

>>> type(list)

>>> type(type(x))

Атрибут __class__ даёт тот же результат, что и функция type, но рекомендуется использовать второй вариант.

>>> x.__class__
>>> type(x)

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

help

Если вы находитесь в Python Shell или делаете отладку кода с использованием breakpoint, и хотите знать, как работает определённый объект, метод или атрибут, функция help поможет вам. В действительности вы, скорее всего, будете обращаться за помощью к поисковой системе. Но если вы уже находитесь в Python Shell, вызов help(list.insert) будет быстрее, чем поиск документации в Google.

Функции, которые пригодятся позже

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

open

Эта функция служит для открытия файла и последующей работы с ним. Но, если вы не работаете с файлами напрямую, то она вам может и не пригодиться. Несмотря на то, что работа с файлами очень распространена, далеко не все программисты Python работают с файлами через open. Например, разработчики Django могут не использовать её вообще.

input

Эта функция запрашивает у пользователя ввод, ждёт нажатия клавиши Enter, а затем возвращает набранный текст. Чтение из стандартного ввода — это один из способов получить входные данные в программе. Но есть и много других способов: аргументы командной строки, чтение из файла, чтение из базы данных и многое другое.

repr

Эта функция необходима для представления объекта в читабельном виде. Для многих объектов функции str и repr работают одинаково.

>>> str(4), repr(4)
('4', '4')
>>> str([]), repr([])
('[]', '[]')

Но есть объекты, для которых их применение различается.

>>> str('hello'), repr("hello")
('hello', "'hello'")
>>> from datetime import date
>>> str(date(2020, 1, 1)), repr(date(2020, 1, 1))
('2020-01-01', 'datetime.date(2020, 1, 1)')

Строковое представление, которое вы видите в Python Shell, использует repr, тогда как функция print использует str.

>>> date(2020, 1, 1)
datetime.date(2020, 1, 1)
>>> "hello!"
'hello!'
>>> print(date(2020, 1, 1))
2020-01-01
>>> print("hello!")
hello!

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

super

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

property

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

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

class Circle:

    def __init__(self, radius=1):
        self.radius = radius

    @property
    def diameter(self):
        return self.radius * 2

Здесь вы можете увидеть доступ к атрибуту diameter объекта Circle.

>>> circle = Circle()
>>> circle.diameter
2
>>> circle.radius = 5
>>> circle.diameter
10

Если вы занимаетесь объектно-ориентированным программированием на Python, вам, вероятно, захочется узнать о property больше в какой-то момент. В отличие от других объектно-ориентированных языков, в Python property используется вместо методов getter и setter.

issubclass и isinstance

Функция issubclass проверяет, является ли класс подклассом одного или нескольких других классов.

>>> issubclass(int, bool)
False
>>> issubclass(bool, int)
True
>>> issubclass(bool, object)
True

Функция isinstance проверяет, является ли объект экземпляром одного или нескольких классов.

>>> isinstance(True, str)
False
>>> isinstance(True, bool)
True
>>> isinstance(True, int)
True
>>> isinstance(True, object)
True

Функция isinstance может быть представлена как делегирование в issubclass.

>>> issubclass(type(True), str)
False
>>> issubclass(type(True), bool)
True
>>> issubclass(type(True), int)
True
>>> issubclass(type(True), object)
True

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

hasattr, getattr, setattr и delattr

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

>>> class Thing: pass
...
>>> thing = Thing()

Функция hasattr позволяет проверить, имеет ли объект определённый атрибут.

>>> hasattr(thing, 'x')
False
>>> thing.x = 4
>>> hasattr(thing, 'x')
True

Функция getattr позволяет получить значение атрибута (с необязательным значением по умолчанию, если атрибут не существует).

>>> getattr(thing, 'x')
4
>>> getattr(thing, 'x', 0)
4
>>> getattr(thing, 'y', 0)
0

Функция setattr позволяет установить значение атрибута.

>>> setattr(thing, 'x', 5)
>>> thing.x
5

И delattr соответственно удаляет атрибут.

>>> delattr(thing, 'x')
>>> thing.x
Traceback (most recent call last):
  File "", line 1, in 
AttributeError: 'Thing' object has no attribute 'x'>

classmethod и staticmethod

Если у вас есть метод, который должен вызываться в экземпляре или в классе, вам нужен декоратор classmethod. Фабричные методы (альтернативные конструкторы) являются распространённым случаем для этого.

class RomanNumeral:

    """Римская цифра, представленная как строка и число."""

    def __init__(self, number):
        self.value = number

    @classmethod
    def from_string(cls, string):
        return cls(roman_to_int(string))  # Функция пока еще не существует

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

class RomanNumeral:

    """Римская цифра, представленная как строка и число."""

    SYMBOLS = {'M': 1000, 'D': 500, 'C': 100, 'L': 50, 'X': 10, 'V': 5, 'I': 1}

    def __init__(self, number):
        self.value = number

    @classmethod
    def from_string(cls, string):
        return cls(cls.roman_to_int(string))

    @staticmethod
    def roman_to_int(numeral):
        total = 0
        for symbol, next_symbol in zip_longest(numeral, numeral[1:]):
            value = RomanNumeral.SYMBOLS[symbol]
            next_value = RomanNumeral.SYMBOLS.get(next_symbol, 0)
            if value < next_value:
                value = -value
            total += value
        return total

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

next

Данная функция возвращает следующий элемент в итераторе. Она может работать со следующими видами итераторов:

  • объекты enumerate;
  • объекты zip;
  • возвращаемые значения функции reversed;
  • файлы
  • объекты csv.reader;
  • генератор-выражения;
  • генератор-функции;

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

Функции, которые когда-нибудь можно выучить

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

  • iter: возвращает итератор (список, набор и т. д.);
  • callable: возвращает True, если аргумент является вызываемым;
  • filter and map: вместо них рекомендуется использовать генератор-выражения;
  • Round: округляет число;
  • divmod: эта функция выполняет деление без остатка (//) и операцию по модулю (%) одновременно;
  • bin, oct и hex: служат для отображения чисел в виде строки в двоичной, восьмеричной или шестнадцатеричной форме;
  • abs: возвращает абсолютное значение числа (аргумент может быть целым или числом с плавающей запятой, если аргумент является комплексным числом, его величина возвращается);
  • hash;
  • object.

Прочие специфические функции

  • ord и chr: могут пригодиться при изучении ASCII или Unicode;
  • exec и eval: для исполнения строки;
  • compile;
  • slice: если вы реализуете __getitem__ для создания пользовательской последовательности, это может вам понадобиться;
  • bytes, bytearray и memoryview: если вы часто работаете с байтами;
  • ascii: похож на repr, но возвращает представление объекта только в ASCII;
  • frozenset: как set, но он неизменен (и хешируемый);
  • __import__: лучше использовать importlib;
  • format: вызывает метод __format__, который используется для форматирования строк;
  • pow: оператор возведения в степень (**);
  • complex: если вы не используете комплексные числа (4j + 3), она вам не понадобится.

Заключение

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

Использованы материалы: tproger.ru

]]>
https://chel-center.ru/python-yfc/2019/10/01/vstroennye-funkcii-python-kakie-nuzhno-znat-i-na-kakie-ne-stoit-tratit-vremja/feed/ 0
PyCharm — эффективная разработка на Python https://chel-center.ru/python-yfc/2019/10/01/pycharm-mdash-instrument-effektivnoj-razrabotki-na-python/ https://chel-center.ru/python-yfc/2019/10/01/pycharm-mdash-instrument-effektivnoj-razrabotki-na-python/#respond Tue, 01 Oct 2019 01:43:20 +0000 http://chel-center.ru/python-yfc/?p=155 Читать далее «PyCharm — эффективная разработка на Python»

]]>
Программист должен сосредочить своё внимание на бизнес-логике создаваемого приложения и на его полезности. Именно для этого предназначен такой инструмент, как PyCharm от JetBrains. В нём решены задачи отладки и простой визуализации проектов, он экономит время и избавляет от рутинных операций.

Оглавление

В этой статье вы узнаете о том:

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

Предполагается, что вы уже знакомы с Python и обладаете некоторым опытом разработки в своей системе. Используется Python 3.6. Скриншоты и демо-версии сделаны в Mac OS. Поскольку PyCharm работает на всех основных платформах, есть некоторые незначительные отличия элементов пользовательского интерфейса и, возможно, потребуется изменить некоторые команды.

Замечание:

PyCharm выпускается в трёх редакциях:

  1. PyCharm Edu — бесплатная версия для обучения;
  2. PyCharm Community — бесплатная версия и кроме обучения предназначена, главным образом, для развития Python;
  3. PyCharm Professional — платный вариант, который имеет полный функционал, зрелое сообщество, очень хорошо подходит для научной и Web разработок с поддержкой таких фреймворков, как Django и Flask, Database и SQL, таких научных инструментов, как Jupyter.

Для более подробной информации о различиях посмотрите PyCharm Editions Comparison Matrix от JetBrains. Кроме того, компания предоставляет бесплатные лицензии на версию Professional специальным предложением для студентов, преподавателей, проектам с открытым исходным кодом и им подобным командам.

Установка PyCharm

В этой статья я буду использовать PyCharm Community Edition 2019.1, так как она бесплатна и доступна на любой популярной платформе всем. Но смею вас заверить, что приведённые здесь примеры с успехом работают и на PyCharm Professional Edition 2019.1.

Для установки PyCharm рекомендую использовать JetBrains Toolbox App. С его помощью вы сможете установить любые продукты JetBrains или несколько версий одного и того же продукта, при необходимости легко обновлять, откатывать и удалять любые инструменты. Вы также сможете быстро открыть любой проект в любой предыдущей версии.

Для установки Toolbox App прочитайте фирменную документацию от JetBrains. Операционная система будет определена автоматически при загрузке и для вас будут предложены корректные пошаговые инструкции. Если этого не произойдёт, то выберите ОС «в рукопашную» в поле справа вверху:

Список ОС для установки ПО Jetbrains
Список ОС для установки ПО Jetbrains

После установки загрузите приложение и подтвердите своё согласие с условиями использования софта. На закладке Tools посмотрите список доступных продуктов. Выберите PyCharm Community и нажмите Install:

Установка PyCharm с помощью Toolbox App
Установка PyCharm с помощью Toolbox App

Вот и всё! PyCharm уже готов к работе на вашей машине. Если вам не нравится Toolbox app, то воспользуйтесь автономной установкой PyCharm.

Запустите PyCharm и увидите всплывающее окно настройки импорта:

Настройки импорта
Настройки импорта

PyCharm автоматически определит новую установку и предложит вам Do not import settings (Не импортировать настройки). Согласитесь и нажмите OK, выберите раскладку клавиш PyCharm по умолчанию и нажмите Next: UI Themes (Далее: тема пользовательского интерфейса) справа внизу:

Схема раскладки клавиш PyCharm
Схема раскладки клавиш PyCharm

PyCharm предложит вам тёмную тему под названием Darcula или светлую тему. Выберите то, что вам нравится и нажмите кнопку Next: Launcher Script (Далее: сценарий запуска):

Страница настройки темы PyCharm
Страница настройки темы PyCharm

Здесь на протяжении всего урока будет использоваться тёмная тема Darcula. Однако, вы можете найти и установить другую тему, используя плагины, или импортировать идеальную для вас тему IntelliJ.

На следующей странице оставьте всё по-умолчанию и нажмите Next: Featured plugins (Далее: Рекомендуемые плагины). Здесь PyCharm покажет вам список плагинов, которые вы можете немедленно установить, большинство пользователей любят это делать. Нажмите Start using PyCharm (Стартовать PyCharm) и теперь можно смело записывать код!

Запись кода в PyCharm

В PyCharm всё делается в контексте проекта. Поэтому для начала его надо создать.

После установки и загрузки PyCharm в окне приветствия нажмите Create New Project (создать новый проект) и вы появится окно для создания нового проекта New Project:

Создание нового проекта pycharm
Создание нового проекта pycharm

Укажите местоположение проекта и раскройте список Project Interpreter. Здесь у вас есть возможность создать новый интерпретатор для своего нового проекта или повторно использовать существующий. Выберите New environment using. Прямо рядом с ним у вас есть выпадающий список для выбора одного из вариантов Virtualenv, Pipenv или Conda, которые являются инструментами поддержки необходимых для разный проектов зависимостей отдельно, создавая для этого изолированные среды Python.

Если хотите, выберите для этого урока Virtualenv. При желании можно указать местоположение среды и выбрать базовый интерпретатор из списка, в котором должны присутствовать все интерпретаторы Python, например, Python 2.7 и Python 3.6, установленные в вашей операционной системе. Обычно по умолчанию все бывает в порядке, но если Python у вас не установлен, то придётся это сделать. Пройдите на сайт python.org, скачайте дистрибутив и сделайте установку интерпритатора. Затем вы должны выбрать блоки для наследования глобальных пакетов сайтов в вашей новой среде и сделать их доступными для всех других проектов. Пока не обращайте на них внимание и оставьте невыбранными.

В правом нижнем углу нажмите кнопочку Create и вы увидите созданный новый проект:

Создание нового проекта в PyCharm
Создание нового проекта в PyCharm

Также появится небольшое всплывающее окно Tip of the Day (Совет дня), где при каждом запуске даётся какой-то случайный совет от PyCharm. Прочитайте и просто закройте это окно.

Настало время начать запись кода на Python. Одновременно нажмите Cmd+N если у вас Mac или Alt+Ins если Windows или Linux. После чего выберите Python File. Это можно сделать воспользовавшись главным меню File → New. Назовите новый файл guess_game.py и нажмите OK. Вы увидите окно PyCharm, похожее на это:

Создание нового файла в PyCharm
Создание нового файла в PyCharm

Давайте быстренько напишем тестовый код, реализующий простую игру на угадывание — программа генерирует секретное число, которое должен угадать человек. На каждое предложенное человеком число программа скажет, было оно меньше или больше секретного. Игра заканчивается, когда человек угадает число. Вот этот код gauss-game.py:

from random import randint

def play():
    random_int = randint(0, 100)

    while True:
        user_guess = int(input("Запишите целое число в диапазоне от 0 до 100?"))
        if user_guess == randint:
            print(f"Вы угадали число ({random_int}). Поздравляю!")
            break
        if user_guess < random_int:
            print("Ваше число меньше секретного.")
            continue
        if user_guess > random_int:
            print("Выше число больше секретного.")
            continue

if __name__ == '__main__':
    play()

Не копируйте, а введите этот код напрямую и увидите что‑то вроде этого:

 Intelligent Coding Assistance — интеллектуальный ассистент кодирования
Intelligent Coding Assistance — интеллектуальный ассистент кодирования

Как видите, в PyCharm есть Intelligent Coding Assistance — интеллектуальный ассистент кодирования, который делает автодополнение кода, проверяет синтаксис, сообщает об ошибках и даёт рекомендации по их исправлению. В частности, заметьте, когда вы записали main и нажали Tab, PyCharm автоматически полностью завершил всю конструкцию main за вас.

Так-же обратите внимание, что если перед if поставить точку .if и нажать Tab, то PyCharm полностью за вас напишет конструкцию if. То же самое верно для True.while — работает PyCharm’s Postfix completions (постфиксное дополнение кода) и не надо лишний раз нажимать на Enter для перехода но новую строку.

Загрузка кода в PyCharm

Теперь, когда вы написали код, пришло время запустить его.

У вас есть три способа запуска этой программы:

  1. Используйте клавиши Ctrl+Shift+R на Mac или Ctrl+Shift+F10 на Windows или Linux.
  2. Нажмите правую кнопку мыши в поле редактирования и в меню выберите Run ‘guess_game’.
  3. Поскольку в этой программе есть предложение __main__, то щелкните на маленькую зелёную стрелку слева от фразы __main__ и выберите Run ‘guess_game’отсюда.

Любой из этих вариантов приведёт к запуска программы, и вы увидите панель «Run Tool» в нижней части окна, с выводом кода, показывающим диалог.

Запуск приложения в PyCharm
Запуск приложения в PyCharm

Немного поиграйте и увидите, что секретное число угадать можно. Совет от профессионала: начните с 50.

Отладка в PyCharm

Вы нашли секретное число? Если так, то, возможно, заметили что-то странное, вместо того, чтобы печатать поздравление и завершать игру программа запускается заново. Где‑то прямо здесь есть ошибка. Чтобы узнать, почему программа запускается заново, вы должны её отладить.

Сначала установите точку останова, нажав на пустое место слева от строки № 8:

Точки останова для отладки
Точки останова для отладки

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

  1. Нажмите Ctrl+Shift+D на Mac или Shift+Alt+F9 на Windows или Linux.
  2. Щелчком правой кнопки мыши в поле редактирования выберите Debug ‘guess_game’.
  3. Щёлкните на маленькую зелёную стрелку слева от фразы __main__ и выберите Debug ‘guess_game отсюда.

После этого вы увидите открывшиеся внизу окно Debugger:

Старт отладки в PyCharm
Старт отладки в PyCharm

Для отладки программы выполните следующие шаги:

  1. Обратите внимание, что текущая строка выделена синим цветом.
  2. Посмотрите, что random_int и его значение перечислены в окне отладки. Запишите это значение. (На рисунке число 85.)
  3. Нажмите F8 для выполнения текущей строки и перехода к следующей. Если в текущей строке вызывается функции, то при необходимости в неё попасть нажмите F7. По-шагово выполняя операторы, в окне отладки вы сможете наблюдать все изменения значений переменных, обновляемые автоматически.
  4. Обратите внимание, что рядом с открывшейся вкладкой «Debugger» находится вкладка «Console», у которых совершенно разное функциональное назначение. На вкладке Console вы будете взаимодействовать со своей программой, а на вкладке Debugger вы будете выполнять действия по отладке.
  5. Переключайтесь на вкладку Console для диалога с вашим guess.
  6. Запишите ваше число и нажмите Enter.
  7. Переключитесь назад на вкладку Debugger.
  8. Нажмите F8 для выполнения оператора if. Заметьте, вы на строке 14. Постойте! Почему не произошёл переход к 11 строке? Причина в том, что условие в операторе if 10 строки приняло значение False. Но почему False если введённое число то, что надо?
  9. Внимательно посмотрите на строчку 10 и заметите, что мы сравниваем user_guess не с тем, что надо. Вместо random_int делается сравнение с функцией randint, импортированной из пакета random.
  10. Измените на random_int, перезапустите и сделайте пошаговое выполнение операторов. Вы видите, произошёл переход к строке 11, а значение условия стало True:

Debugging Script in PyCharm

Поздравляю! Ошибка найдена и исправлена.

Тестирование в PyCharm

Без тестирования нельзя гарантировать надёжность работы любого приложения. PyCharm помогает быстро и комфортно написать и загрузить тесты. По-умолчанию используется unittest, но кроме него можно использовать такие фреймворки, как pytest, nose, doctest, tox и trial. Например, для своего проекта можно выбрать pytest:

  1. Откройте диалог настройки Settings/Preferences → Tools → Python Integrated Tools.
  2. Выберите pytest в поле Default test runner.
  3. Нажмите OK для сохранения настроек.

В нашем примере мы будем использовать загрузчик теста по‑умолчанию unittest.

В том же самом проекте, где записана игра, создайте файл с именем calculator.py и запишите в него код класса Calculator:

class Calculator:
    def add(self, a, b):
        return a + b
    def multiply(self, a, b):
        return a * b

Для кода, открытого в редакторе, PyCharm позволяет очень легко создавать тесты. С открытым файлом calculator.py выполните любое из следующих действий:

  • Нажмите Shift+Cmd+T на Mac или Ctrl+Shift+T на Windows или Linux.
  • Правой кнопкой мыши в поле редактирования выберите Go To и Test.
  • В основном меню проследуйте Navigate → Test.

Выберите Create New Test (Создать новый тест) и посмотрите на окно:

Создание теста в PyCharm
Создание теста в PyCharm

Значения полей Target directory (целевой каталог), Test file name (Имя файла теста) и Test class name (Имя класса теста) оставьте по‑умолчанию. Для тестирования отметьте оба метода и нажмите на OK. Вуаля! PyCharm автоматически создаст для вас файл с именем test_calculator.py и заглушки для тестов:

from unittest import TestCase
class TestCalculator(TestCase):
    def test_add(self):
        self.fail()
    def test_multiply(self):
        self.fail()

Загрузите тест одним из следующих способов:

  • Нажмите Ctrl+R на Mac или Shift+F10 на Windows или Linux.
  • Щёлкните правой кнопкой мыши в поле редактирования и выберите Run ‘Unittests for test_calculator.py’.
  • Щёлкните на маленькой зелёной стрелке слева от имени класс теста и выберите Run ‘Unittests for test_calculator.py’.

Вы увидите открытое окно тестов со всеми ошибками:

Результат тестирования — ошибки
Результат тестирования — ошибки

Обратите внимание, что у вас есть иерархия результатов теста слева и терминал для вывода результатов справа.

Теперь реализуем test_add, изменив код на следующий:

from unittest import TestCase
from calculator import Calculator
class TestCalculator(TestCase):
    def test_add(self):
        self.calculator = Calculator()
        self.assertEqual(self.calculator.add(3, 4), 7)
    def test_multiply(self):
        self.fail()

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

Загрузка тестов в PyCharm
Загрузка тестов в PyCharm

Обратите внимание, что метод sleep (0.1), который вы видите на картинке выше, намеренно используется для замедления одного из тестов, чтобы показать, как работает сортировка по времени исполнения.

Редактирование существующего проекта в PyCharm

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

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

После чего разархивируйте и откройте его в PyCharm одним из следующих способов:

  • Нажмите File → Open в главном меню.
  • Нажмите Open в окне Welcome Screen, если вы только что загрузили PyCharm.

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

Если проект уже содержит виртуальную среду, то PyCharm будет автоматически её использовать и сделает интерпретатором проекта.

Если вы хотите создать свою virtualenv — виртуальную среду, что обычно и делается, то откройте Preferences, нажав на Mac Cmd+, или Settings на Windows или Linux Ctrl+Alt+S и найдите секцию Project: ProjectName. Откройте выпадающий список и выберите Project Interpreter:

Определение виртуальной среды проекта в PyCharm
Определение виртуальной среды проекта в PyCharm

Выберите virtualenv в выпадающем списке. Если такого выбора в списке нет, то для настройки спарва от выпадающего списка нажмите кнопку Add…. Дальнешие шаги такие же, как при создании нового проекта.

Поиск и навигация в PyCharm

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

  • Поиск фрагмента текста в текущем файле: нажмите Cmd+F на Mac или Ctrl+F на Windows или Linux.
  • Поиск фрагмента во всем проекте: нажмите Cmd+Shift+F на Mac или Ctrl+Shift+F на Windows или Linux.
  • Поиск класса: нажмите Cmd+O на Mac или Ctrl+N на Windows или Linux.
  • Поиск файла: нажмите Cmd+Shift+O на Mac или Ctrl+Shift+N на Windows или Linux.
  • Поиск везде, если не знаете, что конкретно ищете — файл, класс или фрагмент кода: нажмите Shift дважды.

Что касается навигации, шпаргалка ниже сэкономит вам массу времени:

  • Переход к объявлению переменной: нажмите Cmd на Mac или Ctrl на Windows или Linux и щёлкните по переменной.
  • Поиск используемого класса, метода или любого символа: нажмите Alt+F7.
  • Просмотр последних изменений: нажмите Shift+Alt+C или выберите View → Recent Changes в главном меню.
  • Просмотр ваших последних файлов: нажмите Cmd+E на Mac или Ctrl+E на Windows или Linux или в главном меню прйдите View → Recent Files.
  • G>Переход назад и вперед по истории навигации после того, как вы уже что‑то сделали: нажмите Cmd+[ / Cmd+] на Mac или Ctrl+Alt+Left / Ctrl+Alt+Right на Windows или Linux.

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

Управление версиями в PyCharm

Система управления версиями, типа, Git или Mercurial является важнейшим инструментом в современном мире разработки программного обеспечения. Поэтому так важна поддержка их в любой IDE. PyCharm делает это очень хорошо, прекрасно интегрируясь с Git (и Github), а так же с другими популярными системами такими, как Mercurial, Perforce и Subversion.

Настройка систем управления версиями

Что-бы включить интеграцию с системой управления версиями пройдите VCS → VCS Operations Popup… в верхнем меню или нажмите клавиши Ctrl+V на Mac или Alt+` на Windows или Linux. Выберите Enable Version Control Integration…. Посмотрите на открывшееся окно:

Интеграция с системами управления версиями в PyCharm
Интеграция с системами управления версиями в PyCharm

Выберите Git из выпадающего списка, нажмите OK и в вашем проекте включена система управления версиями. Обратите внимание, что если вы открыли существующий проект с включенным управлением версиями, PyCharm увидит это и автоматически подключится к ней.

Теперь, если вы пройдете VCS Operations Popup…, то увидите всплывающее окно с опциями git add, git stash, git branch, git commit, git push и много другое:

Работа с системой управления версиями в PyCharm
Работа с системой управления версиями в PyCharm

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

Коммиты и разрешение конфликтов

Есть две особенности интеграции систем управления версиями в PyCharm, которые лично я использую и получаю от этого огромное удовольствие! Допустим, вы закончили свою работу и хотите это как-то отметить. Перейдите VCS → VCS Operations Popup… → Commit… или нажмите Cmd+K на Mac или Ctrl+K на Windows или Linux. Посмотрите на появившееся окно:

Окно коммита в PyCharm
Окно коммита в PyCharm

В этом окне можно:

  1. Выбрать файлы для фиксации;
  2. Записать сообщение о фиксации;
  3. Выполнить все команды проверки и очистки перед фиксацией;
  4. Посмотреть различия в изменениях;
  5. Зафиксировать и нажать стрелку справа от кнопки Commit и выбрать Commit and Push….

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

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

Конфликт в PyCharm
Конфликт в PyCharm

Всё это выглядит странно и трудно понять, что надо удалить, а что оставить. PyCharm на помощь! У него гораздо приятнее и чище способ разрешения конфликтов. Перейдите к VCS в верхнем меню, выберите Git, а затем Resolve conflicts…. Выберите файл, конфликты которого вы хотите разрешить, и нажмите Merge. Вы увидите следующее открытое окно:

Окно разрешения конфликтов в PyCharm
Окно разрешения конфликтов в PyCharm

В левой колонке вы увидите свои изменения. Справа — изменения, внесенные вашим товарищем по команде. Наконец, в средней колонке вы увидите результат. Конфликтующие строки подсвечиваются и вы можете видеть маленькие X and >>/<< рядом с этими строками. Нажмите стрелки для того, чтобы принять изменения, а X, что бы отклонить. После того, как вы разрулите все эти конфликты, нажмите кнопку Apply:

Конфликт разрешен
Конфликт разрешен

В приведенной выше картинке в первой противоречивой строке автор отказался от своих изменений и принял изменения своих товарищей по команде. А во второй строке наоборот, автор принял свои собственные изменения и отклонил изменения своих партнеров по команде.

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

Плагины и внешние инструменты в PyCharm

В PyCharm вы найдёте почти все, что нужно для разработки. Если чего‑то нет, то, скорее всего, есть плагин, реализующий ту функциональность, которая вам нужна. Например, с помощью плагинов можно:

  • Добавить поддержку для различных языков и структур;
  • Увеличить свою пропродуктивность, используя быстрые подсказки, средства просмотра файлов и т.д.;
  • Выучить новый язык программирования с помощью упражнений по кодированию

Например, IdeaVim добавит иммитацию Vim в ваш PyCharm. Ну, если вам нравится Vim, почему-бы это не сделать.

Измените тему своего PyCharm на Material Theme UI и посмотрите, как это выглядит:

Тема Material Design в PyCharm
Тема Material Design в PyCharm

Vue.js добавляет поддержку проектов Vue.js. Markdown предоставляет возможность редактировать файлы Markdown в среде IDE и просматривать HTML‑код в режиме предварительного просмотра в браузере. Вы можете найти и установить все доступные плагины, выбрав Preferences → Plugins на Mac или Settings → Plugins на Windows или Linux на вкладке Marketplace, но это уже за деньги:

Маркеплейс плагинов для PyCharm
Маркеплейс плагинов для PyCharm

Если вы ничего не нашли, то можете разработать свой плагин.

Если вы не можете найти нужный плагин и не хотите разрабатывать свой собственный, потому что в PyPI уже есть пакет, то его можно добавить в PyCharm в качестве внешнего инструмента. Так, например, анализатор кода Flake8.

Сначала установите flake8 в своей virtualenv, используя pip install flake8 в терминале приложения. Так же успешно можно использовать пакет интегрированный в PyCharm:

Терминал в PyCharm
Терминал в PyCharm

Далее пройдите в меню Preferences → Tools на Mac или Settings → Tools для Windows/Linux и выберите External Tools. Щёлкните на маленькую кнопку + (1). В новом всплывающем окне вставьте детали, как показано ниже, и нажмите ОК для обоих окон:

Установка Flake8 в PyCharm
Установка Flake8 в PyCharm

Здесь Program (2) относится к исполняемому файлу Flake8, который находится в папке /bin вашей виртуальной среды. Arguments (3) указывают, какой файл вы хотите проанализировать с помощью Flake8. Working directory — рабочий каталог вашего проекта.

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

Обратите свой взор на то, что называется Макрос. Макросы позволяют задавать значения переменным в формате $name$, которые могут меняться в зависимости от вашего контекста. Например, $FileName$ — это first.py, когда вы редактируете first.py, а когда вы редактируете second.py, то это second.py. Вы можете просмотреть их список и вставить любой из них, нажав на кнопки Insert Macro…. Поскольку здесь вы использовали макросы, значения будут меняться в зависимости от проекта, над которым вы сейчас работаете, и Flake8 продолжит правильно выполнять свою работу.

Чтобы это понять, создайте файл example.py и запишите туда следующий код:

CONSTANT_VAR = 1

def add(a, b):
    c = "hello"
    return a + b

То, что написано, немного не по правилам Flake8. Нажмите правую кнопку ыша на поле редактирования этого файла. Выберите External Tools и Flake8. Вуа‑ля! Результат анализа Flake8 можно посмотреть внизу:

Результат анализа кода Flake8, выведенный в PyCharm
Результат анализа кода Flake8, выведенный в PyCharm

Для ускорения работы с внешними инструментами можно добавить клавиши быстрого доступа. Перейдём к Preferences на Mac или к Settings на Windows или Linux. Затем Keymap → External Tools → External Tools. Дважды щёлкните на Flake8 и выберите Add Keyboard Shortcut. Посмотрите сюда:

Добавление клавиш быстрого доступа в PyCharm
Добавление клавиш быстрого доступа в PyCharm

На картинке выше показано, как назначены клавиши быстрого доступа Ctrl+Alt+A для загрузки этого инструмента. Добавьте свои клавиши быстрого доступа в текстовое поле и нажмите OK для обоих окон. Теперь вы можете использовать эти клавиши для загрузки Flake8 и анализа файла, над которым сейчас работаете.

Возможности профессиональной версии PyCharm

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

Поддержка Django

PyCharm поддерживает Django, один из самых популярных и любимых веб‑фреймворков Python. Что бы убедиться в его доступности проделайте следующее:

  1. Откройте Preferences на Mac или Settings на Windows или Linux.
  2. Выберите Languages and Frameworks.
  3. Выберите Django.
  4. Проверьте установлена ли галочка на Enable Django support?Если нет, установите.
  5. Примените изменения.

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

  • При создании проекта у вас будет выбран тип проекта Django. И это означает, что в проекте такого типа у вас будут все необходимые файлы и настройки. Это эквивалентно использованию django-admin startproject mysite.
  • Вы можете загрузить manage.py непосредственно из PyCharm.
  • Поддержка в шаблоне Django включает:
    • синтаксис и подсветку ошибок.
    • Автозавершение кода.
    • Навигацию.
    • Завершение имен блоков.
    • Завершение пользовательских тегов и фильтров.
    • Быстрый доступ к документации по тегам и фильтрам.
    • Возможность их отладки.
  • Автоавершение кода во всех других частях Django, таких как представления, URL‑адреса и модели, а также поддержка анализа кода для Django ORM.
  • Диаграммы зависимостей для моделей Django.

Более подробная информация о поддержке Django смотрите в официальной документации.

Поддержка баз данных

Современная разработка баз данных — сложная задача со множеством вспомогательных систем и рабочих процессов. Вот почему JetBrains, компания, стоящая за PyCharm, разработала для этого отдельную IDE DataGrip. Это отдельный продукт от PyCharm с отдельной лицензией.

К счастью, PyCharm поддерживает все функции, доступные в DataGrip через плагин Database tools and SQL, который включен по умолчанию. С его помощью можно запрашивать, создавать и управлять базами данных независимо от того, работают ли они локально, на сервере или в облаке. Плагин поддерживает MySQL, PostgreSQL, Microsoft SQL Server, SQLite, MariaDB, Oracle, Apache Cassandra и другие. Для получения дополнительной информации о том, что вы можете сделать с этим плагином, посмотрите полную документацию по поддержке баз данных.

Визуализация параллельных потоков

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

Проверьте подробную документацию этой функции для получения более подробной информации.

Более подробная информация содержится в подробной документации об этой функции.

Профилировщик

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

  1. vmprof
  2. yappi
  3. cProfile

Если у вас не установлен vmprof или yappi, просто вернитесь к стандартному cProfile. Он хорошо документирован и здесь я не буду пересказывать эту документацию.

Режим научной разработки

Python — это язык не только для общего и веб‑программирования. За последние годы он стал лучшим инструментом для науки о данных и машинного обучения. Своей популярностью он обязан своим инструментам и библиотекам, таким как NumPy, SciPy, scikit-learn, Matplotlib, Jupyter и другим. При наличии таких мощных библиотек необходима мощная IDE для поддержки всех функций, таких как построение графиков и анализ этих библиотек. PyCharm предоставляет все, что нужно, исчерпывющая документация здесь.

Удалённая разработка

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

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

Заключение

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

Здесь вы узнали о многом, в том числе:

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

Если Вы хотите что-то спросить или поделиться своими замечаниями пишите в комментарии ниже. Для более детального знакомства с документацией перейдите на сайт PyCharm.

Для визуалов:

По мотивам: PyCharm for Productive Python Development (Guide)Р

]]>
https://chel-center.ru/python-yfc/2019/10/01/pycharm-mdash-instrument-effektivnoj-razrabotki-na-python/feed/ 0
Множество Мандельброта на Python https://chel-center.ru/python-yfc/2019/10/01/mnozhestvo-mandelbrota-na-python/ https://chel-center.ru/python-yfc/2019/10/01/mnozhestvo-mandelbrota-na-python/#respond Tue, 01 Oct 2019 12:08:05 +0000 http://chel-center.ru/python-yfc/?p=48 Читать далее «Множество Мандельброта на Python»

]]>
В 1985 году я прочитал статью Александра К. Дьюдни, ведущего раздел занимательной науки журнала “Scientific American”, о множестве Мандельброта, написал программу его визуализации на цветном телевизоре, подключенном через модуль крейта CAMAC к машинке MERA-CAMAC-125/СМ4А. После чего мы с коллегами могли часами генерировать и рассматривать завораживающие картинки, записывая выдающиеся в файлы на память. После упомянутой публикации подобные множества стали необычайно популярны, например, множество Мандельброта использовал в качестве своей эмблемы фонд Сороса. Гораздо позже, лет через десять, когда меня поразил Парадокс береговой линии, я узнал красивое и непонятное словосочетание «голоморфная динамика».

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

Описание алгоритма

Итак, план такой. Пусть c — некоторое комплексное число. Рассмотрим последовательность чисел z0, z1, z2, … , которая строится следующим образом:

z0 = 0, zk+1 = zk2 + c, k = 0, 1, 2,…

На каждом шаге мы берём предыдущее число, возводим в квадрат и прибавляем c. В зависимости от значения c, последовательность чисел {zk} может быть ограниченной или неограниченной. При некоторых значениях она стремительно улетает в бесконечность (конечно в пределах разрядной сетки), а при некоторых тормозится. Если последовательность ограничена, мы говорим, что c принадлежит множеству Мандельброта M.

Поскольку число c комплексное, у него есть вещественная и мнимая части. Каждое комплексное число задаётся точкой декартовой плоскости: по горизонтальной координате будем откладывать вещественную часть, а по вертикальной — мнимую. Таким образом, множество M является множеством на вещественной плоскости.

Для построения графического изображения множества Мандельброта можно использовать алгоритм, называемый escape-time. Суть его такова. Всё множество полностью расположено внутри круга радиуса 2 на плоскости. Поэтому будем считать, что если для точки c последовательность итераций функции fc = z2 + c с начальным значением z = 0 после некоторого большого их числа N (скажем, 100) не вышла за пределы этого круга, то точка принадлежит множеству и красится в черный цвет. Соответственно, если на каком-то этапе, меньшем N, элемент последовательности по модулю стал больше 2, то точка множеству не принадлежит и остается белой. Таким образом, можно получить черно-белое изображение множества, которое и было получено Мандельбротом. Вот с этого мы и начнём.

Чёрно-белое множество, то которое получил Мандельброт

import numpy as np
import matplotlib.pyplot as plt
# библиотеки

# инициализиация
pmin, pmax, qmin, qmax = -2.5, 1.5, -2, 2
# пусть c = p + iq и p меняется в диапазоне от pmin до pmax,
# а q меняется в диапазоне от qmin до qmax

ppoints, qpoints = 200, 200
# число точек по горизонтали и вертикали

max_iterations = 300
# максимальное количество итераций

infinity_border = 100
# если ушли на это расстояние, считаем, что ушли на бесконечность

image = np.zeros((ppoints, qpoints))
# image — это двумерный массив, в котором будет записана наша картинка
# по умолчанию он заполнен нулями

for ip, p in enumerate(np.linspace(pmin, pmax, ppoints)):
    for iq, q in enumerate(np.linspace(qmin, qmax, qpoints)):
        c = p + 1j * q
        # буквой j обозначается мнимая единица: чтобы Python понимал, что речь
        # идёт о комплексном числе, а не о переменной j, мы пишем 1j

        z = 0
        for k in range(max_iterations):
            z = z ** 2 + c
            # Самая Главная Формула

            if abs(z) > infinity_border:
                # если z достаточно большое, считаем, что последовательость
                # ушла на бесконечность
                # или уйдёт
                # можно доказать, что infinity_border можно взять равным 4

                image[ip, iq] = 1
                # находимся вне M: отметить точку как белую
                break
plt.xticks([])
plt.yticks([])
# выключим метки на осях

plt.imshow(-image.T, cmap='Greys')
# транспонируем картинку, чтобы оси были направлены правильно
# перед image стоит знак минус, чтобы множество Мандельброта рисовалось
# чёрным цветом
plt.show()

 

Множество Мандельброта классичекое
Множество Мандельброта классичекое

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

Цветное множество, то которое за Мандельброта получили другие

import numpy as np
import matplotlib.pyplot as plt
# библиотеки

# инициализиация
pmin, pmax, qmin, qmax = -2.5, 1.5, -2, 2
# пусть c = p + iq и p меняется в диапазоне от pmin до pmax,
# а q меняется в диапазоне от qmin до qmax

ppoints, qpoints = 200, 200
# число точек по горизонтали и вертикали

max_iterations = 300
# максимальное количество итераций

infinity_border = 10
# если ушли на это расстояние, считаем, что ушли на бесконечность

def mandelbrot(pmin, pmax, ppoints, qmin, qmax, qpoints,
               max_iterations=200, infinity_border=10):
    image = np.zeros((ppoints, qpoints))
    p, q = np.mgrid[pmin:pmax:(ppoints*1j), qmin:qmax:(qpoints*1j)]
    c = p + 1j*q
    z = np.zeros_like(c)
    for k in range(max_iterations):
        z = z**2 + c
        mask = (np.abs(z) > infinity_border) & (image == 0)
        image[mask] = k
        z[mask] = np.nan
    return -image.T

image = mandelbrot(-2.5, 1.5, 1000, -2, 2, 1000)
plt.xticks([])
plt.yticks([])
plt.imshow(image, cmap='flag', interpolation='none')

plt.show()

 

Множество Мандельброта цветное
Множество Мандельброта цветное

Изменяем палитру множества Мандельброта

import numpy as np
import matplotlib.pyplot as plt
from itertools import cycle
import matplotlib.colors as clr
# библиотеки

# инициализиация
pmin, pmax, qmin, qmax = -2.5, 1.5, -2, 2
# пусть c = p + iq и p меняется в диапазоне от pmin до pmax,
# а q меняется в диапазоне от qmin до qmax

ppoints, qpoints = 200, 200
# число точек по горизонтали и вертикали

max_iterations = 300
# максимальное количество итераций

infinity_border = 10
# если ушли на это расстояние, считаем, что ушли на бесконечность

def mandelbrot(pmin, pmax, ppoints, qmin, qmax, qpoints,
               max_iterations=200, infinity_border=10):
    image = np.zeros((ppoints, qpoints))
    p, q = np.mgrid[pmin:pmax:(ppoints*1j), qmin:qmax:(qpoints*1j)]
    c = p + 1j*q
    z = np.zeros_like(c)
    for k in range(max_iterations):
        z = z**2 + c
        mask = (np.abs(z) > infinity_border) & (image == 0)
        image[mask] = k
        z[mask] = np.nan
    return -image.T

#image = mandelbrot(-0.793191078177363, 0.16093721735804, 1000, -0.793191, 0.160937, 1000)
plt.figure(figsize=(10, 10))
colorpoints = [(1 - (1 - q) ** 4, c) for q, c in zip(np.linspace(0, 1, 20),
                                                     cycle(['#ffff88', '#000000',
                                                            '#ffaa00', ]))]
cmap = clr.LinearSegmentedColormap.from_list('mycmap',
                                             colorpoints, N=2048)
# LinearSegmentedColormap создаёт палитру по заданным точкам и заданным цветам
# можете попробовать выбрать другие цвета

plt.xticks([])
plt.yticks([])

image = mandelbrot(-2.5, 1.5, 1000, -2, 2, 1000)
plt.imshow(image, cmap=cmap, interpolation='none')

plt.show()
Измененная палитра множества Мандельброта
Измененная палитра множества Мандельброта

Углубляемся

А теперь в наш алгоритм добавим еще один цикл и рассмотрим поподробнее множество Мандельброта в окрености точки -0.793191078177363, 0.16093721735804

p_center, q_center = -0.793191078177363, 0.16093721735804
for i in range(1,11):
    scalefactor = i / 12000

    plt.xticks([])
    plt.yticks([])

    pmin_ = (pmin - p_center) * scalefactor + p_center
    qmin_ = (qmin - q_center) * scalefactor + q_center
    pmax_ = (pmax - p_center) * scalefactor + p_center
    qmax_ = (qmax - q_center) * scalefactor + q_center
    image = mandelbrot(pmin_, pmax_, 500, qmin_, qmax_, 500)
    print("(", pmin_, ",", pmax_, ") (", qmin_, ",", qmax_, ")")

    plt.figure(figsize=(10, 10))
    plt.imshow(image, cmap='flag', interpolation='none')
    filename = "images//mandelbrot-" + str(i) + ".png"
    plt.savefig(filename, format="png")
    print(filename  + " saved")

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

Множество Мандельброта в окрености точки -0.793191078177363, 0.16093721735804

Посмотрели. Дизайнеры, кое-что понимающие в кодировании, могут использовать приведенные алгоритмы в своем творчестве для создания оригинальных картинок и фантастических сюжетом. Все они проверены в PyCharm Community.

В качестве основы этих алгоритмов использованы коды Ильи Щурова, которые значительно переработаны и дополнены.

]]>
https://chel-center.ru/python-yfc/2019/10/01/mnozhestvo-mandelbrota-na-python/feed/ 0
С чего начиналось «шаманство» в анализе данных https://chel-center.ru/python-yfc/2019/11/03/s-chego-nachinalos-shamanstvo-v-analize-dannyih/ https://chel-center.ru/python-yfc/2019/11/03/s-chego-nachinalos-shamanstvo-v-analize-dannyih/#respond Sun, 03 Nov 2019 02:31:15 +0000 http://waksoft.susu.ru/?p=24505 Читать далее «С чего начиналось «шаманство» в анализе данных»

]]>
Так что мы больше не будем винить себя в недостатке
ясность, так как мы cделаем это профессией

Блез Паскаль

В 60-х годах прошлого века, как тогда говорили, «партия и правительство» (а точнее Председатель Совета Министров СССР Косыгин Алексей Николаевич) поручили геологам найти на территории СССР месторождение золота африканского типа. Всего таких месторождений в мире было семь, они представляют собой «золотые блины» толщиной 10–15 сантиметров на глубине 2–3 километра (т.е. найти их «случайно» почти невозможно). Имелась полная статистика по ним: пробы грунта, снимки местности и т.д. Имелась также статистика по местам, в которых специалисты предполагали наличие золота, но тщательный анализ установил его отсутствие. Такую статистику в анализе данных часто собирают в таблицы «объект-признак», пример показан на рис. 1: по строкам записаны описания месторождений (объектов), а столбцы соответствуют некоторым признакам (мнение одного эксперта, особенность рельефа и т.д.).

Рис.1. Таблица объект-признак. 

Для консультации два молодых геолога (А.Н. Дмитриев и Ф.П. Кренделев) обратились в Институт математики новосибирского Академгородка. Проблемой заинтересовался математик Журавлёв Юрий Иванович. На вид это была как раз математическая задача: интерполяция функции от многих переменных (функция равна единице на описаниях месторождений золота и нулю – на описаниях остальных мест, надо определить, где она ещё будет равна единице, кроме известных семи точек). Проблема была только в том, что переменных больше сотни, а точек, в которых известны значения функции, всего несколько. Задача казалась неразрешимой, по крайней мере, методами «классической математики», но помог случай. За год до этого Академгородок посетил американский профессор Э. Фейгенбаум, который в своих лекциях утверждал, в частности, что ни одна по-настоящему сложная задача не может быть решена чисто математическим путём, необходимо использовать человеческий опыт, «подсматривать», как решают задачу специалисты и разрабатывать эвристические алгоритмы. Ю.И. Журавлёв ухватился за эту идею, долго беседовал с геологами, выяснял, как вообще принято искать полезные ископаемые, и переводил эти «геологические» идеи в математическую форму.

В результате был изобретён алгоритм для поиска золота. С точки зрения «чистой математики» он был некорректен (сама постановка задачи была не совсем корректна), но он сработал! Описывать алгоритм в этой лекции мы не будем, но объясним один из основных принципов его работы. Рассмотрим рис. 1. Если подописание (1,1) (выделено в таблице) встречается только в первых двух признаках объектов первого класса и не встречается в объектах второго класса, то наличие такого подописания характерно для объектов первого класса. Это называют элементарным тестовым классификатором, их строят много, причём строят так, чтобы они были «неупрощаемы», т.е., например, если сократить это подописание, то значение 1 в первом признаке (или во втором) уже не будет характерно ни для одного из классов. Для нового объекта (потенциального месторождения), который надо классифицировать, смотрят, какие классификаторы «голосуют» за его вхождение в первый класс, а какие – за вхождение во второй. В простейшем случае «прислушиваются к большинству».

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

Впервые эта история была рассказана в научно-популярной лекции «ШАМАНСТВО» В АНАЛИЗЕ ДАННЫХ доцента ВМК МГУ имени М.В. Ломоносова, д.ф.-м.н. А.Г. Дьяконова

]]>
https://chel-center.ru/python-yfc/2019/11/03/s-chego-nachinalos-shamanstvo-v-analize-dannyih/feed/ 0
Прежде научись ходить, а бегай уже потом… https://chel-center.ru/python-yfc/2019/11/08/prezhde-nauchis-hodit-a-begaj-uzhe-potom/ https://chel-center.ru/python-yfc/2019/11/08/prezhde-nauchis-hodit-a-begaj-uzhe-potom/#respond Fri, 08 Nov 2019 01:36:39 +0000 http://chel-center.ru/python-yfc/?p=133 Читать далее «Прежде научись ходить, а бегай уже потом…»

]]>
 

Всё просто! — Прежде чем перейти к сложным темам убедитесь в том, что ваши знания имеют прочный фундамент.

Это особенно важно, когда речь заходит об освоении Python. Многие инструменты и методы требуют надёжных знаний основ языка.

Пробелы в знаниях приводят к путанице, например как у одного из моих студентов:

Я изо всех сил пытаюсь найти разницу/предпочтение/лучшие практики между использованием Anaconda и pip для виртуальных сред. Есть несколько противоречивых советов о том, следует ли использовать дистрибутив Anaconda или прямую установку Python и pip.

Прямо сейчас я пользуюсь Anaconda, бесплатно, очень эффективно, удобно, по‑истине профессиональный способ управления зависимостями. Однако, все реальные учебники по Python ссылаются только на pip. Означает ли это, что мне нужно переписать все свои примеры инструментов для их использования в продакшен!

Итак, что лучше использовать? Я с нетерпением жду ясности по этому поводу!

Похоже, наш студент увлёкся наукой о данных или машинным обучением. Anaconda в этом сообществе — самая популярная штука.

Популярность здесь объясняется, большим количеством высококачественных научных библиотек и наборов данных, более 1 500, готовых к мгновенному использованию! Более того, Anaconda поможет вам управлять всеми этими пакетами, а также виртуальными средами и различными установками Python.

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

Видите ли, есть масса других библиотек, недоступных через Anaconda. И вот при желании их использовать в своих проектах Python, придётся обратится к pip (менеджер пакетов) для установки.

pip — официальный менеджер пакетов Python. Поэтому, любой, кто занимается Python должен знать, как использовать pip. (К тому же pip, де-факто, является стандартом для всех моих упражнений на Python!)

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

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

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

Если вы исследуете данные и планируете использовать Python только для машинного обучения, то Anaconda — отличный выбор!

Тем не менее, pip может стать полезным инструментом в тех случаях, когда «руки» conda не дотягиваются. Именно поэтому, по крайней мере, надо знать, как pip работает.

Кроме того, никто никогда не знаете, перейдёт ли он в другие проекты Python, такие как веб или управление базами данных.

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

Если вы привыкли к Anaconda и вам нужен праймер на pip, то на это есть правильный туториал.

]]>
https://chel-center.ru/python-yfc/2019/11/08/prezhde-nauchis-hodit-a-begaj-uzhe-potom/feed/ 0
Есть сертифика́ты и сертифи́каты https://chel-center.ru/python-yfc/2019/11/18/est-sertifika-ty-i-sertifi-katy/ https://chel-center.ru/python-yfc/2019/11/18/est-sertifika-ty-i-sertifi-katy/#respond Mon, 18 Nov 2019 12:28:50 +0000 http://waksoft.susu.ru/?p=27599 Читать далее «Есть сертифика́ты и сертифи́каты»

]]>
Пришло мне на ящик письмо от Дэна из realpython.com, с которым у нас общие интересы в сфере Computer Science образования, по поводу выдачи и обретение сертификатов, подтверждающих некоторые компетенции. Оно «взорвало» мозг и породило несколько мыслей по этому же поводу. Надеюсь и у вас появятся мысли об образовательном бизнесе, особенно, в приложении к отечественным условиям. «Предприятие создано с целью получения прибыли» — первая фраза уставных документов любого коммерческого предприятия, а всё остальное потом… И уже в этом лукавство по отношению к качеству образовательного продукта… Начнём по-тихоньку…

One of the «shameful secrets» of my career is that I’m a certified «Scrum Product Owner.»

Let me tell you how this came to be:

One fine Tuesday morning my manager John approached me.

«Hey Dan, we’ve booked this Agile training in town and one of the PMs can’t make it. Want to go?»

I’d just sat down with a steaming cup of coffee about to sift through my inbox, but…I just can’t say «no» to free education.

So I went.

Now, I’m a software developer and I like to believe I’m a thoughtful and rational human being…

Naturally that puts me at odds with some of the stuff that the «Church of Agile» has brought upon us.

(And guess what, going to that agile training seminar didn’t change my opinion one bit.)

This «training» wasn’t about the principles and ideas outlined in the original agile manifesto.

This was «capital-A» Agile, chewed up beyond recognition and then regurgitated for pointy haired managers who had never even WRITTEN a line of code.

I wouldn’t have wanted to work with any of the corporate drones receiving agile training at that seminar, or to inflict them on my team.

I mean, most of the «product managers» there spent the whole day either staring blankly at the wall or playing with their phones.

I’m not even sure if the guy who ran the seminar had ever shipped a software product successfully….

At the end of the event, everyone who had dragged their body to more than 50% of the sessions became a «Scrum Certified Product Owner.» (!!!)

They even promised to send us a «high-quality print certificate» we could frame and hang on the wall…

Needless to say I was NOT impressed.

Now, I’m getting carried away ranting about commercially-perverted flavors of agile here, so let me reel this back in:

Getting certified in a programming language or anything else that has to do with programming means doodley-squat.

It’s useless.

In my experience most of these certificates are a complete joke.

No one hiring for a (good) developer job takes these certifications seriously. Especially not if one can get them by spending a day or two staring at a wall.

Certificates are a poor substitute for examples. Employers would much rather see work you’ve done—than a piece of paper that says you have the ability to do work.

Don’t get me wrong, I like the general idea of certification—

Having a third-party to point to that can, in effect, say «Hey, this guy/gal has at least a baseline level of knowledge and here’s proof for it.»

But as of 2019, this simply doesn’t exist.

(And that’s why interviewing software developers is still more of an art than a science.)

Please DO learn as much as you can but DON’T invest extra time and/or money to get a sham certificate. It’s a waste.

Alright, time to brew some green tea to calm my nerves…In the mean time:

Happy Pythoning!

— Dan Bader

P.S. Note that «certificate» != «CS degree.» I’ll talk more about that distinction in the future.

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

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

Позвольте мне рассказать вам, как это случилось:

Однажды утром во вторник ко мне подошел мой менеджер Джон.

«Эй, Дэн, мы заказали тренинг по Agile в городе, и один из премьер-министров не сможет приехать. Хочешь пойти?»

Я просто сел за чашку кофе, чтобы отфильтровать базар, но… просто не могу сказать «нет» бесплатному образованию.

Так что я пошёл.

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

Естественно, это вступает в противоречие с некоторыми вещами, которые принесла нам «Церковь Agile».

(Более того, посещение этого интенсивного семинара нисколько не изменило моего мнения.)

«Обучение» (заметьте кавычки, моё прим.) было не о принципах и идеях, изложенных в первоначальном манифесте Agile.

Это был «capital-А» Agile, перепетый до неузнаваемости, а затем озаривший продвинутых волосатых менеджеров, которые никогда даже не пробовали писать строчку кода.

Я бы не захотел работать ни с одним из корпоративных беспилотников, прошедших обучение на этом семинаре, и не хотел бы приглашать их в свою команду.

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

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

В конце мероприятия все, кто притащил свое тело более на чем 50% занятий сессий, стали «Сертифицированными владельцами продукта Scrum». (!!!)

Они даже пообещали прислать нам «сертификат на бумаге образцового качества», который можно вставить в рамку и повесить на стене….

Нет нужды говорить, что я НЕ был доволен.

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

Получение сертификата о владение конкретным языком программирования или любым другим языком, связанном с программированием это doodley-squat (что-то типа карикатуры к замечательному событию, моё прим.).

Это бессмысленно.

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

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

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

Не поймите меня неправильно, но, в общем-то, идея сертификации мне нравится…

Наличие третьей стороны, по сути подтверждающей: «Эй, а у этого парня/девушки есть, по крайней мере, базовый уровень знаний и вот доказательство этого».

Но с 2019 года это уже не работает.

(И именно поэтому интервьюирование разработчиков программного обеспечения всё еще скорее искусство, чем наука).

Пожалуйста, не учитесь столько, сколько сможете и не тратьте своё время и/или деньги на получение фиктивного сертификата. Это пустая затея.

Ладно, пора заварить зеленого чая, чтобы успокоить нервы…. А пока…:

Счастливого Python-нинга!

— Дэн Бейдер

P.S. Обратите внимание, что «сертификат» != «CS степень». В будущем я напишу об этом подробнее.

Dan из realpython.com</a

]]>
https://chel-center.ru/python-yfc/2019/11/18/est-sertifika-ty-i-sertifi-katy/feed/ 0
Объектно-ориентированное программирование в Python – лучшие ресурсы https://chel-center.ru/python-yfc/2020/03/09/obektno-orientirovannoe-programmirovanie-v-python-luchshie-resursy/ https://chel-center.ru/python-yfc/2020/03/09/obektno-orientirovannoe-programmirovanie-v-python-luchshie-resursy/#comments Mon, 09 Mar 2020 17:17:13 +0000 http://chel-center.ru/python-yfc/?p=29976 Читать далее «Объектно-ориентированное программирование в Python – лучшие ресурсы»

]]> Есть масса способов узнать об объектно‑ориентированном программировании на Python. Однако, эта шпаргалка указывает на самые ценные учебники, видео и книги, которые я нашел специально, чтобы ваши компетенции в ООП Python стали лучше. Счастливого Python‑инга!

Объектно‑ориентированное программирование (ООП) в Python 3

В этом учебном пособии по Real Python вы узнаете основы объектно-ориентированного программирования (ООП) в Python и способы работы с классами, объектами и конструкторами. Учебное пособие также включает в себя несколько ООП-упражнений для проверки вашего прогресса в обучении.

Смело идём сюда.

Официальный учебник Python: классы

Это довольно хорошее введение в основную механику классов и ООП в Python. Учебник совершенствовался годами, и его стоит прочитать, если вы его еще не видели.

https://docs.python.org/3/tutorial/classes.html

Шаблоны Python — репозитарий на GitHub

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

github.com/faif/python-patterns

Шаблоны проектирования на Python

Это хороший вводный урок по шаблонам проектирования ООП в Python. Андрей хорошо показывает, что некоторые из «классических» шаблонов проектирования Java и C++ в Python излишни или имеют более простые реализации и поэтому не нужны, например, использование модуля Python для имитации Singleton.

toptal.com/python/python-design-patterns

Почему полезно объектно-ориентированное программирование?

На примере вымышленной ролевой игры Эл Свейгарт рассказывает и объясняет, как методы ООП могут привести к более простому и более удобному коду. Сделано всё действительно хорошо.

inventwithpython.com/blog/2014/12/02/why-is-object-oriented-program-ming-useful-with-an-role-playing-game-example/

Летняя школа Python: Объектно-ориентированный дизайн

Эта слайд-презентация выступления Нико Уилберта дает отличное введение в ООП и шаблоны проектирования в Python, а также сопровождается множеством примеров.

https://python.g-node.org/python-summerschool-2013/_media/wiki/oop/oo_design_2013.pdf

]]>
https://chel-center.ru/python-yfc/2020/03/09/obektno-orientirovannoe-programmirovanie-v-python-luchshie-resursy/feed/ 1