Пособие по языку Python 3
Данная книга является кратким и информативным пособием с большим количеством примеров по языку Python версии 3, по структуре разбита на три главы, разделенные по разделам.
Главы этой книги я показывал людям как имевшим опыт в программировании, так и совершенно с ним не знакомых. Материал был приведен к очень простому пониманию, и может быть легко усвоен человеком без знаний программирования вообще.
Первая глава посвящена общим возможностям и синтаксису конструкций языка Python.
Вторая глава посвящена графическим приложениям.
Третья глава посвящена django.
Данную книгу я посвящаю своей семье. Благодаря их терпению я смог выделить время для написания и составления примеров.
В данной книге я по минимуму буду «разводить воду», больше будет упор на практические примеры, чтобы донести возможности языка. Все примеры выполнялись под операционной системой Windows 7, но и без проблем применяемы мной в работе и на ОС FreeBSD и Linux.
Взять дистрибутив можно с официального сайта: https://www.python.org/
Данное пособие написано автором проекта http://snakeproject.ru/ Козловым Михаилом, Вы можете посредством обратной связи на сайте оставить отзыв или предложение.
Оглавление
1. Вводная часть
1.0 Введение
1.1 Первая программа
1.2 Примеры с выводом на экран
1.3 Переменные и типы данных
1.4 Арифметические операторы
1.5 Интерактивный ввод
1.6 Работа со строками
1.7 Списки и кортежи
1.8 Циклы и условия
1.9 Функции
2.0 Базовые навыки работы с модулями.
2.1 Работа с файлами
2.2 Работа с ftp
2.3 Регулярные выражения
2.4 Прехват ошибки(try-except)
2.5 Встроенные функции
2.6 Основы ООП
2.7 Сокеты(пример простого сетевого приложения)
2.8 Основы работы с базами данных(sqlite)
2. Графические приложения
3. Основы django
1. Вводная часть
1.0 Введение
Итак, поехали! Язык Python в изучении невероятно прост, после
установки дистрибутива я буду работать либо посредством интерактивной среды
разработки IDLE (Вы можете например найти ее в «пуске»), либо
писать в скриптах с расширением .py или .pyw (варианты для отладки и без).
1.1 Первая программа
Первая «классическая программа» с выводом
строки на экран:
>>> print("Hello
World!")
Hello World!
1.2 Примеры с выводом на экран
>>>
1+34
35
>>>
print("123 "+" 456")
123 456
Примеры с форматированием вывода(%s,%d,%f для работы со строками, целыми и
числами с плавающей точкой):
>>> print("%s
and %s" % ("str1", "str2"))
str1 and str2
>>> print("%12d
and %0.2f" % (2014, 23.1234))
2014
and 23.12
1.3 Переменные и типы данных
В Python переменные слаботипизированы, т.е.
переменные имеют динамическую типизацию. В ходе программы переменная может
принимать различные типы данных.
Частоиспользуемые типы данных в Python:
Категория |
Тип |
Описание |
Числа |
int |
целые |
|
float |
с плавающей точкой |
|
bool |
логические(true\false) |
|
complex |
комплексные |
Последовательности |
str |
строки |
|
list |
списки |
|
typle |
кортежи |
None |
Type(None) |
пустой объект |
Рассмотрим примеры объявления переменных и
работы с ними.
>>> per
= "AnyString"
>>> perNew = "NewString"
>>> perMix
= per+" "+perNew
>>> perMix
'AnyString NewString'
>>> per*3
'AnyStringAnyStringAnyString'
>>> per[3]
'S'
>>> per[3:5]
'St'
1.4 Арифметические операторы
Рассмотрим
примеры с арифметическими выражениями.
>>>
2+2 #Сложение
4
>>>
5-3 #Вычитание
2
>>>
8/2 #Деление
4.0
>>>
45*3 #Умножение
135
>>>
(5+5)*5 #Скобки
50
>>>
13%2 #Деление по модулю
1
>>>
9//2 #Деление с усечением
4
1.5 Интерактивный ввод
>>>
a = input()
AnyString
>>>
a
'AnyString'
1.6 Работа со строками
Поиск и замена в строке
>>>
'первый и второй'.replace('второй', 'первый')
'первый
и первый'
Длина строки
>>>
len(per)
9
Вывод на нескольких строках
>>> print("""
String 1 1 1
String 2 2 2
String 3 3 3
""")
String 1 1 1
String 2 2 2
String 3 3 3
#Объединение строк используя «разделитель»
>>> s = ","
>>> s1 = "1"; s2 =
"2"; s3 = "3";
>>> st = [s1,s2,s3]
>>> s.join(st)
'1,2,3'
#Перевод в большой и малые регистры
>>> s = "aBcD"
>>> s.upper()
'ABCD'
>>> s.lower()
'abcd'
#Проверка
на:
>>>
s = "123123"
#Все
ли цифровые символы в строке
>>>
s.isdigit()
True
#Все
ли буквенные символы в строке
>>> s.isalpha()
False
#Все
ли буквенно-цифровые символы в строке
>>> s.isalnum()
True
1.7 Списки и кортежи
Списки это
фактически массивы, но типы значений могут различаться.
Кортежи по
сути являются неизменяемыми конструкциями типа «ключ-значение».
Примеры
объявления и распространенных действий со списками.
#Объявление
>>>
a = ['1', '2', 1, 2]
>>>
a
['1',
'2', 1, 2]
#Обращение
>>>
a[0]
'1'
>>>
a[1:3]
['2',
1]
>>>
a[2] = 123
>>>
a[1:3]
['2',
123]
#Изменить
значение
>>>
a[:0] = [1212, '222']
>>>
a
[1212,
'222', '1', '2', 123, 2]
#Очистить
>>> a[:]
= []
>>> a
[]
#Длина
>>> len(a)
0
#Добавление
элемента
>>>
a.append('555')
>>>
a
['555']
#Варианты
удаления элементов
>>>
a.remove('555')
>>>
del a[0]
#Посчитаем
количество вхождений в список
>>> a = ['1', '2', 1, 2]
>>> a.count(2)
1
>>> a = ['1', '2', 1, 2, 2, 2,
3, 3]
>>> a.count(2)
3
#Применение
некоторой функции ко всем элементам списка - map()
>>> a1 = [1, 2, 3, 4, 5, 6]
>>> a2 = [6, 5, 4, 3, 2, 1]
>>> print
map(lambda x, y: x*y, a1, a2)
[6,
10, 12, 12, 10, 6]
#Удалим
элемент по позиции
>>>
a.pop(2)
1
>>>
a
['1',
'2', 2, 2, 2, 3, 3]
Примеры
объявления и работы с кортежами.
#Объявление
>>>
per = {'name': 'ira', 'lastname': 'lomova'}
#Добавить
ключ и значение
>>>
per['age'] = 25
#Обращение
к значению ключа
>>>
per['name']
'ira'
#Проверка
на присутствие в кортеже ключа
>>>
'name' in per
True
#Перебор
значений и ключей
>>> for
key, value in per.items():
print(key, value)
name ira
age 25
lastname lomova
1.8 Циклы и условия
Рассмотрим
конструкции циклов while, for и оператора проверки условия(оператора
ветвления)
While(«выполняй пока условие верно»)
>>> a=1
>>> while
a!=3:
print(a)
a = a+1
1
2
>>> a=1
>>> while
a!=3:
print(a, end='
')
a=a+1
1 2
For(перебирает значения)
>>>
a = ['1', '2', '3']
>>> for
x in a:
print(x)
1
2
3
#Вариант
с генератором чисел range
>>> for
i in range(3):
print(i)
0
1
2
#Вариант
с генератором чисел range с определенным диапазоном чисел
>>> for
i in range(3, 7):
print(i)
3
4
5
6
IF(проверка условия)
Имеет необязательные блоки elif и else. Количество дополнительных проверок elif может быть несколько или одно, блок else отработает в ситуации, когда ни одно
условие не выполнилось.
>>> per
= int(input('Введи число: '))
Введи число: 123
>>> if
per > 100:
print('per больше
100')
elif per < 100:
print('per меньше
100')
else:
print('per равно 0')
per больше 100
1.9 Функции
Функции могут содержать инструкцию return, которая возвращает значение(его можно например занести в переменную).
В другом случае функция может использоваться
без ключевого слова return и отрабатывать как «кусок кода» или как «хранимая процедура».
Помимо этого функция может принимать
аргументы, иметь обязательные и аргументы с уже заданными значениями.
Примеры функций.
#Объявление
функции с одним обязательным аргументом
#return не используется
>>> def
func(x):
if x>0:
print('x > 0')
else:
print('x <= 0')
#Вызов с передачей
аргумента
>>>
func(3)
x > 0
#return
возвратит значение, которое можно записать в переменную
>>> def
func(x):
if x>0:
z = x + 1
return z
else:
z = x - 1
return z
>>>per = func(3)
>>>per
4
Примеры с
обязательными и необязательными аргументами.
>>>
def func(a, b, c=4): # c
- необязательный аргумент
return a + b + c
>>> func(1, 2) # a = 1, b = 2, c
= 4 (по
умолчанию)
7
>>> func(1, 2, 3) # a = 1, b =
2, c = 3
6
>>> func(a=1, b=1) # a = 1, b = 1,
c = 4
6
Произвольное
количество аргументов.
>>>
def func(*args):
return args
>>>
func(1,2,3,4,5)
(1,2,3,4,5)
Произвольное
количество именованных аргументов.
>>>
def func(**kwargs):
return kwargs
>>> func(a=1, b=2, c=3)
{'a': 1, 'b': 2, 'c': 3}
2.0 Базовые навыки работы с модулями.
В питоне изначально присутствует большое
количество модулей для работы например с регулярными
выражениями или операционной системой.
Модули
представлены объектами-модулями, атрибутами которох
являются имена, определенные в модулях
Модули по
тематике из стандартной библиотеки Python:
Сервисы периода выполнения: sys, atexit, copy, traceback, math, cmath, random, time, calendar, datetime,
sets, array, struct, itertools,
locale, gettext.
Поддержка цикла разработки: pdb, hotshot, profile, unittest, pydoc. Пакеты docutils, distutils.
Взаимодействие с
ОС (файлы, процессы): os, os.path, getopt,
glob, popen2, shutil, select, signal, stat, tempfile.
Обработка текстов: string, re, StringIO, codecs, difflib, mmap, sgmllib, htmllib, htmlentitydefs. Пакет xml.
Многопоточные вычисления: threading, thread, Queue.
Хранение данных. Архивация: pickle, shelve, anydbm,
gdbm, gzip, zlib, zipfile, bz2, csv, tarfile.
Платформо-зависимые модули. Для UNIX: commands, pwd, grp, fcntl, resource, termios, readline, rlcompleter. Для Windows: msvcrt, _winreg, winsound.
Поддержка сети. Протоколы Интернет: cgi, Cookie, urllib, urlparse, httplib, smtplib, poplib, telnetlib, socket, asyncore. Примеры серверов: SocketServer, BaseHTTPServer, xmlrpclib, asynchat.
Поддержка Internet. Форматы данных: quopri, uu, base64, binhex, binascii, rfc822, mimetools, MimeWriter, multifile, mailbox. Пакет email.
Для Python:
parser, symbol, token, keyword, inspect, tokenize, pyclbr,
py_compile, compileall, dis, compiler.
Графический
интерфейс: Tkinter.
В данном разделе будет показано, как
импортировать и получать справку по модулям.
#Импортировать
модуль(в нашем примере модуль sys)
>>>
import sys
#Посмотрим
пути, где питон смотрит наличие модулей
#Тут
мы уже обращаемся к функционалу модуля
>>>
sys.path
['', 'C:\Python33\Lib\idlelib',
'c:\Python27\egg\Lib\site-packages', 'c:\Python27\Lib\site-packages',
'C:\Windows\system32\python33.zip', 'C:\Python33\DLLs', 'C:\Python33\lib',
'C:\Python33', 'C:\Python33\lib\site-packages']
#Посмотрим,
что есть в модуле sys
>>>
dir(sys)
['__displayhook__', '__doc__', '__excepthook__', '__loader__', '__name__', '__package__', '__stderr__', '__stdin__', '__stdout__', '_clear_type_cache', '_current_frames',
'_debugmallocstats', '_getframe',
'_home', '_mercurial', '_xoptions', 'api_version', 'argv', 'base_exec_prefix', 'base_prefix', 'builtin_module_names',
'byteorder', 'call_tracing',
'callstats', 'copyright', 'displayhook', 'dllhandle', 'dont_write_bytecode', 'exc_info',
'excepthook', 'exec_prefix',
'executable', 'exit', 'flags', 'float_info', 'float_repr_style', 'getcheckinterval',
'getdefaultencoding', 'getfilesystemencoding',
'getprofile', 'getrecursionlimit',
'getrefcount', 'getsizeof', 'getswitchinterval', 'gettrace', 'getwindowsversion', 'hash_info', 'hexversion', 'implementation', 'int_info', 'intern', 'last_traceback', 'last_type', 'last_value', 'maxsize', 'maxunicode', 'meta_path', 'modules', 'path', 'path_hooks', 'path_importer_cache', 'platform',
'prefix', 'setcheckinterval',
'setprofile', 'setrecursionlimit',
'setswitchinterval', 'settrace',
'stderr', 'stdin', 'stdout', 'thread_info', 'version', 'version_info', 'warnoptions', 'winver']
#Пример
импортирования фукционала из модуля
>>>
from sys import *
#После
импортирования можно обращаться напрямую, а не через точку
>>> version
'3.3.2 (v3.3.2:d047928ae3f6, May 16
2013, 00:03:43) [MSC v.1600 32 bit (Intel)]'
#Посмотреть
справку по модулю или отдельному функционалу:
>>> help(os)
>>> help(os.system)
2.1 Работа с файлами
#Копировать
файл
>>>
import shutil
>>> shutil.copyfile('C:/test/test.txt',
'C:/test/newtest.txt')
'C:/test/newtest.txt'
#Откроем
файл на запись.
>>> f = open('C:/test/test.txt',
'w')
#Запишем
в него несколько строк с переносом на другую строку "\r\n".
>>> f.write('string1 \r\n')
10
>>>
f.write('string2')
7
#Закроем
файл
>>>
f.close()
#Пример
с чтением файла по количеству байт, и "прочитать все"
>>> f = open('C:/test/test.txt',
'r')
>>> f.read(7)
'string1'
>>> f.read()
' \n\nstring2'
>>> f.close()
#Пример
с редактированием файла по позиции байт
>>> f = open('C:/test/test.txt',
'w')
>>> f.write('abcdef')
6
>>> f.seek(3)
3
>>> f.write('CD')
2
>>> f.close()
>>> f = open('C:/test/test.txt',
'r')
>>>
f.read()
'abcCDf'
#Еще
пример чтения из файла
>>> f = open('C:/test/test.txt',
'w')
>>> f.write('string \r\n')
9
>>> f.write('string \r\n')
9
>>> f.write('string \r\n')
9
>>> f.close()
>>> f = open('C:/test/test.txt',
'r')
>>> f.readline()
'string \n'
>>> f.readlines()
['\n', 'string \n', '\n', 'string \n',
'\n']
>>>
f.close()
#Замена
определенной строки на значение
>>> f = open('C:/test/test.txt',
'r')
>>> strings
= f.readlines()
>>> f.close()
>>> strings[0]
= 'STRING'
>>> f = open('C:/test/test.txt',
'w')
>>> f.writelines(strings)
>>> f.close()
2.2 Работа с ftp
#Импортируем
библиотеки
>>>
import os
>>>
from ftplib import FTP
#Данные
для подключения
>>> ftpresource = '192.168.10.102'
>>> ftplogin = 'anonymous'
>>> ftppassword = 'yourpass'
>>> todir = 'C:/2'
#Параметры подключения
>>> ftp = FTP(ftpresource)
>>> ftp.login(ftplogin, ftppassword)
'230 Anonymous user
logged in.'
>>> ftp.cwd('/')
'250 CWD command
successful.'
#Скачиваем
все файлы с расширением .cfg
>>> for
files in ftp.nlst('*.cfg'):
ftp.retrbinary('RETR '+files, open(os.path.join(todir, files), 'wb').write, 1024)
'226 Transfer complete.'
'226 Transfer complete.'
'226
Transfer complete.'
#Закрываем
соединение
>>>
ftp.close()
2.3 Регулярные выражения
Регулярные
выражения модуль - re
Символы для шаблонов:
"." Любой символ
"^" Начало строки
"$" Конец строки
"*" Повторение фрагмента нуль или более
раз
"+" Повторение фрагмента один или более
раз
"?" Предыдущий фрагмент либо
присутствует, либо отсутствует
"{m,n}" Повторение
предыдущего фрагмента от m до n
раз включительно
"[...]" Любой символ из набора в скобках.
"[^...]" Любой символ не из набора в скобках
"" Обратная косая черта отменяет
специальное значение следующего за ней символа
"|" Фрагмент справа или фрагмент слева
"*?" Повторение фрагмента нуль или более раз
"+?" Повторение фрагмента один или более раз
"{m,n}?"
Повторение предыдущего фрагмента от m до n раз включительно
#Импортируем
модуль
>>>
import re
#Поиск
всех совпадений в строке
>>> re.findall(r"[0-9]+",
"123 abc 456AAA 789 def")
['123',
'456', '789']
#Разбивает строку на подстроки, разделенные
подстроками, заданными шаблоном
>>> re.split(r"[-_|/]", "123-abc_456AAA/789|def")
['123', 'abc',
'456AAA', '789', 'def']
2.4 Прехват
ошибки(try-except)
#Контроль
ошибок
>>> try:
zxc /cxz
except:
print "Error"
Error
2.5 Встроенные функции
В этом
разделе приведем список встроенных функций и дадим ресурс, где можно разобрать
функциональную часть каждой из функций.
Встроенные
функции
Тут можно
посмотреть описание:
http://ru.wikiversity.org/wiki/Программирование_и_научные_вычисления_на_языке_Python/§4/Приложение
Встроенные
функции по тематике:
Функции
преобразования типов и классы: coerce, str, repr, int,
list, tuple, long, float, complex,
dict, super, file, bool, object
Числовые и
строковые функции: abs, divmod,
ord, pow, len, chr, unichr,
hex, oct, cmp, round, unicode
Функции обработки данных: apply, map,
filter, reduce, zip, range, xrange, max, min, iter, enumerate, sum
Функции определения свойств: hash, id,
callable, issubclass, isinstance,
type
Функции для
доступа к внутренним структурам: locals, globals, vars, intern, dir
Функции
компиляции и исполнения: eval, execfile,
reload, __import__, compile
Функции
ввода-вывода: input, raw_input,
open
Функции для
работы с атрибутами: getattr, setattr,
delattr, hasattr
Функции-"украшатели" методов классов: staticmethod, classmethod, property
Прочие
функции: buffer, slice
2.6 Основы ООП
ООП
Все данные
представляются объектами.
Программу
можно составить как набор взаимодействующих объектов, посылающих друг другу
сообщения.
Каждый
объект имеет собственную часть памяти и может состоять из других объектов.
Каждый
объект имеет тип.
Все объекты
одного типа могут принимать одни и те же сообщения (и выполнять одни и те же
действия).
#Минимально
возможное определение класса
>>>
class A:
pass
В Python члены класса называются атрибутами,
функции класса — методами, поля класса — свойствами.
Определения
методов аналогичны определениям функций, методы всегда имеют первый аргумент,
называемый по широко принятому соглашению self:
>>> class
A:
def m1(self, x):
print (x)
Создание
экземпляра класса, изменение атрибутов и вызов метода
>>> class
A:
attr1 = 0
attr2 = 0
def m(self, x):
print (self.attr1 * self.attr2 * x)
>>> A = A()
>>> A.attr1 = 2
>>> A.attr2 = 3
>>>
A.m(10)
60
Конструктор
класса - специальный метод, который не требует вызова, запускается при вызове
класса автоматически, носит имя __init__
>>> class
B:
def __init__(self,a,b):
self.fname = a
self.lname = b
self.job = "Director: "+self.fname+" "+self.lname
def m(self,d):
self.department = self.job+"
work in " + d + " dept"
print (self.department)
>>> B = B("Mike",
"Jagger")
>>> B.m("IT")
Director: Mike Jagger
work in IT dept
2.7 Сокеты(пример простого сетевого
приложения)
Для начала
немного теории о сетевой модели
Уровни
модели OSI:
Физический
Поток битов,
передаваемых по физической линии. Определяет параметры физической линии.
Канальный (Ethernet, PPP, ATM и т.п.)
Кодирует и
декодирует данные в виде потока битов, справляясь с ошибками, возникающими на
физическом уровне в пределах физически единой сети.
Сетевой (IP)
Маршрутизирует
информационные пакеты от узла к узлу.
Транспортный
(TCP, UDP и т.п.)
Обеспечивает
прозрачную передачу данных между двумя точками соединения.
Сеансовый
Управляет
сеансом соединения между участниками сети. Начинает, координирует и завершает
соединения.
Представления
Обеспечивает
независимость данных от формы их представления путем преобразования форматов.
На этом уровне может выполняться прозрачное (с точки зрения вышележащего
уровня) шифрование и дешифрование данных.
Приложений
(HTTP, FTP, SMTP, NNTP, POP3, IMAP и т.д.)
Поддерживает
конкретные сетевые приложения. Протокол зависит от типа сервиса.
Итак, пример
простой передачи и возврата строки по сети.(приложение
типа обмен данными между клиентом и сервером)
#Модуль socket
import socket
#Создание сокета
sock = socket.socket()
#Свяжем
сокет с хостом и портом с помощью метода bind
sock.bind(('', 9999))
#С
помощью метода listen запустим для сокета режим прослушивания.
sock.listen(1)
#Принимаем
подключение с помощью метода accept, который
возвращает кортеж с двумя элементами: новый сокет и
адрес клиента.
conn, addr = sock.accept()
#Для
получения данных воспользуемся методом recv, в
качестве аргумента принимает количество байт. Будем читать 1024 байт.
#Получаем
данные от клиента, и возвращаем приветствие
data = conn.recv(1024)
conn.send("Server:Hello, client!")
#Закрываем
соединение
conn.close()
Файл server.py:
import socket
sock = socket.socket()
sock.bind(('',
9999))
sock.listen(1)
conn, addr = sock.accept()
print ('Client address:', addr)
data = conn.recv(1024)
print (data)
s = "Server:Hello, client!"
conn.send(bytes(s,
'UTF-8'))
conn.close()
Файл
client.py
import socket
sock = socket.socket()
sock.connect(('localhost', 9999))
s = 'Client:Hello, server!'
sock.send(bytes(s,
'UTF-8'))
data = sock.recv(1024)
sock.close()
print (data)
Запустить можно например так:
Вызываем два
окошка «cmd»
Пишем путь
до питона и через пробел путь до скрипта
Сначала
запускаем server.py
Затем client.py
2.8 Основы работы с базами данных(sqlite)
#sqlite3 простейший пример работы с базой данных из
файла
>>>
import sqlite3
#Соединение
с базой методом connect
>>> conn
= sqlite3.connect('C:\test\base.db')
#Соединение
в результате успешного вызова функции connect(), имеет следующие
методы:
#close()
Закрывает соединение с базой данных.
#commit()
Завершает транзакцию.
#rollback() Откатывает начатую транзакцию.
#cursor()
Возвращает объект-курсор, использующий данное соединение.
>>>
c = conn.cursor()
#execute
- исполняет запрос к базе данных. Примеры:
#Создание таблицы
c.execute('''create
table stocks (date text, trans text, symbol text, qty real, price real)''')
#Вставка значений
c.execute("""insert
into stocks values ('2006-01-05','BUY','RHAT',100,35.14)""")
#Подтверждаем
изменения
conn.commit()
#Сделаем
выборку
>>> conn
= sqlite3.connect('C:\test\base.db')
>>> c = conn.cursor()
>>> c.execute('select * from
stocks order by price')
<sqlite3.Cursor
object at 0x028517E0>
>>> for
row in c:
print(row)
(u'2006-01-05',
u'BUY', u'RHAT',
100.0, 35.14)
#Закрываем
соединение
c.close()