Краткое руководство по Python

Python - это интерпретируемый, интерактивный и объектно-ориентированный язык сценариев высокого уровня. Python разработан для удобочитаемости. В нем часто используются ключевые слова на английском языке, а в других языках используются знаки препинания, и в нем меньше синтаксических конструкций, чем в других языках.

  • Python is Interpreted- Python обрабатывается интерпретатором во время выполнения. Вам не нужно компилировать вашу программу перед ее выполнением. Это похоже на PERL и PHP.

  • Python is Interactive - Фактически вы можете сидеть в командной строке Python и напрямую взаимодействовать с интерпретатором для написания ваших программ.

  • Python is Object-Oriented - Python поддерживает объектно-ориентированный стиль или технику программирования, которая инкапсулирует код внутри объектов.

  • Python is a Beginner's Language - Python - отличный язык для начинающих программистов и поддерживает разработку широкого спектра приложений, от простой обработки текста до веб-браузеров и игр.

История Python

Python был разработан Гвидо ван Россумом в конце 80-х - начале 90-х годов в Национальном исследовательском институте математики и компьютерных наук в Нидерландах.

Python является производным от многих других языков, включая ABC, Modula-3, C, C ++, Algol-68, SmallTalk, оболочку Unix и другие языки сценариев.

Python защищен авторским правом. Как и Perl, исходный код Python теперь доступен под Стандартной общественной лицензией GNU (GPL).

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

Возможности Python

Возможности Python включают в себя -

  • Easy-to-learn- Python имеет несколько ключевых слов, простую структуру и четко определенный синтаксис. Это позволяет студенту быстро овладеть языком.

  • Easy-to-read - Код Python более четко определен и виден глазам.

  • Easy-to-maintain - Исходный код Python довольно прост в обслуживании.

  • A broad standard library - Большая часть библиотеки Python очень портативна и кроссплатформенна, совместима с UNIX, Windows и Macintosh.

  • Interactive Mode - Python поддерживает интерактивный режим, который позволяет интерактивное тестирование и отладку фрагментов кода.

  • Portable - Python может работать на самых разных аппаратных платформах и имеет одинаковый интерфейс на всех платформах.

  • Extendable- В интерпретатор Python можно добавлять низкоуровневые модули. Эти модули позволяют программистам добавлять или настраивать свои инструменты для повышения эффективности.

  • Databases - Python предоставляет интерфейсы для всех основных коммерческих баз данных.

  • GUI Programming - Python поддерживает приложения с графическим интерфейсом пользователя, которые можно создавать и переносить во многие системные вызовы, библиотеки и системы Windows, такие как Windows MFC, Macintosh и систему X Window в Unix.

  • Scalable - Python обеспечивает лучшую структуру и поддержку больших программ, чем сценарии оболочки.

Помимо вышеупомянутых функций, Python имеет большой список хороших функций, некоторые из которых перечислены ниже -

  • Он поддерживает методы функционального и структурного программирования, а также ООП.

  • Он может использоваться как язык сценариев или может быть скомпилирован в байт-код для создания больших приложений.

  • Он предоставляет динамические типы данных очень высокого уровня и поддерживает проверку динамических типов.

  • Он поддерживает автоматический сбор мусора.

  • Его можно легко интегрировать с C, C ++, COM, ActiveX, CORBA и Java.

Python доступен на самых разных платформах, включая Linux и Mac OS X. Давайте разберемся, как настроить нашу среду Python.

Настройка локальной среды

Откройте окно терминала и введите «python», чтобы узнать, установлен ли он уже и какая версия установлена.

  • Unix (Solaris, Linux, FreeBSD, AIX, HP / UX, SunOS, IRIX и т. Д.)
  • Win 9x / NT / 2000
  • Macintosh (Intel, PPC, 68K)
  • OS/2
  • DOS (несколько версий)
  • PalmOS
  • Мобильные телефоны Nokia
  • Windows CE
  • Acorn / RISC OS
  • BeOS
  • Amiga
  • VMS/OpenVMS
  • QNX
  • VxWorks
  • Psion
  • Python также был перенесен на виртуальные машины Java и .NET.

Получение Python

Самый последний и актуальный исходный код, двоичные файлы, документация, новости и т. Д. Доступны на официальном сайте Python. https://www.python.org/

Вы можете скачать документацию Python из https://www.python.org/doc/. Документация доступна в форматах HTML, PDF и PostScript.

Установка Python

Дистрибутив Python доступен для самых разных платформ. Вам необходимо загрузить только двоичный код, подходящий для вашей платформы, и установить Python.

Если двоичный код для вашей платформы недоступен, вам понадобится компилятор C для компиляции исходного кода вручную. Компиляция исходного кода обеспечивает большую гибкость с точки зрения выбора функций, необходимых для вашей установки.

Вот краткий обзор установки Python на различных платформах -

Установка Unix и Linux

Вот простые шаги по установке Python на машине Unix / Linux.

  • Откройте веб-браузер и перейдите в https://www.python.org/downloads/.

  • Перейдите по ссылке, чтобы загрузить заархивированный исходный код, доступный для Unix / Linux.

  • Скачайте и распакуйте файлы.

  • Редактирование модулей / Setup файл , если вы хотите настроить некоторые параметры.

  • запустить ./configure скрипт

  • make

  • сделать установку

Это устанавливает Python в стандартное расположение / usr / local / bin и его библиотеки в / usr / local / lib / pythonXX, где XX - это версия Python.

Установка Windows

Вот шаги по установке Python на машине с Windows.

  • Откройте веб-браузер и перейдите в https://www.python.org/downloads/.

  • Перейдите по ссылке на файл python-XYZ.msi установщика Windows, где XYZ - это версия, которую необходимо установить.

  • Чтобы использовать этот установщик python-XYZ.msi , система Windows должна поддерживать Microsoft Installer 2.0. Сохраните файл установщика на локальном компьютере, а затем запустите его, чтобы узнать, поддерживает ли ваш компьютер MSI.

  • Запускаем скачанный файл. Это вызывает мастер установки Python, который действительно прост в использовании. Просто примите настройки по умолчанию, дождитесь завершения установки, и все готово.

Установка Macintosh

Последние Mac поставляются с установленным Python, но он может быть устаревшим на несколько лет. Видетьhttp://www.python.org/download/mac/для получения инструкций по получению текущей версии вместе с дополнительными инструментами для поддержки разработки на Mac. Для старых Mac OS до Mac OS X 10.3 (выпущенных в 2003 году) доступен MacPython.

Джек Янсен поддерживает его, и вы можете получить полный доступ ко всей документации на его веб-сайте - http://www.cwi.nl/~jack/macpython.html. Вы можете найти полную информацию об установке Mac OS.

Настройка PATH

Программы и другие исполняемые файлы могут находиться во многих каталогах, поэтому операционные системы предоставляют путь поиска, в котором перечислены каталоги, в которых ОС ищет исполняемые файлы.

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

В path Переменная называется PATH в Unix или Path в Windows (Unix чувствителен к регистру; Windows - нет).

В Mac OS установщик обрабатывает сведения о пути. Чтобы вызвать интерпретатор Python из любого конкретного каталога, вы должны добавить каталог Python в свой путь.

Установка пути в Unix / Linux

Чтобы добавить каталог Python к пути для определенного сеанса в Unix -

  • In the csh shell - введите setenv PATH "$ PATH: / usr / local / bin / python" и нажмите Enter.

  • In the bash shell (Linux) - введите export PATH = "$ PATH: / usr / local / bin / python" и нажмите Enter.

  • In the sh or ksh shell - введите PATH = "$ PATH: / usr / local / bin / python" и нажмите Enter.

  • Note - / usr / local / bin / python - это путь к каталогу Python

Установка пути в Windows

Чтобы добавить каталог Python к пути для определенного сеанса в Windows -

At the command prompt - введите path% path%; C: \ Python и нажмите Enter.

Note - C: \ Python - это путь к каталогу Python

Переменные среды Python

Вот важные переменные среды, которые может распознавать Python:

Sr.No. Переменная и описание
1

PYTHONPATH

Его роль аналогична PATH. Эта переменная сообщает интерпретатору Python, где найти файлы модуля, импортированные в программу. Он должен включать каталог исходной библиотеки Python и каталоги, содержащие исходный код Python. PYTHONPATH иногда задается установщиком Python.

2

PYTHONSTARTUP

Он содержит путь к файлу инициализации, содержащему исходный код Python. Он выполняется каждый раз при запуске интерпретатора. В Unix он называется .pythonrc.py и содержит команды для загрузки утилит или изменения PYTHONPATH.

3

PYTHONCASEOK

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

4

PYTHONHOME

Это альтернативный путь поиска модуля. Обычно он встраивается в каталоги PYTHONSTARTUP или PYTHONPATH, чтобы упростить переключение библиотек модулей.

Запуск Python

Есть три разных способа запустить Python:

Интерактивный переводчик

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

Войти python командная строка.

Начните писать прямо сейчас в интерактивном интерпретаторе.

$python # Unix/Linux
or
python% # Unix/Linux
or
C:> python # Windows/DOS

Вот список всех доступных параметров командной строки -

Sr.No. Вариант и описание
1

-d

Он обеспечивает вывод отладки.

2

-O

Он генерирует оптимизированный байт-код (в результате получаются файлы .pyo).

3

-S

Не запускайте сайт импорта для поиска путей Python при запуске.

4

-v

подробный вывод (подробная трассировка операторов импорта).

5

-X

отключите встроенные исключения на основе классов (используйте только строки); устарело, начиная с версии 1.6.

6

-c cmd

запустить скрипт Python, отправленный как строка cmd

7

file

запустить скрипт Python из заданного файла

Скрипт из командной строки

Сценарий Python может быть выполнен из командной строки, вызвав интерпретатор в вашем приложении, как показано ниже:

$python script.py # Unix/Linux

or

python% script.py # Unix/Linux

or 

C: >python script.py # Windows/DOS

Note - Убедитесь, что режим разрешений файла разрешает выполнение.

Интегрированная среда разработки

Вы также можете запустить Python из среды графического интерфейса пользователя (GUI), если в вашей системе есть приложение с графическим интерфейсом, которое поддерживает Python.

  • Unix - IDLE - это самая первая Unix IDE для Python.

  • Windows - PythonWin - это первый интерфейс Windows для Python, представляющий собой IDE с графическим интерфейсом.

  • Macintosh - Версия Python для Macintosh вместе с IDLE IDE доступна с основного веб-сайта и может быть загружена в виде файлов MacBinary или BinHex'd.

Если вы не можете правильно настроить среду, обратитесь за помощью к системному администратору. Убедитесь, что среда Python правильно настроена и работает нормально.

Note - Все примеры, приведенные в последующих главах, выполнены с версией Python 2.4.3, доступной в версии CentOS Linux.

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

Язык Python во многом похож на Perl, C и Java. Однако между языками есть определенные различия.

Первая программа на Python

Выполним программы в разных режимах программирования.

Программирование в интерактивном режиме

Вызов интерпретатора без передачи файла сценария в качестве параметра вызывает следующее приглашение:

$ python
Python 2.4.3 (#1, Nov 11 2010, 13:34:43)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-48)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>

Введите следующий текст в командной строке Python и нажмите Enter -

>>> print "Hello, Python!"

Если вы используете новую версию Python, вам нужно будет использовать оператор печати со скобками, как в print ("Hello, Python!");. Однако в версии Python 2.4.3 это дает следующий результат:

Hello, Python!

Программирование в режиме сценария

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

Давайте напишем простую программу Python в скрипте. Файлы Python имеют расширение.py. Введите следующий исходный код в файл test.py -

print "Hello, Python!"

Мы предполагаем, что у вас установлен интерпретатор Python в переменной PATH. Теперь попробуйте запустить эту программу следующим образом -

$ python test.py

Это дает следующий результат -

Hello, Python!

Давайте попробуем другой способ выполнить скрипт Python. Вот модифицированный файл test.py -

#!/usr/bin/python

print "Hello, Python!"

Мы предполагаем, что у вас есть интерпретатор Python, доступный в каталоге / usr / bin. Теперь попробуйте запустить эту программу следующим образом -

$ chmod +x test.py     # This is to make file executable
$./test.py

Это дает следующий результат -

Hello, Python!

Идентификаторы Python

Идентификатор Python - это имя, используемое для идентификации переменной, функции, класса, модуля или другого объекта. Идентификатор начинается с буквы от A до Z, от a до z или символа подчеркивания (_), за которым следуют ноль или более букв, символов подчеркивания и цифр (от 0 до 9).

Python не допускает символов пунктуации, таких как @, $ и%, в идентификаторах. Python - это язык программирования с учетом регистра. Таким образом,Manpower и manpower - это два разных идентификатора в Python.

Вот соглашения об именах для идентификаторов Python -

  • Имена классов начинаются с заглавной буквы. Все остальные идентификаторы начинаются с строчной буквы.

  • Если идентификатор начинается с одного символа подчеркивания в начале, это означает, что идентификатор является частным.

  • Идентификатор, начинающийся с двух знаков подчеркивания в начале, указывает на строго конфиденциальный идентификатор.

  • Если идентификатор также заканчивается двумя завершающими знаками подчеркивания, идентификатор является определяемым языком специальным именем.

Зарезервированные слова

В следующем списке показаны ключевые слова Python. Это зарезервированные слова, и вы не можете использовать их в качестве имен констант, переменных или любых других идентификаторов. Все ключевые слова Python содержат только строчные буквы.

и exec не
утверждать Ну наконец то или же
сломать за проходить
класс из Распечатать
Продолжить Глобальный поднять
def если возвращение
дель импорт пытаться
Элиф в в то время как
еще является с участием
Кроме лямбда Уступать

Линии и отступы

Python не предоставляет фигурных скобок для обозначения блоков кода для определений классов и функций или управления потоком. Блоки кода обозначаются строковым отступом, который строго соблюдается.

Количество пробелов в отступе варьируется, но все операторы в блоке должны иметь одинаковый отступ. Например -

if True:
   print "True"
else:
   print "False"

Однако следующий блок генерирует ошибку -

if True:
print "Answer"
print "True"
else:
print "Answer"
print "False"

Таким образом, в Python все непрерывные строки с одинаковым количеством пробелов образуют блок. В следующем примере есть различные блоки операторов -

Note- Не пытайтесь понять логику на данном этапе. Просто убедитесь, что вы поняли различные блоки, даже если они без скобок.

#!/usr/bin/python

import sys

try:
   # open file stream
   file = open(file_name, "w")
except IOError:
   print "There was an error writing to", file_name
   sys.exit()
print "Enter '", file_finish,
print "' When finished"
while file_text != file_finish:
   file_text = raw_input("Enter text: ")
   if file_text == file_finish:
      # close the file
      file.close
      break
   file.write(file_text)
   file.write("\n")
file.close()
file_name = raw_input("Enter filename: ")
if len(file_name) == 0:
   print "Next time please enter something"
   sys.exit()
try:
   file = open(file_name, "r")
except IOError:
   print "There was an error reading file"
   sys.exit()
file_text = file.read()
file.close()
print file_text

Многострочные утверждения

Заявления в Python обычно заканчиваются новой строкой. Однако Python позволяет использовать символ продолжения строки (\) для обозначения продолжения строки. Например -

total = item_one + \
        item_two + \
        item_three

В операторах, заключенных в квадратные скобки [], {} или (), не нужно использовать символ продолжения строки. Например -

days = ['Monday', 'Tuesday', 'Wednesday',
        'Thursday', 'Friday']

Цитата в Python

Python принимает одинарные ('), двойные (") и тройные (' '' или" "") кавычки для обозначения строковых литералов, если один и тот же тип кавычек начинается и заканчивается в строке.

Тройные кавычки используются для разделения строки на несколько строк. Например, все следующее является законным -

word = 'word'
sentence = "This is a sentence."
paragraph = """This is a paragraph. It is
made up of multiple lines and sentences."""

Комментарии в Python

Знак решетки (#), который не находится внутри строкового литерала, начинает комментарий. Все символы после # и до конца физической строки являются частью комментария, и интерпретатор Python игнорирует их.

#!/usr/bin/python

# First comment
print "Hello, Python!" # second comment

Это дает следующий результат -

Hello, Python!

Вы можете ввести комментарий в той же строке после оператора или выражения -

name = "Madisetti" # This is again comment

Вы можете прокомментировать несколько строк следующим образом -

# This is a comment.
# This is a comment, too.
# This is a comment, too.
# I said that already.

Использование пустых строк

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

В сеансе интерактивного интерпретатора вы должны ввести пустую физическую строку для завершения многострочного оператора.

Жду пользователя

В следующей строке программы отображается запрос, в котором говорится: «Нажмите клавишу ввода, чтобы выйти», и ожидается, что пользователь предпримет действия -

#!/usr/bin/python

raw_input("\n\nPress the enter key to exit.")

Здесь "\ n \ n" используется для создания двух новых строк перед отображением фактической строки. Как только пользователь нажимает клавишу, программа завершается. Это хороший трюк, позволяющий держать окно консоли открытым до тех пор, пока пользователь не закончит работу с приложением.

Несколько заявлений в одной строке

Точка с запятой (;) позволяет размещать несколько операторов в одной строке, если ни одна из них не запускает новый блок кода. Вот образец фрагмента с точкой с запятой -

import sys; x = 'foo'; sys.stdout.write(x + '\n')

Несколько групп утверждений как наборы

Группа отдельных операторов, составляющих единый блок кода, называется suitesв Python. Для составных или сложных операторов, таких как if, while, def и class, требуется строка заголовка и набор.

Строки заголовка начинаются с оператора (с ключевого слова) и заканчиваются двоеточием (:), за которыми следуют одна или несколько строк, составляющих набор. Например -

if expression : 
   suite
elif expression : 
   suite 
else : 
   suite

Аргументы командной строки

Многие программы могут быть запущены, чтобы предоставить вам некоторую базовую информацию о том, как их следует запускать. Python позволяет сделать это с помощью -h -

$ python -h
usage: python [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-c cmd : program passed in as string (terminates option list)
-d     : debug output from parser (also PYTHONDEBUG=x)
-E     : ignore environment variables (such as PYTHONPATH)
-h     : print this help message and exit

[ etc. ]

Вы также можете запрограммировать свой сценарий таким образом, чтобы он принимал различные параметры. Аргументы командной строки - это сложная тема, и ее следует изучить чуть позже, когда вы ознакомитесь с остальными концепциями Python.

Переменные - это не что иное, как зарезервированные ячейки памяти для хранения значений. Это означает, что когда вы создаете переменную, вы резервируете некоторое место в памяти.

В зависимости от типа данных переменной интерпретатор выделяет память и решает, что можно сохранить в зарезервированной памяти. Следовательно, назначая переменным разные типы данных, вы можете хранить в этих переменных целые числа, десятичные дроби или символы.

Присвоение значений переменным

Переменные Python не нуждаются в явном объявлении для резервирования места в памяти. Объявление происходит автоматически, когда вы присваиваете значение переменной. Знак равенства (=) используется для присвоения значений переменным.

Операнд слева от оператора = - это имя переменной, а операнд справа от оператора = - это значение, хранящееся в переменной. Например -

#!/usr/bin/python

counter = 100          # An integer assignment
miles   = 1000.0       # A floating point
name    = "John"       # A string

print counter
print miles
print name

Здесь 100, 1000.0 и «Джон» - это значения, присвоенные переменным counter , miles и name соответственно. Это дает следующий результат -

100
1000.0
John

Множественное присвоение

Python позволяет назначать одно значение нескольким переменным одновременно. Например -

a = b = c = 1

Здесь создается целочисленный объект со значением 1, и все три переменные назначаются в одну и ту же ячейку памяти. Вы также можете назначить несколько объектов нескольким переменным. Например -

a,b,c = 1,2,"john"

Здесь два целочисленных объекта со значениями 1 и 2 присвоены переменным a и b соответственно, а один строковый объект со значением «john» назначен переменной c.

Стандартные типы данных

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

Python имеет пять стандартных типов данных -

  • Numbers
  • String
  • List
  • Tuple
  • Dictionary

Числа Python

Числовые типы данных хранят числовые значения. Числовые объекты создаются, когда вы присваиваете им значение. Например -

var1 = 1
var2 = 10

Вы также можете удалить ссылку на числовой объект, используя оператор del. Синтаксис оператора del -

del var1[,var2[,var3[....,varN]]]]

Вы можете удалить один объект или несколько объектов, используя оператор del. Например -

del var
del var_a, var_b

Python поддерживает четыре разных числовых типа -

  • int (целые числа со знаком)
  • long (длинные целые числа, они также могут быть представлены в восьмеричном и шестнадцатеричном формате)
  • float (вещественные значения с плавающей запятой)
  • комплекс (комплексные числа)

Примеры

Вот несколько примеров чисел -

int долго плавать сложный
10 51924361L 0,0 3,14j
100 -0x19323L 15.20 45.j
-786 0122L -21,9 9.322e-36j
080 0xDEFABCECBDAECBFBAEl 32,3 + e18 .876j
-0490 535633629843L -90. -.6545 + 0J
-0x260 -052318172735L -32,54e100 3e + 26J
0x69 -4721885298529L 70.2-E12 4.53e-7j
  • Python позволяет использовать строчную l с длинным, но рекомендуется использовать только верхний регистр L, чтобы не путать с числом 1. Python отображает длинные целые числа с прописной L.

  • Комплексное число состоит из упорядоченной пары действительных чисел с плавающей запятой, обозначаемых x + yj, где x и y - действительные числа, а j - мнимая единица.

Строки Python

Строки в Python идентифицируются как непрерывный набор символов, представленных в кавычках. Python позволяет использовать пары одинарных или двойных кавычек. Подмножества строк могут быть взяты с помощью оператора среза ([] и [:]) с индексами, начинающимися с 0 в начале строки и работающими от -1 в конце.

Знак плюс (+) - это оператор конкатенации строк, а звездочка (*) - оператор повторения. Например -

#!/usr/bin/python

str = 'Hello World!'

print str          # Prints complete string
print str[0]       # Prints first character of the string
print str[2:5]     # Prints characters starting from 3rd to 5th
print str[2:]      # Prints string starting from 3rd character
print str * 2      # Prints string two times
print str + "TEST" # Prints concatenated string

Это даст следующий результат -

Hello World!
H
llo
llo World!
Hello World!Hello World!
Hello World!TEST

Списки Python

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

К значениям, хранящимся в списке, можно получить доступ с помощью оператора среза ([] и [:]) с индексами, начинающимися с 0 в начале списка и продвигающимися до конца -1. Знак плюс (+) - это оператор конкатенации списка, а звездочка (*) - оператор повторения. Например -

#!/usr/bin/python

list = [ 'abcd', 786 , 2.23, 'john', 70.2 ]
tinylist = [123, 'john']

print list          # Prints complete list
print list[0]       # Prints first element of the list
print list[1:3]     # Prints elements starting from 2nd till 3rd 
print list[2:]      # Prints elements starting from 3rd element
print tinylist * 2  # Prints list two times
print list + tinylist # Prints concatenated lists

Это дает следующий результат -

['abcd', 786, 2.23, 'john', 70.2]
abcd
[786, 2.23]
[2.23, 'john', 70.2]
[123, 'john', 123, 'john']
['abcd', 786, 2.23, 'john', 70.2, 123, 'john']

Кортежи Python

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

Основные различия между списками и кортежами заключаются в следующем: списки заключаются в квадратные скобки ([]), их элементы и размер могут быть изменены, а кортежи заключаются в круглые скобки (()) и не могут быть обновлены. Кортежи можно рассматривать какread-onlyсписки. Например -

#!/usr/bin/python

tuple = ( 'abcd', 786 , 2.23, 'john', 70.2  )
tinytuple = (123, 'john')

print tuple               # Prints the complete tuple
print tuple[0]            # Prints first element of the tuple
print tuple[1:3]          # Prints elements of the tuple starting from 2nd till 3rd 
print tuple[2:]           # Prints elements of the tuple starting from 3rd element
print tinytuple * 2       # Prints the contents of the tuple twice
print tuple + tinytuple   # Prints concatenated tuples

Это дает следующий результат -

('abcd', 786, 2.23, 'john', 70.2)
abcd
(786, 2.23)
(2.23, 'john', 70.2)
(123, 'john', 123, 'john')
('abcd', 786, 2.23, 'john', 70.2, 123, 'john')

Следующий код недействителен для кортежа, потому что мы пытались обновить кортеж, что недопустимо. Аналогичный случай возможен со списками -

#!/usr/bin/python

tuple = ( 'abcd', 786 , 2.23, 'john', 70.2  )
list = [ 'abcd', 786 , 2.23, 'john', 70.2  ]
tuple[2] = 1000    # Invalid syntax with tuple
list[2] = 1000     # Valid syntax with list

Словарь Python

Словари Python представляют собой своего рода хеш-таблицы. Они работают как ассоциативные массивы или хэши, найденные в Perl, и состоят из пар ключ-значение. Ключ словаря может быть практически любым типом Python, но обычно это числа или строки. Значения, с другой стороны, могут быть любым произвольным объектом Python.

Словари заключаются в фигурные скобки ({}), а значения могут быть присвоены и доступны с помощью квадратных скобок ([]). Например -

#!/usr/bin/python

dict = {}
dict['one'] = "This is one"
dict[2]     = "This is two"

tinydict = {'name': 'john','code':6734, 'dept': 'sales'}


print dict['one']       # Prints value for 'one' key
print dict[2]           # Prints value for 2 key
print tinydict          # Prints complete dictionary
print tinydict.keys()   # Prints all the keys
print tinydict.values() # Prints all the values

Это дает следующий результат -

This is one
This is two
{'dept': 'sales', 'code': 6734, 'name': 'john'}
['dept', 'code', 'name']
['sales', 6734, 'john']

В словарях нет понятия порядка между элементами. Неверно говорить, что элементы «вышли из строя»; они просто неупорядочены.

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

Иногда вам может потребоваться выполнить преобразование между встроенными типами. Для преобразования между типами вы просто используете имя типа как функцию.

Есть несколько встроенных функций для выполнения преобразования из одного типа данных в другой. Эти функции возвращают новый объект, представляющий преобразованное значение.

Sr.No. Описание функции
1

int(x [,base])

Преобразует x в целое число. base указывает базу, если x - строка.

2

long(x [,base] )

Преобразует x в длинное целое число. base указывает базу, если x - строка.

3

float(x)

Преобразует x в число с плавающей запятой.

4

complex(real [,imag])

Создает комплексное число.

5

str(x)

Преобразует объект x в строковое представление.

6

repr(x)

Преобразует объект x в строку выражения.

7

eval(str)

Оценивает строку и возвращает объект.

8

tuple(s)

Преобразует s в кортеж.

9

list(s)

Преобразует s в список.

10

set(s)

Преобразует s в набор.

11

dict(d)

Создает словарь. d должен быть последовательностью кортежей (ключ, значение).

12

frozenset(s)

Преобразует s в замороженный набор.

13

chr(x)

Преобразует целое число в символ.

14

unichr(x)

Преобразует целое число в символ Юникода.

15

ord(x)

Преобразует одиночный символ в его целочисленное значение.

16

hex(x)

Преобразует целое число в шестнадцатеричную строку.

17

oct(x)

Преобразует целое число в восьмеричную строку.

Операторы - это конструкции, которые могут управлять значением операндов.

Рассмотрим выражение 4 + 5 = 9. Здесь 4 и 5 называются операндами, а + называется оператором.

Типы операторов

Язык Python поддерживает следующие типы операторов.

  • Арифметические операторы
  • Операторы сравнения (отношения)
  • Операторы присваивания
  • Логические операторы
  • Побитовые операторы
  • Операторы членства
  • Операторы идентификации

Давайте посмотрим на всех операторов один за другим.

Арифметические операторы Python

Предположим, что переменная a содержит 10, а переменная b содержит 20, тогда -

[ Показать пример ]

Оператор Описание пример
+ Дополнение Добавляет значения по обе стороны от оператора. а + б = 30
- Вычитание Вычитает правый операнд из левого операнда. а - б = -10
* Умножение Умножает значения по обе стороны от оператора а * б = 200
/ Деление Делит левый операнд на правый операнд б / а = 2
% Модуль Делит левый операнд на правый и возвращает остаток б% а = 0
** Экспонента Выполняет экспоненциальный (степенной) расчет операторов a ** b = 10 в степени 20
// Деление этажа - деление операндов, результатом которого является частное, в котором удаляются цифры после десятичной точки. Но если один из операндов отрицателен, результат не учитывается, т.е. округляется от нуля (в сторону отрицательной бесконечности) - 9 // 2 = 4 и 9.0 // 2.0 = 4.0, -11 // 3 = -4, -11.0 // 3 = -4.0

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

Эти операторы сравнивают значения по обе стороны от них и определяют соотношение между ними. Их также называют операторами отношения.

Предположим, что переменная a содержит 10, а переменная b содержит 20, тогда -

[ Показать пример ]

Оператор Описание пример
== Если значения двух операндов равны, условие становится истинным. (a == b) неверно.
знак равно Если значения двух операндов не равны, то условие становится истинным. (a! = b) верно.
<> Если значения двух операндов не равны, то условие становится истинным. (a <> b) верно. Это похоже на оператор! =.
> Если значение левого операнда больше, чем значение правого операнда, тогда условие становится истинным. (a> b) неверно.
< Если значение левого операнда меньше значения правого операнда, тогда условие становится истинным. (a <b) верно.
> = Если значение левого операнда больше или равно значению правого операнда, тогда условие становится истинным. (a> = b) неверно.
<= Если значение левого операнда меньше или равно значению правого операнда, тогда условие становится истинным. (a <= b) верно.

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

Предположим, что переменная a содержит 10, а переменная b содержит 20, тогда -

[ Показать пример ]

Оператор Описание пример
знак равно Присваивает значения из правых операндов левому операнду c = a + b присваивает значение a + b в c
+ = Добавить И Он добавляет правый операнд к левому операнду и присваивает результат левому операнду c + = a эквивалентно c = c + a
- = Вычесть И Он вычитает правый операнд из левого операнда и присваивает результат левому операнду c - = a эквивалентно c = c - a
* = Умножить И Он умножает правый операнд на левый операнд и присваивает результат левому операнду c * = a эквивалентно c = c * a
/ = Разделить И Он делит левый операнд на правый и присваивает результат левому операнду c / = a эквивалентно c = c / a
% = Модуль И Он принимает модуль с использованием двух операндов и присваивает результат левому операнду c% = a эквивалентно c = c% a
** = Показатель И Выполняет экспоненциальное (степенное) вычисление операторов и присваивает значение левому операнду c ** = a эквивалентно c = c ** a
// = Разделение этажей Он выполняет разделение этажей по операторам и присваивает значение левому операнду c // = a эквивалентно c = c // a

Побитовые операторы Python

Побитовый оператор работает с битами и выполняет побитовую операцию. Допустим, если a = 60; и b = 13; Теперь в двоичном формате их значения будут 0011 1100 и 0000 1101 соответственно. В следующей таблице перечислены побитовые операторы, поддерживаемые языком Python, с примером каждого из них, мы используем две указанные выше переменные (a и b) в качестве операндов -

а = 0011 1100

б = 0000 1101

-----------------

а & b = 0000 1100

а | Ь = 0011 1101

а ^ Ь = 0011 0001

~ а = 1100 0011

В языке Python поддерживаются следующие побитовые операторы.

[ Показать пример ]

Оператор Описание пример
& Двоичное И Оператор копирует бит в результат, если он существует в обоих операндах (a & b) (означает 0000 1100)
| Двоичное ИЛИ Он копирует бит, если он существует в любом из операндов. (a | b) = 61 (означает 0011 1101)
^ Двоичный XOR Он копирует бит, если он установлен в одном операнде, но не в обоих. (a ^ b) = 49 (означает 0011 0001)
~ Двоичное дополнение Он унарный и имеет эффект «переворачивания» битов. (~ a) = -61 (означает 1100 0011 в форме дополнения до 2 из-за двоичного числа со знаком.
<< Двоичный сдвиг влево Значение левого операнда сдвигается влево на количество битов, указанное правым операндом. a << 2 = 240 (означает 1111 0000)
>> Двоичный сдвиг вправо Значение левого операнда перемещается вправо на количество битов, указанное правым операндом. a >> 2 = 15 (означает 0000 1111)

Логические операторы Python

Язык Python поддерживает следующие логические операторы. Предположим, что переменная a содержит 10, а переменная b содержит 20, тогда

[ Показать пример ]

Оператор Описание пример
и логическое И Если оба операнда верны, условие становится истинным. (а и б) верно.
или логическое ИЛИ Если любой из двух операндов не равен нулю, условие становится истинным. (а или б) верно.
не логическое НЕ Используется для изменения логического состояния его операнда. Not (a и b) ложно.

Операторы членства Python

Операторы членства Python проверяют членство в последовательности, такой как строки, списки или кортежи. Есть два оператора членства, как описано ниже -

[ Показать пример ]

Оператор Описание пример
в Возвращает значение true, если находит переменную в указанной последовательности, и false в противном случае. x in y, здесь возвращается 1, если x является членом последовательности y.
не в Возвращает значение true, если не находит переменную в указанной последовательности, и false в противном случае. x не в y, здесь не приводит к 1, если x не является членом последовательности y.

Операторы идентификации Python

Операторы идентификации сравнивают места в памяти двух объектов. Ниже описаны два оператора идентификации:

[ Показать пример ]

Оператор Описание пример
является Возвращает значение true, если переменные по обе стороны от оператора указывают на один и тот же объект, и false в противном случае. х это у, здесь is приводит к 1, если id (x) равно id (y).
не является Возвращает false, если переменные по обе стороны от оператора указывают на один и тот же объект, и true в противном случае. х не у, здесь is not приводит к 1, если id (x) не равно id (y).

Приоритет операторов Python

В следующей таблице перечислены все операторы от самого высокого до самого низкого приоритета.

[ Показать пример ]

Sr.No. Оператор и описание
1

**

Возведение в степень (возведение в степень)

2

~ + -

Дополнение, унарный плюс и минус (имена методов для последних двух: + @ и - @)

3

* / % //

Умножение, деление, деление по модулю и полу

4

+ -

Сложение и вычитание

5

>> <<

Поразрядный сдвиг вправо и влево

6

&

Побитовое "И"

7

^ |

Побитовое исключающее `ИЛИ 'и обычное` ИЛИ'

8

<= < > >=

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

9

<> == !=

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

10

= %= /= //= -= += *= **=

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

11

is is not

Операторы идентификации

12

in not in

Операторы членства

13

not or and

Логические операторы

Принятие решения - это предвидение условий, возникающих при выполнении программы, и определение действий, предпринимаемых в соответствии с условиями.

Структуры принятия решений оценивают несколько выражений, результатом которых является ИСТИНА или ЛОЖЬ. Вам необходимо определить, какое действие предпринять и какие операторы выполнить, если результат ИСТИНА или ЛОЖЬ в противном случае.

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

Язык программирования Python предполагает любые non-zero и non-null значения как ИСТИНА, и если это либо zero или же null, то принимается значение ЛОЖЬ.

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

Sr.No. Заявление и описание
1 если заявления

An if statement состоит из логического выражения, за которым следует одно или несколько операторов.

2 если ... еще утверждения

An if statement может сопровождаться необязательным else statement, который выполняется, когда логическое выражение имеет значение FALSE.

3 вложенные операторы if

Вы можете использовать один if или же else if заявление внутри другого if или же else if заявления).

Давайте кратко рассмотрим каждое принятие решения -

Люкс Single Statement

Если сюита if Предложение состоит только из одной строки, оно может находиться в той же строке, что и оператор заголовка.

Вот пример one-line if пункт -

#!/usr/bin/python

var = 100
if ( var == 100 ) : print "Value of expression is 100"
print "Good bye!"

Когда приведенный выше код выполняется, он дает следующий результат:

Value of expression is 100
Good bye!

Как правило, операторы выполняются последовательно: сначала выполняется первый оператор функции, затем второй и т. Д. Может возникнуть ситуация, когда вам нужно выполнить блок кода несколько раз.

Языки программирования предоставляют различные структуры управления, которые позволяют использовать более сложные пути выполнения.

Оператор цикла позволяет нам выполнять оператор или группу операторов несколько раз. Следующая диаграмма иллюстрирует оператор цикла -

Язык программирования Python предоставляет следующие типы циклов для обработки требований цикла.

Sr.No. Тип и описание петли
1 пока цикл

Повторяет оператор или группу операторов, пока данное условие ИСТИННО. Он проверяет условие перед выполнением тела цикла.

2 для цикла

Выполняет последовательность операторов несколько раз и сокращает код, управляющий переменной цикла.

3 вложенные циклы

Вы можете использовать один или несколько циклов внутри любого другого цикла while, for или do.. while.

Заявления контроля цикла

Операторы управления циклом изменяют выполнение обычной последовательности. Когда выполнение покидает область действия, все автоматические объекты, созданные в этой области, уничтожаются.

Python поддерживает следующие управляющие операторы. Щелкните следующие ссылки, чтобы проверить их детали.

Давайте кратко рассмотрим операторы управления циклом.

Sr.No. Положение и описание управления
1 заявление о прерывании

Завершает оператор цикла и передает выполнение оператору, непосредственно следующему за циклом.

2 продолжить заявление

Заставляет цикл пропускать оставшуюся часть своего тела и немедленно повторно проверять свое состояние перед повторением.

3 заявление о прохождении

Оператор pass в Python используется, когда оператор требуется синтаксически, но вы не хотите, чтобы выполнялась какая-либо команда или код.

Числовые типы данных хранят числовые значения. Это неизменяемые типы данных. Это означает, что изменение значения числового типа данных приводит к новому выделенному объекту.

Числовые объекты создаются, когда вы присваиваете им значение. Например -

var1 = 1
var2 = 10

Вы также можете удалить ссылку на числовой объект, используя delзаявление. Синтаксис оператора del -

del var1[,var2[,var3[....,varN]]]]

Вы можете удалить один объект или несколько объектов, используя delзаявление. Например -

del var
del var_a, var_b

Python поддерживает четыре разных числовых типа -

  • int (signed integers) - Их часто называют целыми или целыми числами, положительными или отрицательными целыми числами без десятичной точки.

  • long (long integers ) - Также называемые длинными, они представляют собой целые числа неограниченного размера, записанные как целые числа, за которыми следует буква L в верхнем или нижнем регистре.

  • float (floating point real values)- Также называемые числами с плавающей запятой, они представляют собой действительные числа и записываются с десятичной точкой, разделяющей целую и дробную части. Поплавки также могут иметь научную нотацию, где E или e обозначают степень 10 (2,5e2 = 2,5 x 10 2 = 250).

  • complex (complex numbers)- имеют форму a + bJ, где a и b являются числами с плавающей запятой, а J (или j) представляет собой квадратный корень из -1 (который является мнимым числом). Действительная часть числа - это а, а мнимая часть - b. Комплексные числа мало используются в программировании на Python.

Примеры

Вот несколько примеров чисел

int долго плавать сложный
10 51924361L 0,0 3,14j
100 -0x19323L 15.20 45.j
-786 0122L -21,9 9.322e-36j
080 0xDEFABCECBDAECBFBAEL 32,3 + e18 .876j
-0490 535633629843L -90. -.6545 + 0J
-0x260 -052318172735L -32,54e100 3e + 26J
0x69 -4721885298529L 70.2-E12 4.53e-7j
  • Python позволяет использовать L в нижнем регистре с long, но рекомендуется использовать только L в верхнем регистре, чтобы избежать путаницы с числом 1. Python отображает длинные целые числа с заглавной L.

  • Комплексное число состоит из упорядоченной пары вещественных чисел с плавающей запятой, обозначаемых a + bj, где a - действительная часть, а b - мнимая часть комплексного числа.

Преобразование типа числа

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

  • Тип int(x) чтобы преобразовать x в простое целое число.

  • Тип long(x) чтобы преобразовать x в длинное целое число.

  • Тип float(x) для преобразования x в число с плавающей запятой.

  • Тип complex(x) для преобразования x в комплексное число с действительной частью x и мнимой частью нуля.

  • Тип complex(x, y)для преобразования x и y в комплексное число с действительной частью x и мнимой частью y. x и y - числовые выражения

Математические функции

Python включает следующие функции, которые выполняют математические вычисления.

Sr.No. Функция и возврат (описание)
1 абс (х)

Абсолютное значение x: (положительное) расстояние между x и нулем.

2 ceil (x)

Потолок x: наименьшее целое число не менее x

3 cmp (x, y)

-1, если x <y, 0, если x == y, или 1, если x> y

4 ехр (х)

Экспонента от x: e x

5 фабрики (х)

Абсолютное значение x.

6 этаж (x)

Пол x: наибольшее целое число не больше x

7 журнал (х)

Натуральный логарифм x при x> 0

8 log10 (x)

Логарифм x по основанию 10 для x> 0.

9 макс (x1, x2, ...)

Самый большой из его аргументов: значение, ближайшее к положительной бесконечности.

10 мин (х1, х2, ...)

Наименьший из его аргументов: значение, ближайшее к отрицательной бесконечности.

11 modf (x)

Дробная и целая части x в двухэлементном кортеже. Обе части имеют тот же знак, что и x. Целая часть возвращается как число с плавающей запятой.

12 pow (x, y)

Значение x ** y.

13 раунд (x [, n])

xокругляется до n знаков после запятой. Python округляет от нуля как решающий фактор: round (0,5) равен 1,0, а round (-0,5) равен -1,0.

14 sqrt (х)

Квадратный корень из x при x> 0

Функции случайных чисел

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

Sr.No. Описание функции
1 выбор (seq)

Случайный элемент из списка, кортежа или строки.

2 randrange ([начало,] стоп [, шаг])

Случайно выбранный элемент из диапазона (старт, стоп, шаг)

3 случайный ()

Случайное число с плавающей запятой r, такое, что 0 меньше или равно r, а r меньше 1

4 семя ([x])

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

5 перемешать (lst)

Рандомизирует элементы списка на месте. Нет возврата.

6 равномерное (x, y)

Случайное число с плавающей запятой r, такое, что x меньше или равно r, а r меньше y

Тригонометрические функции

Python включает следующие функции, которые выполняют тригонометрические вычисления.

Sr.No. Описание функции
1 acos (x)

Вернуть арккосинус x в радианах.

2 asin (х)

Вернуть арксинус x в радианах.

3 атан (х)

Вернуть арктангенс x в радианах.

4 atan2 (у, х)

Возвращает atan (y / x) в радианах.

5 cos (x)

Верните косинус x радиан.

6 гипотеза (х, у)

Верните евклидову норму sqrt (x * x + y * y).

7 грех (х)

Верните синус x радиан.

8 загар (х)

Вернуть тангенс x радиан.

9 градусы (х)

Преобразует угол x из радиан в градусы.

10 радианы (х)

Преобразует угол x из градусов в радианы.

Математические константы

Модуль также определяет две математические константы -

Sr.No. Константы и описание
1

pi

Математическая константа пи.

2

e

Математическая константа e.

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

var1 = 'Hello World!'
var2 = "Python Programming"

Доступ к значениям в строках

Python не поддерживает символьный тип; они рассматриваются как строки длины один, поэтому также считаются подстрокой.

Чтобы получить доступ к подстрокам, используйте квадратные скобки для нарезки вместе с индексом или индексами для получения вашей подстроки. Например -

#!/usr/bin/python

var1 = 'Hello World!'
var2 = "Python Programming"

print "var1[0]: ", var1[0]
print "var2[1:5]: ", var2[1:5]

Когда приведенный выше код выполняется, он дает следующий результат:

var1[0]:  H
var2[1:5]:  ytho

Обновление строк

Вы можете «обновить» существующую строку, назначив (пере) переменную другой строке. Новое значение может быть связано со своим предыдущим значением или с совершенно другой строкой в ​​целом. Например -

#!/usr/bin/python

var1 = 'Hello World!'
print "Updated String :- ", var1[:6] + 'Python'

Когда приведенный выше код выполняется, он дает следующий результат:

Updated String :-  Hello Python

Персонажи побега

Следующая таблица представляет собой список управляющих или непечатаемых символов, которые могут быть представлены с помощью обратной косой черты.

Интерпретируется escape-символ; в строках с одинарными или двойными кавычками.

Обозначение обратной косой черты Шестнадцатеричный символ Описание
\ а 0x07 Звонок или тревога
\ b 0x08 Backspace
\ cx   Ctrl-x
\ Cx   Ctrl-x
\ е 0x1b Побег
\ f 0x0c Formfeed
\ M- \ Cx   Мета-Control-x
\ п 0x0a Новая линия
\ nnn   Восьмеричная запись, где n находится в диапазоне 0,7
0x0d Возврат каретки
\ s 0x20 Космос
\ т 0x09 Вкладка
\ v 0x0b Вертикальная табуляция
\Икс   Символ x
\ xnn   Шестнадцатеричное представление, где n находится в диапазоне 0,9, af или AF.

Специальные строковые операторы

Предположим строковую переменную a содержит 'Hello' и переменную b держит Python, тогда -

Оператор Описание пример
+ Конкатенация - добавляет значения по обе стороны от оператора. a + b даст HelloPython
* Повторение - создает новые строки, объединяя несколько копий одной и той же строки. a * 2 передаст -HelloHello
[] Slice - дает символ из указанного индекса a [1] даст e
[:] Range Slice - дает символы из заданного диапазона a [1: 4] даст ell
в Членство - возвращает истину, если в данной строке существует символ. H в a даст 1
не в Членство - возвращает истину, если символ не существует в данной строке. M не в a даст 1
r / R Необработанная строка - подавляет фактическое значение escape-символов. Синтаксис необработанных строк точно такой же, как и для обычных строк, за исключением оператора необработанной строки, буквы «r», которая стоит перед кавычками. Буква «r» может быть в нижнем (r) или верхнем регистре (R) и должна быть помещена непосредственно перед первой кавычкой. print r '\ n' печатает \ n и печатает R '\ n'печатает \ n
% Формат - выполняет форматирование строки См. Следующий раздел

Оператор форматирования строки

Одна из самых крутых функций Python - оператор строкового формата%. Этот оператор уникален для строк и восполняет набор функций из семейства printf () языка C. Ниже приводится простой пример -

#!/usr/bin/python

print "My name is %s and weight is %d kg!" % ('Zara', 21)

Когда приведенный выше код выполняется, он дает следующий результат:

My name is Zara and weight is 21 kg!

Вот список полного набора символов, которые можно использовать вместе с% -

Символ формата Преобразование
% c персонаж
% s преобразование строки с помощью str () до форматирования
знаковое десятичное целое число
% d знаковое десятичное целое число
% u десятичное целое без знака
% o восьмеричное целое число
%Икс шестнадцатеричное целое число (строчные буквы)
%ИКС шестнадцатеричное целое число (заглавные буквы)
% e экспоненциальная запись (со строчной буквой "е")
% E экспоненциальная запись (с заглавными буквами 'E')
% f вещественное число с плавающей запятой
короче из% f и% e
короче из% f и% E

Другие поддерживаемые символы и функции перечислены в следующей таблице -

Условное обозначение Функциональность
* аргумент определяет ширину или точность
- левое выравнивание
+ показать знак
<sp> оставьте пробел перед положительным числом
# добавьте восьмеричный начальный ноль («0») или шестнадцатеричный начальный «0x» или «0X», в зависимости от того, использовались ли «x» или «X».
0 прокладка слева с нулями (вместо пробелов)
% '%%' оставляет вам единственный буквальный '%'
(var) переменная сопоставления (аргументы словаря)
млн m - минимальная общая ширина, а n - количество цифр, отображаемых после десятичной точки (если применимо).

Тройные цитаты

На помощь приходят тройные кавычки Python, позволяющие строкам занимать несколько строк, включая дословные NEWLINE, TAB и любые другие специальные символы.

Синтаксис тройных кавычек состоит из трех последовательных single or double цитаты.

#!/usr/bin/python

para_str = """this is a long string that is made up of
several lines and non-printable characters such as
TAB ( \t ) and they will show up that way when displayed.
NEWLINEs within the string, whether explicitly given like
this within the brackets [ \n ], or just a NEWLINE within
the variable assignment will also show up.
"""
print para_str

Когда приведенный выше код выполняется, он дает следующий результат. Обратите внимание, как каждый специальный символ был преобразован в свою печатную форму, вплоть до последней строки NEWLINE в конце строки между «вверх». и закрывающие тройные кавычки. Также обратите внимание, что NEWLINE появляются либо с явным возвратом каретки в конце строки, либо с ее escape-кодом (\ n) -

this is a long string that is made up of
several lines and non-printable characters such as
TAB (    ) and they will show up that way when displayed.
NEWLINEs within the string, whether explicitly given like
this within the brackets [
 ], or just a NEWLINE within
the variable assignment will also show up.

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

#!/usr/bin/python

print 'C:\\nowhere'

Когда приведенный выше код выполняется, он дает следующий результат:

C:\nowhere

Теперь воспользуемся сырой строкой. Мы бы выразилисьr'expression' следующим образом -

#!/usr/bin/python

print r'C:\\nowhere'

Когда приведенный выше код выполняется, он дает следующий результат:

C:\\nowhere

Строка Юникода

Обычные строки в Python хранятся внутри как 8-битный код ASCII, а строки Unicode хранятся как 16-битный Unicode. Это позволяет использовать более разнообразный набор символов, включая специальные символы из большинства языков мира. Я ограничу свою обработку строк Unicode следующим:

#!/usr/bin/python

print u'Hello, world!'

Когда приведенный выше код выполняется, он дает следующий результат:

Hello, world!

Как видите, строки Unicode используют префикс u, так же как необработанные строки используют префикс r.

Встроенные строковые методы

Python включает следующие встроенные методы для управления строками:

Sr.No. Методы с описанием
1 капитализировать ()

Делает первую букву строки заглавной

2 центр (ширина, fillchar)

Возвращает строку с пробелами, центрированную по центру исходной строки до столбцов ширины.

3 count (str, begin = 0, end = len (строка))

Подсчитывает, сколько раз str встречается в строке или в подстроке строки, если заданы начальный индекс begin и конечный конец индекса.

4 декодировать (кодировка = 'UTF-8', ошибки = 'строгий')

Декодирует строку, используя кодек, зарегистрированный для кодирования. кодировка по умолчанию - строковая кодировка по умолчанию.

5 кодировать (кодировка = 'UTF-8', errors = 'strict')

Возвращает закодированную строковую версию строки; при ошибке по умолчанию возникает ошибка ValueError, если ошибка не указана с помощью «игнорировать» или «заменить».

6 заканчивается (суффикс, начало = 0, конец = лен (строка))

Определяет, заканчивается ли строка или подстрока строки (если даны начало начального индекса и конечный конец индекса) суффиксом; возвращает true, если это так, и false в противном случае.

7 expandtabs (tabsize = 8)

Расширяет табуляции в строке до нескольких пробелов; по умолчанию 8 пробелов на вкладку, если размер табуляции не указан.

8 найти (str, begin = 0 end = len (строка))

Определите, встречается ли str в строке или в подстроке строки, если заданы начальный индекс begin и end index end, возвращает индекс, если он найден, и -1 в противном случае.

9 index (str, begin = 0, end = len (строка))

То же, что и find (), но вызывает исключение, если str не найдена.

10 isalnum ()

Возвращает true, если строка содержит хотя бы 1 символ, а все символы являются буквенно-цифровыми, и false в противном случае.

11 isalpha ()

Возвращает true, если строка содержит хотя бы 1 символ и все символы буквенные, и false в противном случае.

12 isdigit ()

Возвращает true, если строка содержит только цифры, и false в противном случае.

13 islower ()

Возвращает истину, если в строке есть хотя бы 1 символ в регистре и все символы в регистре в нижнем регистре, и ложь в противном случае.

14 isnumeric ()

Возвращает true, если строка Unicode содержит только числовые символы, и false в противном случае.

15 isspace ()

Возвращает true, если строка содержит только символы пробела, и false в противном случае.

16 istitle ()

Возвращает истину, если строка правильно "заглавная", и ложь в противном случае.

17 isupper ()

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

18 присоединиться (seq)

Объединяет (объединяет) строковые представления элементов в последовательности seq в строку с разделителем string.

19 len (строка)

Возвращает длину строки

20 ljust (ширина [, fillchar])

Возвращает строку, заполненную пробелами, при этом исходная строка выровнена по левому краю до общей ширины столбцов.

21 год нижний ()

Преобразует все прописные буквы в строке в строчные.

22 lstrip ()

Удаляет все ведущие пробелы в строке.

23 макетранс ()

Возвращает таблицу перевода, которая будет использоваться в функции перевода.

24 макс (стр)

Возвращает максимальный алфавитный символ из строки str.

25 мин (ул)

Возвращает минимальный алфавитный символ из строки str.

26 replace (old, new [, max])

Заменяет все вхождения old в строке новыми или не более чем max, если задано max.

27 rfind (str, begin = 0, end = len (строка))

То же, что и find (), но поиск по строке в обратном направлении.

28 rindex (str, begin = 0, end = len (строка))

То же, что index (), но поиск по строке в обратном направлении.

29 rjust (ширина; [, fillchar])

Возвращает строку, заполненную пробелами, при этом исходная строка выровнена по правому краю до общей ширины столбцов.

30 rstrip ()

Удаляет все завершающие пробелы в строке.

31 год split (str = "", num = string.count (str))

Разбивает строку в соответствии с разделителем str (пробел, если он не указан) и возвращает список подстрок; если задано, разделить не более чем на количество подстрок.

32 splitlines (num = string.count ('\ n'))

Разбивает строку на все (или количество) NEWLINE и возвращает список каждой строки с удаленными NEWLINE.

33 начинается с (str, begin = 0, end = len (строка))

Определяет, начинается ли строка или подстрока строки (если заданы начальный индекс begin и конечный конец индекса) с подстроки str; возвращает true, если это так, и false в противном случае.

34 полоса ([символы])

Выполняет как lstrip (), так и rstrip () для строки.

35 год swapcase ()

Инвертирует регистр всех букв в строке.

36 заглавие()

Возвращает "заглавную" версию строки, то есть все слова начинаются с верхнего регистра, а остальные - с нижнего.

37 перевести (таблица, deletechars = "")

Переводит строку в соответствии с таблицей перевода str (256 символов), удаляя символы из строки del.

38 верхний ()

Преобразует строчные буквы в строковые в прописные.

39 zfill (ширина)

Возвращает исходную строку с заполненными слева нулями до общей ширины символов; предназначенная для чисел, функция zfill () сохраняет любой заданный знак (без нуля).

40 isdecimal ()

Возвращает true, если строка Unicode содержит только десятичные символы, и false в противном случае.

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

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

Есть определенные вещи, которые можно делать со всеми типами последовательностей. Эти операции включают индексацию, нарезку, сложение, умножение и проверку членства. Кроме того, в Python есть встроенные функции для определения длины последовательности и поиска ее наибольших и наименьших элементов.

Списки Python

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

Создать список так же просто, как поместить разные значения, разделенные запятыми, в квадратные скобки. Например -

list1 = ['physics', 'chemistry', 1997, 2000];
list2 = [1, 2, 3, 4, 5 ];
list3 = ["a", "b", "c", "d"]

Как и строковые индексы, индексы списков начинаются с 0, и списки могут быть нарезаны, объединены и так далее.

Доступ к значениям в списках

Чтобы получить доступ к значениям в списках, используйте квадратные скобки для разделения вместе с индексом или индексами, чтобы получить значение, доступное по этому индексу. Например -

#!/usr/bin/python

list1 = ['physics', 'chemistry', 1997, 2000];
list2 = [1, 2, 3, 4, 5, 6, 7 ];
print "list1[0]: ", list1[0]
print "list2[1:5]: ", list2[1:5]

Когда приведенный выше код выполняется, он дает следующий результат:

list1[0]:  physics
list2[1:5]:  [2, 3, 4, 5]

Обновление списков

Вы можете обновить один или несколько элементов списков, предоставив срез в левой части оператора присваивания, и вы можете добавлять элементы в список с помощью метода append (). Например -

#!/usr/bin/python

list = ['physics', 'chemistry', 1997, 2000];
print "Value available at index 2 : "
print list[2]
list[2] = 2001;
print "New value available at index 2 : "
print list[2]

Note - метод append () обсуждается в следующем разделе.

Когда приведенный выше код выполняется, он дает следующий результат:

Value available at index 2 :
1997
New value available at index 2 :
2001

Удалить элементы списка

Чтобы удалить элемент списка, вы можете использовать оператор del, если вы точно знаете, какие элементы вы удаляете, или метод remove (), если вы не знаете. Например -

#!/usr/bin/python

list1 = ['physics', 'chemistry', 1997, 2000];
print list1
del list1[2];
print "After deleting value at index 2 : "
print list1

Когда приведенный выше код выполняется, он дает следующий результат -

['physics', 'chemistry', 1997, 2000]
After deleting value at index 2 :
['physics', 'chemistry', 2000]

Note - метод remove () обсуждается в следующем разделе.

Основные операции со списком

Списки реагируют на операторы + и * подобно строкам; они также означают конкатенацию и повторение, за исключением того, что результатом является новый список, а не строка.

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

Выражение Python Полученные результаты Описание
len ([1, 2, 3]) 3 Длина
[1, 2, 3] + [4, 5, 6] [1, 2, 3, 4, 5, 6] Конкатенация
['Привет!'] * 4 [«Привет!», «Привет!», «Привет!», «Привет!»] Повторение
3 в [1, 2, 3] Правда Членство
для x в [1, 2, 3]: выведите x, 1 2 3 Итерация

Индексирование, нарезка и матрицы

Поскольку списки представляют собой последовательности, индексация и нарезка работают для списков так же, как и для строк.

Предполагая следующий ввод -

L = ['spam', 'Spam', 'SPAM!']

Выражение Python Полученные результаты Описание
L [2] СПАМ! Смещения начинаются с нуля
L [-2] Спам Отрицательный: считайте справа
L [1:] ["Спам", "СПАМ!"] Нарезка извлекает разделы

Встроенные функции и методы списков

Python включает следующие функции списка -

Sr.No. Функция с описанием
1 cmp (список1, список2)

Сравнивает элементы обоих списков.

2 len (список)

Дает общую длину списка.

3 макс (список)

Возвращает элемент из списка с максимальным значением.

4 мин (список)

Возвращает элемент из списка с минимальным значением.

5 список (seq)

Преобразует кортеж в список.

Python включает следующие методы списка

Sr.No. Методы с описанием
1 list.append (объект)

Добавляет объект obj в список

2 list.count (объект)

Возвращает количество появлений obj в списке.

3 list.extend (seq)

Добавляет содержимое seq в список

4 list.index (объект)

Возвращает самый низкий индекс в списке, который появляется obj.

5 list.insert (индекс, объект)

Вставляет объект obj в список по индексу смещения

6 list.pop (obj = список [-1])

Удаляет и возвращает последний объект или объект из списка

7 list.remove (объект)

Удаляет объект obj из списка

8 list.reverse ()

Переворачивает объекты списка на место

9 list.sort ([функция])

Сортирует объекты списка, используйте функцию сравнения, если задана

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

Создать кортеж так же просто, как ввести разные значения, разделенные запятыми. При желании вы также можете поместить эти значения, разделенные запятыми, в круглые скобки. Например -

tup1 = ('physics', 'chemistry', 1997, 2000);
tup2 = (1, 2, 3, 4, 5 );
tup3 = "a", "b", "c", "d";

Пустой кортеж записывается в виде двух скобок, ничего не содержащих:

tup1 = ();

Чтобы записать кортеж, содержащий одно значение, вы должны включить запятую, даже если есть только одно значение -

tup1 = (50,);

Как и строковые индексы, индексы кортежей начинаются с 0, и их можно разрезать, объединять и т. Д.

Доступ к значениям в кортежах

Чтобы получить доступ к значениям в кортеже, используйте квадратные скобки для сечения вместе с индексом или индексами, чтобы получить значение, доступное по этому индексу. Например -

#!/usr/bin/python

tup1 = ('physics', 'chemistry', 1997, 2000);
tup2 = (1, 2, 3, 4, 5, 6, 7 );
print "tup1[0]: ", tup1[0];
print "tup2[1:5]: ", tup2[1:5];

Когда приведенный выше код выполняется, он дает следующий результат:

tup1[0]:  physics
tup2[1:5]:  [2, 3, 4, 5]

Обновление кортежей

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

#!/usr/bin/python

tup1 = (12, 34.56);
tup2 = ('abc', 'xyz');

# Following action is not valid for tuples
# tup1[0] = 100;

# So let's create a new tuple as follows
tup3 = tup1 + tup2;
print tup3;

Когда приведенный выше код выполняется, он дает следующий результат:

(12, 34.56, 'abc', 'xyz')

Удалить элементы кортежа

Удаление отдельных элементов кортежа невозможно. Конечно, нет ничего плохого в том, чтобы собрать еще один кортеж с отброшенными нежелательными элементами.

Чтобы явно удалить весь кортеж, просто используйте delзаявление. Например -

#!/usr/bin/python

tup = ('physics', 'chemistry', 1997, 2000);
print tup;
del tup;
print "After deleting tup : ";
print tup;

Это дает следующий результат. Обратите внимание на возникшее исключение, потому что послеdel tup кортеж больше не существует -

('physics', 'chemistry', 1997, 2000)
After deleting tup :
Traceback (most recent call last):
   File "test.py", line 9, in <module>
      print tup;
NameError: name 'tup' is not defined

Основные операции с кортежами

Кортежи реагируют на операторы + и * подобно строкам; они также означают конкатенацию и повторение, за исключением того, что результатом является новый кортеж, а не строка.

Фактически, кортежи реагируют на все общие операции с последовательностью, которые мы использовали для строк в предыдущей главе -

Выражение Python Полученные результаты Описание
len ((1, 2, 3)) 3 Длина
(1, 2, 3) + (4, 5, 6) (1, 2, 3, 4, 5, 6) Конкатенация
('Привет!',) * 4 («Привет!», «Привет!», «Привет!», «Привет!») Повторение
3 в (1, 2, 3) Правда Членство
для x в (1, 2, 3): выведите x, 1 2 3 Итерация

Индексирование, нарезка и матрицы

Поскольку кортежи представляют собой последовательности, индексация и нарезка работают для кортежей так же, как и для строк. Предполагая следующий ввод -

L = ('spam', 'Spam', 'SPAM!')

 

Выражение Python Полученные результаты Описание
L [2] 'СПАМ!' Смещения начинаются с нуля
L [-2] 'Спам' Отрицательный: считайте справа
L [1:] ["Спам", "СПАМ!"] Нарезка извлекает разделы

Без ограничивающих рамок

Любой набор из нескольких объектов, разделенных запятыми, записанных без идентифицирующих символов, т. Е. Скобки для списков, скобки для кортежей и т. Д., По умолчанию используются для кортежей, как указано в этих коротких примерах.

#!/usr/bin/python

print 'abc', -4.24e93, 18+6.6j, 'xyz';
x, y = 1, 2;
print "Value of x , y : ", x,y;

Когда приведенный выше код выполняется, он дает следующий результат:

abc -4.24e+93 (18+6.6j) xyz
Value of x , y : 1 2

Встроенные функции кортежей

Python включает следующие функции кортежей -

Sr.No. Функция с описанием
1 cmp (кортеж1, кортеж2)

Сравнивает элементы обоих кортежей.

2 len (кортеж)

Выдает общую длину кортежа.

3 макс (кортеж)

Возвращает элемент из кортежа с максимальным значением.

4 min (кортеж)

Возвращает элемент из кортежа с минимальным значением.

5 кортеж (последовательность)

Преобразует список в кортеж.

Каждый ключ отделяется от своего значения двоеточием (:), элементы разделяются запятыми, и все это заключено в фигурные скобки. Пустой словарь без каких-либо элементов записывается с помощью двух фигурных скобок, например: {}.

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

Доступ к значениям в словаре

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

#!/usr/bin/python

dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}
print "dict['Name']: ", dict['Name']
print "dict['Age']: ", dict['Age']

Когда приведенный выше код выполняется, он дает следующий результат:

dict['Name']:  Zara
dict['Age']:  7

Если мы попытаемся получить доступ к элементу данных с помощью ключа, который не является частью словаря, мы получим следующую ошибку:

#!/usr/bin/python

dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}
print "dict['Alice']: ", dict['Alice']

Когда приведенный выше код выполняется, он дает следующий результат:

dict['Alice']:
Traceback (most recent call last):
   File "test.py", line 4, in <module>
      print "dict['Alice']: ", dict['Alice'];
KeyError: 'Alice'

Обновление словаря

Вы можете обновить словарь, добавив новую запись или пару ключ-значение, изменив существующую запись или удалив существующую, как показано ниже в простом примере:

#!/usr/bin/python

dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}
dict['Age'] = 8; # update existing entry
dict['School'] = "DPS School"; # Add new entry

print "dict['Age']: ", dict['Age']
print "dict['School']: ", dict['School']

Когда приведенный выше код выполняется, он дает следующий результат:

dict['Age']:  8
dict['School']:  DPS School

Удалить элементы словаря

Вы можете удалить отдельные элементы словаря или очистить все содержимое словаря. Вы также можете удалить весь словарь за одну операцию.

Чтобы явно удалить весь словарь, просто используйте delзаявление. Ниже приводится простой пример -

#!/usr/bin/python

dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}
del dict['Name']; # remove entry with key 'Name'
dict.clear();     # remove all entries in dict
del dict ;        # delete entire dictionary

print "dict['Age']: ", dict['Age']
print "dict['School']: ", dict['School']

Это дает следующий результат. Обратите внимание, что возникает исключение, потому что послеdel dict словаря больше не существует -

dict['Age']:
Traceback (most recent call last):
   File "test.py", line 8, in <module>
      print "dict['Age']: ", dict['Age'];
TypeError: 'type' object is unsubscriptable

Note - метод del () обсуждается в следующем разделе.

Свойства ключей словаря

Словарные значения не имеют ограничений. Это может быть любой произвольный объект Python, либо стандартные объекты, либо объекты, определенные пользователем. Однако это не относится к ключам.

О ключах словаря следует помнить два важных момента:

(a)Не допускается более одной записи на ключ. Это означает, что дублирование ключа не допускается. Когда дублирующиеся ключи встречаются во время назначения, побеждает последнее назначение. Например -

#!/usr/bin/python

dict = {'Name': 'Zara', 'Age': 7, 'Name': 'Manni'}
print "dict['Name']: ", dict['Name']

Когда приведенный выше код выполняется, он дает следующий результат:

dict['Name']:  Manni

(b)Ключи должны быть неизменными. Это означает, что вы можете использовать строки, числа или кортежи в качестве ключей словаря, но что-то вроде ['key'] недопустимо. Ниже приводится простой пример -

#!/usr/bin/python

dict = {['Name']: 'Zara', 'Age': 7}
print "dict['Name']: ", dict['Name']

Когда приведенный выше код выполняется, он дает следующий результат:

Traceback (most recent call last):
   File "test.py", line 3, in <module>
      dict = {['Name']: 'Zara', 'Age': 7};
TypeError: unhashable type: 'list'

Функции и методы встроенного словаря

Python включает в себя следующие словарные функции -

Sr.No. Функция с описанием
1 cmp (dict1, dict2)

Сравнивает элементы обоих dict.

2 len (дикт)

Дает общую длину словаря. Это будет равно количеству элементов в словаре.

3 str (дикт)

Производит печатное строковое представление словаря

4 тип (переменная)

Возвращает тип переданной переменной. Если переданной переменной является словарь, она вернет тип словаря.

Python включает следующие словарные методы -

Sr.No. Методы с описанием
1 dict.clear ()

Удаляет все элементы словаря dict

2 dict.copy ()

Возвращает мелкую копию словаря dict

3 dict.fromkeys ()

Создайте новый словарь с ключами из seq и значениями, установленными в значение .

4 dict.get (ключ, по умолчанию = Нет)

Для ключевого ключа возвращает значение или значение по умолчанию, если ключ не в словаре

5 dict.has_key (ключ)

Возвращает true, если ключ в словаре dict , иначе false.

6 dict.items ()

Возвращает список пар кортежей dict (ключ, значение)

7 dict.keys ()

Возвращает список ключей словаря dict

8 dict.setdefault (ключ, по умолчанию = Нет)

Аналогично get (), но установит dict [key] = default, если ключ еще не находится в dict

9 dict.update (dict2)

Добавляет пары "ключ-значение" словаря dict2 в dict

10 dict.values ​​()

Возвращает список словаря Dict значений «s

Программа Python может обрабатывать дату и время несколькими способами. Преобразование между форматами даты - обычная рутинная работа для компьютеров. Модули времени и календаря Python помогают отслеживать дату и время.

Что такое клещ?

Временные интервалы представляют собой числа с плавающей запятой в секундах. Определенные моменты времени выражаются в секундах с 00:00:00 1 января 1970 г. (эпоха).

Есть популярный timeмодуль, доступный в Python, который предоставляет функции для работы со временем и для преобразования между представлениями. Функция time.time () возвращает текущее системное время в тиках с 00:00:00 1 января 1970 г. (эпоха).

пример

#!/usr/bin/python
import time;  # This is required to include time module.

ticks = time.time()
print "Number of ticks since 12:00am, January 1, 1970:", ticks

Это приведет к следующему результату:

Number of ticks since 12:00am, January 1, 1970: 7186862.73399

Арифметику даты легко выполнять с помощью тиков. Однако даты до эпохи не могут быть представлены в таком виде. Даты далекого будущего также нельзя представить таким образом - точка отсечки для UNIX и Windows наступит где-то в 2038 году.

Что такое TimeTuple?

Многие функции времени Python обрабатывают время как набор из 9 чисел, как показано ниже -

Индекс Поле Значения
0 4-значный год 2008 г.
1 Месяц От 1 до 12
2 День От 1 до 31
3 Час От 0 до 23
4 Минуты От 0 до 59
5 Второй От 0 до 61 (60 или 61 високосная секунда)
6 День недели От 0 до 6 (0 - понедельник)
7 День года От 1 до 366 (юлианский день)
8 Дневного сбережения -1, 0, 1, -1 означает, что библиотека определяет DST

Приведенный выше кортеж эквивалентен struct_timeструктура. Эта структура имеет следующие атрибуты -

Индекс Атрибуты Значения
0 tm_year 2008 г.
1 tm_mon От 1 до 12
2 tm_mday От 1 до 31
3 tm_hour От 0 до 23
4 tm_min От 0 до 59
5 tm_sec От 0 до 61 (60 или 61 високосная секунда)
6 tm_wday От 0 до 6 (0 - понедельник)
7 tm_yday От 1 до 366 (юлианский день)
8 tm_isdst -1, 0, 1, -1 означает, что библиотека определяет DST

Получение текущего времени

Чтобы преобразовать момент времени из секунд, прошедших с момента значения эпохи с плавающей запятой, в кортеж времени, передайте значение с плавающей запятой в функцию (например, localtime), которая возвращает кортеж времени со всеми девятью действительными элементами.

#!/usr/bin/python
import time;

localtime = time.localtime(time.time())
print "Local current time :", localtime

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

Local current time : time.struct_time(tm_year=2013, tm_mon=7, 
tm_mday=17, tm_hour=21, tm_min=26, tm_sec=3, tm_wday=2, tm_yday=198, tm_isdst=0)

Получение форматированного времени

Вы можете отформатировать любое время в соответствии с вашими требованиями, но простой способ получить время в читаемом формате - это asctime () -

#!/usr/bin/python
import time;

localtime = time.asctime( time.localtime(time.time()) )
print "Local current time :", localtime

Это даст следующий результат -

Local current time : Tue Jan 13 10:17:09 2009

Получение календаря на месяц

Модуль календаря предоставляет широкий спектр методов для работы с годовыми и ежемесячными календарями. Здесь мы печатаем календарь на данный месяц (январь 2008 г.) -

#!/usr/bin/python
import calendar

cal = calendar.month(2008, 1)
print "Here is the calendar:"
print cal

Это даст следующий результат -

Here is the calendar:
   January 2008
Mo Tu We Th Fr Sa Su
    1  2  3  4  5  6
 7  8  9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

Времени Модуль

Есть популярный timeмодуль, доступный в Python, который предоставляет функции для работы со временем и для преобразования между представлениями. Вот список всех доступных методов -

Sr.No. Функция с описанием
1 time.altzone

Смещение местного часового пояса DST в секундах к западу от UTC, если таковой определен. Это отрицательно, если местный часовой пояс DST находится к востоку от UTC (как в Западной Европе, включая Великобританию). Используйте это, только если дневной свет отличен от нуля.

2 time.asctime ([время кортежа])

Принимает кортеж времени и возвращает читаемую 24-символьную строку, например «Tue Dec 11 18:07:14 2008».

3 time.clock ()

Возвращает текущее время процессора в секундах с плавающей запятой. Для измерения вычислительных затрат различных подходов значение time.clock более полезно, чем значение time.time ().

4 time.ctime ([секунды])

Как asctime (localtime (secs)) и без аргументов как asctime ()

5 time.gmtime ([секунды])

Принимает момент, выраженный в секундах с начала эпохи, и возвращает временную последовательность t со временем в формате UTC. Примечание: t.tm_isdst всегда 0

6 time.localtime ([секунды])

Принимает момент, выраженный в секундах, начиная с эпохи, и возвращает кортеж времени t с местным временем (t.tm_isdst равен 0 или 1, в зависимости от того, применяется ли летнее время к мгновенным секундам по местным правилам).

7 time.mktime (время кортежа)

Принимает момент, выраженный как кортеж по местному времени, и возвращает значение с плавающей запятой с моментом, выраженным в секундах, начиная с эпохи.

8 time.sleep (сек)

Приостанавливает вызывающий поток на несколько секунд.

9 time.strftime (fmt [, время кортежа])

Принимает момент, выраженный как кортеж времени по местному времени, и возвращает строку, представляющую момент, как указано в строке fmt.

10 time.strptime (str, fmt = '% a% b% d% H:% M:% S% Y')

Анализирует str в соответствии со строкой формата fmt и возвращает момент времени в формате кортежа времени.

11 time.time ()

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

12 time.tzset ()

Сбрасывает правила преобразования времени, используемые библиотечными подпрограммами. Переменная среды TZ указывает, как это делается.

Давайте кратко рассмотрим функции -

В модуле времени доступны следующие два важных атрибута:

Sr.No. Атрибут с описанием
1

time.timezone

Атрибут time.timezone - это смещение в секундах местного часового пояса (без летнего времени) от UTC (> 0 в Северной и Южной Америке; <= 0 в большинстве стран Европы, Азии и Африки).

2

time.tzname

Атрибут time.tzname - это пара строк, зависящих от локали, которые представляют собой названия местного часового пояса без летнего времени и с летним временем соответственно.

Календарь Модуль

Модуль календаря предоставляет функции, связанные с календарем, в том числе функции для печати текстового календаря на определенный месяц или год.

По умолчанию в календаре понедельник является первым днем ​​недели, а воскресенье - последним. Чтобы изменить это, вызовите функцию calendar.setfirstweekday ().

Вот список функций, доступных с модулем календаря -

Sr.No. Функция с описанием
1

calendar.calendar(year,w=2,l=1,c=6)

Возвращает многострочную строку с календарем на год, отформатированную в три столбца, разделенных пробелами c. w - ширина в символах каждой даты; каждая строка имеет длину 21 * w + 18 + 2 * c. l - количество строк на каждую неделю.

2

calendar.firstweekday( )

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

3

calendar.isleap(year)

Возвращает True, если год високосный; в противном случае - False.

4

calendar.leapdays(y1,y2)

Возвращает общее количество високосных дней в годах в диапазоне (y1, y2).

5

calendar.month(year,month,w=2,l=1)

Возвращает многострочную строку с календарем на месяц месяц год год, одну строку в неделю плюс две строки заголовка. w - ширина в символах каждой даты; каждая строка имеет длину 7 * w + 6. l - количество строк на каждую неделю.

6

calendar.monthcalendar(year,month)

Возвращает список списков целых чисел. Каждый подсписок обозначает неделю. Дни вне месяца месяц года года устанавливаются на 0; Дни в месяце устанавливаются на свое число месяца, 1 и выше.

7

calendar.monthrange(year,month)

Возвращает два целых числа. Первый - это код дня недели для первого числа месяца в году года; второй - количество дней в месяце. Коды дня недели от 0 (понедельник) до 6 (воскресенье); номера месяцев от 1 до 12.

8

calendar.prcal(year,w=2,l=1,c=6)

Как print calendar.calendar (год, ш, л, в).

9

calendar.prmonth(year,month,w=2,l=1)

Как print calendar.month (год, месяц, w, l).

10

calendar.setfirstweekday(weekday)

Устанавливает первый день каждой недели как рабочий день с кодом дня недели. Коды дней недели от 0 (понедельник) до 6 (воскресенье).

11

calendar.timegm(tupletime)

Обратное к time.gmtime: принимает момент времени в форме кортежа времени и возвращает тот же момент, что и число секунд с плавающей запятой с начала эпохи.

12

calendar.weekday(year,month,day)

Возвращает код дня недели для указанной даты. Коды дня недели от 0 (понедельник) до 6 (воскресенье); номера месяцев от 1 (январь) до 12 (декабрь).

Другие модули и функции

Если вам интересно, то здесь вы найдете список других важных модулей и функций для игры с датой и временем в Python -

  • Даты и времени модуля

  • Pytz Модуль

  • Dateutil Модуль

Функция - это блок организованного многократно используемого кода, который используется для выполнения одного связанного действия. Функции обеспечивают лучшую модульность вашего приложения и высокую степень повторного использования кода.

Как вы уже знаете, Python предоставляет множество встроенных функций, таких как print () и т. Д., Но вы также можете создавать свои собственные функции. Эти функции называются пользовательскими функциями.

Определение функции

Вы можете определять функции для обеспечения необходимой функциональности. Вот простые правила для определения функции в Python.

  • Функциональные блоки начинаются с ключевого слова def за которым следует имя функции и круглые скобки (()).

  • Все входные параметры или аргументы должны быть заключены в эти круглые скобки. Вы также можете определить параметры внутри этих скобок.

  • Первое утверждение функции может быть необязательное заявление - документация строка функции или строки документации .

  • Блок кода внутри каждой функции начинается с двоеточия (:) и имеет отступ.

  • Оператор return [выражение] завершает функцию, опционально передавая выражение вызывающей стороне. Оператор return без аргументов аналогичен return None.

Синтаксис

def functionname( parameters ):
   "function_docstring"
   function_suite
   return [expression]

По умолчанию параметры имеют позиционное поведение, и вам нужно сообщить им в том же порядке, в котором они были определены.

пример

Следующая функция принимает строку в качестве входного параметра и выводит ее на стандартный экран.

def printme( str ):
   "This prints a passed string into this function"
   print str
   return

Вызов функции

Определение функции дает ей только имя, определяет параметры, которые должны быть включены в функцию, и структурирует блоки кода.

После того, как базовая структура функции завершена, вы можете выполнить ее, вызвав ее из другой функции или непосредственно из командной строки Python. Ниже приведен пример вызова функции printme () -

#!/usr/bin/python

# Function definition is here
def printme( str ):
   "This prints a passed string into this function"
   print str
   return;

# Now you can call printme function
printme("I'm first call to user defined function!")
printme("Again second call to the same function")

Когда приведенный выше код выполняется, он дает следующий результат:

I'm first call to user defined function!
Again second call to the same function

Передавать по ссылке против значения

Все параметры (аргументы) на языке Python передаются по ссылке. Это означает, что если вы изменяете то, на что ссылается параметр в функции, это изменение также отражается в вызывающей функции. Например -

#!/usr/bin/python

# Function definition is here
def changeme( mylist ):
   "This changes a passed list into this function"
   mylist.append([1,2,3,4]);
   print "Values inside the function: ", mylist
   return

# Now you can call changeme function
mylist = [10,20,30];
changeme( mylist );
print "Values outside the function: ", mylist

Здесь мы поддерживаем ссылку на переданный объект и добавляем значения в один и тот же объект. Итак, это даст следующий результат -

Values inside the function:  [10, 20, 30, [1, 2, 3, 4]]
Values outside the function:  [10, 20, 30, [1, 2, 3, 4]]

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

#!/usr/bin/python

# Function definition is here
def changeme( mylist ):
   "This changes a passed list into this function"
   mylist = [1,2,3,4]; # This would assig new reference in mylist
   print "Values inside the function: ", mylist
   return

# Now you can call changeme function
mylist = [10,20,30];
changeme( mylist );
print "Values outside the function: ", mylist

Параметр mylist является локальным для функции changeme. Изменение mylist внутри функции не влияет на mylist . Функция ничего не делает, и, наконец, это приведет к следующему результату:

Values inside the function:  [1, 2, 3, 4]
Values outside the function:  [10, 20, 30]

Аргументы функции

Вы можете вызвать функцию, используя следующие типы формальных аргументов:

  • Обязательные аргументы
  • Аргументы ключевого слова
  • Аргументы по умолчанию
  • Аргументы переменной длины

Обязательные аргументы

Обязательные аргументы - это аргументы, переданные функции в правильном позиционном порядке. Здесь количество аргументов в вызове функции должно точно совпадать с определением функции.

Чтобы вызвать функцию printme () , вам обязательно нужно передать один аргумент, иначе это даст следующую синтаксическую ошибку:

#!/usr/bin/python

# Function definition is here
def printme( str ):
   "This prints a passed string into this function"
   print str
   return;

# Now you can call printme function
printme()

Когда приведенный выше код выполняется, он дает следующий результат:

Traceback (most recent call last):
   File "test.py", line 11, in <module>
      printme();
TypeError: printme() takes exactly 1 argument (0 given)

Аргументы ключевого слова

Аргументы ключевых слов связаны с вызовами функций. Когда вы используете аргументы ключевого слова в вызове функции, вызывающая сторона идентифицирует аргументы по имени параметра.

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

#!/usr/bin/python

# Function definition is here
def printme( str ):
   "This prints a passed string into this function"
   print str
   return;

# Now you can call printme function
printme( str = "My string")

Когда приведенный выше код выполняется, он дает следующий результат:

My string

Следующий пример дает более четкую картину. Обратите внимание, что порядок параметров не имеет значения.

#!/usr/bin/python

# Function definition is here
def printinfo( name, age ):
   "This prints a passed info into this function"
   print "Name: ", name
   print "Age ", age
   return;

# Now you can call printinfo function
printinfo( age=50, name="miki" )

Когда приведенный выше код выполняется, он дает следующий результат:

Name:  miki
Age  50

Аргументы по умолчанию

Аргумент по умолчанию - это аргумент, который принимает значение по умолчанию, если значение не указано в вызове функции для этого аргумента. Следующий пример дает представление об аргументах по умолчанию, он печатает возраст по умолчанию, если он не передан -

#!/usr/bin/python

# Function definition is here
def printinfo( name, age = 35 ):
   "This prints a passed info into this function"
   print "Name: ", name
   print "Age ", age
   return;

# Now you can call printinfo function
printinfo( age=50, name="miki" )
printinfo( name="miki" )

Когда приведенный выше код выполняется, он дает следующий результат:

Name:  miki
Age  50
Name:  miki
Age  35

Аргументы переменной длины

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

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

def functionname([formal_args,] *var_args_tuple ):
   "function_docstring"
   function_suite
   return [expression]

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

#!/usr/bin/python

# Function definition is here
def printinfo( arg1, *vartuple ):
   "This prints a variable passed arguments"
   print "Output is: "
   print arg1
   for var in vartuple:
      print var
   return;

# Now you can call printinfo function
printinfo( 10 )
printinfo( 70, 60, 50 )

Когда приведенный выше код выполняется, он дает следующий результат:

Output is:
10
Output is:
70
60
50

В Анонимные функции

Эти функции называются анонимными, потому что они не объявляются стандартным образом с помощью ключевого слова def . Вы можете использовать ключевое слово lambda для создания небольших анонимных функций.

  • Лямбда-формы могут принимать любое количество аргументов, но возвращать только одно значение в форме выражения. Они не могут содержать команды или несколько выражений.

  • Анонимная функция не может быть прямым вызовом print, потому что лямбда требует выражения

  • Лямбда-функции имеют собственное локальное пространство имен и не могут обращаться к переменным, отличным от тех, что указаны в их списке параметров и в глобальном пространстве имен.

  • Хотя кажется, что лямбда-выражения являются однострочной версией функции, они не эквивалентны встроенным операторам в C или C ++, цель которых заключается в передаче распределения стека функций во время вызова по соображениям производительности.

Синтаксис

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

lambda [arg1 [,arg2,.....argn]]:expression

Ниже приведен пример, показывающий, как работает лямбда- форма функции.

#!/usr/bin/python

# Function definition is here
sum = lambda arg1, arg2: arg1 + arg2;

# Now you can call sum as a function
print "Value of total : ", sum( 10, 20 )
print "Value of total : ", sum( 20, 20 )

Когда приведенный выше код выполняется, он дает следующий результат:

Value of total :  30
Value of total :  40

Возвращение Заявление

Оператор return [выражение] завершает функцию, опционально передавая выражение вызывающей стороне. Оператор return без аргументов аналогичен return None.

Все приведенные выше примеры не возвращают никакого значения. Вы можете вернуть значение из функции следующим образом:

#!/usr/bin/python

# Function definition is here
def sum( arg1, arg2 ):
   # Add both the parameters and return them."
   total = arg1 + arg2
   print "Inside the function : ", total
   return total;

# Now you can call sum function
total = sum( 10, 20 );
print "Outside the function : ", total

Когда приведенный выше код выполняется, он дает следующий результат:

Inside the function :  30
Outside the function :  30

Объем переменных

Все переменные в программе могут быть доступны не во всех местах этой программы. Это зависит от того, где вы объявили переменную.

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

  • Глобальные переменные
  • Локальные переменные

Глобальные и локальные переменные

Переменные, которые определены внутри тела функции, имеют локальную область видимости, а те, которые определены вне ее, имеют глобальную область.

Это означает, что к локальным переменным можно получить доступ только внутри функции, в которой они объявлены, тогда как к глобальным переменным можно обращаться по всему телу программы для всех функций. Когда вы вызываете функцию, переменные, объявленные внутри нее, попадают в область видимости. Ниже приводится простой пример -

#!/usr/bin/python

total = 0; # This is global variable.
# Function definition is here
def sum( arg1, arg2 ):
   # Add both the parameters and return them."
   total = arg1 + arg2; # Here total is local variable.
   print "Inside the function local total : ", total
   return total;

# Now you can call sum function
sum( 10, 20 );
print "Outside the function global total : ", total

Когда приведенный выше код выполняется, он дает следующий результат:

Inside the function local total :  30
Outside the function global total :  0

Модуль позволяет вам логически организовать ваш код Python. Группирование связанного кода в модуль упрощает понимание и использование кода. Модуль - это объект Python с произвольно названными атрибутами, которые можно связывать и ссылаться.

Проще говоря, модуль - это файл, состоящий из кода Python. Модуль может определять функции, классы и переменные. Модуль также может включать исполняемый код.

пример

Код Python для модуля с именем aname обычно находится в файле с именем aname.py . Вот пример простого модуля support.py

def print_func( par ):
   print "Hello : ", par
   return

Импорт Заявление

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

import module1[, module2[,... moduleN]

Когда интерпретатор встречает оператор импорта, он импортирует модуль, если модуль присутствует в пути поиска. Путь поиска - это список каталогов, которые интерпретатор ищет перед импортом модуля. Например, чтобы импортировать модуль support.py, вам нужно поместить следующую команду вверху скрипта -

#!/usr/bin/python

# Import module support
import support

# Now you can call defined function that module as follows
support.print_func("Zara")

Когда приведенный выше код выполняется, он дает следующий результат:

Hello : Zara

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

От ... импорта Заявление

Оператор Python from позволяет импортировать определенные атрибуты из модуля в текущее пространство имен. Из ... импорт имеет следующий синтаксис -

from modname import name1[, name2[, ... nameN]]

Например, чтобы импортировать функцию fibonacci из модуля fib, используйте следующий оператор -

from fib import fibonacci

Этот оператор не импортирует весь модуль fib в текущее пространство имен; он просто вводит элемент fibonacci из модуля fib в глобальную таблицу символов импортирующего модуля.

От ... импорт * Заявление

Также можно импортировать все имена из модуля в текущее пространство имен, используя следующий оператор импорта -

from modname import *

Это обеспечивает простой способ импортировать все элементы из модуля в текущее пространство имен; однако это утверждение следует использовать с осторожностью.

Расположение модулей

Когда вы импортируете модуль, интерпретатор Python ищет модуль в следующих последовательностях:

  • Текущий каталог.

  • Если модуль не найден, Python ищет каждый каталог в переменной оболочки PYTHONPATH.

  • Если ничего не помогает, Python проверяет путь по умолчанию. В UNIX этот путь по умолчанию обычно / usr / local / lib / python /.

Путь поиска модуля хранится в системном модуле sys как sys.pathпеременная. Переменная sys.path содержит текущий каталог PYTHONPATH и значение по умолчанию, зависящее от установки.

PYTHONPATH Variable

PYTHONPATH - это переменная среды, состоящая из списка каталогов. Синтаксис PYTHONPATH такой же, как и у переменной оболочки PATH.

Вот типичный PYTHONPATH из системы Windows -

set PYTHONPATH = c:\python20\lib;

А вот типичный PYTHONPATH из системы UNIX -

set PYTHONPATH = /usr/local/lib/python

Пространства имен и область видимости

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

Оператор Python может обращаться к переменным в локальном пространстве имен и в глобальном пространстве имен . Если локальная и глобальная переменные имеют одинаковое имя, локальная переменная затеняет глобальную переменную.

Каждая функция имеет собственное локальное пространство имен. Методы класса следуют тому же правилу области видимости, что и обычные функции.

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

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

Оператор global VarName сообщает Python, что VarName является глобальной переменной. Python прекращает поиск переменной в локальном пространстве имен.

Например, мы определяем переменную Money в глобальном пространстве имен. Внутри функции Money мы присваиваем Money значение, поэтому Python принимает Money как локальную переменную. Однако мы получили доступ к значению локальной переменной Money перед ее установкой, поэтому результатом является UnboundLocalError. Раскомментирование глобального оператора устраняет проблему.

#!/usr/bin/python

Money = 2000
def AddMoney():
   # Uncomment the following line to fix the code:
   # global Money
   Money = Money + 1

print Money
AddMoney()
print Money

Функция dir ()

Встроенная функция dir () возвращает отсортированный список строк, содержащих имена, определенные модулем.

Список содержит имена всех модулей, переменных и функций, определенных в модуле. Ниже приводится простой пример -

#!/usr/bin/python

# Import built-in module math
import math

content = dir(math)
print content

Когда приведенный выше код выполняется, он дает следующий результат:

['__doc__', '__file__', '__name__', 'acos', 'asin', 'atan', 
'atan2', 'ceil', 'cos', 'cosh', 'degrees', 'e', 'exp', 
'fabs', 'floor', 'fmod', 'frexp', 'hypot', 'ldexp', 'log',
'log10', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 
'sqrt', 'tan', 'tanh']

Здесь специальная строковая переменная __name__ - это имя модуля, а __file__ - имя файла, из которого был загружен модуль.

В Глобал () и местные () функции

Функции globals () и locals () могут использоваться для возврата имен в глобальном и локальном пространствах имен в зависимости от места, откуда они вызываются.

Если locals () вызывается из функции, она вернет все имена, к которым можно получить доступ локально из этой функции.

Если globals () вызывается из функции, она вернет все имена, к которым можно получить глобальный доступ из этой функции.

Тип возврата обеих этих функций - словарь. Следовательно, имена можно извлекать с помощью функции keys ().

Перезарядка () Функция

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

Поэтому, если вы хотите повторно выполнить код верхнего уровня в модуле, вы можете использовать функцию reload () . Функция reload () снова импортирует ранее импортированный модуль. Синтаксис функции reload () таков:

reload(module_name)

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

reload(hello)

Пакеты на Python

Пакет - это иерархическая структура каталогов файлов, которая определяет единую среду приложения Python, состоящую из модулей, подпакетов, подпакетов и т. Д.

Рассмотрим файл Pots.py, доступный в каталоге телефона . Этот файл имеет следующую строку исходного кода -

#!/usr/bin/python

def Pots():
   print "I'm Pots Phone"

Аналогичным образом у нас есть еще два файла с разными функциями с тем же именем, что и выше -

  • Файл Phone / Isdn.py с функцией Isdn ()

  • Файл Phone / G3.py с функцией G3 ()

Теперь создайте еще один файл __init__.py в каталоге телефона -

  • Phone/__init__.py

Чтобы сделать все ваши функции доступными при импортировании Phone, вам необходимо поместить явные операторы импорта в __init__.py следующим образом:

from Pots import Pots
from Isdn import Isdn
from G3 import G3

После добавления этих строк в __init__.py все эти классы будут доступны при импорте пакета Phone.

#!/usr/bin/python

# Now import your Phone Package.
import Phone

Phone.Pots()
Phone.Isdn()
Phone.G3()

Когда приведенный выше код выполняется, он дает следующий результат:

I'm Pots Phone
I'm 3G Phone
I'm ISDN Phone

В приведенном выше примере мы взяли пример одной функции в каждом файле, но вы можете сохранить несколько функций в своих файлах. Вы также можете определять различные классы Python в этих файлах, а затем создавать свои пакеты из этих классов.

В этой главе рассматриваются все основные функции ввода-вывода, доступные в Python. Дополнительные функции см. В стандартной документации Python.

Печать на экран

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

#!/usr/bin/python

print "Python is really a great language,", "isn't it?"

Это дает следующий результат на вашем стандартном экране -

Python is really a great language, isn't it?

Чтение ввода с клавиатуры

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

  • raw_input
  • input

Raw_input Функция

Функция raw_input ([prompt]) считывает одну строку из стандартного ввода и возвращает ее в виде строки (удаляя завершающую новую строку).

#!/usr/bin/python

str = raw_input("Enter your input: ")
print "Received input is : ", str

Вам будет предложено ввести любую строку, и она отобразит ту же строку на экране. Когда я набрал «Hello Python!», Его результат был таким:

Enter your input: Hello Python
Received input is :  Hello Python

Вход функции

Функция input ([prompt]) эквивалентна raw_input, за исключением того, что она предполагает, что ввод является допустимым выражением Python, и возвращает вам результат оценки.

#!/usr/bin/python

str = input("Enter your input: ")
print "Received input is : ", str

Это приведет к следующему результату для введенного ввода -

Enter your input: [x*5 for x in range(2,10,2)]
Recieved input is :  [10, 20, 30, 40]

Открытие и закрытие файлов

До сих пор вы читали и записывали в стандартный ввод и вывод. Теперь мы увидим, как использовать фактические файлы данных.

Python предоставляет базовые функции и методы, необходимые для управления файлами по умолчанию. Вы можете выполнять большую часть операций с файлами, используяfile объект.

Открытая функция

Прежде чем вы сможете читать или записывать файл, вы должны открыть его с помощью встроенной функции Python open () . Эта функция создаетfile объект, который будет использоваться для вызова других связанных с ним методов поддержки.

Синтаксис

file object = open(file_name [, access_mode][, buffering])

Вот подробности о параметрах -

  • file_name - Аргумент имя_файла - это строковое значение, содержащее имя файла, к которому вы хотите получить доступ.

  • access_mode- Access_mode определяет режим, в котором файл должен быть открыт, то есть чтение, запись, добавление и т. Д. Полный список возможных значений приведен ниже в таблице. Это необязательный параметр, и режим доступа к файлу по умолчанию - чтение (r).

  • buffering- Если значение буферизации установлено на 0, буферизация не выполняется. Если значение буферизации равно 1, буферизация строки выполняется при доступе к файлу. Если вы задаете значение буферизации как целое число больше 1, то действие буферизации выполняется с указанным размером буфера. Если отрицательный, размер буфера является системным по умолчанию (поведение по умолчанию).

Вот список различных режимов открытия файла -

Sr.No. Режимы и описание
1

r

Открывает файл только для чтения. Указатель файла помещается в начало файла. Это режим "по умолчанию".

2

rb

Открывает файл для чтения только в двоичном формате. Указатель файла помещается в начало файла. Это режим "по умолчанию".

3

r+

Открывает файл для чтения и записи. Указатель файла помещается в начало файла.

4

rb+

Открывает файл в двоичном формате для чтения и записи. Указатель файла помещается в начало файла.

5

w

Открывает файл только для записи. Заменяет файл, если он существует. Если файл не существует, создает новый файл для записи.

6

wb

Открывает файл для записи только в двоичном формате. Заменяет файл, если он существует. Если файл не существует, создает новый файл для записи.

7

w+

Открывает файл для записи и чтения. Заменяет существующий файл, если он существует. Если файл не существует, создает новый файл для чтения и записи.

8

wb+

Открывает файл в двоичном формате для записи и чтения. Заменяет существующий файл, если он существует. Если файл не существует, создает новый файл для чтения и записи.

9

a

Открывает файл для добавления. Указатель файла находится в конце файла, если файл существует. То есть файл находится в режиме добавления. Если файл не существует, создается новый файл для записи.

10

ab

Открывает файл для добавления в двоичном формате. Указатель файла находится в конце файла, если файл существует. То есть файл находится в режиме добавления. Если файл не существует, создается новый файл для записи.

11

a+

Открывает файл как для добавления, так и для чтения. Указатель файла находится в конце файла, если файл существует. Файл откроется в режиме добавления. Если файл не существует, создается новый файл для чтения и записи.

12

ab+

Открывает файл в двоичном формате для добавления и чтения. Указатель файла находится в конце файла, если файл существует. Файл откроется в режиме добавления. Если файл не существует, создается новый файл для чтения и записи.

В файле атрибутов объекта

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

Вот список всех атрибутов, связанных с файловым объектом -

Sr.No. Атрибут и описание
1

file.closed

Возвращает true, если файл закрыт, иначе false.

2

file.mode

Возвращает режим доступа, в котором был открыт файл.

3

file.name

Возвращает имя файла.

4

file.softspace

Возвращает false, если пространство явно требуется с print, в противном случае - true.

пример

#!/usr/bin/python

# Open a file
fo = open("foo.txt", "wb")
print "Name of the file: ", fo.name
print "Closed or not : ", fo.closed
print "Opening mode : ", fo.mode
print "Softspace flag : ", fo.softspace

Это дает следующий результат -

Name of the file:  foo.txt
Closed or not :  False
Opening mode :  wb
Softspace flag :  0

Близко () Метод

Метод close () файлового объекта сбрасывает любую незаписанную информацию и закрывает файловый объект, после чего запись невозможна.

Python автоматически закрывает файл, когда объект ссылки файла переназначается другому файлу. Для закрытия файла рекомендуется использовать метод close ().

Синтаксис

fileObject.close()

пример

#!/usr/bin/python

# Open a file
fo = open("foo.txt", "wb")
print "Name of the file: ", fo.name

# Close opend file
fo.close()

Это дает следующий результат -

Name of the file:  foo.txt

Чтение и запись файлов

Файл объект содержит набор методов доступа , чтобы сделать нашу жизнь проще. Мы увидим, как использовать методы read () и write () для чтения и записи файлов.

Записи () Метод

Метод write () записывает любую строку в открытый файл. Важно отметить, что строки Python могут содержать двоичные данные, а не только текст.

Метод write () не добавляет символ новой строки ('\ n') в конец строки -

Синтаксис

fileObject.write(string)

Здесь переданный параметр - это содержимое, которое будет записано в открытый файл.

пример

#!/usr/bin/python

# Open a file
fo = open("foo.txt", "wb")
fo.write( "Python is a great language.\nYeah its great!!\n")

# Close opend file
fo.close()

Вышеупомянутый метод создаст файл foo.txt и запишет заданный контент в этот файл и, наконец, закроет этот файл. Если вы откроете этот файл, он будет иметь следующее содержимое.

Python is a great language.
Yeah its great!!

Чтения () Метод

Метод read () считывает строку из открытого файла. Важно отметить, что строки Python могут содержать двоичные данные. кроме текстовых данных.

Синтаксис

fileObject.read([count])

Здесь переданный параметр - это количество байтов, которое нужно прочитать из открытого файла. Этот метод начинает чтение с начала файла, и если счетчик отсутствует, он пытается прочитать как можно больше, возможно, до конца файла.

пример

Возьмем файл foo.txt , который мы создали выше.

#!/usr/bin/python

# Open a file
fo = open("foo.txt", "r+")
str = fo.read(10);
print "Read String is : ", str
# Close opend file
fo.close()

Это дает следующий результат -

Read String is :  Python is

Расположение файлов

Метод tell () сообщает вам текущую позицию в файле; другими словами, следующее чтение или запись произойдет через столько байтов от начала файла.

Метод seek (offset [, from]) изменяет текущую позицию файла. Смещение аргумент указывает число байтов , которые будут перемещены. От аргумента определяет базисную позицию , откуда байты должны быть перемещены.

Если from установлено в 0, это означает использование начала файла в качестве ссылочной позиции, а 1 означает использование текущей позиции в качестве ссылочной позиции, а если он установлен в 2, то конец файла будет взят в качестве ссылочной позиции. .

пример

Возьмем файл foo.txt , который мы создали выше.

#!/usr/bin/python

# Open a file
fo = open("foo.txt", "r+")
str = fo.read(10)
print "Read String is : ", str

# Check current position
position = fo.tell()
print "Current file position : ", position

# Reposition pointer at the beginning once again
position = fo.seek(0, 0);
str = fo.read(10)
print "Again read String is : ", str
# Close opend file
fo.close()

Это дает следующий результат -

Read String is :  Python is
Current file position :  10
Again read String is :  Python is

Переименование и удаление файлов

Python os Модуль предоставляет методы, которые помогают выполнять операции обработки файлов, такие как переименование и удаление файлов.

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

Метод rename ()

Метод rename () принимает два аргумента: текущее имя файла и новое имя файла.

Синтаксис

os.rename(current_file_name, new_file_name)

пример

Ниже приведен пример , чтобы переименовать существующий файл test1.txt -

#!/usr/bin/python
import os

# Rename a file from test1.txt to test2.txt
os.rename( "test1.txt", "test2.txt" )

Удалить () Метод

Вы можете использовать метод remove () для удаления файлов, указав имя удаляемого файла в качестве аргумента.

Синтаксис

os.remove(file_name)

пример

Ниже приведен пример удаления существующего файла test2.txt -

#!/usr/bin/python
import os

# Delete file test2.txt
os.remove("text2.txt")

Каталоги в Python

Все файлы содержатся в разных каталогах, и Python без проблем справляется с ними. Вos В модуле есть несколько методов, которые помогут вам создавать, удалять и изменять каталоги.

MkDir () Метод

Вы можете использовать метод mkdir () изosмодуль для создания каталогов в текущем каталоге. Вам необходимо предоставить аргумент этому методу, который содержит имя создаваемого каталога.

Синтаксис

os.mkdir("newdir")

пример

Ниже приведен пример создания каталога test в текущем каталоге.

#!/usr/bin/python
import os

# Create a directory "test"
os.mkdir("test")

ChDir () Метод

Вы можете использовать метод chdir () для изменения текущего каталога. Метод chdir () принимает аргумент, который представляет собой имя каталога, который вы хотите сделать текущим каталогом.

Синтаксис

os.chdir("newdir")

пример

Ниже приведен пример перехода в каталог "/ home / newdir" -

#!/usr/bin/python
import os

# Changing a directory to "/home/newdir"
os.chdir("/home/newdir")

Getcwd () Метод

Метод getcwd () отображает текущий рабочий каталог.

Синтаксис

os.getcwd()

пример

Ниже приведен пример текущего каталога -

#!/usr/bin/python
import os

# This would give location of the current directory
os.getcwd()

RmDir () Метод

Метод rmdir () удаляет каталог, который передается в качестве аргумента метода.

Перед удалением каталога необходимо удалить все его содержимое.

Синтаксис

os.rmdir('dirname')

пример

Ниже приведен пример удаления каталога «/ tmp / test». Требуется указать полное имя каталога, иначе он будет искать этот каталог в текущем каталоге.

#!/usr/bin/python
import os

# This would  remove "/tmp/test"  directory.
os.rmdir( "/tmp/test"  )

Методы, связанные с файлами и каталогами

Есть три важных источника, которые предоставляют широкий спектр служебных методов для обработки и управления файлами и каталогами в операционных системах Windows и Unix. Они следующие -

  • Методы файлового объекта : файловый объект предоставляет функции для управления файлами.

  • Методы объектов ОС : они предоставляют методы для обработки файлов, а также каталогов.

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

  • Exception Handling- Это будет рассмотрено в этом руководстве. Вот список стандартных исключений, доступных в Python: Стандартные исключения .

  • Assertions- Это будет рассмотрено в учебнике « Утверждения в Python» .

Список стандартных исключений -

Sr.No. Имя и описание исключения
1

Exception

Базовый класс для всех исключений

2

StopIteration

Возникает, когда метод next () итератора не указывает ни на какой объект.

3

SystemExit

Вызывается функцией sys.exit ().

4

StandardError

Базовый класс для всех встроенных исключений, кроме StopIteration и SystemExit.

5

ArithmeticError

Базовый класс для всех ошибок, возникающих при числовых вычислениях.

6

OverflowError

Возникает, когда вычисление превышает максимальный предел для числового типа.

7

FloatingPointError

Возникает при сбое вычисления с плавающей запятой.

8

ZeroDivisionError

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

9

AssertionError

Возникает в случае отказа утверждения Assert.

10

AttributeError

Возникает в случае сбоя ссылки или присвоения атрибута.

11

EOFError

Возникает, когда нет ввода ни от функции raw_input (), ни от функции input () и достигнут конец файла.

12

ImportError

Возникает при сбое инструкции импорта.

13

KeyboardInterrupt

Возникает, когда пользователь прерывает выполнение программы, обычно нажатием Ctrl + c.

14

LookupError

Базовый класс для всех ошибок поиска.

15

IndexError

Возникает, если в последовательности не найден индекс.

16

KeyError

Возникает, когда указанный ключ не найден в словаре.

17

NameError

Возникает, когда идентификатор не найден в локальном или глобальном пространстве имен.

18

UnboundLocalError

Возникает при попытке доступа к локальной переменной в функции или методе, но ей не было присвоено значение.

19

EnvironmentError

Базовый класс для всех исключений, возникающих вне среды Python.

20

IOError

Возникает при сбое операции ввода / вывода, например при выполнении оператора печати или функции open () при попытке открыть файл, который не существует.

21 год

IOError

Поднят за ошибки, связанные с операционной системой.

22

SyntaxError

Возникает, когда в синтаксисе Python есть ошибка.

23

IndentationError

Возникает, если отступ не указан правильно.

24

SystemError

Возникает, когда интерпретатор обнаруживает внутреннюю проблему, но при обнаружении этой ошибки интерпретатор Python не завершает работу.

25

SystemExit

Возникает при выходе из интерпретатора Python с помощью функции sys.exit (). Если код не обрабатывается, интерпретатор завершает работу.

26

TypeError

Возникает при попытке выполнения операции или функции, недопустимой для указанного типа данных.

27

ValueError

Возникает, когда встроенная функция для типа данных имеет допустимый тип аргументов, но аргументы имеют недопустимые значения.

28

RuntimeError

Возникает, когда сгенерированная ошибка не попадает ни в одну категорию.

29

NotImplementedError

Возникает, когда абстрактный метод, который необходимо реализовать в унаследованном классе, фактически не реализован.

Утверждения в Python

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

Самый простой способ придумать утверждение - это сравнить его с утверждением. raise-ifзаявление (или, чтобы быть точнее, заявление о повышении, если нет). Выражение проверяется, и если результат оказывается ложным, возникает исключение.

Утверждения выполняются с помощью оператора assert, новейшего ключевого слова Python, представленного в версии 1.5.

Программисты часто помещают утверждения в начале функции для проверки правильности ввода и после вызова функции для проверки правильности вывода.

Утверждают Заявление

Когда он встречает утверждение assert, Python оценивает сопутствующее выражение, которое, будем надеяться, верно. Если выражение ложно, Python вызывает исключение AssertionError .

Синтаксис assert -

assert Expression[, Arguments]

Если утверждение не выполняется, Python использует ArgumentExpression в качестве аргумента для AssertionError. Исключения AssertionError можно перехватывать и обрабатывать, как и любое другое исключение, с помощью оператора try-except, но если они не обрабатываются, они завершат программу и произведут обратную трассировку.

пример

Вот функция, которая переводит температуру из градусов Кельвина в градусы Фаренгейта. Поскольку ноль градусов Кельвина настолько холодно, насколько это возможно, функция срабатывает, если обнаруживает отрицательную температуру -

#!/usr/bin/python
def KelvinToFahrenheit(Temperature):
   assert (Temperature >= 0),"Colder than absolute zero!"
   return ((Temperature-273)*1.8)+32
print KelvinToFahrenheit(273)
print int(KelvinToFahrenheit(505.78))
print KelvinToFahrenheit(-5)

Когда приведенный выше код выполняется, он дает следующий результат:

32.0
451
Traceback (most recent call last):
File "test.py", line 9, in <module>
print KelvinToFahrenheit(-5)
File "test.py", line 4, in KelvinToFahrenheit
assert (Temperature >= 0),"Colder than absolute zero!"
AssertionError: Colder than absolute zero!

Что такое исключение?

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

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

Обработка исключения

Если у вас есть подозрительный код, который может вызвать исключение, вы можете защитить свою программу, поместив подозрительный код вtry:блок. После блока try: включитеexcept: оператор, за которым следует блок кода, который решает проблему максимально элегантно.

Синтаксис

Вот простой синтаксис блоков try .... except ... else -

try:
   You do your operations here;
   ......................
except ExceptionI:
   If there is ExceptionI, then execute this block.
except ExceptionII:
   If there is ExceptionII, then execute this block.
   ......................
else:
   If there is no exception then execute this block.

Вот несколько важных моментов о вышеупомянутом синтаксисе:

  • У одного оператора try может быть несколько операторов except. Это полезно, когда блок try содержит инструкции, которые могут вызывать различные типы исключений.

  • Вы также можете предоставить общее предложение except, которое обрабатывает любое исключение.

  • После предложений except вы можете включить else-clause. Код в блоке else выполняется, если код в блоке try: не вызывает исключения.

  • Блок else - хорошее место для кода, который не нуждается в защите try: block.

пример

Этот пример открывает файл, записывает содержимое в файл и выходит изящно, потому что вообще нет никаких проблем -

#!/usr/bin/python

try:
   fh = open("testfile", "w")
   fh.write("This is my test file for exception handling!!")
except IOError:
   print "Error: can\'t find file or read data"
else:
   print "Written content in the file successfully"
   fh.close()

Это дает следующий результат -

Written content in the file successfully

пример

В этом примере пытается открыть файл, в котором у вас нет разрешения на запись, поэтому возникает исключение -

#!/usr/bin/python

try:
   fh = open("testfile", "r")
   fh.write("This is my test file for exception handling!!")
except IOError:
   print "Error: can\'t find file or read data"
else:
   print "Written content in the file successfully"

Это дает следующий результат -

Error: can't find file or read data

За исключением пункта с исключениями Нет

Вы также можете использовать оператор except без исключений, определенных следующим образом:

try:
   You do your operations here;
   ......................
except:
   If there is any exception, then execute this block.
   ......................
else:
   If there is no exception then execute this block.

Это своего рода try-exceptоператор перехватывает все возникающие исключения. Однако использование такого оператора try-except не считается хорошей практикой программирования, поскольку он улавливает все исключения, но не заставляет программиста идентифицировать основную причину проблемы, которая может возникнуть.

За исключением пункта с несколькими исключениями

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

try:
   You do your operations here;
   ......................
except(Exception1[, Exception2[,...ExceptionN]]]):
   If there is any exception from the given exception list, 
   then execute this block.
   ......................
else:
   If there is no exception then execute this block.

Оговорка о "окончательной попытке"

Вы можете использовать finally: блок вместе с try:блок. Блок finally - это место для размещения любого кода, который должен выполняться, независимо от того, вызвал ли блок try исключение или нет. Синтаксис оператора try-finally следующий:

try:
   You do your operations here;
   ......................
   Due to any exception, this may be skipped.
finally:
   This would always be executed.
   ......................

Вы не можете использовать предложение else вместе с предложением finally.

пример

#!/usr/bin/python

try:
   fh = open("testfile", "w")
   fh.write("This is my test file for exception handling!!")
finally:
   print "Error: can\'t find file or read data"

Если у вас нет разрешения на открытие файла в режиме записи, это приведет к следующему результату:

Error: can't find file or read data

Тот же пример можно записать более чисто следующим образом:

#!/usr/bin/python

try:
   fh = open("testfile", "w")
   try:
      fh.write("This is my test file for exception handling!!")
   finally:
      print "Going to close the file"
      fh.close()
except IOError:
   print "Error: can\'t find file or read data"

Когда в блоке try возникает исключение , выполнение немедленно переходит к блоку finally . После выполнения всех операторов в блоке finally исключение возникает снова и обрабатывается в операторах except, если они присутствуют на следующем более высоком уровне оператора try-except .

Аргумент исключения

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

try:
   You do your operations here;
   ......................
except ExceptionType, Argument:
   You can print value of Argument here...

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

Эта переменная получает значение исключения, в основном содержащее причину исключения. Переменная может принимать одно значение или несколько значений в виде кортежа. Этот кортеж обычно содержит строку ошибки, номер ошибки и местоположение ошибки.

пример

Ниже приведен пример единственного исключения -

#!/usr/bin/python

# Define a function here.
def temp_convert(var):
   try:
      return int(var)
   except ValueError, Argument:
      print "The argument does not contain numbers\n", Argument

# Call above function here.
temp_convert("xyz");

Это дает следующий результат -

The argument does not contain numbers
invalid literal for int() with base 10: 'xyz'

Вызов исключения

Вы можете вызвать исключения несколькими способами, используя оператор raise. Общий синтаксис дляraise Заявление выглядит следующим образом.

Синтаксис

raise [Exception [, args [, traceback]]]

Здесь Exception - это тип исключения (например, NameError), а arguments - значение аргумента исключения. Аргумент не обязателен; если не указан, аргумент исключения - Нет.

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

пример

Исключением может быть строка, класс или объект. Большинство исключений, которые вызывает ядро ​​Python, - это классы с аргументом, который является экземпляром класса. Определение новых исключений довольно просто и может быть выполнено следующим образом:

def functionName( level ):
   if level < 1:
      raise "Invalid level!", level
      # The code below to this would not be executed
      # if we raise the exception

Note:Чтобы перехватить исключение, предложение «except» должно ссылаться на одно и то же исключение, созданное либо объектом класса, либо простой строкой. Например, чтобы зафиксировать вышеуказанное исключение, мы должны написать предложение except следующим образом:

try:
   Business Logic here...
except "Invalid level!":
   Exception handling here...
else:
   Rest of the code here...

Пользовательские исключения

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

Вот пример, связанный с RuntimeError . Здесь создается класс, унаследованный от RuntimeError . Это полезно, когда вам нужно отобразить более конкретную информацию при обнаружении исключения.

В блоке try вызывается определенное пользователем исключение и перехватывается в блоке except. Переменная e используется для создания экземпляра класса Networkerror .

class Networkerror(RuntimeError):
   def __init__(self, arg):
      self.args = arg

Итак, как только вы определили класс выше, вы можете вызвать исключение следующим образом:

try:
   raise Networkerror("Bad hostname")
except Networkerror,e:
   print e.args

Python с момента своего существования был объектно-ориентированным языком. Из-за этого создавать и использовать классы и объекты совершенно несложно. Эта глава поможет вам стать экспертом в использовании поддержки объектно-ориентированного программирования Python.

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

Тем не менее, вот небольшое введение в объектно-ориентированное программирование (ООП), которое поможет вам быстрее -

Обзор терминологии ООП

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

  • Class variable- Переменная, общая для всех экземпляров класса. Переменные класса определены внутри класса, но вне его методов. Переменные класса используются не так часто, как переменные экземпляра.

  • Data member - Переменная класса или переменная экземпляра, которая содержит данные, связанные с классом и его объектами.

  • Function overloading- Назначение более чем одного поведения определенной функции. Выполняемая операция зависит от типов задействованных объектов или аргументов.

  • Instance variable - Переменная, которая определяется внутри метода и принадлежит только текущему экземпляру класса.

  • Inheritance - Передача характеристик класса другим производным от него классам.

  • Instance- Индивидуальный объект определенного класса. Например, объект obj, принадлежащий классу Circle, является экземпляром класса Circle.

  • Instantiation - Создание экземпляра класса.

  • Method - Особый вид функции, которая определяется в определении класса.

  • Object- Уникальный экземпляр структуры данных, определяемой ее классом. Объект включает как элементы данных (переменные класса и переменные экземпляра), так и методы.

  • Operator overloading - Назначение более одной функции одному оператору.

Создание классов

Оператор класса создает новое определение класса. Имя класса следует сразу за ключевым словом class, за которым следует двоеточие:

class ClassName:
   'Optional class documentation string'
   class_suite
  • У класса есть строка документации, доступ к которой можно получить через ClassName .__ doc__ .

  • Class_suite состоит из всех компонентов утверждений , определяющих член класса, атрибуты данных и функцию.

пример

Ниже приведен пример простого класса Python -

class Employee:
   'Common base class for all employees'
   empCount = 0

   def __init__(self, name, salary):
      self.name = name
      self.salary = salary
      Employee.empCount += 1
   
   def displayCount(self):
     print "Total Employee %d" % Employee.empCount

   def displayEmployee(self):
      print "Name : ", self.name,  ", Salary: ", self.salary
  • Переменная empCount - это переменная класса, значение которой является общим для всех экземпляров этого класса. Доступ к нему можно получить как Employee.empCount изнутри класса или вне класса.

  • Первый метод __init __ () - это специальный метод, который называется конструктором класса или методом инициализации, который Python вызывает при создании нового экземпляра этого класса.

  • Вы объявляете другие методы класса, такие как обычные функции, за исключением того, что первым аргументом каждого метода является self . Python добавляет аргумент self в список за вас; вам не нужно включать его при вызове методов.

Создание экземпляров объектов

Чтобы создать экземпляры класса, вы вызываете класс, используя имя класса, и передаете любые аргументы, которые принимает его метод __init__ .

"This would create first object of Employee class"
emp1 = Employee("Zara", 2000)
"This would create second object of Employee class"
emp2 = Employee("Manni", 5000)

Доступ к атрибутам

Вы получаете доступ к атрибутам объекта, используя оператор точки с объектом. Доступ к переменной класса будет осуществляться с использованием имени класса следующим образом:

emp1.displayEmployee()
emp2.displayEmployee()
print "Total Employee %d" % Employee.empCount

Теперь, объединяя все концепции -

#!/usr/bin/python

class Employee:
   'Common base class for all employees'
   empCount = 0

   def __init__(self, name, salary):
      self.name = name
      self.salary = salary
      Employee.empCount += 1
   
   def displayCount(self):
     print "Total Employee %d" % Employee.empCount

   def displayEmployee(self):
      print "Name : ", self.name,  ", Salary: ", self.salary

"This would create first object of Employee class"
emp1 = Employee("Zara", 2000)
"This would create second object of Employee class"
emp2 = Employee("Manni", 5000)
emp1.displayEmployee()
emp2.displayEmployee()
print "Total Employee %d" % Employee.empCount

Когда приведенный выше код выполняется, он дает следующий результат:

Name :  Zara ,Salary:  2000
Name :  Manni ,Salary:  5000
Total Employee 2

Вы можете добавлять, удалять или изменять атрибуты классов и объектов в любое время -

emp1.age = 7  # Add an 'age' attribute.
emp1.age = 8  # Modify 'age' attribute.
del emp1.age  # Delete 'age' attribute.

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

  • В getattr(obj, name[, default]) - для доступа к атрибуту объекта.

  • В hasattr(obj,name) - чтобы проверить, существует атрибут или нет.

  • В setattr(obj,name,value)- установить атрибут. Если атрибут не существует, он будет создан.

  • В delattr(obj, name) - удалить атрибут.

hasattr(emp1, 'age')    # Returns true if 'age' attribute exists
getattr(emp1, 'age')    # Returns value of 'age' attribute
setattr(emp1, 'age', 8) # Set attribute 'age' at 8
delattr(empl, 'age')    # Delete attribute 'age'

Встроенные атрибуты класса

Каждый класс Python сохраняет следующие встроенные атрибуты, и к ним можно получить доступ с помощью оператора точки, как и к любому другому атрибуту -

  • __dict__ - Словарь, содержащий пространство имен класса.

  • __doc__ - Строка документации класса или ее нет, если не определено.

  • __name__ - Название класса.

  • __module__- Имя модуля, в котором определен класс. Этот атрибут - «__main__» в интерактивном режиме.

  • __bases__ - Возможно, пустой кортеж, содержащий базовые классы, в порядке их появления в списке базовых классов.

Для вышеуказанного класса давайте попробуем получить доступ ко всем этим атрибутам -

#!/usr/bin/python

class Employee:
   'Common base class for all employees'
   empCount = 0

   def __init__(self, name, salary):
      self.name = name
      self.salary = salary
      Employee.empCount += 1
   
   def displayCount(self):
     print "Total Employee %d" % Employee.empCount

   def displayEmployee(self):
      print "Name : ", self.name,  ", Salary: ", self.salary

print "Employee.__doc__:", Employee.__doc__
print "Employee.__name__:", Employee.__name__
print "Employee.__module__:", Employee.__module__
print "Employee.__bases__:", Employee.__bases__
print "Employee.__dict__:", Employee.__dict__

Когда приведенный выше код выполняется, он дает следующий результат:

Employee.__doc__: Common base class for all employees
Employee.__name__: Employee
Employee.__module__: __main__
Employee.__bases__: ()
Employee.__dict__: {'__module__': '__main__', 'displayCount':
<function displayCount at 0xb7c84994>, 'empCount': 2, 
'displayEmployee': <function displayEmployee at 0xb7c8441c>, 
'__doc__': 'Common base class for all employees', 
'__init__': <function __init__ at 0xb7c846bc>}

Уничтожение объектов (сборка мусора)

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

Сборщик мусора Python запускается во время выполнения программы и запускается, когда счетчик ссылок на объект достигает нуля. Счетчик ссылок на объект изменяется по мере изменения количества указывающих на него псевдонимов.

Счетчик ссылок на объект увеличивается, когда ему присваивается новое имя или он помещается в контейнер (список, кортеж или словарь). Счетчик ссылок на объект уменьшается, когда он удаляется с помощью del , его ссылка переназначается или его ссылка выходит за пределы области видимости. Когда счетчик ссылок на объект достигает нуля, Python собирает его автоматически.

a = 40      # Create object <40>
b = a       # Increase ref. count  of <40> 
c = [b]     # Increase ref. count  of <40> 

del a       # Decrease ref. count  of <40>
b = 100     # Decrease ref. count  of <40> 
c[0] = -1   # Decrease ref. count  of <40>

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

пример

Этот деструктор __del __ () печатает имя класса экземпляра, который вот-вот будет уничтожен -

#!/usr/bin/python

class Point:
   def __init__( self, x=0, y=0):
      self.x = x
      self.y = y
   def __del__(self):
      class_name = self.__class__.__name__
      print class_name, "destroyed"

pt1 = Point()
pt2 = pt1
pt3 = pt1
print id(pt1), id(pt2), id(pt3) # prints the ids of the obejcts
del pt1
del pt2
del pt3

Когда приведенный выше код выполняется, он дает следующий результат -

3083401324 3083401324 3083401324
Point destroyed

Note- В идеале вы должны определить свои классы в отдельном файле, а затем вы должны импортировать их в свой основной файл программы с помощью оператора импорта .

Наследование класса

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

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

Синтаксис

Производные классы объявляются так же, как их родительский класс; однако список базовых классов для наследования дается после имени класса -

class SubClassName (ParentClass1[, ParentClass2, ...]):
   'Optional class documentation string'
   class_suite

пример

#!/usr/bin/python

class Parent:        # define parent class
   parentAttr = 100
   def __init__(self):
      print "Calling parent constructor"

   def parentMethod(self):
      print 'Calling parent method'

   def setAttr(self, attr):
      Parent.parentAttr = attr

   def getAttr(self):
      print "Parent attribute :", Parent.parentAttr

class Child(Parent): # define child class
   def __init__(self):
      print "Calling child constructor"

   def childMethod(self):
      print 'Calling child method'

c = Child()          # instance of child
c.childMethod()      # child calls its method
c.parentMethod()     # calls parent's method
c.setAttr(200)       # again call parent's method
c.getAttr()          # again call parent's method

Когда приведенный выше код выполняется, он дает следующий результат:

Calling child constructor
Calling child method
Calling parent method
Parent attribute : 200

Аналогичным образом вы можете управлять классом из нескольких родительских классов следующим образом:

class A:        # define your class A
.....

class B:         # define your class B
.....

class C(A, B):   # subclass of A and B
.....

Вы можете использовать функции issubclass () или isinstance (), чтобы проверить отношения двух классов и экземпляров.

  • В issubclass(sub, sup) логическая функция возвращает истину, если данный подкласс sub действительно является подклассом суперкласса sup.

  • В isinstance(obj, Class)логическая функция возвращает true, если obj является экземпляром класса Class или экземпляром подкласса класса

Переопределение методов

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

пример

#!/usr/bin/python

class Parent:        # define parent class
   def myMethod(self):
      print 'Calling parent method'

class Child(Parent): # define child class
   def myMethod(self):
      print 'Calling child method'

c = Child()          # instance of child
c.myMethod()         # child calls overridden method

Когда приведенный выше код выполняется, он дает следующий результат:

Calling child method

Базовые методы перегрузки

В следующей таблице перечислены некоторые общие функции, которые вы можете переопределить в своих собственных классах.

Sr.No. Метод, описание и пример вызова
1

__init__ ( self [,args...] )

Конструктор (с любыми необязательными аргументами)

Пример вызова: obj = className (args)

2

__del__( self )

Деструктор, удаляет объект

Пример вызова: del obj

3

__repr__( self )

Оцениваемое строковое представление

Пример вызова: repr (obj)

4

__str__( self )

Строковое представление для печати

Пример вызова: str (obj)

5

__cmp__ ( self, x )

Сравнение объектов

Пример вызова: cmp (obj, x)

Операторы перегрузки

Предположим, вы создали класс Vector для представления двумерных векторов. Что происходит, когда вы добавляете их с помощью оператора плюс? Скорее всего Python на вас накричит.

Однако вы можете определить метод __add__ в своем классе для выполнения сложения векторов, и тогда оператор плюс будет вести себя так, как ожидалось -

пример

#!/usr/bin/python

class Vector:
   def __init__(self, a, b):
      self.a = a
      self.b = b

   def __str__(self):
      return 'Vector (%d, %d)' % (self.a, self.b)
   
   def __add__(self,other):
      return Vector(self.a + other.a, self.b + other.b)

v1 = Vector(2,10)
v2 = Vector(5,-2)
print v1 + v2

Когда приведенный выше код выполняется, он дает следующий результат:

Vector(7,8)

Скрытие данных

Атрибуты объекта могут быть или не быть видимыми вне определения класса. Атрибуты нужно называть с помощью префикса с двойным подчеркиванием, и тогда эти атрибуты не будут напрямую видны посторонним.

пример

#!/usr/bin/python

class JustCounter:
   __secretCount = 0
  
   def count(self):
      self.__secretCount += 1
      print self.__secretCount

counter = JustCounter()
counter.count()
counter.count()
print counter.__secretCount

Когда приведенный выше код выполняется, он дает следующий результат:

1
2
Traceback (most recent call last):
   File "test.py", line 12, in <module>
      print counter.__secretCount
AttributeError: JustCounter instance has no attribute '__secretCount'

Python защищает эти члены, внутренне изменяя имя для включения имени класса. Вы можете получить доступ к таким атрибутам, как object._className__attrName . Если вы замените свою последнюю строку следующим образом, она сработает для вас -

.........................
print counter._JustCounter__secretCount

Когда приведенный выше код выполняется, он дает следующий результат:

1
2
2

Регулярное выражение специальная последовательность символов , которая позволяет соответствовать или найти другие строки или наборы строк, используя специализированный синтаксис проведен в шаблоне. Регулярные выражения широко используются в мире UNIX.

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

Мы рассмотрим две важные функции, которые будут использоваться для обработки регулярных выражений. Но сначала небольшая вещь: существуют различные символы, которые будут иметь особое значение, когда они используются в регулярном выражении. Чтобы избежать путаницы при работе с регулярными выражениями, мы будем использовать Raw Strings какr'expression'.

Матч Функция

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

Вот синтаксис этой функции -

re.match(pattern, string, flags=0)

Вот описание параметров -

Sr.No. Параметр и описание
1

pattern

Это регулярное выражение, которое нужно сопоставить.

2

string

Это строка, в которой будет выполняться поиск по шаблону в начале строки.

3

flags

Вы можете указать разные флаги, используя побитовое ИЛИ (|). Это модификаторы, которые перечислены в таблице ниже.

Функция re.match возвращаетmatch объект на успех, Noneпри неудаче. Мы используем функцию group (num) или groups () отmatch объект, чтобы получить совпадающее выражение.

Sr.No. Метод сопоставления объекта и описание
1

group(num=0)

Этот метод возвращает полное совпадение (или конкретный номер подгруппы)

2

groups()

Этот метод возвращает все подходящие подгруппы в кортеже (пустые, если их не было)

пример

#!/usr/bin/python
import re

line = "Cats are smarter than dogs"

matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I)

if matchObj:
   print "matchObj.group() : ", matchObj.group()
   print "matchObj.group(1) : ", matchObj.group(1)
   print "matchObj.group(2) : ", matchObj.group(2)
else:
   print "No match!!"

Когда приведенный выше код выполняется, он дает следующий результат -

matchObj.group() :  Cats are smarter than dogs
matchObj.group(1) :  Cats
matchObj.group(2) :  smarter

Поиск Функция

Эта функция ищет первое вхождение шаблона RE в строке с необязательными флагами .

Вот синтаксис этой функции -

re.search(pattern, string, flags=0)

Вот описание параметров -

Sr.No. Параметр и описание
1

pattern

Это регулярное выражение, которое нужно сопоставить.

2

string

Это строка, в которой будет выполняться поиск по шаблону в любом месте строки.

3

flags

Вы можете указать разные флаги, используя побитовое ИЛИ (|). Это модификаторы, которые перечислены в таблице ниже.

Функция re.search возвращаетmatch объект на успех, noneпри неудаче. Мы используем функцию group (num) или groups () отmatch объект, чтобы получить совпадающее выражение.

Sr.No. Методы сопоставления объектов и описание
1

group(num=0)

Этот метод возвращает полное совпадение (или конкретный номер подгруппы)

2

groups()

Этот метод возвращает все подходящие подгруппы в кортеже (пустые, если их не было)

пример

#!/usr/bin/python
import re

line = "Cats are smarter than dogs";

searchObj = re.search( r'(.*) are (.*?) .*', line, re.M|re.I)

if searchObj:
   print "searchObj.group() : ", searchObj.group()
   print "searchObj.group(1) : ", searchObj.group(1)
   print "searchObj.group(2) : ", searchObj.group(2)
else:
   print "Nothing found!!"

Когда приведенный выше код выполняется, он дает следующий результат -

searchObj.group() :  Cats are smarter than dogs
searchObj.group(1) :  Cats
searchObj.group(2) :  smarter

Сопоставление и поиск

Python предлагает две разные примитивные операции, основанные на регулярных выражениях: match проверяет совпадение только в начале строки, а search проверяет совпадение в любом месте строки (это то, что Perl делает по умолчанию).

пример

#!/usr/bin/python
import re

line = "Cats are smarter than dogs";

matchObj = re.match( r'dogs', line, re.M|re.I)
if matchObj:
   print "match --> matchObj.group() : ", matchObj.group()
else:
   print "No match!!"

searchObj = re.search( r'dogs', line, re.M|re.I)
if searchObj:
   print "search --> searchObj.group() : ", searchObj.group()
else:
   print "Nothing found!!"

Когда приведенный выше код выполняется, он дает следующий результат:

No match!!
search --> searchObj.group() :  dogs

Искать и заменить

Один из наиболее важных re методы, использующие регулярные выражения, sub.

Синтаксис

re.sub(pattern, repl, string, max=0)

Этот метод заменяет все вхождения шаблона RE в строке на repl , заменяя все вхождения, если не указано max . Этот метод возвращает измененную строку.

пример

#!/usr/bin/python
import re

phone = "2004-959-559 # This is Phone Number"

# Delete Python-style comments
num = re.sub(r'#.*$', "", phone)
print "Phone Num : ", num

# Remove anything other than digits
num = re.sub(r'\D', "", phone)    
print "Phone Num : ", num

Когда приведенный выше код выполняется, он дает следующий результат:

Phone Num :  2004-959-559
Phone Num :  2004959559

Модификаторы регулярных выражений: флаги параметров

Литералы регулярных выражений могут включать необязательный модификатор для управления различными аспектами сопоставления. Модификаторы указываются как необязательный флаг. Вы можете указать несколько модификаторов, используя исключающее ИЛИ (|), как показано ранее, и могут быть представлены одним из них:

Sr.No. Модификатор и описание
1

re.I

Выполняет сопоставление без учета регистра.

2

re.L

Переводит слова в соответствии с текущим языковым стандартом. Эта интерпретация влияет на алфавитную группу (\ w и \ W), а также на поведение границ слова (\ b и \ B).

3

re.M

Заставляет $ совпадать с концом строки (а не только с концом строки), а ^ - с началом любой строки (а не только с началом строки).

4

re.S

Делает точку (точку) соответствием любому символу, включая новую строку.

5

re.U

Интерпретирует буквы в соответствии с набором символов Unicode. Этот флаг влияет на поведение \ w, \ W, \ b, \ B.

6

re.X

Разрешает «более привлекательный» синтаксис регулярных выражений. Он игнорирует пробелы (кроме внутри набора [] или экранированных обратной косой чертой) и обрабатывает неэкранированный # как маркер комментария.

Шаблоны регулярных выражений

За исключением управляющих символов, (+ ? . * ^ $ ( ) [ ] { } | \), все символы совпадают. Вы можете экранировать управляющий символ, поставив перед ним обратную косую черту.

В следующей таблице перечислены синтаксисы регулярных выражений, доступные в Python.

Sr.No. Узор и описание
1

^

Соответствует началу строки.

2

$

Соответствует концу строки.

3

.

Соответствует любому одиночному символу, кроме новой строки. Использование опции m также позволяет сопоставить новую строку.

4

[...]

Соответствует любому одиночному символу в скобках.

5

[^...]

Соответствует любому одиночному символу не в скобках

6

re*

Соответствует 0 или более вхождениям предыдущего выражения.

7

re+

Соответствует одному или нескольким вхождениям предыдущего выражения.

8

re?

Соответствует 0 или 1 вхождению предыдущего выражения.

9

re{ n}

Соответствует ровно n повторениям предыдущего выражения.

10

re{ n,}

Соответствует n или нескольким вхождениям предыдущего выражения.

11

re{ n, m}

Соответствует как минимум n и максимум m вхождениям предыдущего выражения.

12

a| b

Соответствует либо a, либо b.

13

(re)

Группирует регулярные выражения и запоминает совпадающий текст.

14

(?imx)

Временно переключает параметры i, m или x в регулярном выражении. Если указано в скобках, будет затронута только эта область.

15

(?-imx)

Временно отключает параметры i, m или x в регулярном выражении. Если указано в скобках, будет затронута только эта область.

16

(?: re)

Группирует регулярные выражения без запоминания совпадающего текста.

17

(?imx: re)

Временно переключает параметры i, m или x в скобках.

18

(?-imx: re)

Временно отключает параметры i, m или x в скобках.

19

(?#...)

Комментарий.

20

(?= re)

Определяет положение с помощью шаблона. Не имеет диапазона.

21 год

(?! re)

Определяет позицию с использованием отрицания шаблона. Не имеет диапазона.

22

(?> re)

Соответствует независимому шаблону без возврата.

23

\w

Соответствует символам слова.

24

\W

Соответствует несловесным символам.

25

\s

Соответствует пробелу. Эквивалентно [\ t \ n \ r \ f].

26

\S

Соответствует пробелам.

27

\d

Соответствует цифрам. Эквивалентно [0-9].

28

\D

Соответствует нецифровым значениям.

29

\A

Соответствует началу строки.

30

\Z

Соответствует концу строки. Если новая строка существует, она соответствует непосредственно перед новой строкой.

31 год

\z

Соответствует концу строки.

32

\G

Место, где закончился последний матч.

33

\b

Соответствует границам слова вне скобок. Соответствует пробелу (0x08) внутри скобок.

34

\B

Соответствует границам без слов.

35 год

\n, \t, etc.

Соответствует символам новой строки, возврата каретки, табуляции и т. Д.

36

\1...\9

Соответствует n-му сгруппированному подвыражению.

37

\10

Соответствует n-му сгруппированному подвыражению, если оно уже совпало. В противном случае относится к восьмеричному представлению символьного кода.

Примеры регулярных выражений

Буквальные символы

Sr.No. Пример и описание
1

python

Матч «питон».

Классы персонажей

Sr.No. Пример и описание
1

[Pp]ython

Соответствие "Python" или "python"

2

rub[ye]

Матч «рубин» или «рубин»

3

[aeiou]

Соответствует любой гласной в нижнем регистре

4

[0-9]

Соответствует любой цифре; то же, что и [0123456789]

5

[a-z]

Соответствует любой строчной букве ASCII

6

[A-Z]

Соответствует любой заглавной букве ASCII

7

[a-zA-Z0-9]

Соответствует любому из вышеперечисленных

8

[^aeiou]

Сопоставьте все, кроме гласной строчной буквы

9

[^0-9]

Сопоставьте все, кроме цифры

Специальные классы символов

Sr.No. Пример и описание
1

.

Соответствует любому символу, кроме новой строки

2

\d

Соответствует цифре: [0-9]

3

\D

Соответствует нецифровой: [^ 0-9]

4

\s

Соответствует пробелу: [\ t \ r \ n \ f]

5

\S

Сопоставить без пробелов: [^ \ t \ r \ n \ f]

6

\w

Соответствует символу из одного слова: [A-Za-z0-9_]

7

\W

Соответствует символу, не являющемуся словом: [^ A-Za-z0-9_]

Случаи повторения

Sr.No. Пример и описание
1

ruby?

Сопоставьте "rub" или "ruby": y необязательно

2

ruby*

Матч "руб" плюс 0 или более лет

3

ruby+

Матч "руб" плюс 1 или более лет

4

\d{3}

Соответствует ровно 3 цифрам

5

\d{3,}

Соответствие 3 или более цифрам

6

\d{3,5}

Соответствие 3, 4 или 5 цифрам

Неладное повторение

Это соответствует наименьшему количеству повторений -

Sr.No. Пример и описание
1

<.*>

Жадное повторение: соответствует "<python> perl>"

2

<.*?>

Nongreedy: соответствует "<python>" в "<python> perl>"

Группировка с круглыми скобками

Sr.No. Пример и описание
1

\D\d+

Нет группы: + повторяет \ d

2

(\D\d)+

Сгруппировано: + повторяет пару \ D \ d

3

([Pp]ython(, )?)+

Соответствие «Python», «Python, python, python» и т. Д.

Обратные ссылки

Это снова соответствует ранее подобранной группе -

Sr.No. Пример и описание
1

([Pp])ython&\1ails

Сопоставьте питон и ведра или Python и ведра

2

(['"])[^\1]*\1

Строка в одинарных или двойных кавычках. \ 1 соответствует тому, что соответствует первой группе. \ 2 соответствует тому, что соответствует второй группе и т. Д.

Альтернативы

Sr.No. Пример и описание
1

python|perl

Матч "питон" или "перл"

2

rub(y|le))

Матч «рубин» или «рубль»

3

Python(!+|\?)

"Python", за которым следует один или несколько! или один?

Якоря

Здесь необходимо указать позицию совпадения.

Sr.No. Пример и описание
1

^Python

Соответствует "Python" в начале строки или внутренней строки

2

Python$

Соответствует "Python" в конце строки или строки

3

\APython

Соответствует "Python" в начале строки

4

Python\Z

Соответствует "Python" в конце строки

5

\bPython\b

Соответствие "Python" на границе слова

6

\brub\B

\ B не является границей слова: сопоставьте «rub» с «rube» и «ruby», но не только

7

Python(?=!)

Соответствует «Python», если после него стоит восклицательный знак.

8

Python(?!!)

Соответствует «Python», если после него не стоит восклицательный знак.

Специальный синтаксис с круглыми скобками

Sr.No. Пример и описание
1

R(?#comment)

Матчи «Р». Все остальное - комментарий

2

R(?i)uby

Без учета регистра при сопоставлении "uby"

3

R(?i:uby)

То же, что и выше

4

rub(?:y|le))

Группировать только без создания обратной ссылки \ 1

Общий интерфейс шлюза или CGI - это набор стандартов, которые определяют, как происходит обмен информацией между веб-сервером и настраиваемым сценарием. Спецификации CGI в настоящее время поддерживаются NCSA.

Что такое CGI?

  • Общий интерфейс шлюза, или CGI, является стандартом для программ внешнего шлюза для взаимодействия с информационными серверами, такими как серверы HTTP.

  • Текущая версия - CGI / 1.1, а CGI / 1.2 находится в стадии разработки.

Просмотр веб-страниц

Чтобы понять концепцию CGI, давайте посмотрим, что происходит, когда мы щелкаем гиперссылку для просмотра определенной веб-страницы или URL-адреса.

  • Ваш браузер связывается с веб-сервером HTTP и запрашивает URL-адрес, то есть имя файла.

  • Веб-сервер анализирует URL-адрес и ищет имя файла. Если он находит этот файл, он отправляет его обратно в браузер, в противном случае отправляет сообщение об ошибке, указывающее, что вы запросили не тот файл.

  • Веб-браузер принимает ответ от веб-сервера и отображает либо полученный файл, либо сообщение об ошибке.

Однако можно настроить HTTP-сервер так, чтобы всякий раз, когда запрашивается файл в определенном каталоге, этот файл не отправляется обратно; вместо этого он выполняется как программа, и все, что выводит эта программа, отправляется обратно для отображения в вашем браузере. Эта функция называется Common Gateway Interface или CGI, а программы называются сценариями CGI. Эти программы CGI могут быть скриптом Python, скриптом PERL, скриптом оболочки, программой C или C ++ и т. Д.

Схема архитектуры CGI

Поддержка и настройка веб-сервера

Прежде чем приступить к программированию CGI, убедитесь, что ваш веб-сервер поддерживает CGI и настроен для обработки программ CGI. Все программы CGI, выполняемые сервером HTTP, хранятся в предварительно настроенном каталоге. Этот каталог называется CGI Directory и по соглашению называется / var / www / cgi-bin. По соглашению файлы CGI имеют расширение.cgi, но вы можете хранить свои файлы с расширением python .py также.

По умолчанию сервер Linux настроен на запуск только сценариев в каталоге cgi-bin в / var / www. Если вы хотите указать любой другой каталог для запуска ваших сценариев CGI, прокомментируйте следующие строки в файле httpd.conf -

<Directory "/var/www/cgi-bin">
   AllowOverride None
   Options ExecCGI
   Order allow,deny
   Allow from all
</Directory>

<Directory "/var/www/cgi-bin">
Options All
</Directory>

Здесь мы предполагаем, что у вас есть запущенный и успешно работающий веб-сервер, и вы можете запускать любую другую программу CGI, такую ​​как Perl или Shell и т. Д.

Первая программа CGI

Вот простая ссылка, которая связана с CGI-скриптом hello.py . Этот файл хранится в каталоге / var / www / cgi-bin и имеет следующее содержимое. Перед запуском вашей программы CGI убедитесь, что у вас есть режим изменения файла, используяchmod 755 hello.py Команда UNIX для создания исполняемого файла.

#!/usr/bin/python

print "Content-type:text/html\r\n\r\n"
print '<html>'
print '<head>'
print '<title>Hello World - First CGI Program</title>'
print '</head>'
print '<body>'
print '<h2>Hello World! This is my first CGI program</h2>'
print '</body>'
print '</html>'

Если вы нажмете hello.py, это даст следующий результат:

Привет, мир! Это моя первая программа CGI

Этот сценарий hello.py представляет собой простой сценарий Python, который записывает свой вывод в файл STDOUT, то есть на экран. Доступна одна важная и дополнительная функция - первая строка для печати.Content-type:text/html\r\n\r\n. Эта строка отправляется обратно в браузер, и в ней указывается тип содержимого, отображаемого на экране браузера.

К настоящему времени вы, должно быть, поняли базовую концепцию CGI и можете писать много сложных программ CGI с использованием Python. Этот сценарий может взаимодействовать с любой другой внешней системой, а также для обмена информацией, такой как СУБД.

Заголовок HTTP

Линия Content-type:text/html\r\n\r\nявляется частью HTTP-заголовка, который отправляется браузеру для понимания содержимого. Весь HTTP-заголовок будет в следующей форме -

HTTP Field Name: Field Content

For Example
Content-type: text/html\r\n\r\n

Есть несколько других важных заголовков HTTP, которые вы будете часто использовать в программировании CGI.

Sr.No. Заголовок и описание
1

Content-type:

Строка MIME, определяющая формат возвращаемого файла. Пример: Content-type: text / html

2

Expires: Date

Дата, когда информация становится недействительной. Он используется браузером, чтобы решить, когда необходимо обновить страницу. Допустимая строка даты имеет формат 01 января 1998 г., 12:00:00 GMT.

3

Location: URL

URL-адрес, который возвращается вместо запрашиваемого URL-адреса. Вы можете использовать это поле для перенаправления запроса в любой файл.

4

Last-modified: Date

Дата последней модификации ресурса.

5

Content-length: N

Длина возвращаемых данных в байтах. Браузер использует это значение, чтобы сообщить приблизительное время загрузки файла.

6

Set-Cookie: String

Установите cookie, передаваемый через строку

Переменные среды CGI

Все программы CGI имеют доступ к следующим переменным среды. Эти переменные играют важную роль при написании любой программы CGI.

Sr.No. Имя и описание переменной
1

CONTENT_TYPE

Тип данных содержимого. Используется, когда клиент отправляет прикрепленный контент на сервер. Например, загрузка файла.

2

CONTENT_LENGTH

Длина информации запроса. Он доступен только для запросов POST.

3

HTTP_COOKIE

Возвращает установленные файлы cookie в виде пары ключ-значение.

4

HTTP_USER_AGENT

Поле заголовка запроса User-Agent содержит информацию о пользовательском агенте, создавшем запрос. Это имя веб-браузера.

5

PATH_INFO

Путь к сценарию CGI.

6

QUERY_STRING

Информация в кодировке URL, отправляемая с запросом метода GET.

7

REMOTE_ADDR

IP-адрес удаленного хоста, отправляющего запрос. Это полезно для ведения журнала или для аутентификации.

8

REMOTE_HOST

Полное имя хоста, выполняющего запрос. Если эта информация недоступна, то для получения IR-адреса можно использовать REMOTE_ADDR.

9

REQUEST_METHOD

Метод, использованный для отправки запроса. Наиболее распространены методы GET и POST.

10

SCRIPT_FILENAME

Полный путь к сценарию CGI.

11

SCRIPT_NAME

Имя сценария CGI.

12

SERVER_NAME

Имя хоста или IP-адрес сервера

13

SERVER_SOFTWARE

Название и версия программного обеспечения, на котором работает сервер.

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

#!/usr/bin/python

import os

print "Content-type: text/html\r\n\r\n";
print "<font size=+1>Environment</font><\br>";
for param in os.environ.keys():
   print "<b>%20s</b>: %s<\br>" % (param, os.environ[param])

Методы GET и POST

Вы, должно быть, сталкивались со многими ситуациями, когда вам нужно было передать некоторую информацию из вашего браузера на веб-сервер и, в конечном итоге, в вашу программу CGI. Чаще всего браузер использует два метода, два из которых передают эту информацию веб-серверу. Это методы GET и POST.

Передача информации с использованием метода GET

Метод GET отправляет закодированную информацию о пользователе, добавленную к запросу страницы. Страница и закодированная информация разделяются знаком? характер следующим образом -

http://www.test.com/cgi-bin/hello.py?key1=value1&key2=value2

Метод GET - это метод по умолчанию для передачи информации из браузера на веб-сервер, который создает длинную строку, которая появляется в поле Location: вашего браузера. Никогда не используйте метод GET, если у вас есть пароль или другая конфиденциальная информация для передачи на сервер. Метод GET имеет ограничение по размеру: в строке запроса можно отправить только 1024 символа. Метод GET отправляет информацию с помощью заголовка QUERY_STRING и будет доступен в вашей программе CGI через переменную среды QUERY_STRING.

Вы можете передать информацию, просто объединив пары ключ и значение вместе с любым URL-адресом, или вы можете использовать теги HTML <FORM> для передачи информации с помощью метода GET.

Пример простого URL: метод получения

Вот простой URL-адрес, который передает два значения программе hello_get.py с помощью метода GET.

/cgi-bin/hello_get.py?first_name=ZARA&last_name=ALI

Ниже hello_get.pyскрипт для обработки ввода данных веб-браузером. Мы собираемся использоватьcgi модуль, который позволяет очень легко получить доступ к переданной информации -

#!/usr/bin/python

# Import modules for CGI handling 
import cgi, cgitb 

# Create instance of FieldStorage 
form = cgi.FieldStorage() 

# Get data from fields
first_name = form.getvalue('first_name')
last_name  = form.getvalue('last_name')

print "Content-type:text/html\r\n\r\n"
print "<html>"
print "<head>"
print "<title>Hello - Second CGI Program</title>"
print "</head>"
print "<body>"
print "<h2>Hello %s %s</h2>" % (first_name, last_name)
print "</body>"
print "</html>"

Это даст следующий результат -

Привет, ЗАРА Али

Простой пример FORM: метод GET

В этом примере передаются два значения с использованием HTML FORM и кнопки отправки. Мы используем тот же сценарий CGI hello_get.py для обработки этого ввода.

<form action = "/cgi-bin/hello_get.py" method = "get">
First Name: <input type = "text" name = "first_name">  <br />

Last Name: <input type = "text" name = "last_name" />
<input type = "submit" value = "Submit" />
</form>

Вот фактический результат вышеуказанной формы, вы вводите имя и фамилию, а затем нажимаете кнопку отправки, чтобы увидеть результат.

Передача информации с помощью метода POST

Обычно более надежным методом передачи информации программе CGI является метод POST. Это упаковывает информацию точно так же, как методы GET, но вместо того, чтобы отправлять ее в виде текстовой строки после символа? в URL-адресе он отправляет его как отдельное сообщение. Это сообщение поступает в сценарий CGI в виде стандартного ввода.

Ниже приведен тот же скрипт hello_get.py, который обрабатывает GET, а также метод POST.

#!/usr/bin/python

# Import modules for CGI handling 
import cgi, cgitb 

# Create instance of FieldStorage 
form = cgi.FieldStorage() 

# Get data from fields
first_name = form.getvalue('first_name')
last_name  = form.getvalue('last_name')

print "Content-type:text/html\r\n\r\n"
print "<html>"
print "<head>"
print "<title>Hello - Second CGI Program</title>"
print "</head>"
print "<body>"
print "<h2>Hello %s %s</h2>" % (first_name, last_name)
print "</body>"
print "</html>"

Давайте снова возьмем тот же пример, что и выше, который передает два значения с помощью HTML FORM и кнопки отправки. Мы используем тот же сценарий CGI hello_get.py для обработки этого ввода.

<form action = "/cgi-bin/hello_get.py" method = "post">
First Name: <input type = "text" name = "first_name"><br />
Last Name: <input type = "text" name = "last_name" />

<input type = "submit" value = "Submit" />
</form>

Вот фактический результат вышеуказанной формы. Вы вводите имя и фамилию, а затем нажимаете кнопку отправки, чтобы увидеть результат.

Передача данных флажка в программу CGI

Флажки используются, когда требуется выбрать более одного параметра.

Вот пример HTML-кода для формы с двумя флажками -

<form action = "/cgi-bin/checkbox.cgi" method = "POST" target = "_blank">
<input type = "checkbox" name = "maths" value = "on" /> Maths
<input type = "checkbox" name = "physics" value = "on" /> Physics
<input type = "submit" value = "Select Subject" />
</form>

Результатом этого кода является следующая форма -

Ниже приведен сценарий checkbox.cgi для обработки ввода, предоставленного веб-браузером для кнопки флажка.

#!/usr/bin/python

# Import modules for CGI handling 
import cgi, cgitb 

# Create instance of FieldStorage 
form = cgi.FieldStorage() 

# Get data from fields
if form.getvalue('maths'):
   math_flag = "ON"
else:
   math_flag = "OFF"

if form.getvalue('physics'):
   physics_flag = "ON"
else:
   physics_flag = "OFF"

print "Content-type:text/html\r\n\r\n"
print "<html>"
print "<head>"
print "<title>Checkbox - Third CGI Program</title>"
print "</head>"
print "<body>"
print "<h2> CheckBox Maths is : %s</h2>" % math_flag
print "<h2> CheckBox Physics is : %s</h2>" % physics_flag
print "</body>"
print "</html>"

Передача данных радиокнопки в программу CGI

Радиокнопки используются, когда требуется выбрать только один вариант.

Вот пример HTML-кода для формы с двумя переключателями -

<form action = "/cgi-bin/radiobutton.py" method = "post" target = "_blank">
<input type = "radio" name = "subject" value = "maths" /> Maths
<input type = "radio" name = "subject" value = "physics" /> Physics
<input type = "submit" value = "Select Subject" />
</form>

Результатом этого кода является следующая форма -

Ниже приведен сценарий radiobutton.py для обработки ввода, предоставленного веб-браузером для переключателя -

#!/usr/bin/python

# Import modules for CGI handling 
import cgi, cgitb 

# Create instance of FieldStorage 
form = cgi.FieldStorage() 

# Get data from fields
if form.getvalue('subject'):
   subject = form.getvalue('subject')
else:
   subject = "Not set"

print "Content-type:text/html\r\n\r\n"
print "<html>"
print "<head>"
print "<title>Radio - Fourth CGI Program</title>"
print "</head>"
print "<body>"
print "<h2> Selected Subject is %s</h2>" % subject
print "</body>"
print "</html>"

Передача данных текстовой области в программу CGI

Элемент TEXTAREA используется, когда многострочный текст должен быть передан программе CGI.

Вот пример HTML-кода для формы с полем ТЕКСТАРА -

<form action = "/cgi-bin/textarea.py" method = "post" target = "_blank">
<textarea name = "textcontent" cols = "40" rows = "4">
Type your text here...
</textarea>
<input type = "submit" value = "Submit" />
</form>

Результатом этого кода является следующая форма -

Ниже приведен скрипт textarea.cgi для обработки ввода, предоставленного веб-браузером -

#!/usr/bin/python

# Import modules for CGI handling 
import cgi, cgitb 

# Create instance of FieldStorage 
form = cgi.FieldStorage() 

# Get data from fields
if form.getvalue('textcontent'):
   text_content = form.getvalue('textcontent')
else:
   text_content = "Not entered"

print "Content-type:text/html\r\n\r\n"
print "<html>"
print "<head>";
print "<title>Text Area - Fifth CGI Program</title>"
print "</head>"
print "<body>"
print "<h2> Entered Text Content is %s</h2>" % text_content
print "</body>"

Передача данных раскрывающегося списка в программу CGI

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

Вот пример HTML-кода для формы с одним раскрывающимся списком -

<form action = "/cgi-bin/dropdown.py" method = "post" target = "_blank">
<select name = "dropdown">
<option value = "Maths" selected>Maths</option>
<option value = "Physics">Physics</option>
</select>
<input type = "submit" value = "Submit"/>
</form>

Результатом этого кода является следующая форма -

Ниже приведен сценарий dropdown.py для обработки ввода, предоставленного веб-браузером.

#!/usr/bin/python

# Import modules for CGI handling 
import cgi, cgitb 

# Create instance of FieldStorage 
form = cgi.FieldStorage() 

# Get data from fields
if form.getvalue('dropdown'):
   subject = form.getvalue('dropdown')
else:
   subject = "Not entered"

print "Content-type:text/html\r\n\r\n"
print "<html>"
print "<head>"
print "<title>Dropdown Box - Sixth CGI Program</title>"
print "</head>"
print "<body>"
print "<h2> Selected Subject is %s</h2>" % subject
print "</body>"
print "</html>"

Использование файлов cookie в CGI

Протокол HTTP - это протокол без сохранения состояния. Для коммерческого веб-сайта требуется поддерживать информацию о сеансе между разными страницами. Например, регистрация одного пользователя заканчивается после заполнения множества страниц. Как сохранить информацию о сеансе пользователя на всех веб-страницах?

Во многих ситуациях использование файлов cookie является наиболее эффективным методом запоминания и отслеживания предпочтений, покупок, комиссионных и другой информации, необходимой для лучшего взаимодействия с посетителями или статистики сайта.

Как это устроено?

Ваш сервер отправляет некоторые данные в браузер посетителя в виде файла cookie. Браузер может принять файл cookie. Если это так, он сохраняется в виде простой текстовой записи на жестком диске посетителя. Теперь, когда посетитель переходит на другую страницу вашего сайта, cookie доступен для поиска. После получения ваш сервер знает / запоминает, что было сохранено.

Файлы cookie представляют собой запись данных в виде простого текста из 5 полей переменной длины:

  • Expires- Дата истечения срока действия cookie. Если это поле пусто, срок действия cookie истечет, когда посетитель закроет браузер.

  • Domain - Доменное имя вашего сайта.

  • Path- Путь к каталогу или веб-странице, которая устанавливает cookie. Это может быть пустое поле, если вы хотите получить cookie из любого каталога или страницы.

  • Secure- Если это поле содержит слово «безопасный», то файл cookie может быть получен только с помощью безопасного сервера. Если это поле пустое, такое ограничение отсутствует.

  • Name=Value - Файлы cookie устанавливаются и извлекаются в виде пар ключ-значение.

Настройка файлов cookie

Отправить файлы cookie в браузер очень просто. Эти файлы cookie отправляются вместе с заголовком HTTP до поля Content-type. Предполагая, что вы хотите установить UserID и Password как файлы cookie. Настройка файлов cookie выполняется следующим образом -

#!/usr/bin/python

print "Set-Cookie:UserID = XYZ;\r\n"
print "Set-Cookie:Password = XYZ123;\r\n"
print "Set-Cookie:Expires = Tuesday, 31-Dec-2007 23:12:40 GMT";\r\n"
print "Set-Cookie:Domain = www.tutorialspoint.com;\r\n"
print "Set-Cookie:Path = /perl;\n"
print "Content-type:text/html\r\n\r\n"
...........Rest of the HTML Content....

Из этого примера вы, должно быть, поняли, как устанавливать файлы cookie. Мы используемSet-Cookie Заголовок HTTP для установки файлов cookie.

Необязательно устанавливать такие атрибуты файлов cookie, как Expires, Domain и Path. Примечательно, что файлы cookie устанавливаются перед отправкой волшебной строки"Content-type:text/html\r\n\r\n.

Получение файлов cookie

Получить все установленные файлы cookie очень просто. Файлы cookie хранятся в переменной среды CGI HTTP_COOKIE, и они будут иметь следующую форму:

key1 = value1;key2 = value2;key3 = value3....

Вот пример того, как получить файлы cookie.

#!/usr/bin/python

# Import modules for CGI handling 
from os import environ
import cgi, cgitb

if environ.has_key('HTTP_COOKIE'):
   for cookie in map(strip, split(environ['HTTP_COOKIE'], ';')):
      (key, value ) = split(cookie, '=');
      if key == "UserID":
         user_id = value

      if key == "Password":
         password = value

print "User ID  = %s" % user_id
print "Password = %s" % password

Это дает следующий результат для файлов cookie, установленных указанным выше сценарием:

User ID = XYZ
Password = XYZ123

Пример загрузки файла

Чтобы загрузить файл, HTML-форма должна иметь атрибут enctype, установленный на multipart/form-data. Тег ввода с типом файла создает кнопку «Обзор».

<html>
<body>
   <form enctype = "multipart/form-data" 
                     action = "save_file.py" method = "post">
   <p>File: <input type = "file" name = "filename" /></p>
   <p><input type = "submit" value = "Upload" /></p>
   </form>
</body>
</html>

Результатом этого кода является следующая форма -

Приведенный выше пример был намеренно отключен, чтобы люди не загружали файл на наш сервер, но вы можете попробовать приведенный выше код на своем сервере.

Вот сценарий save_file.py для обработки загрузки файла -

#!/usr/bin/python

import cgi, os
import cgitb; cgitb.enable()

form = cgi.FieldStorage()

# Get filename here.
fileitem = form['filename']

# Test if the file was uploaded
if fileitem.filename:
   # strip leading path from file name to avoid 
   # directory traversal attacks
   fn = os.path.basename(fileitem.filename)
   open('/tmp/' + fn, 'wb').write(fileitem.file.read())

   message = 'The file "' + fn + '" was uploaded successfully'
   
else:
   message = 'No file was uploaded'
   
print """\
Content-Type: text/html\n
<html>
<body>
   <p>%s</p>
</body>
</html>
""" % (message,)

Если вы запустите приведенный выше сценарий в Unix / Linux, вам необходимо позаботиться о замене разделителя файлов следующим образом, в противном случае на вашем компьютере с Windows вышеупомянутый оператор open () должен работать нормально.

fn = os.path.basename(fileitem.filename.replace("\\", "/" ))

Как открыть диалоговое окно "Загрузка файла"?

Иногда желательно предоставить вариант, в котором пользователь может щелкнуть ссылку, и для пользователя появится диалоговое окно «Загрузка файла» вместо отображения фактического содержимого. Это очень просто и может быть достигнуто через HTTP-заголовок. Этот заголовок HTTP отличается от заголовка, упомянутого в предыдущем разделе.

Например, если вы хотите сделать FileName файл, загружаемый по заданной ссылке, то его синтаксис следующий:

#!/usr/bin/python

# HTTP Header
print "Content-Type:application/octet-stream; name = \"FileName\"\r\n";
print "Content-Disposition: attachment; filename = \"FileName\"\r\n\n";

# Actual File Content will go here.
fo = open("foo.txt", "rb")

str = fo.read();
print str

# Close opend file
fo.close()

Надеюсь, вам понравился этот урок. Если да, отправьте мне свой отзыв по адресу: Свяжитесь с нами

Стандарт Python для интерфейсов баз данных - Python DB-API. Большинство интерфейсов баз данных Python соответствуют этому стандарту.

Вы можете выбрать подходящую базу данных для своего приложения. Python Database API поддерживает широкий спектр серверов баз данных, таких как -

  • GadFly
  • mSQL
  • MySQL
  • PostgreSQL
  • Microsoft SQL Server 2000
  • Informix
  • Interbase
  • Oracle
  • Sybase

Вот список доступных интерфейсов базы данных Python : Интерфейсы и API базы данных Python . Вы должны загрузить отдельный модуль DB API для каждой базы данных, к которой вам нужен доступ. Например, если вам нужно получить доступ к базе данных Oracle, а также к базе данных MySQL, вы должны загрузить модули базы данных Oracle и MySQL.

API БД обеспечивает минимальный стандарт для работы с базами данных с использованием структур и синтаксиса Python везде, где это возможно. Этот API включает в себя следующее -

  • Импорт модуля API.
  • Установление соединения с базой данных.
  • Выполнение операторов SQL и хранимых процедур.
  • Закрытие соединения

Мы изучили бы все концепции, используя MySQL, поэтому давайте поговорим о модуле MySQLdb.

Что такое MySQLdb?

MySQLdb - это интерфейс для подключения к серверу базы данных MySQL из Python. Он реализует Python Database API v2.0 и построен поверх MySQL C API.

Как установить MySQLdb?

Прежде чем продолжить, убедитесь, что на вашем компьютере установлен MySQLdb. Просто введите в свой скрипт Python следующее и выполните его:

#!/usr/bin/python

import MySQLdb

Если он дает следующий результат, это означает, что модуль MySQLdb не установлен -

Traceback (most recent call last):
   File "test.py", line 3, in <module>
      import MySQLdb
ImportError: No module named MySQLdb

Чтобы установить модуль MySQLdb, используйте следующую команду -

For Ubuntu, use the following command -
$ sudo apt-get install python-pip python-dev libmysqlclient-dev For Fedora, use the following command - $ sudo dnf install python python-devel mysql-devel redhat-rpm-config gcc
For Python command prompt, use the following command -
pip install MySQL-python

Note - Убедитесь, что у вас есть права root для установки вышеуказанного модуля.

Подключение к базе данных

Перед подключением к базе данных MySQL убедитесь в следующем:

  • Вы создали базу данных TESTDB.

  • Вы создали таблицу EMPLOYEE в TESTDB.

  • В этой таблице есть поля FIRST_NAME, LAST_NAME, AGE, SEX и INCOME.

  • Идентификатор пользователя testuser и пароль test123 установлены для доступа к TESTDB.

  • Модуль Python MySQLdb правильно установлен на вашем компьютере.

  • Вы прошли обучение MySQL, чтобы понять основы MySQL.

пример

Ниже приведен пример подключения к базе данных MySQL «TESTDB».

#!/usr/bin/python

import MySQLdb

# Open database connection
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )

# prepare a cursor object using cursor() method
cursor = db.cursor()

# execute SQL query using execute() method.
cursor.execute("SELECT VERSION()")

# Fetch a single row using fetchone() method.
data = cursor.fetchone()
print "Database version : %s " % data

# disconnect from server
db.close()

При запуске этого сценария на моем компьютере с Linux он дает следующий результат.

Database version : 5.0.45

Если соединение установлено с источником данных, то объект соединения возвращается и сохраняется в db для дальнейшего использования, в противном случае dbустановлено значение Нет. Следующий,db объект используется для создания cursorобъект, который, в свою очередь, используется для выполнения SQL-запросов. Наконец, перед выходом он гарантирует, что соединение с базой данных закрыто и ресурсы освобождены.

Создание таблицы базы данных

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

пример

Давайте создадим таблицу базы данных EMPLOYEE -

#!/usr/bin/python

import MySQLdb

# Open database connection
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )

# prepare a cursor object using cursor() method
cursor = db.cursor()

# Drop table if it already exist using execute() method.
cursor.execute("DROP TABLE IF EXISTS EMPLOYEE")

# Create table as per requirement
sql = """CREATE TABLE EMPLOYEE (
         FIRST_NAME  CHAR(20) NOT NULL,
         LAST_NAME  CHAR(20),
         AGE INT,  
         SEX CHAR(1),
         INCOME FLOAT )"""

cursor.execute(sql)

# disconnect from server
db.close()

ВСТАВИТЬ операцию

Это необходимо, когда вы хотите создать свои записи в таблице базы данных.

пример

В следующем примере выполняется инструкция SQL INSERT для создания записи в таблице EMPLOYEE:

#!/usr/bin/python

import MySQLdb

# Open database connection
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )

# prepare a cursor object using cursor() method
cursor = db.cursor()

# Prepare SQL query to INSERT a record into the database.
sql = """INSERT INTO EMPLOYEE(FIRST_NAME,
         LAST_NAME, AGE, SEX, INCOME)
         VALUES ('Mac', 'Mohan', 20, 'M', 2000)"""
try:
   # Execute the SQL command
   cursor.execute(sql)
   # Commit your changes in the database
   db.commit()
except:
   # Rollback in case there is any error
   db.rollback()

# disconnect from server
db.close()

Приведенный выше пример можно записать следующим образом для динамического создания запросов SQL:

#!/usr/bin/python

import MySQLdb

# Open database connection
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )

# prepare a cursor object using cursor() method
cursor = db.cursor()

# Prepare SQL query to INSERT a record into the database.
sql = "INSERT INTO EMPLOYEE(FIRST_NAME, \
       LAST_NAME, AGE, SEX, INCOME) \
       VALUES ('%s', '%s', '%d', '%c', '%d' )" % \
       ('Mac', 'Mohan', 20, 'M', 2000)
try:
   # Execute the SQL command
   cursor.execute(sql)
   # Commit your changes in the database
   db.commit()
except:
   # Rollback in case there is any error
   db.rollback()

# disconnect from server
db.close()

пример

Следующий сегмент кода - это еще одна форма выполнения, в которой вы можете напрямую передавать параметры -

..................................
user_id = "test123"
password = "password"

con.execute('insert into Login values("%s", "%s")' % \
             (user_id, password))
..................................

ПРОЧИТАТЬ операцию

READ Операция с любой базой данных означает получение некоторой полезной информации из базы данных.

Как только наша база данных будет установлена, вы готовы сделать запрос в эту базу данных. Вы можете использовать либоfetchone() метод для получения отдельной записи или fetchall() метод для извлечения нескольких значений из таблицы базы данных.

  • fetchone()- Выбирает следующую строку набора результатов запроса. Набор результатов - это объект, который возвращается, когда объект курсора используется для запроса таблицы.

  • fetchall()- Выбирает все строки в наборе результатов. Если некоторые строки уже были извлечены из набора результатов, тогда он извлекает оставшиеся строки из набора результатов.

  • rowcount - Это атрибут только для чтения и возвращает количество строк, на которые повлиял метод execute ().

пример

Следующая процедура запрашивает все записи из таблицы EMPLOYEE с зарплатой более 1000:

#!/usr/bin/python

import MySQLdb

# Open database connection
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )

# prepare a cursor object using cursor() method
cursor = db.cursor()

sql = "SELECT * FROM EMPLOYEE \
       WHERE INCOME > '%d'" % (1000)
try:
   # Execute the SQL command
   cursor.execute(sql)
   # Fetch all the rows in a list of lists.
   results = cursor.fetchall()
   for row in results:
      fname = row[0]
      lname = row[1]
      age = row[2]
      sex = row[3]
      income = row[4]
      # Now print fetched result
      print "fname=%s,lname=%s,age=%d,sex=%s,income=%d" % \
             (fname, lname, age, sex, income )
except:
   print "Error: unable to fecth data"

# disconnect from server
db.close()

Это даст следующий результат -

fname=Mac, lname=Mohan, age=20, sex=M, income=2000

Операция обновления

UPDATE Операция с любой базой данных означает обновление одной или нескольких записей, которые уже доступны в базе данных.

Следующая процедура обновляет все записи, имеющие SEX как 'M'. Здесь мы увеличиваем ВОЗРАСТ всех мужчин на один год.

пример

#!/usr/bin/python

import MySQLdb

# Open database connection
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )

# prepare a cursor object using cursor() method
cursor = db.cursor()

# Prepare SQL query to UPDATE required records
sql = "UPDATE EMPLOYEE SET AGE = AGE + 1
                          WHERE SEX = '%c'" % ('M')
try:
   # Execute the SQL command
   cursor.execute(sql)
   # Commit your changes in the database
   db.commit()
except:
   # Rollback in case there is any error
   db.rollback()

# disconnect from server
db.close()

УДАЛИТЬ операцию

Операция DELETE требуется, если вы хотите удалить некоторые записи из своей базы данных. Ниже приведена процедура удаления всех записей из СОТРУДНИКА, если ВОЗРАСТ больше 20 -

пример

#!/usr/bin/python

import MySQLdb

# Open database connection
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )

# prepare a cursor object using cursor() method
cursor = db.cursor()

# Prepare SQL query to DELETE required records
sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20)
try:
   # Execute the SQL command
   cursor.execute(sql)
   # Commit your changes in the database
   db.commit()
except:
   # Rollback in case there is any error
   db.rollback()

# disconnect from server
db.close()

Выполнение транзакций

Транзакции - это механизм, обеспечивающий согласованность данных. Транзакции имеют следующие четыре свойства -

  • Atomicity - Либо транзакция завершается, либо вообще ничего не происходит.

  • Consistency - Транзакция должна начинаться в согласованном состоянии и оставлять систему в согласованном состоянии.

  • Isolation - Промежуточные результаты транзакции не видны вне текущей транзакции.

  • Durability - После фиксации транзакции последствия сохраняются даже после сбоя системы.

Python DB API 2.0 предоставляет два метода для фиксации или отката транзакции.

пример

Вы уже знаете, как проводить транзакции. Вот снова похожий пример -

# Prepare SQL query to DELETE required records
sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20)
try:
   # Execute the SQL command
   cursor.execute(sql)
   # Commit your changes in the database
   db.commit()
except:
   # Rollback in case there is any error
   db.rollback()

COMMIT Operation

Фиксация - это операция, которая дает зеленый сигнал базе данных о завершении изменений, и после этой операции никакие изменения не могут быть отменены.

Вот простой пример для вызова commit метод.

db.commit()

ROLLBACK Операция

Если вас не устраивают одно или несколько изменений и вы хотите полностью отменить эти изменения, используйте rollback() метод.

Вот простой пример для вызова rollback() метод.

db.rollback()

Отключение базы данных

Чтобы отключить соединение с БД, используйте метод close ().

db.close()

Если соединение с базой данных закрывается пользователем с помощью метода close (), все невыполненные транзакции откатываются БД. Однако вместо того, чтобы зависеть от каких-либо деталей реализации нижнего уровня БД, вашему приложению было бы лучше явно вызывать фиксацию или откат.

Обработка ошибок

Есть много источников ошибок. Несколько примеров - это синтаксическая ошибка в выполненном операторе SQL, сбой соединения или вызов метода выборки для уже отмененного или завершенного дескриптора оператора.

API БД определяет количество ошибок, которые должны существовать в каждом модуле базы данных. В следующей таблице перечислены эти исключения.

Sr.No. Исключение и описание
1

Warning

Используется для некритических проблем. Должен быть подклассом StandardError.

2

Error

Базовый класс для ошибок. Должен быть подклассом StandardError.

3

InterfaceError

Используется для ошибок в модуле базы данных, а не в самой базе данных. Должен быть подкласс Error.

4

DatabaseError

Используется для ошибок в базе данных. Должен быть подкласс Error.

5

DataError

Подкласс DatabaseError, который относится к ошибкам в данных.

6

OperationalError

Подкласс DatabaseError, который относится к таким ошибкам, как потеря соединения с базой данных. Эти ошибки обычно находятся вне контроля сценария Python.

7

IntegrityError

Подкласс DatabaseError для ситуаций, которые могут повредить реляционную целостность, таких как ограничения уникальности или внешние ключи.

8

InternalError

Подкласс DatabaseError, который относится к внутренним ошибкам модуля базы данных, таким как курсор больше не активен.

9

ProgrammingError

Подкласс DatabaseError, который ссылается на такие ошибки, как неправильное имя таблицы и другие вещи, в которых можно спокойно винить вас.

10

NotSupportedError

Подкласс DatabaseError, который относится к попытке вызвать неподдерживаемую функцию.

Ваши сценарии Python должны обрабатывать эти ошибки, но перед использованием любого из вышеперечисленных исключений убедитесь, что ваша база данных MySQL поддерживает это исключение. Вы можете получить больше информации о них, прочитав спецификацию DB API 2.0.

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

Python также имеет библиотеки, которые обеспечивают доступ более высокого уровня к определенным сетевым протоколам уровня приложения, таким как FTP, HTTP и т. Д.

Эта глава дает вам представление о самой известной концепции в сети - программировании сокетов.

Что такое сокеты?

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

Сокеты могут быть реализованы по нескольким типам каналов: сокеты домена Unix, TCP, UDP и так далее. Библиотека сокетов предоставляет определенные классы для обработки общих транспортов, а также общий интерфейс для обработки остальных.

У сокетов есть свой словарный запас -

Sr.No. Срок и описание
1

Domain

Семейство протоколов, которое используется в качестве транспортного механизма. Эти значения являются константами, такими как AF_INET, PF_INET, PF_UNIX, PF_X25 и т. Д.

2

type

Тип связи между двумя конечными точками, обычно SOCK_STREAM для протоколов с установлением соединения и SOCK_DGRAM для протоколов без установления соединения.

3

protocol

Обычно ноль, это может использоваться для идентификации варианта протокола в домене и типе.

4

hostname

Идентификатор сетевого интерфейса -

  • Строка, которая может быть именем хоста, адресом с четырьмя точками или адресом IPV6 в двоеточии (и, возможно, точкой).

  • Строка «<трансляция>», которая указывает адрес INADDR_BROADCAST.

  • Строка нулевой длины, указывающая INADDR_ANY, или

  • Целое число, интерпретируемое как двоичный адрес в байтовом порядке хоста.

5

port

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

Разъем модуля

Чтобы создать сокет, вы должны использовать функцию socket.socket (), доступную в модуле сокета , которая имеет общий синтаксис -

s = socket.socket (socket_family, socket_type, protocol=0)

Вот описание параметров -

  • socket_family - Это либо AF_UNIX, либо AF_INET, как объяснялось ранее.

  • socket_type - Это либо SOCK_STREAM, либо SOCK_DGRAM.

  • protocol - Обычно это не учитывается, по умолчанию - 0.

Если у вас есть объект сокета , вы можете использовать необходимые функции для создания клиентской или серверной программы. Ниже приведен список необходимых функций -

Методы серверных сокетов

Sr.No. Метод и описание
1

s.bind()

Этот метод связывает адрес (имя хоста, пару номеров порта) с сокетом.

2

s.listen()

Этот метод устанавливает и запускает прослушиватель TCP.

3

s.accept()

Это пассивно принимает клиентское TCP-соединение, ожидая его прибытия (блокировка).

Методы клиентских сокетов

Sr.No. Метод и описание
1

s.connect()

Этот метод активно инициирует соединение с TCP-сервером.

Общие методы сокетов

Sr.No. Метод и описание
1

s.recv()

Этот метод получает сообщение TCP

2

s.send()

Этот метод передает сообщение TCP

3

s.recvfrom()

Этот метод получает сообщение UDP

4

s.sendto()

Этот метод передает сообщение UDP

5

s.close()

Этот метод закрывает сокет

6

socket.gethostname()

Возвращает имя хоста.

Простой сервер

Для написания интернет-серверов мы используем socketфункция, доступная в модуле сокета, для создания объекта сокета. Затем объект сокета используется для вызова других функций для настройки сервера сокетов.

Сейчас звоните bind(hostname, port)функция, чтобы указать порт для вашей службы на данном хосте.

Затем вызовите метод accept возвращенного объекта. Этот метод ожидает, пока клиент не подключится к указанному вами порту, а затем возвращает объект подключения , представляющий подключение к этому клиенту.

#!/usr/bin/python           # This is server.py file

import socket               # Import socket module

s = socket.socket()         # Create a socket object
host = socket.gethostname() # Get local machine name
port = 12345                # Reserve a port for your service.
s.bind((host, port))        # Bind to the port

s.listen(5)                 # Now wait for client connection.
while True:
   c, addr = s.accept()     # Establish connection with client.
   print 'Got connection from', addr
   c.send('Thank you for connecting')
   c.close()                # Close the connection

Простой клиент

Давайте напишем очень простую клиентскую программу, которая открывает соединение с заданным портом 12345 и заданным хостом. Создать клиент сокета с помощью функции модуля сокета Python очень просто .

В socket.connect(hosname, port )открывает TCP-соединение с именем хоста на порту . Когда у вас открыт сокет, вы можете читать из него, как любой объект ввода-вывода. Когда закончите, не забудьте закрыть его, как если бы вы закрывали файл.

Следующий код представляет собой очень простой клиент, который подключается к заданному хосту и порту, считывает любые доступные данные из сокета, а затем выходит:

#!/usr/bin/python           # This is client.py file

import socket               # Import socket module

s = socket.socket()         # Create a socket object
host = socket.gethostname() # Get local machine name
port = 12345                # Reserve a port for your service.

s.connect((host, port))
print s.recv(1024)
s.close()                  # Close the socket when done

Теперь запустите этот server.py в фоновом режиме, а затем запустите выше client.py, чтобы увидеть результат.

# Following would start a server in background.
$ python server.py & # Once server is started run client as follows: $ python client.py

Это даст следующий результат -

Got connection from ('127.0.0.1', 48437)
Thank you for connecting

Интернет-модули Python

Список некоторых важных модулей в сетевом / Интернет-программировании Python.

Протокол Общая функция Номер порта Модуль Python
HTTP интернет страницы 80 httplib, urllib, xmlrpclib
NNTP Новости Usenet 119 nntplib
FTP Передача файлов 20 ftplib, urllib
SMTP Отправка электронной почты 25 smtplib
POP3 Получение электронной почты 110 поплиб
IMAP4 Получение электронной почты 143 imaplib
Telnet Командные строки 23 telnetlib
Суслик Переводы документов 70 gopherlib, urllib

Пожалуйста, проверьте все упомянутые выше библиотеки для работы с протоколами FTP, SMTP, POP и IMAP.

Дополнительная литература

Это было быстрое начало программирования сокетов. Это обширная тема. Рекомендуется перейти по следующей ссылке, чтобы узнать больше -

  • Программирование сокетов Unix .

  • Библиотека сокетов Python и модули .

Простой протокол передачи почты (SMTP) - это протокол, который обрабатывает отправку электронной почты и маршрутизацию электронной почты между почтовыми серверами.

Python предоставляет smtplib модуль, который определяет объект сеанса клиента SMTP, который можно использовать для отправки почты на любой компьютер в Интернете с помощью демона прослушивателя SMTP или ESMTP.

Вот простой синтаксис для создания одного объекта SMTP, который позже можно использовать для отправки электронной почты:

import smtplib

smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )

Вот подробная информация о параметрах -

  • host- Это хост, на котором запущен ваш SMTP-сервер. Вы можете указать IP-адрес хоста или доменное имя, например, tutorialspoint.com. Это необязательный аргумент.

  • port- Если вы указываете аргумент хоста , то вам нужно указать порт, на котором SMTP-сервер слушает. Обычно это порт 25.

  • local_hostname- Если ваш SMTP-сервер работает на вашем локальном компьютере, вы можете указать только localhost в этой опции.

У объекта SMTP есть метод экземпляра, называемый sendmail, который обычно используется для отправки сообщения по почте. Требуется три параметра -

  • Отправитель - строка с адресом отправителя.

  • В Приемники - список А строк, один для каждого получателя.

  • Сообщение - сообщение в виде строки , отформатированной как указано в различном РЛКЕ.

пример

Вот простой способ отправить одно электронное письмо с помощью скрипта Python. Попробуй один раз -

#!/usr/bin/python

import smtplib

sender = '[email protected]'
receivers = ['[email protected]']

message = """From: From Person <[email protected]>
To: To Person <[email protected]>
Subject: SMTP e-mail test

This is a test e-mail message.
"""

try:
   smtpObj = smtplib.SMTP('localhost')
   smtpObj.sendmail(sender, receivers, message)         
   print "Successfully sent email"
except SMTPException:
   print "Error: unable to send email"

Here, you have placed a basic e-mail in message, using a triple quote, taking care to format the headers correctly. An e-mail requires a From, To, and Subject header, separated from the body of the e-mail with a blank line.

To send the mail you use smtpObj to connect to the SMTP server on the local machine and then use the sendmail method along with the message, the from address, and the destination address as parameters (even though the from and to addresses are within the e-mail itself, these aren't always used to route mail).

If you are not running an SMTP server on your local machine, you can use smtplib client to communicate with a remote SMTP server. Unless you are using a webmail service (such as Hotmail or Yahoo! Mail), your e-mail provider must have provided you with outgoing mail server details that you can supply them, as follows −

smtplib.SMTP('mail.your-domain.com', 25)

Sending an HTML e-mail using Python

When you send a text message using Python, then all the content are treated as simple text. Even if you include HTML tags in a text message, it is displayed as simple text and HTML tags will not be formatted according to HTML syntax. But Python provides option to send an HTML message as actual HTML message.

While sending an e-mail message, you can specify a Mime version, content type and character set to send an HTML e-mail.

Example

Following is the example to send HTML content as an e-mail. Try it once −

#!/usr/bin/python

import smtplib

message = """From: From Person <[email protected]>
To: To Person <[email protected]>
MIME-Version: 1.0
Content-type: text/html
Subject: SMTP HTML e-mail test

This is an e-mail message to be sent in HTML format

<b>This is HTML message.</b>
<h1>This is headline.</h1>
"""

try:
   smtpObj = smtplib.SMTP('localhost')
   smtpObj.sendmail(sender, receivers, message)         
   print "Successfully sent email"
except SMTPException:
   print "Error: unable to send email"

Sending Attachments as an E-mail

To send an e-mail with mixed content requires to set Content-type header to multipart/mixed. Then, text and attachment sections can be specified within boundaries.

A boundary is started with two hyphens followed by a unique number, which cannot appear in the message part of the e-mail. A final boundary denoting the e-mail's final section must also end with two hyphens.

Attached files should be encoded with the pack("m") function to have base64 encoding before transmission.

Example

Following is the example, which sends a file /tmp/test.txt as an attachment. Try it once −

#!/usr/bin/python

import smtplib
import base64

filename = "/tmp/test.txt"

# Read a file and encode it into base64 format
fo = open(filename, "rb")
filecontent = fo.read()
encodedcontent = base64.b64encode(filecontent)  # base64

sender = '[email protected]'
reciever = '[email protected]'

marker = "AUNIQUEMARKER"

body ="""
This is a test email to send an attachement.
"""
# Define the main headers.
part1 = """From: From Person <[email protected]>
To: To Person <[email protected]>
Subject: Sending Attachement
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=%s
--%s
""" % (marker, marker)

# Define the message action
part2 = """Content-Type: text/plain
Content-Transfer-Encoding:8bit

%s
--%s
""" % (body,marker)

# Define the attachment section
part3 = """Content-Type: multipart/mixed; name=\"%s\"
Content-Transfer-Encoding:base64
Content-Disposition: attachment; filename=%s

%s
--%s--
""" %(filename, filename, encodedcontent, marker)
message = part1 + part2 + part3

try:
   smtpObj = smtplib.SMTP('localhost')
   smtpObj.sendmail(sender, reciever, message)
   print "Successfully sent email"
except Exception:
   print "Error: unable to send email"

Running several threads is similar to running several different programs concurrently, but with the following benefits −

  • Multiple threads within a process share the same data space with the main thread and can therefore share information or communicate with each other more easily than if they were separate processes.

  • Threads sometimes called light-weight processes and they do not require much memory overhead; they are cheaper than processes.

A thread has a beginning, an execution sequence, and a conclusion. It has an instruction pointer that keeps track of where within its context it is currently running.

  • It can be pre-empted (interrupted)

  • It can temporarily be put on hold (also known as sleeping) while other threads are running - this is called yielding.

Starting a New Thread

To spawn another thread, you need to call following method available in thread module −

thread.start_new_thread ( function, args[, kwargs] )

This method call enables a fast and efficient way to create new threads in both Linux and Windows.

The method call returns immediately and the child thread starts and calls function with the passed list of args. When function returns, the thread terminates.

Here, args is a tuple of arguments; use an empty tuple to call function without passing any arguments. kwargs is an optional dictionary of keyword arguments.

Example

#!/usr/bin/python

import thread
import time

# Define a function for the thread
def print_time( threadName, delay):
   count = 0
   while count < 5:
      time.sleep(delay)
      count += 1
      print "%s: %s" % ( threadName, time.ctime(time.time()) )

# Create two threads as follows
try:
   thread.start_new_thread( print_time, ("Thread-1", 2, ) )
   thread.start_new_thread( print_time, ("Thread-2", 4, ) )
except:
   print "Error: unable to start thread"

while 1:
   pass

Когда приведенный выше код выполняется, он дает следующий результат:

Thread-1: Thu Jan 22 15:42:17 2009
Thread-1: Thu Jan 22 15:42:19 2009
Thread-2: Thu Jan 22 15:42:19 2009
Thread-1: Thu Jan 22 15:42:21 2009
Thread-2: Thu Jan 22 15:42:23 2009
Thread-1: Thu Jan 22 15:42:23 2009
Thread-1: Thu Jan 22 15:42:25 2009
Thread-2: Thu Jan 22 15:42:27 2009
Thread-2: Thu Jan 22 15:42:31 2009
Thread-2: Thu Jan 22 15:42:35 2009

Хотя он очень эффективен для низкоуровневых потоков, но модуль потоков очень ограничен по сравнению с более новым модулем потоков.

Threading Модуль

Более новый модуль потоковой передачи, включенный в Python 2.4, обеспечивает гораздо более мощную и высокоуровневую поддержку потоков, чем модуль потоков, описанный в предыдущем разделе.

Модуль потоковой передачи предоставляет все методы модуля потоков и предоставляет некоторые дополнительные методы:

  • threading.activeCount() - Возвращает количество активных объектов потока.

  • threading.currentThread() - Возвращает количество объектов потока в элементе управления потоком вызывающего объекта.

  • threading.enumerate() - Возвращает список всех активных в данный момент объектов потока.

В дополнение к методам, модуль threading имеет класс Thread, который реализует потоки. Методы, предоставляемые классом Thread , следующие:

  • run() - Метод run () - это точка входа для потока.

  • start() - Метод start () запускает поток, вызывая метод run.

  • join([time]) - join () ожидает завершения потоков.

  • isAlive() - Метод isAlive () проверяет, выполняется ли все еще поток.

  • getName() - Метод getName () возвращает имя потока.

  • setName() - Метод setName () устанавливает имя потока.

Создание потока с использованием модуля Threading

Чтобы реализовать новый поток с использованием модуля потоковой передачи, вам необходимо сделать следующее:

  • Определите новый подкласс класса Thread .

  • Переопределите метод __init __ (self [, args]), чтобы добавить дополнительные аргументы.

  • Затем переопределите метод run (self [, args]), чтобы реализовать то, что поток должен делать при запуске.

Создав новый подкласс Thread , вы можете создать его экземпляр, а затем запустить новый поток, вызвав start () , который, в свою очередь, вызывает метод run () .

пример

#!/usr/bin/python

import threading
import time

exitFlag = 0

class myThread (threading.Thread):
   def __init__(self, threadID, name, counter):
      threading.Thread.__init__(self)
      self.threadID = threadID
      self.name = name
      self.counter = counter
   def run(self):
      print "Starting " + self.name
      print_time(self.name, self.counter, 5)
      print "Exiting " + self.name

def print_time(threadName, counter, delay):
   while counter:
      if exitFlag:
         threadName.exit()
      time.sleep(delay)
      print "%s: %s" % (threadName, time.ctime(time.time()))
      counter -= 1

# Create new threads
thread1 = myThread(1, "Thread-1", 1)
thread2 = myThread(2, "Thread-2", 2)

# Start new Threads
thread1.start()
thread2.start()

print "Exiting Main Thread"

Когда приведенный выше код выполняется, он дает следующий результат:

Starting Thread-1
Starting Thread-2
Exiting Main Thread
Thread-1: Thu Mar 21 09:10:03 2013
Thread-1: Thu Mar 21 09:10:04 2013
Thread-2: Thu Mar 21 09:10:04 2013
Thread-1: Thu Mar 21 09:10:05 2013
Thread-1: Thu Mar 21 09:10:06 2013
Thread-2: Thu Mar 21 09:10:06 2013
Thread-1: Thu Mar 21 09:10:07 2013
Exiting Thread-1
Thread-2: Thu Mar 21 09:10:08 2013
Thread-2: Thu Mar 21 09:10:10 2013
Thread-2: Thu Mar 21 09:10:12 2013
Exiting Thread-2

Синхронизация потоков

Модуль потоковой передачи, поставляемый с Python, включает простой в реализации механизм блокировки, который позволяет синхронизировать потоки. Новая блокировка создается путем вызова метода Lock () , который возвращает новую блокировку.

Метод получения (блокировки) нового объекта блокировки используется для принудительного выполнения потоков синхронно. Необязательный параметр блокировки позволяет вам контролировать, ожидает ли поток получения блокировки.

Если для блокировки установлено значение 0, поток немедленно возвращается со значением 0, если блокировка не может быть получена, и с 1, если блокировка была получена. Если для блокировки установлено значение 1, поток блокируется и ожидает снятия блокировки.

Метод release () нового объекта блокировки используется для снятия блокировки, когда она больше не требуется.

пример

#!/usr/bin/python

import threading
import time

class myThread (threading.Thread):
   def __init__(self, threadID, name, counter):
      threading.Thread.__init__(self)
      self.threadID = threadID
      self.name = name
      self.counter = counter
   def run(self):
      print "Starting " + self.name
      # Get lock to synchronize threads
      threadLock.acquire()
      print_time(self.name, self.counter, 3)
      # Free lock to release next thread
      threadLock.release()

def print_time(threadName, delay, counter):
   while counter:
      time.sleep(delay)
      print "%s: %s" % (threadName, time.ctime(time.time()))
      counter -= 1

threadLock = threading.Lock()
threads = []

# Create new threads
thread1 = myThread(1, "Thread-1", 1)
thread2 = myThread(2, "Thread-2", 2)

# Start new Threads
thread1.start()
thread2.start()

# Add threads to thread list
threads.append(thread1)
threads.append(thread2)

# Wait for all threads to complete
for t in threads:
    t.join()
print "Exiting Main Thread"

Когда приведенный выше код выполняется, он дает следующий результат:

Starting Thread-1
Starting Thread-2
Thread-1: Thu Mar 21 09:11:28 2013
Thread-1: Thu Mar 21 09:11:29 2013
Thread-1: Thu Mar 21 09:11:30 2013
Thread-2: Thu Mar 21 09:11:32 2013
Thread-2: Thu Mar 21 09:11:34 2013
Thread-2: Thu Mar 21 09:11:36 2013
Exiting Main Thread

Многопоточная приоритетная очередь

Модуль Queue позволяет вам создать новый объект очереди, который может содержать определенное количество элементов. Существуют следующие методы управления очередью -

  • get() - get () удаляет и возвращает элемент из очереди.

  • put() - Помещение добавляет элемент в очередь.

  • qsize() - qsize () возвращает количество элементов, которые в данный момент находятся в очереди.

  • empty()- Empty () возвращает True, если очередь пуста; в противном случае - False.

  • full()- full () возвращает True, если очередь заполнена; в противном случае - False.

пример

#!/usr/bin/python

import Queue
import threading
import time

exitFlag = 0

class myThread (threading.Thread):
   def __init__(self, threadID, name, q):
      threading.Thread.__init__(self)
      self.threadID = threadID
      self.name = name
      self.q = q
   def run(self):
      print "Starting " + self.name
      process_data(self.name, self.q)
      print "Exiting " + self.name

def process_data(threadName, q):
   while not exitFlag:
      queueLock.acquire()
         if not workQueue.empty():
            data = q.get()
            queueLock.release()
            print "%s processing %s" % (threadName, data)
         else:
            queueLock.release()
         time.sleep(1)

threadList = ["Thread-1", "Thread-2", "Thread-3"]
nameList = ["One", "Two", "Three", "Four", "Five"]
queueLock = threading.Lock()
workQueue = Queue.Queue(10)
threads = []
threadID = 1

# Create new threads
for tName in threadList:
   thread = myThread(threadID, tName, workQueue)
   thread.start()
   threads.append(thread)
   threadID += 1

# Fill the queue
queueLock.acquire()
for word in nameList:
   workQueue.put(word)
queueLock.release()

# Wait for queue to empty
while not workQueue.empty():
   pass

# Notify threads it's time to exit
exitFlag = 1

# Wait for all threads to complete
for t in threads:
   t.join()
print "Exiting Main Thread"

Когда приведенный выше код выполняется, он дает следующий результат:

Starting Thread-1
Starting Thread-2
Starting Thread-3
Thread-1 processing One
Thread-2 processing Two
Thread-3 processing Three
Thread-1 processing Four
Thread-2 processing Five
Exiting Thread-3
Exiting Thread-1
Exiting Thread-2
Exiting Main Thread

XML - это переносимый язык с открытым исходным кодом, который позволяет программистам разрабатывать приложения, которые могут быть прочитаны другими приложениями, независимо от операционной системы и / или языка разработки.

Что такое XML?

Extensible Markup Language (XML) - это язык разметки, очень похожий на HTML или SGML. Это рекомендовано Консорциумом World Wide Web и доступно в качестве открытого стандарта.

XML чрезвычайно полезен для отслеживания небольших и средних объемов данных, не требуя магистрали на основе SQL.

Архитектуры синтаксического анализатора XML и API

Стандартная библиотека Python предоставляет минимальный, но полезный набор интерфейсов для работы с XML.

Двумя наиболее основными и широко используемыми API для данных XML являются интерфейсы SAX и DOM.

  • Simple API for XML (SAX)- Здесь вы регистрируете обратные вызовы для интересующих событий, а затем позволяете синтаксическому анализатору пройти через документ. Это полезно, когда ваши документы большие или у вас есть ограничения памяти, он анализирует файл при чтении с диска, и весь файл никогда не сохраняется в памяти.

  • Document Object Model (DOM) API - Это рекомендация Консорциума World Wide Web, в которой весь файл считывается в память и сохраняется в иерархической (древовидной) форме для представления всех функций XML-документа.

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

SAX доступен только для чтения, а DOM позволяет вносить изменения в XML-файл. Поскольку эти два разных API буквально дополняют друг друга, нет причин, по которым вы не можете использовать их оба для больших проектов.

Для всех наших примеров кода XML давайте использовать в качестве входных данных простой XML-файл movies.xml -

<collection shelf="New Arrivals">
<movie title="Enemy Behind">
   <type>War, Thriller</type>
   <format>DVD</format>
   <year>2003</year>
   <rating>PG</rating>
   <stars>10</stars>
   <description>Talk about a US-Japan war</description>
</movie>
<movie title="Transformers">
   <type>Anime, Science Fiction</type>
   <format>DVD</format>
   <year>1989</year>
   <rating>R</rating>
   <stars>8</stars>
   <description>A schientific fiction</description>
</movie>
   <movie title="Trigun">
   <type>Anime, Action</type>
   <format>DVD</format>
   <episodes>4</episodes>
   <rating>PG</rating>
   <stars>10</stars>
   <description>Vash the Stampede!</description>
</movie>
<movie title="Ishtar">
   <type>Comedy</type>
   <format>VHS</format>
   <rating>PG</rating>
   <stars>2</stars>
   <description>Viewable boredom</description>
</movie>
</collection>

Разбор XML с помощью API SAX

SAX - это стандартный интерфейс для анализа XML, управляемого событиями. Для синтаксического анализа XML с помощью SAX обычно требуется создать собственный ContentHandler путем создания подкласса xml.sax.ContentHandler.

Ваш ContentHandler обрабатывает определенные теги и атрибуты вашего вкуса (ов) XML. Объект ContentHandler предоставляет методы для обработки различных событий синтаксического анализа. Собственный синтаксический анализатор вызывает методы ContentHandler во время анализа XML-файла.

Методы startDocument и endDocument вызываются в начале и в конце XML-файла. В символы метода (текст) передаются символьные данные XML-файла через текст параметра.

ContentHandler вызывается в начале и в конце каждого элемента. Если синтаксический анализатор не находится в режиме пространства имен, вызываются методы startElement (тег, атрибуты) и endElement (тег) ; в противном случае вызываются соответствующие методы startElementNS и endElementNS . Здесь tag - это тег элемента, а attributes - это объект Attributes.

Вот другие важные методы, которые необходимо понять, прежде чем продолжить -

Make_parser метод

Следующий метод создает новый объект парсера и возвращает его. Созданный объект синтаксического анализатора будет относиться к первому типу анализатора, найденному системой.

xml.sax.make_parser( [parser_list] )

Вот подробная информация о параметрах -

  • parser_list - Необязательный аргумент, состоящий из списка используемых парсеров, все из которых должны реализовывать метод make_parser.

Синтаксический анализ Метод

Следующий метод создает синтаксический анализатор SAX и использует его для анализа документа.

xml.sax.parse( xmlfile, contenthandler[, errorhandler])

Вот подробная информация о параметрах -

  • xmlfile - Это имя XML-файла для чтения.

  • contenthandler - Это должен быть объект ContentHandler.

  • errorhandler - Если указано, обработчик ошибок должен быть объектом SAX ErrorHandler.

ParseString метод

Есть еще один метод создания парсера SAX и синтаксического анализа указанного XML string.

xml.sax.parseString(xmlstring, contenthandler[, errorhandler])

Вот подробная информация о параметрах -

  • xmlstring - Это имя XML-строки для чтения.

  • contenthandler - Это должен быть объект ContentHandler.

  • errorhandler - Если указано, обработчик ошибок должен быть объектом SAX ErrorHandler.

пример

#!/usr/bin/python

import xml.sax

class MovieHandler( xml.sax.ContentHandler ):
   def __init__(self):
      self.CurrentData = ""
      self.type = ""
      self.format = ""
      self.year = ""
      self.rating = ""
      self.stars = ""
      self.description = ""

   # Call when an element starts
   def startElement(self, tag, attributes):
      self.CurrentData = tag
      if tag == "movie":
         print "*****Movie*****"
         title = attributes["title"]
         print "Title:", title

   # Call when an elements ends
   def endElement(self, tag):
      if self.CurrentData == "type":
         print "Type:", self.type
      elif self.CurrentData == "format":
         print "Format:", self.format
      elif self.CurrentData == "year":
         print "Year:", self.year
      elif self.CurrentData == "rating":
         print "Rating:", self.rating
      elif self.CurrentData == "stars":
         print "Stars:", self.stars
      elif self.CurrentData == "description":
         print "Description:", self.description
      self.CurrentData = ""

   # Call when a character is read
   def characters(self, content):
      if self.CurrentData == "type":
         self.type = content
      elif self.CurrentData == "format":
         self.format = content
      elif self.CurrentData == "year":
         self.year = content
      elif self.CurrentData == "rating":
         self.rating = content
      elif self.CurrentData == "stars":
         self.stars = content
      elif self.CurrentData == "description":
         self.description = content
  
if ( __name__ == "__main__"):
   
   # create an XMLReader
   parser = xml.sax.make_parser()
   # turn off namepsaces
   parser.setFeature(xml.sax.handler.feature_namespaces, 0)

   # override the default ContextHandler
   Handler = MovieHandler()
   parser.setContentHandler( Handler )
   
   parser.parse("movies.xml")

Это даст следующий результат -

*****Movie*****
Title: Enemy Behind
Type: War, Thriller
Format: DVD
Year: 2003
Rating: PG
Stars: 10
Description: Talk about a US-Japan war
*****Movie*****
Title: Transformers
Type: Anime, Science Fiction
Format: DVD
Year: 1989
Rating: R
Stars: 8
Description: A schientific fiction
*****Movie*****
Title: Trigun
Type: Anime, Action
Format: DVD
Rating: PG
Stars: 10
Description: Vash the Stampede!
*****Movie*****
Title: Ishtar
Type: Comedy
Format: VHS
Rating: PG
Stars: 2
Description: Viewable boredom

Для получения полной информации о документации SAX API, пожалуйста, обратитесь к стандартным Python SAX API .

Разбор XML с помощью DOM API

Объектная модель документа («DOM») - это межъязыковой API от Консорциума World Wide Web (W3C) для доступа и изменения XML-документов.

Модель DOM чрезвычайно полезна для приложений с произвольным доступом. SAX позволяет просматривать только один бит документа за раз. Если вы смотрите на один элемент SAX, у вас нет доступа к другому.

Вот самый простой способ быстро загрузить XML-документ и создать объект minidom с помощью модуля xml.dom. Объект minidom предоставляет простой метод парсера, который быстро создает дерево DOM из файла XML.

Примерная фраза вызывает функцию parse (file [, parser]) объекта minidom для синтаксического анализа XML-файла, указанного в file, в объект дерева DOM.

#!/usr/bin/python

from xml.dom.minidom import parse
import xml.dom.minidom

# Open XML document using minidom parser
DOMTree = xml.dom.minidom.parse("movies.xml")
collection = DOMTree.documentElement
if collection.hasAttribute("shelf"):
   print "Root element : %s" % collection.getAttribute("shelf")

# Get all the movies in the collection
movies = collection.getElementsByTagName("movie")

# Print detail of each movie.
for movie in movies:
   print "*****Movie*****"
   if movie.hasAttribute("title"):
      print "Title: %s" % movie.getAttribute("title")

   type = movie.getElementsByTagName('type')[0]
   print "Type: %s" % type.childNodes[0].data
   format = movie.getElementsByTagName('format')[0]
   print "Format: %s" % format.childNodes[0].data
   rating = movie.getElementsByTagName('rating')[0]
   print "Rating: %s" % rating.childNodes[0].data
   description = movie.getElementsByTagName('description')[0]
   print "Description: %s" % description.childNodes[0].data

Это даст следующий результат -

Root element : New Arrivals
*****Movie*****
Title: Enemy Behind
Type: War, Thriller
Format: DVD
Rating: PG
Description: Talk about a US-Japan war
*****Movie*****
Title: Transformers
Type: Anime, Science Fiction
Format: DVD
Rating: R
Description: A schientific fiction
*****Movie*****
Title: Trigun
Type: Anime, Action
Format: DVD
Rating: PG
Description: Vash the Stampede!
*****Movie*****
Title: Ishtar
Type: Comedy
Format: VHS
Rating: PG
Description: Viewable boredom

Для получения полной информации о документации DOM API, пожалуйста, обратитесь к стандартным Python DOM API .

Python предоставляет различные варианты разработки графических пользовательских интерфейсов (GUI). Наиболее важные из них перечислены ниже.

  • Tkinter- Tkinter - это интерфейс Python для набора инструментов Tk GUI, поставляемого с Python. Мы бы рассмотрели этот вариант в этой главе.

  • wxPython - Это интерфейс Python с открытым исходным кодом для wxWindows. http://wxpython.org.

  • JPython - JPython - это порт Python для Java, который предоставляет скриптам Python беспрепятственный доступ к библиотекам классов Java на локальном компьютере. http://www.jython.org.

Есть много других доступных интерфейсов, которые вы можете найти в сети.

Программирование на Tkinter

Tkinter - это стандартная библиотека графического интерфейса для Python. Python в сочетании с Tkinter обеспечивает быстрый и простой способ создания приложений с графическим интерфейсом. Tkinter предоставляет мощный объектно-ориентированный интерфейс для набора инструментов Tk GUI.

Создание приложения с графическим интерфейсом пользователя с использованием Tkinter - простая задача. Все, что вам нужно сделать, это выполнить следующие шаги -

  • Импортируйте модуль Tkinter .

  • Создайте главное окно приложения GUI.

  • Добавьте один или несколько из вышеупомянутых виджетов в приложение с графическим интерфейсом.

  • Войдите в основной цикл событий, чтобы принять меры против каждого события, инициированного пользователем.

пример

#!/usr/bin/python

import Tkinter
top = Tkinter.Tk()
# Code to add widgets will go here...
top.mainloop()

Это создаст следующее окно -

Виджеты Tkinter

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

В настоящее время в Tkinter есть 15 типов виджетов. Мы представляем эти виджеты, а также краткое описание в следующей таблице -

Sr.No. Оператор и описание
1 Кнопка

Виджет «Кнопка» используется для отображения кнопок в вашем приложении.

2 Холст

Виджет Canvas используется для рисования фигур, таких как линии, овалы, многоугольники и прямоугольники, в вашем приложении.

3 Checkbutton

Виджет Checkbutton используется для отображения ряда параметров в виде флажков. Пользователь может выбрать одновременно несколько вариантов.

4 Вход

Виджет ввода используется для отображения однострочного текстового поля для приема значений от пользователя.

5 Рамка

Виджет «Рамка» используется как виджет-контейнер для организации других виджетов.

6 метка

Виджет Label используется для обеспечения однострочного заголовка для других виджетов. Он также может содержать изображения.

7 Список

Виджет Listbox используется для предоставления пользователю списка опций.

8 Menubutton

Виджет Menubutton используется для отображения меню в вашем приложении.

9 Меню

Виджет «Меню» используется для предоставления пользователю различных команд. Эти команды содержатся внутри Menubutton.

10 Сообщение

Виджет «Сообщение» используется для отображения многострочных текстовых полей для приема значений от пользователя.

11 Переключатель

Виджет Radiobutton используется для отображения ряда параметров в виде переключателей. Пользователь может выбрать только один вариант за раз.

12 Шкала

Виджет «Масштаб» используется для предоставления виджета ползунка.

13 Полоса прокрутки

Виджет «Полоса прокрутки» используется для добавления возможности прокрутки к различным виджетам, таким как списки.

14 Текст

Виджет Текст используется для отображения текста в несколько строк.

15 Высший уровень

Виджет Toplevel используется для предоставления отдельного оконного контейнера.

16 Spinbox

Виджет Spinbox - это вариант стандартного виджета Tkinter Entry, который можно использовать для выбора из фиксированного количества значений.

17 PanedWindow

PanedWindow - это виджет-контейнер, который может содержать любое количество панелей, расположенных горизонтально или вертикально.

18 LabelFrame

Labelframe - это простой виджет-контейнер. Его основное предназначение - действовать как распорка или контейнер для сложных макетов окон.

19 tkMessageBox

Этот модуль используется для отображения окон сообщений в ваших приложениях.

Давайте изучим эти виджеты подробно -

Стандартные атрибуты

Давайте посмотрим, как указываются некоторые из их общих атрибутов, таких как размеры, цвета и шрифты.

  • Dimensions

  • Colors

  • Fonts

  • Anchors

  • Стили рельефа

  • Bitmaps

  • Cursors

Изучим их кратко -

Управление геометрией

Все виджеты Tkinter имеют доступ к определенным методам управления геометрией, целью которых является организация виджетов по всей области родительских виджетов. Tkinter предоставляет следующие классы диспетчера геометрии: pack, grid и place.

  • Упаковка () Метод - Этот менеджер геометрии организует виджеты в блоках перед помещением их в родительском виджете.

  • Сетки () Метод - Этот менеджер геометрии организует виджеты в таблице-подобную структуру в родительском виджете.

  • Место () Метод - Этот менеджер геометрии организует виджеты, помещая их в положении , в определенном родительском виджете.

Кратко изучим методы управления геометрией -

Любой код, который вы пишете на любом скомпилированном языке, таком как C, C ++ или Java, можно интегрировать или импортировать в другой скрипт Python. Этот код считается «расширением».

Модуль расширения Python - это не что иное, как обычная библиотека C. На машинах Unix эти библиотеки обычно заканчиваются на.so(для общего объекта). На компьютерах с Windows вы обычно видите.dll (для динамически подключаемой библиотеки).

Предварительные требования для написания расширений

Чтобы начать писать расширение, вам потребуются файлы заголовков Python.

  • На машинах Unix для этого обычно требуется установка пакета для конкретного разработчика, такого как python2.5-dev .

  • Пользователи Windows получают эти заголовки как часть пакета при использовании двоичного установщика Python.

Кроме того, предполагается, что вы хорошо знакомы с C или C ++, чтобы писать любое расширение Python с использованием программирования на C.

Первый взгляд на расширение Python

Чтобы впервые взглянуть на модуль расширения Python, вам нужно сгруппировать свой код в четыре части:

  • Заголовочный файл Python.h .

  • Функции C, которые вы хотите предоставить в качестве интерфейса вашего модуля.

  • Таблица, отображающая имена ваших функций в том виде, в каком их видят разработчики Python, с функциями C внутри модуля расширения.

  • Функция инициализации.

Заголовочный файл Python.h

Вам нужно включить файл заголовка Python.h в исходный файл C, который дает вам доступ к внутреннему API Python, используемому для подключения вашего модуля к интерпретатору.

Не забудьте включить Python.h перед любыми другими заголовками, которые могут вам понадобиться. Вам необходимо следовать включенным функциям, которые вы хотите вызывать из Python.

Функции C

Сигнатуры реализации ваших функций на C всегда принимают одну из следующих трех форм:

static PyObject *MyFunction( PyObject *self, PyObject *args );

static PyObject *MyFunctionWithKeywords(PyObject *self,
                                 PyObject *args,
                                 PyObject *kw);

static PyObject *MyFunctionWithNoArgs( PyObject *self );

Каждое из предыдущих объявлений возвращает объект Python. В Python нет такой вещи, как функция void, как в C.Если вы не хотите, чтобы ваши функции возвращали значение, верните C-эквивалент PythonNoneзначение. Заголовки Python определяют макрос Py_RETURN_NONE, который делает это за нас.

Имена ваших функций C могут быть любыми, поскольку они никогда не видны вне модуля расширения. Они определены как статические функции.

Ваши функции C обычно именуются путем объединения имен модуля Python и функций вместе, как показано здесь -

static PyObject *module_func(PyObject *self, PyObject *args) {
   /* Do your stuff here. */
   Py_RETURN_NONE;
}

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

Таблица сопоставления методов

Эта таблица методов представляет собой простой массив структур PyMethodDef. Эта структура выглядит примерно так -

struct PyMethodDef {
   char *ml_name;
   PyCFunction ml_meth;
   int ml_flags;
   char *ml_doc;
};

Вот описание членов этой структуры -

  • ml_name - Это имя функции, которое интерпретатор Python представляет, когда он используется в программах Python.

  • ml_meth - Это должен быть адрес функции, имеющей одну из сигнатур, описанных в предыдущем разделе.

  • ml_flags - Это сообщает интерпретатору, какую из трех сигнатур использует ml_meth.

    • Этот флаг обычно имеет значение METH_VARARGS.

    • Этот флаг можно объединить с помощью побитового ИЛИ с помощью METH_KEYWORDS, если вы хотите разрешить аргументы ключевого слова в вашей функции.

    • Это также может иметь значение METH_NOARGS, которое указывает, что вы не хотите принимать какие-либо аргументы.

  • ml_doc - Это строка документации для функции, которая может иметь значение NULL, если вам не хочется ее писать.

Эта таблица должна быть завершена сигналом, который состоит из значений NULL и 0 для соответствующих элементов.

пример

Для указанной выше функции у нас есть следующая таблица сопоставления методов -

static PyMethodDef module_methods[] = {
   { "func", (PyCFunction)module_func, METH_NOARGS, NULL },
   { NULL, NULL, 0, NULL }
};

Функция инициализации

Последняя часть вашего модуля расширения - это функция инициализации. Эта функция вызывается интерпретатором Python при загрузке модуля. Требуется, чтобы функция была названаinitModule, где Module - это имя модуля.

Функцию инициализации необходимо экспортировать из библиотеки, которую вы будете строить. Заголовки Python определяют PyMODINIT_FUNC, чтобы включить соответствующие заклинания, чтобы это произошло в конкретной среде, в которой мы компилируем. Все, что вам нужно сделать, это использовать его при определении функции.

Ваша функция инициализации C обычно имеет следующую общую структуру:

PyMODINIT_FUNC initModule() {
   Py_InitModule3(func, module_methods, "docstring...");
}

Вот описание функции Py_InitModule3 -

  • func - Это функция, которую нужно экспортировать.

  • module_methods - Это имя таблицы сопоставления, определенное выше.

  • docstring - Это комментарий, который вы хотите оставить в своем расширении.

Объединение всего этого выглядит следующим образом -

#include <Python.h>

static PyObject *module_func(PyObject *self, PyObject *args) {
   /* Do your stuff here. */
   Py_RETURN_NONE;
}

static PyMethodDef module_methods[] = {
   { "func", (PyCFunction)module_func, METH_NOARGS, NULL },
   { NULL, NULL, 0, NULL }
};

PyMODINIT_FUNC initModule() {
   Py_InitModule3(func, module_methods, "docstring...");
}

пример

Простой пример, в котором используются все вышеперечисленные концепции -

#include <Python.h>

static PyObject* helloworld(PyObject* self) {
   return Py_BuildValue("s", "Hello, Python extensions!!");
}

static char helloworld_docs[] =
   "helloworld( ): Any message you want to put here!!\n";

static PyMethodDef helloworld_funcs[] = {
   {"helloworld", (PyCFunction)helloworld, 
      METH_NOARGS, helloworld_docs},
      {NULL}
};

void inithelloworld(void) {
   Py_InitModule3("helloworld", helloworld_funcs,
                  "Extension module example!");
}

Здесь функция Py_BuildValue используется для построения значения Python. Сохраните приведенный выше код в файле hello.c. Мы увидим, как скомпилировать и установить этот модуль для вызова из скрипта Python.

Сборка и установка расширений

Пакет distutils позволяет очень легко распространять модули Python, как чистый Python, так и модули расширения, стандартным способом. Модули распространяются в исходной форме, создаются и устанавливаются с помощью сценария установки, обычно называемого setup.py, следующим образом.

Для вышеуказанного модуля вам необходимо подготовить следующий скрипт setup.py -

from distutils.core import setup, Extension
setup(name='helloworld', version='1.0',  \
      ext_modules=[Extension('helloworld', ['hello.c'])])

Теперь используйте следующую команду, которая выполнит все необходимые шаги компиляции и компоновки с правильными командами и флагами компилятора и компоновщика и скопирует полученную динамическую библиотеку в соответствующий каталог:

$ python setup.py install

В системах на основе Unix вам, скорее всего, потребуется запустить эту команду от имени пользователя root, чтобы иметь права на запись в каталог пакетов сайтов. Обычно это не проблема Windows.

Импорт расширений

После установки расширения вы сможете импортировать и вызывать это расширение в своем скрипте Python следующим образом:

#!/usr/bin/python
import helloworld

print helloworld.helloworld()

Это даст следующий результат -

Hello, Python extensions!!

Передача параметров функции

Поскольку вы, скорее всего, захотите определить функции, которые принимают аргументы, вы можете использовать одну из других сигнатур для своих функций C. Например, следующая функция, которая принимает некоторое количество параметров, будет определена следующим образом:

static PyObject *module_func(PyObject *self, PyObject *args) {
   /* Parse args and do something interesting here. */
   Py_RETURN_NONE;
}

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

static PyMethodDef module_methods[] = {
   { "func", (PyCFunction)module_func, METH_NOARGS, NULL },
   { "func", module_func, METH_VARARGS, NULL },
   { NULL, NULL, 0, NULL }
};

Вы можете использовать функцию API PyArg_ParseTuple для извлечения аргументов из одного указателя PyObject, переданного в вашу функцию C.

Первым аргументом PyArg_ParseTuple является аргумент args. Это объект, который вы будете анализировать . Второй аргумент - это строка формата, описывающая аргументы в том виде, в котором они должны появиться. Каждый аргумент представлен одним или несколькими символами в строке формата следующим образом.

static PyObject *module_func(PyObject *self, PyObject *args) {
   int i;
   double d;
   char *s;

   if (!PyArg_ParseTuple(args, "ids", &i, &d, &s)) {
      return NULL;
   }
   
   /* Do something interesting here. */
   Py_RETURN_NONE;
}

Компиляция новой версии вашего модуля и ее импорт позволяет вам вызывать новую функцию с любым количеством аргументов любого типа -

module.func(1, s="three", d=2.0)
module.func(i=1, d=2.0, s="three")
module.func(s="three", d=2.0, i=1)

Вероятно, вы сможете придумать еще больше вариантов.

PyArg_ParseTuple Функция

Вот стандартная подпись для PyArg_ParseTuple функция -

int PyArg_ParseTuple(PyObject* tuple,char* format,...)

Эта функция возвращает 0 в случае ошибок и значение не равное 0 в случае успеха. tuple - это объект PyObject *, который был вторым аргументом функции C. Здесь формат - это строка C, которая описывает обязательные и необязательные аргументы.

Вот список кодов формата для PyArg_ParseTuple функция -

Код Тип C Имея в виду
c char Строка Python длиной 1 становится символом C.
d двойной Поплавок Python становится двойным C.
ж плавать Поплавок Python становится поплавком C.
я int Python int становится C int.
л долго Python int становится длиной C.
L долго долго Python int становится C long long
О PyObject * Получает заимствованную ссылку на аргумент Python, отличную от NULL.
s символ * Строка Python без встроенных нулей в C char *.
s # char * + int Любая строка Python с адресом C и длиной.
т # char * + int Односегментный буфер только для чтения с адресом и длиной C.
ты Py_UNICODE * Python Unicode без встроенных нулей в C.
ты # Py_UNICODE * + int Любой адрес и длина Python Unicode C.
w # char * + int Чтение / запись односегментного буфера по адресу C и длине.
z символ * Как и s, также принимает None (устанавливает C char * в NULL).
z # char * + int Как и s #, также принимает None (устанавливает C char * в NULL).
(...) согласно ... Последовательность Python рассматривается как один аргумент для каждого элемента.
|   Следующие аргументы необязательны.
:   Конец формата, за которым следует имя функции для сообщений об ошибках.
;   Конец формата, за которым следует весь текст сообщения об ошибке.

Возвращаемые значения

Py_BuildValue принимает строку формата так же, как PyArg_ParseTuple . Вместо того, чтобы передавать адреса создаваемых вами значений, вы передаете фактические значения. Вот пример, показывающий, как реализовать функцию добавления -

static PyObject *foo_add(PyObject *self, PyObject *args) {
   int a;
   int b;

   if (!PyArg_ParseTuple(args, "ii", &a, &b)) {
      return NULL;
   }
   return Py_BuildValue("i", a + b);
}

Вот как бы это выглядело, если бы реализовано на Python -

def add(a, b):
   return (a + b)

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

static PyObject *foo_add_subtract(PyObject *self, PyObject *args) {
   int a;
   int b;

   if (!PyArg_ParseTuple(args, "ii", &a, &b)) {
      return NULL;
   }
   return Py_BuildValue("ii", a + b, a - b);
}

Вот как бы это выглядело, если бы реализовано на Python -

def add_subtract(a, b):
   return (a + b, a - b)

Py_BuildValue Функция

Вот стандартная подпись для Py_BuildValue функция -

PyObject* Py_BuildValue(char* format,...)

Здесь формат - это строка C, которая описывает создаваемый объект Python. Следующие аргументы Py_BuildValue - это значения C, на основе которых строится результат. Результат PyObject * - это новая ссылка.

В следующей таблице перечислены часто используемые строки кода, из которых ноль или более объединены в строковый формат.

Код Тип C Имея в виду
c char AC char становится строкой Python длиной 1.
d двойной AC double становится плавающей точкой Python.
ж плавать AC float становится Python float.
я int AC int становится Python int.
л долго AC long становится Python int.
N PyObject * Передает объект Python и крадет ссылку.
О PyObject * Передает объект Python и выполняет INCREF как обычно.
O & convert + void * Произвольное преобразование
s символ * C 0-завершающийся символом * в строку Python или NULL в None.
s # char * + int C char * и длина в строку Python или от NULL до None.
ты Py_UNICODE * Строка с нулевым символом в конце для Python Unicode или от NULL до None.
ты # Py_UNICODE * + int Строка шириной C и длина в Python Unicode или от NULL до None.
w # char * + int Чтение / запись односегментного буфера по адресу C и длине.
z символ * Как и s, также принимает None (устанавливает C char * в NULL).
z # char * + int Как и s #, также принимает None (устанавливает C char * в NULL).
(...) согласно ... Строит кортеж Python из значений C.
[...] согласно ... Строит список Python из значений C.
{...} согласно ... Строит словарь Python из значений C, чередующихся ключей и значений.

Code {...} строит словари из четного числа значений C, попеременно ключей и значений. Например, Py_BuildValue ("{issi}", 23, "zig", "zag", 42) возвращает словарь вроде Python {23: 'zig', 'zag': 42}.