Содержание

В этом занятии рассматривается структура программы на Python (инициализация переменных, комментарии, функции, вложенные блоки, проверка данных, проведение вычислений). Пример реализации программы по вычислению факториала при помощи Blockly-редактора можно найти здесь.
Из чего состоит правильная программа?
Подключение модулей
Это некоторые готовые библиотеки, которые предоставляют вам доступ к какому-то дополнительному функционалу и расширяют ваши возможности при написании программы. Их подключение выглядит как:
import sys
import math
Любая программа начинается с подключения модулей. Возможно не этих, а каких-то других (не в любой программе нужны математические функции). Возможно вам не нужно расширение функционала и эта секция программы просто останется пустой. Но, если вы что-то подключаете, старайтесь делать это в самом начале.
Определение переменных
Первое, что обычно имеется в коде программы — определение переменных. Python является достаточно гибким и позволяет создавать переменные где угодно в коде. Но хороший стиль оформления программ предусматривает, что переменные, по возможности, объявляются в одном месте — это, как минимум, удобнее для программиста, который сразу видит, какие переменные являются и каких они типов.
Здесь же переменным задаются начальные значения. Если конкретные значения не известны или не нужны в начале работы, можно присвоить специальное значение None — «ничего». То есть не ноль, не единицу, не пустую строку, а вообще отсутствие значения.
Имена переменных не должны совпадать с зарезервированными словами языка python: функциями, типами данных, операторами и др.
Все переменные желательно называть содержательными именами, чтобы увидев их дальше в коде, можно было сразу понять, что они делают.По стандарту форматирования кода python переменные называются малыми буквами (обратите внимание: для python-а регистр важен, то есть с точки зрения интерпретатора, например, a
и A
— разные переменные). Если одного слова для содержательной названия недостаточно, слова в имени переменной розделяються подчеркиванием.
Итак, string_length
, variables_number
, counter
а также den_rozhdenia_olega
— хорошие названия для переменных. DenProgramista
, counter-of-loops
— плохие. my_variable
, asd1
— очень плохие.
К сожалению, выбрать переменной имя, которое полностью отражает ее суть, можно не всегда. И здесь нам на помощь приходят комментарии.
Комментарии
Комментарий — это любой текст для объяснения работы программы, не выполняется интерпретатором. Комментарии могут быть короткие: отделяются от основного кода диезом и все, что находится в коде программы после диеза и до конца строки, интерпретатором игнорируется. Или длинные, в несколько строк: перед началом многострочного комментария ставится трое двойных кавычек, и еще трое в конце — все, что находится между ними, интерпретатор также не выполнит.
number = 10 # number of variables
"""
Here the program begins. This piece of text will be ignored while executing the program
"""
number = number + 1
Кроме толкования переменных комментарии могут применяться где угодно в коде программы для объяснения, что там происходит. Часто бывает, что, возвращаясь через некоторое время (недели или двух достаточно), автор уже не помнит, для чего выполнялась то или иное действие. А если код программы должны читать посторонние люди (например, программа разрабатывается несколькими программистами), комментарии тем более не будут лишними.
Объявления функций
Python позволяет помимо использования готовых писать и собственные функции. Впрочем, если в программе есть свои функции, они объявляются именно в начале — после объявления переменных или даже перед ним.
Например, text_prompt (из примера с факториалом) выводит текстовую строку-приглашение и ждет, пока пользователь введет какие-то данные и нажмет Enter, а затем возвращает введенное значение в программу. В отличие от ввода из командной строки, это происходит прямо во время работы программы. Следовательно, при необходимости, мы можем таким образом интерактивно вводить данные в необходимые моменты времени.
Вы можете использовать функцию raw_input () (или input () — для python3). Что на самом деле делает text_prompt — это просто обеспечивает выполнение raw_input или input независимо от версии установленного интерпретатора. Итак, можно сделать просто так:
x = raw_input('input x : ')
y = raw_input('input y : ')
summ = x + y
И, после того, как сделаны все подготовительные объявления, переходим к основному телу программы.
Тело программы
В начале тела программы обычно происходит ввод данных. Это может быть интерактивный запрос raw_input (), как мы только что рассмотрели, считывания аргументов командной строки, чтение из какого-либо файла или любой другой способ или их комбинация.
Когда все необходимые данные получены, можно проводить сами вычисления, для которых пишется программа. Эта часть кода непосредственно определяется алгоритмом и задачей, которую вы решаете, и давать какие-то советы сложно.
Целью же любой программы является превращение некоторых данных. То есть вы вводите в программу определенные значения, она что-то с ними делает и выдает результат. Так что этот результат работы в конце должен быть каким-то образом выведен: сохранен в файл, отправлен по электронной почте и т.д. Самый простой вариант — это просто вывести результат на экран, например, командой print.
В литературе и примерах с использованием Python 2.x.x. можно встретить различные варианты записи print — со скобками и без (в Python3 используйте скобки! Получите ошибку SyntaxError: Missing parentheses in call to ‘print’. Did you mean print( ‘Hello!’ )?):
print 'Hello!'
print('My name is Boris.')
Пример с факториалом, разветвление if..else, цикл for
Рассмотрим на примере с факториалом, который мы сделали в Блокли:
"""
Factorial calculation program
"""
n = 0 # n to calculate the n!
counter = 0 # counter = 1..n
result = 1 # result = n!
def text_prompt(msg): # function used for interactive data input
try:
return raw_input(msg) # this one is for python 2
except NameError:
return input(msg) # this one is for python 3
n = int(text_prompt('input N: ')) # input n
if n < 0: # if n<0 then n! is undefined
print('N should not be less than zero')
else: # if n>=0 then calculate it
for counter in range(n): # repeat n times
result = result * (counter + 1)
print(str(n) + '! = ' + str(result)) # print the result
В начале программы происходит объявление и инициализация переменных (присвоение им начальных значений), далее объявления функции для ввода данных и само тело программы, которое включает введение n, его проверку, проведение вычислений и вывода результата. В данном примере вместо того, чтобы вывести просто число, мы выводим целую строку, который состоит из нескольких частей, и выглядеть при работе программы так:
3! = 6
или
10! = 3628800
Это имеет смысл, если предполагается интерактивная работа программы: вы выводите пользователю строку-приглашение, вводите данные, а дальше выводите хорошо отформатированную ответ — почему бы и нет.
Такое форматирование в данном случае достигается конкатенацией строк. Сначала берется число n, которое зависит от того, что было введено пользователем. Обратите внимание: так как добавление строки и числа в python недопустимо, мы принудительно конвертируем n в строку с помощью функции str (). К ней приписываем восклицательный знак и равно — эта часть является неизменной при каждом запуске программы, поэтому просто записывается как строка. Далее к ним добавляется собственно результат, который также является числом. Следовательно для добавления к строке его тоже необходимо конвертировать.
Кроме форматирования в данном примере вместо дополнительной переменной i использовано count, а переменная n сразу вводится как целая, без лишних преобразований.
Аналогичную программу можно было бы записать без всякого интерактива, передавая ей единственный параметр — число n — при запуске.Соответственно, в таком варианте от «дружественного» форматирования ответа можно избавиться. И это будет выглядеть следующим образом:
"""
Factorial calculation program
"""
import sys
n = 0 # n to calculate the n!
counter = 0 # counter = 1..n
result = 1 # result = n!
n = int(sys.argv[1]) # input n
if n < 0: # if n<0 then n! is undefined
print('no answer')
else: # if n>=0 then calculate it
for counter in range(n): # repeat n times
result = result * (counter + 1)
print(result) # print the result
Почти то же самое, только изменено ввода и вывода данных, добавлены подключения модуля sys для чтения аргументов командной строки и, соответственно, убрано функцию text_prompt — она больше не нужна.
Алгоритмические конструкции
Ключевым в примере применение алгоритмических конструкций — условного ветвления и цикла Обе они предполагают нелинейное выполнения программы, для чего могут иметь вложенные блоки кода — именно те фрагменты программы, которые необходимо исключить из линейной последовательности выполнения действий в программе.
Напомним: вложенные блоки кода в python выделяются отступлениями в начале строки. Алгоритмические структуры могут вкладываться друг в друга сколько угодно раз — это приводит к большей вложенности блоков кода и, соответственно, больших отступлений.
if n == 0:
print "n is equal to zero"
else:
if n == 7:
print "You're lucky!"
else:
if n > 0:
print 'n is greater than zero'
else:
print "n is less than zero"
С другой стороны это значит, что та часть кода, которая не предусматривает вложенности, то есть выполняется последовательно, не может содержать лишних отступов, плавая влево-вправо — все команды должны быть хорошо написаны на одном уровне.
Большинство языков программирования являются достаточно гибкими в этом вопросе, но содержат дополнительные операторы или отметки для выделения вложенных блоков. Разработчики же python пошли другим путем: избавились таким образом от лишних элементов в коде (и одновременно заставили программистов хорошо форматировать код).
if..else
Описывает условие, при котором происходит переход на одну ветку или другую, и включает 2 вложенных блоки кода:
if n == 0:
if n == 0:
print "n is equal to zero"
else:
print "n is not equal to zero"
Если условие подтверждается, выполняется первый блок. Если нет — второй. Иногда бывает, что необходимо что-то делать только в случае, когда условие верно — в таком случае вторую часть конструкции можно опустить:
if n == 0:
if n == 0:
print "n is equal to zero"
print "this will be printed anyway"
В качестве условия чаще всего применяются сравнения переменных со значениями или другими переменными. Для этого доступны <>, <=,> =, ==. Для проверки «не равно» есть аж два обозначения:! = И <>. Обратите внимание: для проверки, является ли значение или переменные равными, используется двойное «равно» ==, одинарное же применяется для присвоения значений.
Цикл for
На примере в Блокли использованный for является лишь одним из многих, но пока будем работать именно с ним. Это цикл с заранее определенным количеством итераций, в виде блок-схемы его можно представить примерно так:
if n == 0:
n = int(raw_input('input N:'))
for counter in range(n):
print counter+1
Или составить между собой 10 членов арифметической прогрессии a1 + a2 + … + a10 с a0 = 1 и d = 5:
a_0 = 1 # zero member
a_previous = a_0 # previous member
a_i = 0 # current member
d = 5
sum = a_0
for counter in range(10):
a_i = a_previous + d # calculate the new member
sum = sum + a_i
a_previous = a_i # save it as previous
print sum