Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Основы работы в Python. Учебно-методическое пособие

.pdf
Скачиваний:
0
Добавлен:
12.08.2026
Размер:
791 Кб
Скачать

['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

 

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]