Программирование на Питоне - часть первая - переменные

Андрей К…
Последнее изменение:
2
1
0

Любую программу можно сравнить со сложным механизмом. Мне лично всегда представляются шестерни, ремни, колеса, пар вылетает из трубы :) Любая программа, как и любой механизм, выполняет работу, отдавая результат, который можно измерить, но потребляя некое количество ресурсов. Чем более качественно спроектирован и выполнен механизм, тем быстрее будет получен результат и тем меньше будет затрачено ресурсов.

Объявление переменных

Если сравнивать программу с роботом(что мы и дальше будем делать), то переменные - это его кратковременная память. При своем включении робот может подумать - "Ага, меня включили, сколько сейчас времени? Пожалуй, запомню время включения - напишу его на стикере, и напишу заголовок - uptime, что бы было проще найти". Когда мы спросим робота - "Робот, сколько ты уже работаешь?" Он скажет "Ээээээ, так, текущее время сейчас такое-то, что там написано на стикере с заголовком uptime? Так-так, из одного отнимаем другое, получаем разницу в 29.123 секунды".

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

Для работы вам потребуется установить Python версии 3.6.4 или выше. После установки у вас будет доступна утилита Idle - запустите её, нажмите File - New File, Save - сохраните куда-нибудь файл под именем lesson.py, в нем можно будет проверять и модифицировать представленный в статье код.

Итак, скопируйте и вставьте туда этот код:

import time
from datetime import datetime

uptime = datetime.now()
print('Меня запустили', uptime)
print('Подожду 10 секунд')
time.sleep(10)
print('Я работаю уже', (datetime.now()-uptime))

Сохраните, и нажмите F5 - код должен запуститься, и вы увидите примерное такое на экране:

Что произошло? В первых двух строчках я подключил библиотеки для работы с датой и временем - они были установлены вместе с питоном. В общем случае, практически все нужные вам библиотеки уже установлены, и если вы не знаете какая вам нужна, достаточно загуглить желаемый результат - например - "python получить текущее время" даст вам 100500 готовых рецептов.

Далее, в строке

uptime = datetime.now()

Я объявил переменную uptime и присвоил ей текущее время. В общем-то, название можно было придумать любое, например код мог выглядеть так

tekuschee_vremya = datetime.now()

или

t = datetime.now()

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


Реклама


Что на самом деле происходит, когда вы объявляете переменную

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

Шаг 1: Установленный интерпретатор Python прочитал эту строчку

uptime = datetime.now()

Шаг 2: Встроенный анализатор разобрался, что слово uptime вы придумали сами, и хотите использовать в качестве названия переменной, а datetime.now() - это чужой код из чужой библиотеки, который нужно выполнить, что бы получить результат.

Шаг 3: Интерпретатор Python нашел библиотеку datetime, модуль datetime, функцию now (обо всем этом позже), выполнил хранящийся там код, получил текущее представление даты/времени в своем внутреннем формате.

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

Шаг 5: Интерпретатор Python записал в эти несколько байт полученное ранее время, и запомнил связь - теперь слово uptime ссылается именно на те несколько байт в оперативной памяти.

 

Сложно? Давайте попробуем на пальцах. Представьте себе кирпичную стену - скажем 1024 кирпича в длину и 1024 кирпича в высоту, на каждом кирпиче умещается ровно 8 букв написанных через трафарет. Эта стена - оперативная память вашего компьютера.

Вдоль этой стены на строительной люльке катается с трафаретом Семен Серафимович - только он имеет возможность и право писать/стирать с этой стены. Семен Серафимович - контроллер оперативной памяти вашего компьютера.

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

Итак, вы написали

uptime = datetime.now()

Через всякие разные звенья Серафимычу пришло указание - надо на стене записать строку "2018-01-03 11:08:00.497689". "Ого", сказал Серафимыч, посчитав каждый символ, включая пробелы, "этож 4 кирпича придется использовать!". Сам Серафимыч сейчас зависает в люльке на высоте в 100 кирпичей от земли, в 22 кирпича слева. Он ищет ближайшее место на стене, где есть 4 подряд свободных кирпича.

Если такого места нет на всей стене, то Серафимыч может подтереть кое-где старую информацию, предварительно сфотографировав, что бы можно было восстановить если что (так работает файл подкачки), и, в конце-концов, куда-то он запишет нужные данные и по цепи вернет информацию - ваша @#$ дата записана на стене, начиная с определенного кирпича (в данном случае место было, вернулось 22 слева, 100 снизу). Спасибо, Семен Серафимович, запомнили!

 

После этого, в нашем коде выполняется строка

print('Меня запустили', uptime)

и на экране мы видим результат

Что произошло тут? Интерпретатор видит, что вы хотите вывести на экран информацию - строку "меня запустили" и переменную uptime. Он помнит, что uptime нужно искать на стене на кирпиче с координатами (100, 22). Снова летит команда Серафимычу - "А что там написано то хоть??". Серафимыч, хотя уже и уехал оттуда, снова подъезжает к этому месту и диктует "2018-01-03...." считывая информацию с каждого последующего кирпича, пока все нужные данные не будут возвращены. Окей, спасибо, программа нам выводит наше значение и значение времени.

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

print('Подожду 10 секунд')
time.sleep(10)

Ну и завершающая строка:

print('Я работаю уже', (datetime.now()-uptime))

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

Вот такие не хухры-мухры ;)

Комментарии: (2)
04.01.2018 08:23
Спасибо, за данный цикл, продолжайте его пож-ста, а то с вашими ботами без этих знаний очень тяжело разбираться :)
02.12.2018 11:15
Это лучшее объяснение того, как работает код программы. Спасибо орнул от души ) Как теперь только развидеть Сирафимыча который выполняет мои программы)
Пожалуйста, Авторизуйтесь что бы оставить свой комментарий