Основы работы в Python. Учебно-методическое пособие
.pdf['A', 'Python', 2020, 1.8]
[[1 , 0, 0], [0, 1, 0], [0, 0, 1]] # вложение
Над списками можно выполнять операции соединения и повторения:
>>> |
[1, 2]+ ['A', 'Б'] #выведет [1, 2, 'A', 'Б'] |
|
>>> |
2*[1, 2, 3] |
#выведет [1, 2, 3, 1, 2, 3] |
Переменная, являющаяся списком, создается обычным способом с
помощью оператора присваивания, например:
Vector = ["x", -1, [1,2,3]]
при этом сохраняется и правило комбинированного присваивания x,y,z = 1, 2, Vector
print(x,y,z) #выведет 1 2 ['x', -1, [1,2,3]] a,*b = 1, 2, Vector
print(a,b) #выведет 1 [2, ['x', -1, [1,2,3]]]
Создание списков можно автоматизировать с помощью «генераторов списков» так, как представлено в примерах ниже:
x = [N*N |
for |
N in (1, 2, 3, 4, 5)] |
|
print(x) |
|
# напечатает |
[1, 4, 9, 16, 25] |
d = [i*j for i |
in range(1,3) for j in range(3)] |
||
print(d) |
|
# напечатает |
[0, 1, 2, 0, 2, 4] |
y = [N*N |
for |
N in range(1, 6) if N%2 == 1] |
|
print(y) |
|
# напечатает |
[1, 9, 25] |
gradus = [30, 45, 60]
LS = [ sin(radians(x)) for x in gradus ]
В результате получим список LS вида [ 0.5, 0.70…, 0.86…].
Функция list()используется для преобразования итерируемых последовательностей в списки, например:
>>> list('abc') #выведет ['a', 'b', 'c'].
>>> list(range(6)) #выведет [0, 1, 2, 3, 4, 5]
Напомним, что функция range(N, M [,h]) создает упорядоченную последовательность целых чисел, от значения N до M-1, с шагом h. Функция sorted() возвращает новый список, отсортированный по
неубыванию (sorted([8, 1, 3])= [1, 3, 8]). Функции min и max находят максимальный и минимальный элементы списка. К спискам, как и к строкам, применим оператор in, позволяющий узнать, принадлежит ли элемент списку.
21
Аналогично строкам, доступ к элементам списка можно получить по их индексам, а также можно извлекать срезы. Длина списка опреде-
ляется функцией len().Например:
>>> X=['A', 'Б', 20, 1.8, [1, 0]]
>>> |
len(X) |
#выведет 5 |
>>> |
X[1] |
#выведет 'Б' |
>>>X[ : 2] #выведет ['A', 'Б']
>>>X[ -1] #выведет [1, 0]
В отличие от строк, списки – это изменяемые последовательности. Из списков можно удалять элементы, добавлять новые. Пусть X – список из предыдущего примера, изменим второй его элемент:
>>>X[1]='Ж'
>>>X #выведет ['A', 'Ж', 20, 1.8, [1, 0]]
Всписке можно заменить целую последовательность символов (срез):
>>>X [ 1 : 5] = ['Б','В','Г','Д','Е']
>>>X #выведет ['A', 'Б', 'В', 'Г', 'Д', 'Е']
Ниже приведены основные методы работы со списками: X.append(A) – добавление элемента A в конец списка X;
X.extend(T) – добавление списка или кортежа T в конец списка X;
X.insert(i, A) – вставка элемента со значением A на позицию i в списке X;
X.pop(i) – возвращает элемент с номером i в списке X; X.remove(A) –удаление элемента A из списка X; X.count(A) – количество элементов, равных A, в списке X; X.index(x) – определение первой слева позиции элемента A X.reverse() – отражение списка (запись в обратном порядке); X.sort() – сортировка по возрастанию.
Теперь автоматическую генерацию списка можно сделать так: f=[] # пустой список
for x in range(1,6): f.append(x*x) print(f) #выведет [1, 4, 9, 16, 25]
Для списка можно создать вторую ссылку на него же. При создании второй ссылки данные не копируются, но теперь имеют два име-
ни. Если создать список Y, затем сделать присваивание X=Y, а затем изменить X, то Y тоже изменится, так как X будет просто синонимом
того же самого списка. Иллюстрация:
>>> X = Y = [1,2,3]
>>> print(X,Y) #выведет [1, 2, 3] [1, 2, 3]
22
>>> X[2] = 12
>>> print(X,Y) #выведет [1, 2, 12] [1, 2, 12]
>>>X=Y[ : ]
>>>X[2] = 3
>>> print(X,Y) #выведет [1, 2, 3] [1, 2, 12]
Очевидно, что если второй список объявляется как срез первого:
X=Y[ : ], то это будут два разных списка. Для копирования можно
также использовать конструкцию X = Y.copy().
Поэтому, если требуется обеспечить неизменность созданного
объекта, можно использовать вместо списков кортежи.
Кортеж (Tuple) – это упорядоченная, неизменяемая коллекция
объектов произвольных типов, поддерживающая произвольное число
уровней вложенности.Кортеж использует меньше памяти, чем список.
При задании кортежа вместо квадратных скобок используются круг-
лые. Примеры кортежей: (1,2,3), ('aaa', -25, 3), ('x', -1, [1, 2, 3]). Функцией list можно преобразовать кортеж
всписок:
>>>list((1,2,3))
[1, 2, 3]
Важно помнить, что кортеж не допускает изменений, в него нельзя добавить новый элемент, удалить или заменить существующие элементы.
С помощью оператора присваивания можно последовательно из-
влекать элементы кортежа
Vector = ("x", -1, [1,2,3]) x,y,z=(1, 2, Vector)
print(x,y,z) #выведет 1 2 ('x', -1, [1, 2, 3])
Важно согласовать набор переменных слева от символа (=) с элементами кортежа. Допустимо использовать символ звездочка (*), чтобы
присвоить набор элементов кортежа одной переменной. a,*b=(1, 2, Vector)
print(a,b) #выведет 1 [2, ('x', -1, [1, 2, 3])]
Словари и множества в данном пособии не рассматриваются.
23
5. Подпрограммы
Для эффективного структурирования больших программ в ней
удобно выделять отдельные смысловые блоки, реализующие логиче-
ски замкнутый алгоритм (подзадачу). Эти блоки обычно называют
подпрограммами и определенным образом выделяют в коде «основ-
ной» программы. В языке Python такие конструкции называют функ-
циями. При этом основная программа содержит как обычные операто-
ры, так и команды управления этими блоками (вызовы функций), с со-
ответствующим обменом данными. При вызове функции (подпро-
граммы) в нее передаются данные (параметры), и выполняются неко-
торые действия. После выполнения подпрограммы работа продолжа-
ется с той команды, которая непосредственно следует за её вызовом.
Функция должна быть описана до того, как она будет вызываться.
Параметры, используемые в функции, разделяются на локальные,
которые объявляются и используются только внутри неё, и глобаль-
ные, которые объявляются в основной программе и доступны как ей, так и функции. Передача данных между основной программой и функцией может осуществляться только через глобальные параметры: либо непосредственно, по их уникальному имени, либо через механизм формальных параметров. Формальные параметры являются аргументами функций. При вызове функции эти аргументы заменяются определенными значениями – фактическими параметрами.
Функция (подпрограмма) в Python создается с помощью инструк-
ции def В общем виде набор инструкций, объявляющих функцию с заданным именем name, имеет следующий формат:
def name(аргументы): тело функции
Данная составная инструкция состоит из строки заголовка с ключевым словом def и следующего за ней блока инструкций, выделяемым отступами (или идущим после двоеточия). Этот блок инструкций обра-
зует тело функции, то есть программный код, который выполняется
интерпретатором всякий раз, когда производится вызов функции. Не
забудьте двоеточие в конце строки заголовка.
Функция может содержать внутри себя другую функцию, причем
тело «внутренней» функции должно иметь дополнительный отступ.
В строке заголовка инструкции def, кроме имени функции указывается и список из её аргументов (параметров) в круглых скобках. Этот список может быть пустым. С именем функции будет связан объект функция, который вызывается в соответствующем месте програм-
24
мы. Имена аргументов в строке заголовка будут связаны с объектами,
передаваемыми в функцию в точке вызова.
Рассмотрим простую программу с функцией без аргументов:
def a_funct():
print("Herzen University")
a_funct() |
#вызов функции |
a_funct() |
#вызов функции |
В результате будет два раза напечатан текст:Herzen University.
Тело функции часто содержит инструкцию return – она завершает работу функции (и может, например, её досрочно завершить ) и
передает результат вычислений вызывающей программе.
def имя_функции(arg1, arg2,... argN):
...
return <набор возвращаемых значений>
Рассмотрим простой пример:
def fff(a,b): return a+2*b
print( fff(3,6) ) # напечатает 15 print( fff(b=3, a=2) ) # напечатает 8
Обратите внимание на последнюю строку, в результате получится именно число 8, хотя порядок аргументов выглядит нарушенным. А что будет, если вызвать эту же функцию с нечисловыми аргументами?
print( fff('aaa','bbb') )
Будет напечатано, как и следовало ожидать, aaabbbbbb. Таким образом, можно зафиксировать важное правило – тип аргументов функ-
ции никак не объявляется. Это соответствует концепции динамической типизации, принятой в Python, в частности, не требуется объяв-
лять типы переменных, аргументов или возвращаемых значений.
В примере ниже функция возвращает кортеж значений def fff(a,b):
return (a, b, a+2*b)
print( fff(3,6) ) |
# результат (3, 6, 15) |
В языке Python с аргументами функций можно обращаться достаточно свободно. Например, параметрам функции можно присвоить
значения по умолчанию: def fff(a=1, b=2):
25
return a+b |
|
|
|
|
print( fff(b=4, a=5)) |
# напечатает |
9 |
||
print( |
fff()) |
# |
напечатает |
3 |
print( |
fff(3)) |
# |
напечатает |
5 |
Обратите внимание, число параметров при вызове функции может
быть меньше чем указано в заголовке инструкции def. Значения по умолчанию в Python называют ключевыми аргументами, отличая их от «обычных» аргументов. Вот еще один пример:
def mixed_arg(a, x=2, y=3): print(a+x+y)
mixed_arg |
(1) |
# |
напечатает |
6 |
mixed_arg |
(1,5) |
# |
напечатает |
9 |
Таким образом, можно обратиться к функции, используя имена пара-
метров как ключи, независимо от порядка их расположения. Следует
отметить, что нельзя ставить обязательные аргументы после необязательных, если имена параметров не указаны, поэтому оба нижеследу-
ющих вызова дадут ошибку: mixed_arg (x=2, y=1, 1)
mixed_arg (x=2, 1).
Локальные и глобальные параметры. Переменные, объявлен-
ные внутри тела функции, имеют локальную область видимости и называются локальными, а те, что объявлены вне какой-либо функции,
– глобальными. Это означает, что доступ к локальным переменным имеют только те функции, внутри которых они были объявлены, в то время как доступ к глобальным переменным можно получить по всей программе и в любой функции. Рассмотрим пример:
def fff(a, b): |
|
x=10 |
|
return x+a+2*b |
|
print( fff(3,6) ) |
# напечатает 25 |
Переменные a,b,x внутри функции fff – это локальные переменные, они (и их имена) доступны только программному коду внутри
инструкции def и существует только во время выполнения функции. Фактически любые имена, которым тем или иным способом были присвоены некоторые значения внутри функции, по умолчанию класси-
фицируются как локальные переменные. Если в основной программе
после print(fff(3,6)) вставить строчку print(a) или
26
print(x), то будет получено сообщение об ошибке «name 'a' is not defined» или «name 'x' is not defined», то есть ос-
новная программа «не видит» эти переменные. Конечно, можно со-
здать в основной программе свою переменную x, записав, например, x=20; и тогда print(x), естественно, не будет ошибкой.
Теперь сделаем переменную x глобальной также и для подпрограммы, то есть просто не будем определять её внутри функции:
def fff(a, b): return x+a+2*b
x=20
print( fff(3,6) ) # напечатает 35
Таким образом, для того чтобы получить доступ к глобальной пере-
менной на чтение, достаточно лишь указать её имя. А что, если необ-
ходимо изменить глобальную переменную внутри функции? Для этого потребуется инструкция global. Например:
a = 1 |
|
def fff(a,b): |
|
|
def bbb(): |
|
global x |
|
|
global a |
|
y=x+a+2*b |
|
|
a = 25 |
# 1 |
x=100 |
|
|
print(a) |
return y |
|
|
|
bbb() |
# 25 |
x=20 |
#выведет |
35 |
print(a) |
print(fff(3,6)) |
|||
|
|
print(x) |
#выведет |
100 |
Первая программа выведет сначала 1, потом 25, а вторая – 35 и 100.
Инструкция global указывает, что функция будет изменять одно или более глобальных имен, то есть имен, которые находятся в области видимости (в пространстве имен) вмещающего модуля.
Рекурсивный вызов, когда подпрограмма обращается сама к себе, осуществляется обычным образом. Например, числа Фибоначчи
можно получить с помощью следующей программы: def Fib(n):
if n<2: return 1
return Fib(n-1)+Fib(n-2) print(Fib(5)) # результат равен 8
При отладке больших программ удобно использовать инструкцию pass, которая «ничего не делает»:
>>>def fun(): pass
>>>print(fun())
None
27
6. Элементы графики – модуль Turtle
Этот модуль используется для рисования простых графических
объектов, в частности, фрактальных кривых. Подключение функций
модуля осуществляется инструкциями import turtle или from turtle import *. В первом случае запись команд имеет вид turtle.имя(…), во втором случае записывается только имя команды.
Инструкции модуля реализуют специфические принципы постро-
ения геометрических объектов в двумерном графическом окне через
управление движением пера («черепашки»), последовательно рисую-
щего эти объекты (а не с помощью прямого указания координат и па-
раметров фигур). Рисунок фактически представляет собой траекторию
пера-черепашки, причем направление движения имеет значение.
Перо также может двигаться над рисунком, не оставляя следа. По мол-
чанию, изображением пера является стрелка, указывающая направле-
ние движения. Можно выбрать и другое изображение пера: кружок,
черепашка, и т.д. Ниже приведен пример программы, рисующей пря-
мой угол из двух линий(Рис.6.1):
import turtle |
|
turtle.down() |
|
turtle.forward(100) |
|
turtle.home() |
|
turtle.left(90) |
|
turtle.forward(100) |
Рис.6.1. Результат построения. |
turtle.mainloop() |
Начало координат – в центре окна |
Содержание программы: «опустить перо в центр рисунка, пройти горизонтально вправо на 100 шагов, вернуться в центр, повернуться на 90 градусов влево (теперь «вектор скорости» направлен вверх) пройти еще 100 шагов в новом направлении (вертикально вверх)». Инструкция turtle.mainloop() – фиксация окна.
Основные команды управления пером («черепашкой»)
down() |
Опустить перо (и начинать рисовать) |
up() |
Поднять перо (теперь перо не будет рисовать) |
forward(n) |
Перемещение вперед на n шагов (пикселей) |
fd(n) |
|
backward(n) |
Перемещение назад на n шагов (пикселей) |
bk(n) |
|
28 |
|
right(A) |
Повернуться направо на A градусов |
left(A) |
Повернуться налево на A градусов |
goto(x,y) |
Перейти в точку с координатами (x,y) |
home() |
Перейти в начало координат – точку (0,0) |
circle(r) |
Окружность радиуса |r|, при r>0 её центр смещен |
|
на r влево от направления пера (r<0 – вправо). |
Замечание (circle). При движении пера центр окружности распо-
лагается при r>0 слева и обходится против часовой стрелки, а при r<0
– справа, и обходится по часовой стрелке. Поэтому, например, если записать подряд circle(10); circle(–10), то получим две
окружности, касающиеся друга, а их центры разнесены на 20 пунктов. Рисования дуги осуществляется командой circle(r, angle), где
angle – угловой размер дуги. В качестве примера приведем программу, соответствующую рис 6.2
|
from turtle import * |
|
|
|||
|
||||||
|
down() |
bk(200); |
|
|
|
|
|
fd(100); |
|
|
|
||
|
goto(0,0); |
|
|
|
||
|
left(90); |
|
|
|
|
|
|
fd(100); |
|
|
|
|
|
|
goto(0,0); |
|
|
|
||
|
circle(50); |
|
|
|
||
|
goto(0,0); |
|
|
Рис.6.2. Результат работы программы. |
||
|
right(90); |
|
|
Конечное положение пера – «стрелка». |
||
|
circle(50,180) |
|
|
В программе использовано from |
||
|
mainloop() |
|
|
turtle import *, поэтому префикс |
||
|
|
|
|
|
|
turtle. не нужен |
Ниже приведен список важных команд модуля turtle: |
||||||
|
setx(x) |
|
|
Задает x-координату пера («черепашки») |
||
|
sety(y) |
|
|
Задает y -координату пера |
||
|
setpos(x, y) |
|
Перемещает перо на заданную позицию |
|||
|
setheading(A) |
|
Повернуть перо на угол A градусов от |
|||
|
seth(A) |
|
|
начального (не текущего!) направления |
||
|
pos() |
|
|
Возвращает текущие координаты пера (x,y) |
||
|
dot(r) |
|
|
Команда ставит точку, где r – радиус точки и |
||
|
|
|
|
29 |
||
|
|
dot(r,Z) |
Z – её цвет, например 'green'или "red". |
stamp() |
Отпечаток пера в данной точке |
clearstamp() |
Убрать отпечаток пера |
undo() |
Отменить действие() |
write('текст') |
Вывести текст в точке нахождения пера |
сlear() |
Очистка экрана. |
hideturtle() |
Скрыть изображение пера («черепашки») |
showturtle() |
Снова показать изображение пера |
Замечание (pos()). Если записать команду write(pos()), то
в точке нахождения пера будет напечатаны его двумерные координа-
ты. Чтобы получить доступ к самим значениям координат, можно за-
писать X=pos(), при этом X очевидно будет двумерным вектором,
в чем можно убедиться с помощью следующих инструкций z=str(X[0])+','+str(X[1]); write(z)
По отдельности двумерные координаты (x, y) точки можно также по-
лучить, записав x=pos()[0] и y=pos()[1].
Управление параметрами построения |
||
|
|
|
speed(N) |
Задать скорость движения пера (N =1,…,10). |
|
Максимальная скорость при N=0. |
||
color(Z) |
Установить цвет траектории: Z=("red", |
|
"yellow", "green" и т.д.) |
||
|
||
color(Z1,Z2) |
Установить цвет траектории и заливки |
|
bgcolor(Z) |
Устанавливает цвет фона |
|
shape() |
Устанавливает форму пера, |
|
shapesize() |
Возвращает /устанавливает растяжение пера, |
|
width(n) |
Установить ширину следа в n пикселей |
|
reset() |
Сбрасываются все параметры, очищается |
|
экран, перо – на исходную позицию |
||
radians() |
Задавать углы в радианах |
|
degrees() |
Задавать углы в градусах (по умолчанию) |
|
сlear() |
Очистка экрана |
|
30 |
|
|
