Пособие по языку 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()