Python для начинающих
Подписаться на эту рубрику по RSS
Модулем в языке Python называется любой файл с программой. Каждый модуль может импортировать другой модуль, получая, таким образом, доступ к идентификаторам внутри импортированного модуля. Следует заметить, что импортируемый модуль может содержать программу не только на языке Python. Например, можно импортировать скомпилированный модуль, написанный на языке C.
Все программы, которые мы запускали ранее, были расположены в модуле с названием "__main__". Получить имя модуля позволяет предопределенный атрибут __name__. Атрибут __name__ для запускаемого модуля содержит значение "__main__", а для импортируемого модуля - его имя. Выведем название модуля:
print __name__ # Выведет: __main__
Проверить, является модуль главной программой или импортированным модулем, позволяет код, приведенный в листинге ниже.
Проверка способа запуска модуля
if __name__ == "__main__":
print "Это главная программа"
else:
print "Импортированный модуль"
Инструкция import
Импортировать модуль позволяет инструкция import. Мы уже не раз использовали эту инструкцию для подключения встроенных модулей. Например, подключали модуль time для получения текущей даты с помощью функции strftime():
import time # Импортируем модуль
print time.strftime("%d.%m.%Y") # Выводим текущую дату
Далее...
Модуль calendar позволяет вывести календарь в виде простого текста или в HTML формате. Прежде чем использовать модуль, необходимо подключить его с помощью выражения:
import calendar
Модуль предоставляет следующие классы:
Calendar - базовый класс, который наследует все остальные классы. формат конструктор:
Calendar([<Первый день недели>])
В качестве примера получим двухмерный список всех дней в январе 2013 года, распределение по дням недели:
import calendar c = calendar.Calendar(0) print c.monthdayscalendar(2013, 1) # 1 - это январьДалее...
В практике любого программиста наступает задача скопировать некий материал с сайта. Так как страниц достаточно много не стоит терять время на ручное копирование. Ведь, языки программирования нужны для того чтобы избавится от рутинной работы и автоматизировать разные задачи. В Python есть отличная библиотека для работы с HTML. С ней можно парсить не только сайты но и обычные html документы. Хорошим преимуществом данной библиотеки является персональный алгоритм структурирования HTML кода, что позволяет программисту сэкономить время работы.
Но, проблемы в работе с html документами могут все равно появляться. HTML не имеет строгую структуру кода и некоторые верстальщики дают волю фантазии и изобретают свою структуру кода. Могут возникнуть и проблемы с кодировкой, что создаст новые проблемы для структурирования кода и получения данных.
Мы не будем воровать контент с других сайтов чтобы продемонстрировать библиотеку в работе, примеры будем делать на нашем сайте. Администрация pythonworld, поблагодарит нас за это и пойдем дальше.
Установка библиотеки Beautiful Soup (Linux)
$ apt-get install python-bs4
$ apt-get install python-lxml
$ apt-get install python-html5lib
Библиотека Beautiful Soup предназначена для работы с Python 2, но так же умеет работать с кодом Python 3. После установки и python-html5lib, можно будет парсить и современные документы стандарта HTML5.
Для организации циклов наиболее часто используется инструкция for, которая позволяет выполнить обход элементов коллекции. Итерации – одна из самых богатых особенностей языка Python. Однако наиболее часто используемой формой итераций является простой цикл по элементам последовательности, такой как строка, список или кортеж. Пример реализации итераций приводится ниже:
# -*- coding: utf-8 -*-
for n in [1,2,3,4,5,6,7,8,9]:
print "2 в степени %d = %d" % (n, 2**n)
В данном примере на каждой итерации переменная n будет последовательно получать значения из списка [1,2,3,4,...,9]. Поскольку необходимость организовать цикл по фиксированному диапазону целочисленных значений возникает достаточно часто, для этих целей используется сокращенная форма записи:
for n in range(1, 10):
print "2 в степени %d = %d" % (n, 2**n)
Функция range(i,j [,stride]) создает объект, представляющий диапазон целых чисел со значениями от i по j-1. Если начальное значение не указано, оно берется равным нулю. В третьем необязательном аргументе stride можно передать шаг изменения значений. Например:
Словарь является ассоциативным массивом или таблицей хешей, содержащий объекты, индексированные ключами. Чтобы создать словарь, последовательность элементов необходима заключить в фигурные скобки ({}), как показано в примере ниже.
Для получения значения словаря, его содержимое вызывается с помощью ключа. Ключ должен быть уникальным по отношению к другим, если ключ в словаре дублируется, то значение ключа будет тот кто ближе к концу словаря.
person = { 'name': 'Ваня', 'age': 18, }Объекты из словарях, можно изменять по своему желанию следующим образом.
person = { 'name': 'Ваня', 'age': 18, } person['name'] = 'John' print person # Вернет: {'age': 18, 'name': 'John'}Чаще всего в качестве ключей применяются строки, тем не менее, для этих целей допускается использовать большинство других объектов языка Python, включая числа и кортежи. Определенные объекты, включая списки и словари, не могут использоваться в качестве ключей, потому что их содержимое может изменяться.
Функции являются отличным помощником во всех языках программирования. Они способствуют улучшению кода за счет выполнения ими повторных задании без нужны дублировать код для получения результата без использования функции. Код функции должен быть как можно более компактнее. Функция должна выполнять только одну операцию. Она должна выполнять ее хорошо и ничего другого она делать не должна. Чтобы создать читабельный код для вам и для других программистов вы должны следить за ним. Вы работаете с с чистым кодом, если каждая функция в основном делает то, что вы от нее ожидали. Половина усилий по реализации этого принципа сводится к выбору хороших имен для компактных функции, выполняющих одну операцию.
Чем меньше и специализированнее код функции, тем проще выбрать для нее понятное имя. Не бойтесь использовать длинные имена. Длинное содержательное имя лучше короткого невразумительного. Будьте последовательны в выборе имени. Используйте в имени функции те же словосочетания, глаголы и существительные, которые используются в ваших модулях. Создание функции производится с помощью инструкции def, как показано в следующем примере. Мы уже научились работать со списками в python, давайте воспользуется знаниями тут.
# -*- coding: utf-8 -*- Phones = ['Nokia', 'Samsung', 'LG', 'Sony'] def show_as_text(user_list): words = '' for value in user_list: words += str(value) + ' ' return words print 'Phones: ', show_as_text(Phones) # Вернет: Phones: Nokia Samsung LG SonyДалее...
Списки - последовательности произвольных объектов. Списки можно создать путем заключения элементов списка в квадратные скобки, как в примере ниже. Получить значение из списка можно указывая его индекс, списки индексируются целыми числами. Первый элемент списка имеет индекс, равным нулю. Для доступа к остальным элементам списка используются оператор индексирования.
# -*- coding: utf-8 -*- cars = ['BMW', 'Mercedes', 'Ford'] print (cars[0]) # Выведет первый элемент списка BMW print (cars[2]) # Последний элемент списка Ford
Довольно простые примеры. Попробуем добавить в конце списка новый элемент Audi. Для добавления новых элементов в конце списка используется метод append().
cars.append('Audi') print (cars) # Получим: ['BMW', 'Mercedes', 'Ford', 'Audi']
Для добавления нового элемента по середине или перед любым другим элементом используется метод insert(order_num, value)
cars.insert(2, 'Mitsubishi') print (cars) # Получили: ['BMW', 'Mercedes', 'Mitsubishi', 'Ford', 'Audi']
Воспользуемся оператором среза чтобы извлекать и изменять целые фрагменты списков.
cars = ['BMW', 'Mercedes', 'Mitsubishi', 'Ford', 'Audi'] first_two = cars[0:2] # Первые два элементы списка, вернет: ['BMW', 'Mercedes'] another_cars = cars[3:] # Все элементы в списке после 3-го включая его. Вернет: ['Ford', 'Audi'] cars[1] = 'Mercedes-Benz' # Заменяет значение второго элемента на новое print (cars) # Получим: ['BMW', 'Mercedes-Benz', 'Mitsubishi', 'Ford', 'Audi']Далее...
Создавая логирование действии, сохраняя из интернета изображения, читая построчно из файла и многие другие действия которые требуют от нас запись, сохранения и чтение, в Python выполняется весьма просто и быстро. В случае сохранения данных в файл, папка в которой находится файл должна иметь права 777. Следующая программа открывает файл и читает его содержимое построчно:
# -*- coding: utf-8 -*- f = open('power.txt') line = f.readline() while line: print (line), line = f.readline() f.close()
Функция open() возвращает новый файловой объект. Вызывая методы этого объекта можно выполнять разные действия над файлом, такие как чтение и запись. Метод readline() который мы использовали в примере выше, читает одну строку из файла, завершая символом перевода строки. Используя данный метод, для чтения файла нам понадобится цикл while, и в теле цикла вызывать readline() чтобы читать следующею строку. После чтения всего файла, метод возвращает пустую строку т.е. False, вот тогда цикл while и завершает свою работу.
Можно читать из файла построчно не используя при этом цикл while, данный способ более прост и читабельней.
# -*- coding: utf-8 -*- f = open('power.txt') for line in f.readlines(): print (line),Метод readlines() отличается одной добавленной буквой и строит обратить внимание на это, часто ошибаются и используют readline() и не понимают почему выдают всего лишь одну строку. readline() и readlines() выполняют одну и ту же операцию - читаю построчно данные из файла, но возвращают разные данные. readlines() возвращает список в котором содержится строки из файла.
Недавно пришлось написать небольшой скрипт для рассылки писем к читателям с одного проекта. На PHP у меня уже ранее реализован данный скрипт, но т.к. я перешел программировать на Python мне нужно больше практики для понимания языка. Хочу сказать, что по сравнению с PHP, собственная smtp библиотека от Python гораздо удобнее для настройки в случае если нам нужна аутентификация с другого почтового сервиса.
Плюсы и минусы
Написал небольшую функцию которая должна отвечать всем вашим требованиям. Некоторые моменты с которыми были бы костыли в PHP, в Python реализованы весьма логично. Например отправлять массовое сообщение на PHP, пришлось создавать цикл и каждому получателю отправлять отдельное письмо через вызов mail(). Python нам сразу предлагает указать все нужные адресаты в общий список и передать ему - он сам разберется.
В PHP мне иногда приходилось мучится с кодировкой. Когда проверяешь и видишь, что все в порядке с кодировкой но письмо опять с иероглифами, это очень сильно бесит. Несмотря на то, что в Python, модуль smtplib принимает текст письма исключительно в ASCII, проблема с русским языков исчезает сразу если указать кодировку в самом скрипте т.е.
Перемещать и копировать файлы по каталогам нам поможет функции модуля shutil. Подключаем модуль shutil в начале нашего скрипта на Python, потом уже получим доступ к его функциям. Функции модуля shutil не ограничиваются только на копирование и перемещение, мы обсудим разные методики использования функции даного модуля.
Функция copyfile(Копируемый файл, путь куда копируем)
Копирует содержимое файла по указанному пути и создает новый в указанном во втором параметре месте. Методанные при этом не копируются т.е. права доступа и т.д. Если место куда мы копируем уже имеет такой файл он будет перезаписан. В случае неудачи копирования, возбуждается исключение IOError.>>> import shutil # Подключаем модуль >>> shutil.copyfile(r'/home/py/mouse.txt', r'/home/py/new-mouse.txt') >>> # Указанный путь не будет существовать >>> shutil.copyfile(r'/home/py/mouse.txt', r'/go/here/no.txt') IOError: [Errno: 2] No such file or directory '/go/here/no.txt'
Функция copy(Копируемый файл, куда копируем)
Копирует файл вместе с его правами. В случае если файл уже существовал, он будет перезаписан. Неудачное копирование вызовет исключение IOError.
shutil.copy(r'my_file.txt', r'new_file.txt')Далее...