Python: пример контроля входных данных и циклы.

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

#!/usr/bin/python

import sys import os

def show_usage (message, code = 1) :

print message

print "%s: source_dir dest_dir" % sys.argv[0]

sys.exit(code) if len(sys.argv) != 3:

show_usage("Нужно передать 2 аргумента; вы передали %d" % (len(sys.argv) — 1)) elif not os.path.isdir(sys.argv[l]):

show_usage("Недопустимый каталог-источник") elif not os.path.isdir(sys.argv[2]):

show_usage("Недопустимый каталог-приемник")

source, dest = sys.argv[1:3]

print "Каталогом-источником является", source print "Каталогом-приемником является", dest

В дополнение к импортированию модуля sys, мы также импортируем модуль os (чтобы получить доступ к утилите os .path, isdir). Обратите внимание на то, что команда import не позволяет вам "фамильярничать" с содержимым импортируемых модулей при доступе к любым определенным в них символам, т.е. вы не освобождаетесь от необходимости использовать полные имена, которые начинаются с имени модуля.

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

Первый элемент массива sys .argv (в позиции 0) содержит имя сценария, поэтому длина массива на единицу больше, чем количество реально переданных аргументов командной строки. Запись sys. argv [ 1:3} означает только часть массива. Удивительно, но часть (подмассив) не включает элемент, расположенный на дальнем конце заданного диапазона, поэтому рассматриваемая часть массива содержит только элементы sys. argv [ 1 ] и sys. argv [2]. Чтобы включить в подмассив второй и последующие аргументы командной строки, можно использовать выражение say sys. argv [ 1: ].

Подобно оболочке bash и языку Perl, в языке Python предусмотрено специальное условие "else if ", которому соответствует ключевое слово elif. В языке Python нет оператора переключателя (switch) для передачи управления на различные ветви (case) в зависимости от результата сравнения аргумента с заданными значениями.

Параллельное присваивание значений переменным source и dest несколько отличается от Рег1-версии тем, что самих этих переменных нет в списке. Язык Python позволяет параллельные присваивания в любой форме.

В языке Python используются одинаковые операторы сравнеция для числовых и строковых значений. Оператор сравнения "! =" означает "не равно". Обратите внимание на то, что в языке Python унарного оператора "!" нет; используйте вместо него оператор not. Булевы операторы and и or выполняют булевы операции (что вполне ожидаемо), но они не возвращают булевы значения: результатом всегда является значение одного из операндов.

 

Циклы

В приведенном ниже фрагменте используется конструкция for...in, обеспечивающая выполнение итераций в диапазоне от 1 до 10.

for counter in range(1, 10): print counter,

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

1 2 3 4 5 6 7 8 9

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

  • В синтаксисе цикла нет никаких специальных требований в отношении числовых диапазонов. Итерационную Python-модель может поддерживать практически любой объект. Так, вы можете организовать выполнение итераций по строке (посимвольно), списку, файлу (по символам, строкам или блокам), подмассиву и т.д.
  • Итераторы могут возвращать несколько значений, и вы можете использовать несколько переменных цикла. Присваивание в начале каждой итерации работает подобно обычным множественным Python-присваиваниям.
  • Оба цикла for и while могут иметь в конце оператор else, который выполняется
    только в том случае, если цикл завершается нормально (в противоположность выходу из цикла посредством оператора break). Это свойство на первый взгляд может показаться нелогичным, но оно позволяет реализовать довольно элегантные решения для выполнения определенных действий при заданных условиях.

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

#!/usr/bin/python

import sys import re

suits = { 1Bashful':'red', 'Sneezy':'green', 'Doc':'blue', 'Dopey':'orange',

'Grumpy':'yellow', 'Happy1:'taupe1, 'Sleepy':'puce' } pattern = re.compile(" (%s) " % sys.argv[1])

for dwarf, color in suits.items () :

if pattern.search(dwarf) or pattern.search(color): print "%s's dwarf suit is %s." % \

(pattern.sub(r"_\l_", dwarf), pattern.sub(r"_\l_", color)) break else:

print "No dwarves or dwarf suits matched the pattern."

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

$ python dwarfsearch '[aeiou]{2}'

Sn_ee_zy's dwarf suit is gr_ee_n.

$ python dwarfsearch go

No dwarves or dwarf suits matched the pattern.

Присваивание переменной suits демонстрирует Python-синтаксис для кодирования литеральных словарей. Метод suits. items () работает как итератор для пар "ключ/ значение" — обратите внимание на то, что на каждой итерации мы извлекаем как имя карлика, так и цвет костюма. Если хотите, чтобы итерация происходила только по ключам, можете использовать такой вариант организации цикла: for  dwarf  in  suits. Python реализует обработку регулярного выражения посредством его модуля ге. Никакие правила работы с регулярными выражениями не встроены в сам язык, поэтому их обработка в Python более громоздкая, чем в Perl. Здесь сначала выбирается регулярное выражение pattern из первого аргумента командной строки, заключенного в круглые скобки, чтобы сформировать "группу захвата".

Затем проверяются и модифицируются строки с помощью методов search и sub объекта регулярного выражения. Можно также использовать вызов соответствующих функций (например, re. search), передав регулярное выражение в качестве первого аргумента. Выражение \ 1 в строке подстановки представляет собой обратную ссылку на содержимое первой "группы захвата".

 

Комментарии (0)

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.