Python для обеспечения географических исследований Лекция 3

advertisement
Python для обеспечения
географических исследований
Лекция 3
Сегодня на повестке дня:
Смотрим на решение домашних задачек
Ветвление по условию
Циклы с условием
Циклы с параметром
Исключения и их обработка
2
import math
# ВВОД ДАННЫХ
print "Type x1: "
x1 = input()
print "Type y1: "
y1 = input()
print "Type a: "
adeg = input()
print "Type d: "
d = input()
# ПЕРЕВОД УГЛА В РАДИАНЫ
arad = (adeg * math.pi)/180
# СЧИТАЕМ ПРИРАЩЕНИЯ
dx = math.cos(arad)*d
dy = math.sin(arad)*d
# СЧИТАЕМ КООРДИНАТЫ
x2 = x1 + dx
y2 = y1 + dy
print "x2: " + str(x2)
print "y2: " + str(y2)
3
# ВВОД ДАННЫХ
print 'Enter phrase:'
str = input ()
# ВЫВОД ДАННЫХ
print str[:4]
print str[4:]
print str[len(str)/2]
print str [2:7]
4
import math
# ВВОД ДАННЫХ
print 'Enter list:'
a = input ()
# ВЫВОД 4го ЭЛЕМЕНТА
print a[3]
# ВЫВОД В ОБРАТНОМ ПОРЯДКЕ
print a[5],a[4],a[3],a[2],a[1],a[0] # МОЖНО ПРОСТО a [-1::-1] , :: - ЗНАЧИТ ШАГ.
# СУММА
sum = a[0] + a[1] + a[2] + a[3] + a[4] + a[5]
print sum
5
# СРЕДНЕЕ АРИФМЕТИЧЕСКОЕ
srArifm = sum / 6.0
print srArifm
#ОТКЛОНЕНИЯ ЭЛЕМЕНТОВ
otklon = [a[0]-srArifm,a[1]-srArifm,a[2]-srArifm,a[3]-srArifm,a[4]-srArifm,a[5]-srArifm]
print otklon
#СРЕДНЕЕ КВАДРАТИЧЕСКОЕ ОТКЛОНЕНИЕ
srKvOtklon = math.sqrt((otklon[0]**2+otklon[1]**2+otklon[2]**2+otklon[3]**2+otklon[4]**2+otklon[5]**2)/6)
print srKvOtklon
6
В программах постоянно возникает необходимость поступить так или иначе
в зависимости от выполнения или невыполнениях разных условий
7
Для этого в любом языке есть так называемый «условный оператор».
В Python это оператор if
Синтаксис:
if <логическое выражение>:
<действия>
elif <логическое выражение>:
<действия>
else:
<действия>
elif и else – необязательные компоненты
Логическое выражение здесь - любой сложности с использованием функций и т.д.
8
Пример:
a=2
if a > 3:
print 'a higher than 3'
else:
print 'a less than 3'
Здесь мы сталкиваемся сразу с массой важных новых вещей.
Первая и самая необычная – форма операторных скобок. В python их роль играют просто…
отступы. Из пробелов или табуляции.
9
Pascal:
If a > 3 then
Begin
<действия>
End;
Операторные скобки Begin – End ограничивают перечень инструкций, относящихся к
оператору if
C, Java:
If (a>3) {
<действия>
}
Здесь операторные скобки имеют вид фигурных скобок.
То, что за операторными скобками, продолжает выполняться независимо от условия
10
В Python:
print ‘Привет, мир!’
a=3
b=4
if (a*3) > 10:
print ‘Родина встречает октябрь!’
s = input ()
…
Да, если не будет отступа – ничего не заработает.
Да, отступы будут везде и повсюду, где будут составные инструкции.
11
Под <действия> подразумевается любое количество инструкций любого толка, в
том числе другие операторы условия и вообще что угодно.
if (a > 3):
print ‘abc’
b=a+3
if (b < 7):
c=b–1
print ‘!’
print ‘?’
print ‘…’
Только по отступам интерпретатор понимает, к чему именно
относятся те или иные инструкции.
12
При этом отступы по всей программе должны быть одинаковыми. Например 2
пробела, или 4 пробела. Разные отступы будут интерпретироваться как разные
уровни вложенности!
if (a>3):
b=4
k=7
e=2
WTF?!
13
Необязательные части оператора: elif и else
elif – ещё один оператор условия, в который мы попадаем,
если не выполняется условие основного if
a=4
if (a > 5):
print ‘a is higher than 5’
elif (a = 5):
print ‘a is equal 5’
14
Необязательные части оператора: elif и else
else – ветка, в которую мы попадаем, если не выполняется
условие основного if и elif при его наличии
a=4
if (a > 5):
print ‘a is higher than 5’
else:
print ‘a is equal or less than 5’
15
a = int(input())
if a < -5:
print('Low')
elif -5 <= a <= 5:
print('Mid')
else:
print('High')
16
Веток elif может быть сколько угодно. Else – только одна, в самом конце.
17
Другая часто встречаемая задача – повторять какой-то кусок кода много раз,
причем в нем могут меняться переменные, по-разному ветвиться логика по
условиям и т.д.
Для этого существуют циклы
18
Основная задача – многократное повторение инструкций.
Самый простой и понятный цикл – цикл while, который будет выполнять некоторое
условие до тех пор, пока заданное логическое выражение будет оставаться истинным
Синтаксис:
while <логическое выражение>:
<инструкции>
Логическое выражение, как и всегда, может быть любой сложности
Тело цикла (выполняемые инструкции) живут за отступами, как и тело в операторе
условия.
19
i=0
while i < 10:
print I
i=i+1
Прокрутите этот простой цикл
в голове!
Как только логическое выражение
перестает выполняться, мы сразу
покидаем цикл.
20
Циклами очень удобно обходить списки (массивы) или строки посимвольно, если
мы не знаем заранее длину этих списков (массивов) или строк.
Задача: вывести введенную строку в обратном порядке.
str = input()
i = len(str) - 1
while i >= 0:
print str[i]
i=i–1
Почему начинаем с len(str) – 1 ?
Почему условие до i >= 0 ?
21
Задача: пользователь вводит список чисел любого размера. Посчитать среднее
арифметическое.
a = input()
i=0
sum = 0.0
while (i<len(a)):
sum = sum + a[i]
i=i+1
srArifm = sum / len(a)
print srArifm
!!! Если в таком цикле забыть увеличить
переменную i – получится бесконечное
колесо Сансары
22
Такая переменная называется счетчиком и почти всегда присутствует в циклах с
условием. Обычно им дают имена i,j,k,m – как в математике.
Давайте совместим цикл и оператор с условием!
Задача: пользователь вводит любой список с числами. Вывести на экран только
кратные 3 из этого списка.
a = input()
i=0
while i < len(a):
if (a[i] % 3.0) == 0.0:
print a[i]
i=i+1
23
Есть ключевое слово, которое иногда полезно при работе с циклами. Это break.
break – немедленный выход из цикла. Программа продолжит выполняться со
следующей после цикла инструкции.
Это можно использовать как инструмент выхода из цикла при достижении
требуемой цели.
while (1 == 1):
a = input ()
if a = ‘Геофак – твой верный шаг’:
break
print ‘Живи пока…’
24
25
Цикл может быть какой угодно вложенности. То есть цикл в цикле в цикле…
Задача: вывести таблицу умножения!
i=1
while i < 10:
j=1
while j < 10:
print str(i) + 'x' + str(j) + ' = ' + str(i*j)
j=j+1
i=i+1
26
Циклом while можно сделать всё, что угодно, но всё же он не очень-то удобен.
Счетчики нужно постоянно отслеживать… Да и вообще…
Есть ещё цикл for
Синтаксис:
for <переменная> in <список/строка/…>:
<инструкции>
a = [1,2,3,4,5]
for i in a:
print i
27
Переменная, записанная в <переменная>, поочередно принимает значение всех
элементов списка или строки. Каждая новая итерация цикла – очередное значение.
a = 'Geo'
for i in a:
print i
28
Посчитаем таким способом среднее арифметическое опять:
a = input()
sum = 0.0
for i in a:
sum = sum + i
srArifm = sum / len (a)
print srArifm
29
Break также можно использовать с циклом for. Но есть ещё слово continue,
которое обеспечивает немедленный переход к началу цикла с переводом
элемента в следующее состояние.
for val in ‘geography’:
if val == ‘g’:
continue
print(val)
30
С циклами и условиями необходимо хорошенько разобраться – они являются
основой любого алгоритма, любой программы!
31
В программах периодически возможны сценарии, которые приводят к ошибкам.
Например, пользователь вводит текст там, где предполагается ввести число.
Или стечение обстоятельств приводит к делению на ноль.
Сценарий в таком случае закончит работу с ошибкой.
Часто нужно уметь предупредить такой случай, отловив исключение.
>>> 100 / 0
Traceback (most recent call last):
File "", line 1, in
100 / 0
ZeroDivisionError: division by zero
32
Синтаксис отлова исключений такой (общий вид):
try:
блок 1
# интерпретатор пытается выполнить блок1
except (name1,name2):
блок 2
# выполняется, если в блоке try возникло исключение name1 или name2
except name3:
блок 3
# выполняется, если в блоке try возникло исключение name3
except:
блок 4
# выполняется для всех остальных возникших исключений
else:
блок 5
# выполняется, если в блоке try не возникло исключения
finally:
блок 6
# выполнится всегда
Обязательно должны быть только try и except
33
try:
k=1/0
except:
print ‘Деление на 0 ’
Отлавливаем любое исключение
try:
k=1/0
except ZeroDivisionError:
print ‘Деление на 0 ’
Отлавливаем конкретное исключение
(конкретную ошибку)
34
a = input ()
try:
b = a**3
except:
print 'Seems like a is not number'
b = 'try again'
finally:
print b
Обратите внимание, что, как и везде, блоки выделяются отступами.
В этом сценарии есть ещё один источник ошибок a = input()
35
try:
a = input ()
except:
print 'Invalid input'
a=0
try:
b = a**3
except:
print 'Seems like a is not number'
b = 'try again'
finally:
print b
36
Разумеется, исключения при вводе данных лучше отслеживать в цикле по
принципу – если введено не то, дать пользователю ввести ещё раз:
f=0
print 'Enter number:'
while f == 0:
try:
a = input ()
except:
print 'Invalid input. Try again'
continue
try:
print a + 5
except:
print 'Invalid input (not a number). Try again'
continue
f=1
37
Обычно в скриптах «для себя» исключениями пользуются очень редко.
Но если предполагается передача (или продажа) программы кому-то, нужно
обеспечить невозможность вылета программы с ошибкой, то есть предусмотреть
везде обработку исключений.
38
Спасибо за внимание!
e.kazakov@spbu.ru
ekazakov.info/students
39
Download