Python. Занятие 3: продолжение знакомства

5 (100%) 8 vote[s]

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

Из чего состоит правильная программа?

Подключение модулей

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

import sys
import math

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

Определение переменных

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

Здесь же переменным задаются начальные значения. Если конкретные значения не известны или не нужны в начале работы, можно присвоить специальное значение None — «ничего». То есть не ноль, не единицу, не пустую строку, а вообще отсутствие значения.

Имена переменных не должны совпадать с зарезервированными словами языка python: функциями, типами данных, операторами и др.

Все переменные желательно называть содержательными именами, чтобы увидев их дальше в коде, можно было сразу понять, что они делают.По стандарту форматирования кода python переменные называются малыми буквами (обратите внимание: для python-а регистр важен, то есть с точки зрения интерпретатора, например, a и A— разные переменные). Если одного слова для содержательной названия недостаточно, слова в имени переменной розделяються подчеркиванием.

Итак, string_lengthvariables_numbercounterа также den_rozhdenia_olega— хорошие названия для переменных. DenProgramistacounter-of-loops— плохие. my_variableasd1— очень плохие.

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

Комментарии

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

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

Рассмотрим на примере с факториалом, который мы сделали в Блокли:

  1. """
  2. Factorial calculation program
  3. """
  4. n = 0                      # n to calculate the n!
  5. counter = 0                # counter = 1..n
  6. result = 1                 # result = n!
  7.  
  8. def text_prompt(msg):      # function used for interactive data input
  9.   try:
  10.     return raw_input(msg)  # this one is for python 2
  11.   except NameError:
  12.     return input(msg)      # this one is for python 3
  13.  
  14. n = int(text_prompt('input N: '))          # input n
  15. if n < 0:                                  # if n<0 then n! is undefined
  16.   print('N should not be less than zero')
  17. else:                                      # if n>=0 then calculate it
  18.   for counter in range(n):                 # repeat n times
  19.     result = result * (counter + 1)
  20.   print(str(n) + '! = ' + str(result))     # print the result

В начале программы происходит объявление и инициализация переменных (присвоение им начальных значений), далее объявления функции для ввода данных и само тело программы, которое включает введение n, его проверку, проведение вычислений и вывода результата. В данном примере вместо того, чтобы вывести просто число, мы выводим целую строку, который состоит из нескольких частей, и выглядеть при работе программы так:

3! = 6

или 

10! = 3628800

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

Такое форматирование в данном случае достигается конкатенацией строк. Сначала берется число n, которое зависит от того, что было введено пользователем. Обратите внимание: так как добавление строки и числа в python недопустимо, мы принудительно конвертируем n в строку с помощью функции str (). К ней приписываем восклицательный знак и равно — эта часть является неизменной при каждом запуске программы, поэтому просто записывается как строка. Далее к ним добавляется собственно результат, который также является числом. Следовательно для добавления к строке его тоже необходимо конвертировать.

Кроме форматирования в данном примере вместо дополнительной переменной i использовано count, а переменная n сразу вводится как целая, без лишних преобразований.

Аналогичную программу можно было бы записать без всякого интерактива, передавая ей единственный параметр — число n — при запуске.Соответственно, в таком варианте от «дружественного» форматирования ответа можно избавиться. И это будет выглядеть следующим образом:

  1. """
  2. Factorial calculation program
  3. """
  4. import sys 
  5.  
  6. n = 0                                # n to calculate the n!
  7. counter = 0                          # counter = 1..n
  8. result = 1                           # result = n!
  9.  
  10. n = int(sys.argv[1])                 # input n
  11. if n < 0:                            # if n<0 then n! is undefined
  12.   print('no answer')
  13. else:                                # if n>=0 then calculate it
  14.   for counter in range(n):           # repeat n times
  15.     result = result * (counter + 1)
  16.   print(result)                      # print the result

Почти то же самое, только изменено ввода и вывода данных, добавлены подключения модуля sys для чтения аргументов командной строки и, соответственно, убрано функцию text_prompt — она ​​больше не нужна.

Алгоритмические конструкции

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

Напомним: вложенные блоки кода в python выделяются отступлениями в начале строки. Алгоритмические структуры могут вкладываться друг в друга сколько угодно раз — это приводит к большей вложенности блоков кода и, соответственно, больших отступлений.

  1. if n == 0:
  2.   print "n is equal to zero"
  3. else:
  4.   if n == 7:
  5.     print "You're lucky!"
  6.   else:
  7.     if n &gt; 0:
  8.       print 'n is greater than zero'
  9.     else:
  10.       print "n is less than zero"

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

Большинство языков программирования являются достаточно гибкими в этом вопросе, но содержат дополнительные операторы или отметки для выделения вложенных блоков. Разработчики же python пошли другим путем: избавились таким образом от лишних элементов в коде (и одновременно заставили программистов хорошо форматировать код).

if..else

Описывает условие, при котором происходит переход на одну ветку или другую, и включает 2 вложенных блоки кода:

  1. if n == 0:
  2. if n == 0:
  3.   print "n is equal to zero"
  4. else:
  5.   print "n is not equal to zero"

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

  1. if n == 0:
  2. if n == 0:
  3.   print "n is equal to zero"
  4. print "this will be printed anyway"

В качестве условия чаще всего применяются сравнения переменных со значениями или другими переменными. Для этого доступны <>, <=,> =, ==. Для проверки «не равно» есть аж два обозначения:! = И <>. Обратите внимание: для проверки, является ли значение или переменные равными, используется двойное «равно» ==, одинарное же применяется для присвоения значений.

Цикл for

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

  1. if n == 0:
  2. n = int(raw_input('input N:'))
  3. for counter in range(n):
  4.   print counter+1

Или составить между собой 10 членов арифметической прогрессии a1 + a2 + … + a10 с a0 = 1 и d = 5:

  1. a_0 = 1                    # zero member
  2. a_previous = a_0           # previous member
  3. a_i = 0                    # current member
  4. d = 5    
  5. sum = a_0
  6. for counter in range(10):
  7.   a_i = a_previous + d     # calculate the new member
  8.   sum = sum + a_i          
  9.   a_previous = a_i         # save it as previous
  10. print sum

Тест проверки знаний:

Python 3 Babulya 2019 год Повторить тест
Введение в информатику: программирование на Python
Python 3   |   Дата: 03.07.2019   |   Вопросов: 7   |   Автор: Babulya
Вопрос № 1
Вопрос № 2
Вопрос № 3
Вопрос № 4
Вопрос № 5
Вопрос № 6
Вопрос № 7

Практические задания

Задание 1

Программа должна рассчитывать числа последовательности Фибоначчи. Последовательность Фибоначчи — это последовательность чисел, в которой каждый элемент равен сумме двух предыдущих. При этом нулевой элемент считается 0, а первый 1. Итак, сама последовательность выглядит следующим образом: 
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, …

Входные данные : целое неотрицательное число n. Передается в программу в качестве аргумента командной строки.

Результат работы : значение n-го числа последовательности Фибоначчи.

Не используйте рекурсию.

Например
Входные данные: 0 
Пример вызова: python lab3_2.py 0 
Результат: 0 
Входные данные: 10 
Пример вызова: python lab3_2.py 10 
Результат: 55

Решение смотрите здесь:

Решение

Задание 2

Программа должна рассчитывать числа последовательности Фибоначчи. Последовательность Фибоначчи — это последовательность чисел, в которой каждый элемент равен сумме двух предыдущих. При этом нулевой элемент считается 0, а первый 1. Итак, сама последовательность выглядит следующим образом: 
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, …

Входные данные : целое неотрицательное число n. Передается в программу в качестве аргумента командной строки.

Результат работы : значение n-го числа последовательности Фибоначчи.

Не используйте рекурсию.

Например
Входные данные: 0 
Пример вызова: python lab3_2.py 0 
Результат: 0 
Входные данные: 10 
Пример вызова: python lab3_2.py 10 
Результат: 55

Ответ

Читайте больше по теме:

Подписаться
Уведомление о
guest
0 комментариев
Inline Feedbacks
View all comments
Просмотры: 1526

Популярные записи