На главную страницу | Новости  |  Ссылки | Контакты

Spyphy Farnsworth
Квантовая реальность. Кибернетика. Искусственный интеллект


Введение в Python, часть 2. Типы данных, функции, файлы


Базовые конструкции языка Python: Типы данных, операции, множества и списки, функции, ввод-вывод и работа с файлами (кратко).

Первая программа и основные элементы синтаксиса


Простейшая программа на языке Python не требуется подключения каких-либо библиотек, заголовочных файлов и даже использования функции Main() как в C++:

 #code: Первая программа на языке Python
print('Hello World!')

Посколку Python - язык интерпретируемый, то такая программа называется сценарием или скриптом.

Мы используем версию Python3. Поэтому запуск данного скрипта на выполнение осуществляется следующим образом:

 python3 prog.py 
Hello World!

Если в консоли набрать python3 без параметров, то будет запущен <<интерактивный режим>>, в котором удобно осваивать язык.

Комментарии могут быть добавлены в текст программы после символа \#:

print('Hello World!') # это комментарий

Инструкции в Python заканчиваются переводом строки. При этом нет необходимости ставить точку с запятой (как, например, в C++), хотя ее постановка не будет ошибкой. Точка с запятой используется, если возникает необходимость разместить несколько инструкций в одной строке, например

>>> x = 2; y = 3; print(x+y)
5

Типы данных


Python --- язык со строгой динамической типизацией. Строгая типизация означает, что переменная в любой момент времени имеет точно определенный тип. В языке Python тип переменной легко определить с помощью функции type:

 #code: Строгая динамическая типизация
>>> X = 10
>>> type(X)

>>> X = 'Hello'
>>> type(X)


Здесь знак <<равно>> (=) --- оператор присваивания. Это аналогично синтаксису языков C/C++/JAVA. Однако в отличие от них, в Python нет необходимости объявлять тип переменной. Он определяется автоматически в ходе выполнения программы (динамическая типизация. Более того, переменная может изменить свой тип в ходе выполненения программы, если ей будет присвоено новое значение другого типа. Как говорят, в языке Python <<важнее значение, а не имя переменной>>. Удобство такого подхода проявится, например, при написании функции. Таким образом, имена переменных в Python --- это только ссылки на объекты. Они не хранят информацию о типе объекта.

К основным встроенныем типам данных языка Python относятся числа, строки, множества, списки, кортежи и словари. Рассмотрим их подробнее (в скобках будет указан тип данных, возвращаемый функцией type).

- Числовые типы, которые включают целые (int и long), вещественные (float) и комплексные (complex) числа.

- Строка (str) --- последовательность символов Юникода. Строки заключаются в кавчики либо в апострафы (оба варианта равноценны). Например, "Python" или 'Python'.

- Множество (set). Пример множества: {1,2,3}.

- Список (list) --- упорядоченная последовательность значений произвольных типов. Пример списка: [1,2,3].

- Кортежь (tuple) --- тоже список, только неизменяемый. Пример кортежа: (1,2,3).

- Словарь (dict) --- неотсортированная колекция элементов, доступ к которым осуществляется по ключу. Пример словаря: {1:'a', 2:'b'}. По большому счету словарь в Python --- это список кортежей.

- Логический тип (bool), переменные которого могут принимать только два значения: True и False.

В Python все типы данных реализованы в виде объектов, причем для них наиболее важные операторы уже перегружены. Поэтому работат с базовыми типами можно двумя способами: либо посредством вызова методов объектов, либо использовать перегруженные операторы.

Продемонстрируем сказанное на примере класса int, реализующего целые числа. Для этого класса перегружены базовые операторы +,-,*, / и ** (возвещение в степень), соответствующие основные арифметическим операция. Например, код

>>> 2+3
5

может быть записан в эквивалентном виде с использованием метода __add__() класса int:

>>> (2).__add__(3)
5

Но, конечно, так никто не пишет.

Узнать полный список методов любого класса можно посредством функции dir, указав нужный класс в качестве аргумента этой функции. Например,

>>> dir(int)

Для получения более детальной справки о классе и его методах используйте функцию help:

>>> help(int)
>>> help(int.__add__)

Среди полезных возможностей Python следует отметим возможность работы с комплексными числами. Мнимая единица задается как 1j либо 1J. Например,

>>> 1j*1j
(-1+0j)

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

%Однако его здесь рассматривать не будем. Вместо этого перейдем к обзору более сложных типов данных и операций над ними.

Списки


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

Получить элемент списка можно, указав его номер в квадратных скобках после имени списка:

L = [1, 2, 'A', True, [3, 4]]
>>> L[0]     # первый элемента списка
1
>>> L[4][0]  # извлекаем элемент вложенного списка
3

Заметим, что нумерация элементов списка в Python начинается с нуля.

Выполнить конкатенацию (объединение) двух списков можно с помощью перегруженного оператора + (<<плюс>>):

>>> [1, 2] + [5, 6]
[1, 2, 5, 6]
 

Кроме того, класс list имеет набор различных методов для вставки и удаления элементов из списка: append(), insert(), remove(), pop(). А также методы для сортировки элементов списка: sort() и reverse().

Например, метод insert() используется для вставки нового элемента в середину (или начало) списка. Первый аргумент этого метода указывает позицию, куда нужно вставить элемент, а через второй аргумент передается сам элемент:

>>> L = [1, 2]
>>> L.insert(1, 3)
>>> L
[1, 3, 2]
 

Узнать длину списка можно с помощью функции len().

>>> len([1,2,3])
3

Сделаем важное замечание относительно операция присваивания =. Эта операция не производит копирование списка, а только создает еще одну ссылку на тот же список (т.е. хранящийся в той же области памяти). Это сделана для экономии ресурсов, однако может привести к неожиданным результатам при неправильном использовании. Рассмотрим пример.

>>> L = [1, 2, 3]
>>> S = L
>>> L[0] = 9   # изменим первый элемент списка L
>>> L
[9, 2, 3]
 
>>> S # в списке S первый элемент тоже изменился [9, 2, 3] # так как это один и тот же список на самом деле

Если же нам нужно сделать реальную копию списка, то для этих целей существует метод copy().

>>> L = [1, 2, 3]
>>> S = L.copy()
>>> L[0] = 9
>>> L
[9, 2, 3]
 
>>> S # теперь все в порядка [1, 2, 3] # список S не затронут

Это замечание справедливо и для всех остальных встроенных типов данных языка Python. В общем случае для операции присваивания действуют следующие правила:

--- Инструкция присваивания всегда создает ссылку на объект (но не создает копии объектов).

--- Переменные создаются при первом присваивании.

--- Перед использованием переменной ей должно быть присвоено значение.

Множества


В отличие от списков, множества не могут содержать повторяющихся элементов.

Для работы с множествами предусмотрены методы union(), intersection(), difference(), issubset(), смысл которых ясен из их названия. Посмотрим, как это выглядит на практике.

>>> A = {1, 2}
>>> B = {2, 3}
>>> A.union(B)
{1, 2, 3}
>>> A.intersection(B)
{2}

Эти же операции можно записать в более компактной форме, используя перегруженные операторы:

>>> A | B    # объединение множеств
{1, 2, 3}
>>> A & B    # пересечение множеств
{2}

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

Также имеются операции нахождения разности множеств (A - B) и симметрической разности (A ^ B).

Кроме того, существуют операции над множествами, которые возвращают логическое значение истина или ложь. К ним относится операция сравнения двух множеств (A == B), проверка вложенности одного множества в другое (A <= B), принадлежность элемента множеству (x in A) и другие.

Мощность множества A (т.е. количество элементов в нем) можно получить с помощью функции len(A).

Cтроки


Строки в Python --- это не просто массив символов. В Python строки реализованы в виде отдельного класса. Однако операции над строками очень похожи на операции над списками. Например, конкатенация строк (оператор +), получение символа по индексу (оператор []), получение длины строки (функция len()), повторение строки (с помощью опертора *) и другие. Следующий пример демонстрирует работу со строками.

 #code: Работа с строками
>>> s = 'str'+'ing' # конкатенация
>>> s
'string'
>>> s[2]
'r'
>>> t = s*2  # удвоение строки
>>> t
'stringstring'
>>> len(t)
12

Получение подстроки. Оператор извлечения среза из строки выглядит так: [X:Y]. X --- это индекс начала среза, а Y --- его окончания; причем символ с номером Y в срез уже не входит. Если отсутствует первый индекс, то срез берется от начала до второго индекса; при отсутствии второго индекса, срез берется от первого индекса до конца строки.

>>> s = "0123456789";
>>> s[0:2];
'01'
>>> s[:2];
'01'
>>> s[2:];
'23456789'

Операторы сравнения


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

Операторы сравнения производят сравнение двух элементов одного класса и в качестве результата возвращают константы True или False. Основные операторы сравнения: равно (==), не равно (!=), меньше (<), больше (>), не меньше (>=), не больше (>=). Например, для числовых типов:

>>> 5 <= 3
False

Кроме того, операторы сравнения перегружены для некоторых других (не числовых) классов. Например, как уже было отмечено выше, применительно к множествам операторы < и > означают проверку на включение:

>>> {1,2,3} > {1,3}
True

Логические операции


Для переменных логического типа bool определены следующие операторы: and, or и and. Пример использования этих операторов:

>>> (not 1==2) or False
True

Преобразование типов данных


Язык Python допускает неявное преобразование типов. Например, если сложить целое (int) и вещественное (float) числа, то результатом будет число типа float:

>>> type(3 + 4.5)


Явное преобразование из одного типа в другой имеет следующую форму: тип(значение). Рассмотрим пример преобразования строки в число типа float:

>>> float('12'+'3')
123.0


Еще один полезный пример --- преобразования строки в список символов:

 #code: Преобразование строки в список символов
>>> ls = list('string')
>>> ls
['s', 't', 'r', 'i', 'n', 'g']
 

% это можно опустить:

Правда, в обратную сторону этот способ (через str()) не сработает. Точнее, результат будет не совсем тот, что можно ожидать:

>>> str(ls)
"['s', 't', 'r', 'i', 'n', 'g']"

Для получения исходной строки нужно использовать специальный метод join():

>>> ''.join(ls)
'string'

Блоки, циклы и ветвления


Оператор ветвления представлен единственной условной инструкцией if.

if 1 > 2:
	print('условие выполнено')

В Python отсутствует оператор множественного выбора (switch -- case) как в C++ или JAVA. Для этих целей используется полная конструкция if/elif/else, общая форма которой имеет следующий вид:

if <условие1>:
	<блок1>
elif <условие2>:
	<блок2>	
else <условие3>:
	<блок3>	

Для реализации циклов в Python присутствуют стандартные инструкции for и while. Инструкция for всегда используется в связке с ключевым словом in и предназначена для обхода всех элементов списка, множества и любых других последовательностей. Например,

for x in {3, 2, 1}:
	print(x)

Стандартная форма цикла while следующая:

while <условие>:
	<блок>

Совместно с инструкциями циклов могут использоваться стандартные инструкции break и continue, а также менее стандартные инструкции --- pass и else. Инструкция pass --- это пустая инструкция, которая ничего не делает. Инструкция else располагается после цикла и всегда выполняется в том случае, если цикл завершается обычном способом (без прерывния с помощью break).

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

for x in [1, 2]:
	print(x)
	print(x^2)
print(x^3)

В этом примере 2-ая и 3-я строки кода включены в тело цикла for и поэтому будут выполнены дважды (для x=1 и x=2), а инструкция 4-ой строки расположена после окончания цикла, и значит выполнится только один раз (для x=2).

Для формирования последовательностей чисел с заданным шагом существует функция \\

range(start, stop, step). Если step>0, то она возвращает возврастающую последовательность чисел с условием

start <= start + i * step < stop,

где i --- целое неотрицательное число. Например,

>>> list(range(0, 10, 2))
[0, 2, 4, 6, 8]
 

Функция range часто используется в циклах. Например, следующий код напечатает в консоль последовательность чисел 0, 2, 4, 6, 8.

for x in range(0, 10, 2):
	print(x)

Кроме того, range вместе с for часто используются для генерации списков (или других последовательностей), что демонстрирует следующий пример:

>>> [x**2 for x in range(0, 10, 2)]
[0, 4, 16, 36, 64]
 

Функции


Как и в большинстве языков программирования, в Python можно определять собственные функции. Для создания функции предназначена5 инструкция def. Ниже показан пример определения функции:

 #code: Пример объявления функции
def sum(x,y):
	return x+y

По умолчанию все переменные внутри функции локальные, т.е. находится в локальной области видимости. Это вполне естественный подход. Однако есть возможность обратиться и к глобальным переменным, объявленным вне функции. Для этого имеются ключевые слова global и nonlocal.

Еще одни способ задания функций --- использование лямбда-нотации:

>>> sum = lambda x,y: x+y
>>> sum(2,3)
5

Или даже так, без присвоения имени функции:

>>> (lambda x,y: x+y)(2,3)
5

Такие анонимные (или лямбда-функции) составляют основу функционального программирования.

Передача параметров по ссылке/по значению Все параметры передаются по ссылке. Однако если переменная связана с неизменяемым значением, например int, str, tulpe, то естественно, это значение не изменится. А вот если переменная связана со списком, словарем или классом, то значение связанного с переменной объекта изменится.


Ввод-вывод


Для считывания строки с консоли используется функция input, а для вывода на консоль --- функция print.

>>> str = input() # ввод строки с консоли
5
>>> x = int(str)  # преобразование в числовую форму
>>> y = x**2
>>> print(y)      # вывод на консоль
25

Файлы и каталоги


Чтение/запись данных из файла можно проводить с помощью методов read() и write() соответственно. Перед началом работы с файлом его необходимо открыть с помощью функции open(), а после окончания работы --- закрыть посредством close(). Типичный пример работы с файлом (в текстовом режиме):

>>> f = open('newfile.txt','w') # открытие в режиме записи
>>> f.write('Hello')
5
>>> f.close()
>>> f = open('newfile.txt','r') # открытие в режиме чтения
>>> f.read()
'Hello'
>>> f.close()





galaxy