#1. Знакомство с Python
Знакомство с Python. Типы данных. Базовые операции
План
- Введение в программирование
- О языке Python
- Литература и полезные ссылки
- Домашнее задание
Вместо введения
Программы = алгоритмы + структуры данных
Никлаус Вирт
Прежде, чем приступить к языкам программирование, вкратце разберем что такое компьютер и как он работает.
Компью́тер (англ. computer, от лат. computare — считать, вычислять) — устройство, способное автоматически выполнять заданную последовательность операций. Описание последовательности операций называется программой.
Основные компоненты компьютера:
Процессор получает данные из памяти, производит вычисления, и обратно записывает эти данные в память.
Алгори́тм (лат. algorithmi — от имени среднеазиатского математика Аль-Хорезми) — конечная совокупность точно заданных правил решения некоторого класса задач или набор инструкций, описывающих порядок действий исполнителя для решения определённой задачи.
Все в программировании структурировано, подчиняется логике, алгоритмизированно.
Написание программы требует в первую очередь не знания языка, а умения строить логические цепочки, связывать события между собой, т.е. строить алгоритмы.
Для построения алгоритмов рекомендуется использовать блок-схемы. Первое время учащимся настоятельно рекомендуется строить блок-схемы даже для самых простых задач, далее - только для тех, которые кажутся им сложными.
Блок-схема (Flowchart)
Блок-схемой называется графическое представление алгоритма. В блок-схеме шаг или последовательность шагов алгоритма представляется в виде блока, а между блоками устанавливаются связи.
Побробнее тут .
Например, проверку существования треугольника с заданными длинами сторон
Компью́терная програ́мма — набор компьютерных инструкций и данных, позволяющая аппаратному обеспечению выполнять вычисления или функции управления.
Программи́рование — процесс создания компьютерных программ.
Язы́к программи́рования — формальный язык, предназначенный для записи компьютерных программ. Язык программирования определяет набор лексических, синтаксических и семантических правил, определяющих внешний вид программы и действия, которые выполнит клмпьютер под её управлением.
Уровни языков программирования
- машинные;
- машинно-оpиентиpованные (ассемблеpы);
- машинно-независимые (языки высокого уровня).
Машинные языки и машинно-ориентированные языки - это языки низкого уровня или языки первого поколения
Трансля́ция програ́ммы — преобразование программы, представленной на одном из языков программирования, в программу на другом языке. Транслятор обычно выполняет также диагностику ошибок, формирует словари идентификаторов, выдаёт для печати текст программы и т. д.
Трансля́тор — программа или техническое средство, выполняющее трансляцию программы.
Виды трансляции выделяют следующие языки
- Компиляция (Компилятор - Компилируемый язык)
- Интерпретация (Интерпретар - Интерпретируемый язык)
Компиляция означает, что исходный код программы сперва преобразуется в целевой (машинный) код специальной программой, называемой компилятором — в результате получается исполнимый модуль, который уже может быть запущен на исполнение как отдельная программа.
Интерпретация же означает, что исходный код выполняется непосредственно, команда за командой, так что программа просто не может быть запущена без наличия интерпретатора.
У компиляторов и интерпретаторов имеются свои достоинства. Возможны различные критерии. По производительности – времени выполнения программы – компиляторы побеждают.
- Выход компилятора является машинным кодом, непосредственно выполняемым компьютером. Дополнительно при создании этого кода компилятор мог применять оптимизацию, улучшающую эффективность кода.
- Интерпретация кода требует при выполнении каждого оператора его предварительной обработки. В результате интерпретация программы выполняется на порядок медленнее в сравнении с работой программы, созданной компилятором.
Все меняется, если в качестве критерия выбрать удобство и скорость разработки. Компилятор стоит между вами и реализацией вашей последней идеи: прежде чем увидеть результаты последнего изменения в программе, необходимо ждать результата компиляции (и связывания, о чем ниже пойдет речь). При интерпретации выполнение начинается незамедлительно.
Типизация в языках программирования:
Типизация — это то, как язык распознаёт типы переменных. Типизация определяет, нужно ли вам писать тип, или язык «поймёт» его сам, и насколько свободно можно с типами работать: например, можно ли их менять.
В переменную можно записывать информацию, а тип переменной описывает, какая именно информация записана в переменной и что с ней можно делать.
- типизированные и нетипизированные (бестиповые).
К первому например относятся C, Python, Scala, PHP и Lua, а ко второму — язык ассемблера, Forth и Brainfuck.
Типизированные
-
Статическая / динамическая типизация. Статическая определяется тем, что конечные типы переменных и функций устанавливаются на этапе компиляции. Т.е. уже компилятор на 100% уверен, какой тип где находится. В динамической типизации все типы выясняются уже во время выполнения программы.
Примеры:
Статическая: C, Java, C#;
Динамическая: Python, JavaScript, Ruby. -
Сильная / слабая типизация (также иногда говорят строгая / нестрогая). Сильная типизация выделяется тем, что язык не позволяет смешивать в выражениях различные типы и не выполняет автоматические неявные преобразования, например нельзя вычесть из строки множество. Языки со слабой типизацией выполняют множество неявных преобразований автоматически, даже если может произойти потеря точности или преобразование неоднозначно.
Примеры:
Сильная: Java, Python, Haskell, Lisp;
Слабая: C, JavaScript, Visual Basic, PHP. -
Явная / неявная типизация. Явно-типизированные языки отличаются тем, что тип новых переменных / функций / их аргументов нужно задавать явно. Соответственно языки с неявной типизацией перекладывают эту задачу на компилятор / интерпретатор.
Примеры:
Явная: C++, D, C#
Неявная: PHP, Lua, JavaScript, Python
Python
Немного истории
Опубликован в 1991 году Гвидо ван Россумом
Гвидо ван Россум (нидерл. Guido van Rossum; род. 31 января 1956, Харлем, Нидерланды) — голландский программист и автор языка программирования Python.
Он же «Великодушный пожизненный диктатор» (англ. Benevolent Dictator For Life, сокр. BDFL)
Язык назван в честь популярного телешоу «Летающий цирк Монти Пайтона» (Monty Python’s Flying Circus)
(британский комедийный скетч-сериал с участием комедийной группы «Монти Пайтон»)
Датой пуюбликацйии считается 20 февраля 1991 (version 0.9.0)
Входит в топ-5 языков https://www.tiobe.com/tiobe-index/
https://insights.stackoverflow.com/survey/2021#most-popular-technologies-language
Актуальные версии 3.7+ и старше
Последняя доступная 3.10
2.7 стала последней версией второго питона, поддержка закончилась 1 Января 2020
Где используется
Кем используется
Портируемость
Python портирован и работает почти на всех известных платформах — от КПК до мейнфреймов.
Существуют порты под Microsoft Windows, практически все варианты UNIX и UNIX-подобных систем:(включая FreeBSD, и Linux, Mac OS X), Plan 9, Mac OS и , iPhone OS 2.0 и выше, Palm OS, OS/2, Amiga, HaikuOS, AS/400 и даже OS/390, Windows Mobile, Symbian и Android.
The Zen of Python
Красивое лучше, чем уродливое.
Явное лучше, чем неявное.
Простое лучше, чем сложное.
Сложное лучше, чем запутанное.
Плоское лучше, чем вложенное.
Разреженное лучше, чем плотное.
Читаемость имеет значение.
Особые случаи не настолько особые, чтобы нарушать правила.
При этом практичность важнее безупречности.
Ошибки никогда не должны замалчиваться.
Если они не замалчиваются явно.
Встретив двусмысленность, отбрось искушение угадать.
Должен существовать один и, желательно, только один очевидный способ сделать это.
Хотя он поначалу может быть и не очевиден, если вы не голландец.
Сейчас лучше, чем никогда.
Хотя никогда зачастую лучше, чем прямо сейчас.
Если реализацию сложно объяснить — идея плоха.
Если реализацию легко объяснить — идея, возможно, хороша.
Пространства имён — отличная штука! Будем делать их больше!
Тим Петерс
О языке
- Свободный и имеет открытый исходный код
- Реализован на С (CPython)
- Высокоуровневый
- Динамическая сильная неявная типизация
- Интерпретируемый
- Объектно-ориентированный - все является объектом
Python — высокоуровневый интерпретируемый язык программирования общего назначения с динамической строгой неявной типизацией и автоматическим управлением памятью. Ориентированный на повышение производительности разработчика, читаемости кода и его качества, а также на обеспечение переносимости написанных на нём программ. Язык является полностью объектно-ориентированным в том плане, что всё является объектами. Python является мультипарадигмальным языком программирования.
Недостатками языка являются зачастую более низкая скорость работы и более высокое потребление памяти написанных на нём программ по сравнению с аналогичным кодом, написанным на компилируемых языках, таких как C или C++.
Паради́гма программи́рования — это совокупность идей и понятий, определяющих стиль написания компьютерных программ (подход к программированию). Подробнее тут
Python поддерживает структурное, объектно-ориентированное, функциональное, императивное и аспектно-ориентированное программирование.
Выполнение программы на Python
Выполнение программы на Python выглядит следующим образом. Сначала мы пишим в текстовом редакторе скрипт с набором выражений на данном языке программирования. Передаем этот скрипт на выполнение интерпретатору. Интерпретатор транслирует код в промежуточный байткод, а затем виртуальная машина переводит полученный байткод в набор инструкций, которые выполняются операционной системой.
Здесь стоит отметить, что хотя формально трансляция интерпретатором исходного кода в байткод и перевод байткода виртуальной машиной в набор машинных команд представляют два разных процесса, но фактически они объединены в самом интерпретаторе.
Переменная
Переме́нная — поименованная область памяти, адрес которой можно использовать для осуществления доступа к данным.
Данные, находящиеся в переменной (то есть по данному адресу памяти), называются значением этой переменной
Переменная — именованный участок памяти, обладающий некоторым типом.
Переменные — это контейнер для таких значений, как числа, используемые в сложении, или строка, которую мы могли бы использовать как часть предложения. Но одна из особенностей переменных — их значение может меняться.
В Python имена переменных могут содержать буквы, цифры и символ нижнего подчеркивания. При этом начинаться переменная должна либо с буквы, либо с символа нижнего подчеркивания. Если переменная состоит из нескольких слов, её принято называть snake_case_ом.
Типом переменной называется тот вид данных, который на данный момент может хранить переменная. Все виды данных в языках программирования можно отнести к двум группам: скалярные (простые) типы данных и структурированные (составные) типы данных.
Базовые типы
На этом уроке мы работаем только со скалярным типом данных integer (целые числа) и структурированным типом данных string(строка), представляющим собой последовательность символов. Подробнее структурированные типы данных будут рассмотрены на следующих уроках.
Объявление переменной
Далее представлены переменные различных скалярных (простых) типов:
my_integer = 4 #целые числа
my_float = 4.12 #дробные числа
my_char = 'a' #символы
my_bool = True #правда или ложь, булева алгебра
Любой объект является ссылкой
• Типом объекта является то, на что он ссылается
• Тип объекта может произвольно меняться по ходу выполнения кода, когда ссылка начинает ссылаться на другой объект (например, в результате операции присвоения).
Синтаксис языка Python и отступы
print(‘Hello, World’)
if True:
••••a = 1 #comment
else:
••••b = ‘c’
Настоятельно рекомендуется использовать 4 пробела на каждый уровень отступа. Python 3 запрещает смешивание табуляции и пробелов в отступах. Код, в котором используются и те, и другие типы отступов, должен быть исправлен так, чтобы отступы в нем были расставлены только с помощью пробелов.
Числовые типы: int , float
- int - целые числа
- float - вещественные числа
Простейшие математические операции с числами
x + y | Сложение |
x - y | Вычитание |
x * y | Умножение |
x / y | Деление |
x // y | Получение целой части от деления |
x % y | Остаток от деления |
-x | Смена знака числа |
abs(x) | Модуль числа |
divmod(x, y) | Пара (x // y, x % y) |
x ** y | |
pow(x, y[, z]) | xy по модулю (если модуль задан) |
int1 = 4
int2 = 8
result = int1 + int2 # result = 12
result = int2 - int1 # result = 4
result = int1 * int2 # result = 32
result = (int2+1) // int1 # result = 2
result = int2 ** int1 # result = 4096
result = (int2+1) % int1 # result = 1
Из-за представления чисел в компьютере вещественные числа неточны, и это может привести к ошибкам:
>>> 0.1+0.1
0.2
>>> 0.1+0.1+0.1
0.30000000000000004
Операторы присваивания
Оператор | Описание | Примеры |
---|---|---|
= | Присваивает значение правого операнда левому. | c = 23 присвоит переменной с значение 23 |
+= | Прибавит значение правого операнда к левому и присвоит эту сумму левому операнду. |
с = 5 |
-= | Отнимает значение правого операнда от левого и присваивает результат левому операнду. |
с = 5 |
*= | Умножает правый операнд с левым и присваивает результат левому операнду. |
с = 5 |
/= | Делит левый операнд на правый и присваивает результат левому операнду. | с = 10 а = 2 с /= а равносильно: с = с / а. c будет равно 5 |
%= | Делит по модулю операнды и присваивает результат левому. | с = 5 а = 2 с %= а равносильно: с = с % а. c будет равно 1 |
**= | Возводит в левый операнд в степень правого и присваивает результат левому операнду. | с = 3 а = 2 с **= а равносильно: с = с ** а. c будет равно 9 |
//= | Производит целочисленное деление левого операнда на правый и присваивает результат левому операнду. | с = 11 а = 2 с //= а равносильно: с = с // а. c будет равно 5 |
Строковые: str
Строки в Python - упорядоченные последовательности символов, используемые для хранения и представления текстовой информации, поэтому с помощью строк можно работать со всем, что может быть представлено в текстовой форме.
s1 = ''
s2 = 'a'
s3 = "b"
s4 = 'spam"s'
s5 = "spam's"
Конкатенация (сложение)
>>> s1 = 'spam'
>>> s2 = 'eggs'
>>> print(s1 + ' ' + s2)
'spam eggs'
Вывод данных
Для вывода данных используется функция print
:
int1 = 4
str1 = "8"
print(int1) #выведет 4
print('text') #выведет text
print("text") #выведет text
print(str1) #выведет 8
Практика
Установка Python
Выбор среды разработки
Первая программа
-
Выводим Hello, World с помощью print()
-
Приветствуем пользователя, получив его имя с помощью input()
a = input('Input your name: ')
"Есть чё посложнее??"
Напишем небольшой скрипт. Скрипт будет получать на вход суммы денег, суммировать их и прекратит свою работу, когда сумма превысит тысячу (к примеру, долларов США). Каждую введенную сумму скрипт будет распределять по шести “конвертам”:
Конверт на “необходимые траты и нужды” получает 55% всех средств.
Конверты на “финансовую свободу”, “образование”, “резерв и больше покупки” и “развлечения” получают по 10% средств.
Конверт “на подарки” получает оставшиеся 5% средств
Для удобства работы с программой она будет разбита на небольшие куски. Внутри программы есть комментарии на английском языке, а вне кода куски программы прокомментированы на русском.
# -*- coding: utf-8 -*-
# initializing empty envelops
necessity_envelop = 0 # NEC, необходимые траты
freedom_envelop = 0 # FFA, финансовая свобода
education_envelop = 0 # EDU, образование
long_term_envelop = 0 # LTSS, резерв и на большие покупки
play_envelop = 0 # PLAY, развлечения
give_envelop = 0 # GIVE, подарки
# initializing percent rate
nec_rate = 0.55
ffa_rate = 0.1
edu_rate = 0.1
ltss_rate = 0.1
play_rate = 0.1
give_rate = 0.05
# initializing expected income, expected necessity and other amounts
expected_income = 1000
Иинициализация переменных конвертов и коэффициентов
# invitation, greetings etc.
print ("""Hello.\n
We gonna fill your envelops by the money you input here!\n
Please input your amounts of money income and see the results.\n
Press Ctrl+c to exit script.
\n\n Enter the amount please:""")
Вывод приглашения в консоль
# initializing handler for standard input
sum = 0
while (sum < expected_income):
line = int(input())
sum += line
necessity_envelop += line * nec_rate
freedom_envelop += line * ffa_rate
education_envelop += line * edu_rate
long_term_envelop += line * ltss_rate
play_envelop += line * play_rate
give_envelop += line * give_rate
print("\n Enter the amount please:")
Цикл обработки поступающих от пользователя сумм
Строка
line = int(input())
означает “считать в переменную line одну строку из консоли”.
Результирующий вывод данных
# final output
print("At the end we have:\n\
Necessity Envelop has: " + str(int(necessity_envelop)) + "\n\
Financial Freedom Envelop has: " + str(int(freedom_envelop)) + "\n\
Education Envelop " + str(int(education_envelop)) + "\n\
Long Term Saving for Spending Envelop has: " + str(int(long_term_envelop)) + "\n\
Play Envelop has: " + str(int(play_envelop)) + "\n\
Give Envelop has: " + str(int(give_envelop)) + "\n\
_______________________________________________________________\n\
\
Thanks for using our software :)")
Cохраняем в файл с раширением .py
и запускаем
python envelops.py
Литература и полезные ссылки
- 📖 Язык программирования
- 📖 Числа и Работа со строками в Python
- 📖 Установка и первая программа
- 📖 Ликбез по типизации в языках программирования
- 📖 Компиляция против интерпретации
Домашнее задание
- Нарисовать простейшую блок-схему приготовления чая “из пакетика”.
🔗 Редактор блок-схем онлайн - Нарисовать блок-схему программы
envelops.py
.