Задание 7: арифметические операции
Python поддерживает арифметические операции: сложение (+), вычитание (-), умножение, (*), деление (/), целочисленное деление (//), взятие остатка от деления (%), возведение в степень.
Сразу ответ к заданию:
Как видите, курс несложный, прекрасно подходит для начинающих, а также позволяет легко научиться работе с PyCharm. Советую пройти его весь, тем более, что на каждое задание есть подсказки.
Если останутся вопросы, Python-сообщество всегда радо будет помочь.
Компиляция программы на python 3 в exe с помощью программы cx_Freeze
Наверняка, у каждого Python-программиста возникало непреодолимое желание, а изредка и реальная потребность, скомпилировать свою программу на python в exe файл. Сегодня я расскажу, как это сделать с помощью программы cx_Freeze.
Вопрос 1: а оно надо?
Прежде, чем начинать компилировать программу, нужно убедиться, что это действительно необходимо.
"Компиляция" программы на python - процесс, который может сопровождаться множеством проблем. Более того, это не компиляция в машинный код, как, например, программы на C, а лишь "сборка" в исполняемый файл вашей программы вместе с частью интерпретатора python.
Поэтому, если вы будете использовать программу сами или на компьютерах тех, кто её будет использовать, будет стоять интерпретатор python, то вам не нужно её компилировать.
Установка cx_Freeze
Если компилировать программу на python всё-таки нужно, то скачиваем cx_Freeze сhttp://www.lfd.uci.edu/~gohlke/pythonlibs/#cx_freeze (так как в ней нет одного неприятного бага, который есть в официальной версии).
Затем устанавливаем, не забывая правильно выбрать директорию, где расположен python.
Компиляция
Компилировать будем программу "блэкджек" (файл 21.py) (кому лень смотреть, привожу полный исходный код).
import randomrandom.shuffle(koloda) print('Поиграем в очко?')count = 0 while True: choice = input('Будете брать карту? y/n\n') if choice == 'y': current = koloda.pop() print('Вам попалась карта достоинством %d' %current) count += current if count > 21: print('Извините, но вы проиграли') break elif count == 21: print('Поздравляю, вы набрали 21!') break else: print('У вас %d очков.' %count) elif choice == 'n': print('У вас %d очков и вы закончили игру.' %count) break print('До новых встреч!')Создаём в папке с программой файл setup.py с содержимым:
from cx_Freeze import setup, Executable setup( name = "21", version = "0.1", description = "Blackjack", executables = [Executable("21.py")])
Переходим в командную строку (обычно Пуск → Стандартные → Командная строка). Переходим в папку с программой (в моём случае D:\Dima\py). Запускаем команду C:\Python34\python.exe setup.py build (вместо C:\Python34 нужно написать папку, куда установлен python).
Начнется процесс сборки, в котором cx_Freeze может выдавать предупреждения, но, скорее всего, они не повлияют на работу программы.
Поздравляю! В папке build теперь есть ваша папка с исполняемым файлом!
Заметьте, не файл, а папка! Все остальные файлы также нужны для работы программы (да, это недостаток cx_Freeze). К тому же, при завершении программы окно сразу закрывается (а не ждет нажатия клавиши), поэтому в конец программы нужно дописать что-то вроде:
input("Press Enter")И скомпилировать ещё раз.
Также можно создать msi-архив командой C:\Python34\python.exe setup.py bdist_msi.
Разумеется, при компиляции более сложных программ вы можете столкнуться с более сложными проблемами.
Для их решения следует воспользоваться официальной документацией.
NumPy: начало работы
NumPy — это библиотека языка Python, добавляющая поддержку больших многомерных массивов и матриц, вместе с большой библиотекой высокоуровневых (и очень быстрых) математических функций для операций с этими массивами.
Установка NumPy
На linux - пакет python3-numpy (или аналогичный для вашей системы), или через pip. Ну или же собирать из исходников https://sourceforge.net/projects/numpy/files/NumPy/.
На Windows на том же сайте есть exe установщики. Или, если возникают проблемы, рекомендую ещё хороший сборник библиотек http://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy.
Начинаем работу
Основным объектом NumPy является однородный многомерный массив (в numpy называется numpy.ndarray). Это многомерный массив элементов (обычно чисел), одного типа.
Наиболее важные атрибуты объектов ndarray:
ndarray.ndim - число измерений (чаще их называют "оси") массива.
ndarray.shape - размеры массива, его форма. Это кортеж натуральных чисел, показывающий длину массива по каждой оси. Для матрицы из n строк и m столбов, shape будет (n,m). Число элементов кортежа shape равно ndim.
ndarray.size - количество элементов массива. Очевидно, равно произведению всех элементов атрибута shape.
ndarray.dtype - объект, описывающий тип элементов массива. Можно определить dtype, используя стандартные типы данных Python. NumPy здесь предоставляет целый букет возможностей, как встроенных, например: bool_, character, int8, int16, int32, int64, float8, float16, float32, float64, complex64, object_, так и возможность определить собственные типы данных, в том числе и составные.
ndarray.itemsize - размер каждого элемента массива в байтах.
ndarray.data - буфер, содержащий фактические элементы массива. Обычно не нужно использовать этот атрибут, так как обращаться к элементам массива проще всего с помощью индексов.
Создание массивов
В NumPy существует много способов создать массив. Один из наиболее простых - создать массив из обычных списков или кортежей Python, используя функцию numpy.array() (запомните: array - функция, создающая объект типа ndarray):
>>> import numpy as np>>> a = np.array([1, 2, 3])>>> aarray([1, 2, 3])>>> type(a)<class 'numpy.ndarray'>Функция array() трансформирует вложенные последовательности в многомерные массивы. Тип элементов массива зависит от типа элементов исходной последовательности (но можно и переопределить его в момент создания).
>>> b = np.array([[1.5, 2, 3], [4, 5, 6]])>>> barray([[ 1.5, 2. , 3. ], [ 4. , 5. , 6. ]])Можно также переопределить тип в момент создания:
>>> b = np.array([[1.5, 2, 3], [4, 5, 6]], dtype=np.complex)>>> barray([[ 1.5+0.j, 2.0+0.j, 3.0+0.j], [ 4.0+0.j, 5.0+0.j, 6.0+0.j]])Функция array() не единственная функция для создания массивов. Обычно элементы массива вначале неизвестны, а массив, в котором они будут храниться, уже нужен. Поэтому имеется несколько функций для того, чтобы создавать массивы с каким-то исходным содержимым (по умолчанию тип создаваемого массива — float64).
Функция zeros() создает массив из нулей, а функция ones() — массив из единиц. Обе функции принимают кортеж с размерами, и аргумент dtype:
>>> np.zeros((3, 5))array([[ 0., 0., 0., 0., 0.], [ 0., 0., 0., 0., 0.], [ 0., 0., 0., 0., 0.]])>>> np.ones((2, 2, 2))array([[[ 1., 1.], [ 1., 1.]], [[ 1., 1.], [ 1., 1.]]])Функция eye() создаёт единичную матрицу (двумерный массив)
>>> np.eye(5)array([[ 1., 0., 0., 0., 0.], [ 0., 1., 0., 0., 0.], [ 0., 0., 1., 0., 0.], [ 0., 0., 0., 1., 0.], [ 0., 0., 0., 0., 1.]])Функция empty() создает массив без его заполнения. Исходное содержимое случайно и зависит от состояния памяти на момент создания массива (то есть от того мусора, что в ней хранится):
>>> np.empty((3, 3))array([[ 6.93920488e-310, 6.93920488e-310, 6.93920149e-310], [ 6.93920058e-310, 6.93920058e-310, 6.93920058e-310], [ 6.93920359e-310, 0.00000000e+000, 6.93920501e-310]])>>> np.empty((3, 3))array([[ 6.93920488e-310, 6.93920488e-310, 6.93920147e-310], [ 6.93920149e-310, 6.93920146e-310, 6.93920359e-310], [ 6.93920359e-310, 0.00000000e+000, 3.95252517e-322]])Для создания последовательностей чисел, в NumPy имеется функция arange(), аналогичная встроенной в Python range(), только вместо списков она возвращает массивы, и принимает не только целые значения:
>> arange(10, 30, 5)array([10, 15, 20, 25])>>> np.arange(0, 1, 0.1)array([ 0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])Вообще, при использовании arange() с аргументами типа float, сложно быть уверенным в том, сколько элементов будет получено (из-за ограничения точности чисел с плавающей запятой). Поэтому, в таких случаях обычно лучше использовать функцию linspace(), которая вместо шага в качестве одного из аргументов принимает число, равное количеству нужных элементов:
>>> np.linspace(0, 2, 9) # 9 чисел от 0 до 2 включительноarray([ 0. , 0.25, 0.5 , 0.75, 1. , 1.25, 1.5 , 1.75, 2. ])fromfunction(): применяет функцию ко всем комбинациям индексов
>>> def f1(i, j):... return 3 * i + j...>>> np.fromfunction(f1, (3, 4))array([[ 0., 1., 2., 3.], [ 3., 4., 5., 6.], [ 6., 7., 8., 9.]])>>> np.fromfunction(f1, (3, 3))array([[ 0., 1., 2.], [ 3., 4., 5.], [ 6., 7., 8.]])Печать массивов
Если массив слишком большой, чтобы его печатать, NumPy автоматически скрывает центральную часть массива и выводит только его уголки.
>>> print(np.arange(0, 3000, 1))[ 0 1 2 ..., 2997 2998 2999]Если вам действительно нужно увидеть весь массив, используйте функцию numpy.set_printoptions:
np.set_printoptions(threshold=np.nan)И вообще, с помощью этой функции можно настроить печать массивов "под себя". Функция numpy.set_printoptions принимает несколько аргументов:
precision : количество отображаемых цифр после запятой (по умолчанию 8).
threshold : количество элементов в массиве, вызывающее обрезание элементов (по умолчанию 1000).
edgeitems : количество элементов в начале и в конце каждой размерности массива (по умолчанию 3).
linewidth : количество символов в строке, после которых осуществляется перенос (по умолчанию 75).
suppress : если True, не печатает маленькие значения в scientific notation (по умолчанию False).
nanstr : строковое представление NaN (по умолчанию 'nan').
infstr : строковое представление inf (по умолчанию 'inf').
formatter : позволяет более тонко управлять печатью массивов. Здесь я его рассматривать не буду, можете почитать здесь (на английском).
И вообще, пользуйтесь официальной документацией по numpy, а в этом пособии я постараюсь описать всё необходимое. В следующей части мы рассмотрим базовые операции над массивами.