Programming: Python:


Основы программирования



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

1.      Оператор if.

Если вы знакомы с английским языком, то легко поймёте, что слово if переводится как “если”. Этот оператор выполняет блок кода, следующий после него с отступами, только в случае, если выражение в его заголовке не нуль(т.е. верно).

>>> x = int(raw_input("Введите целое число: "))
>>> if x < 0:
...  x = 0
...  print 'Отрицательное число стало нулём'
... elif x == 0:
...  print 'Это число - нуль'
... elif x == 1:
...  print 'Это число - 1'
... else:
...  print `Это число больше единицы'
...

Далее могут быть ещё операторы elif(аналог case в Си). Оператору if, как видно, сопутствуют операторы else(“иначе” - блок кода выполняется если условие в заголовке if приняло нулевое значение, т стало ложным) и elif(“иначе если” - блок кода выполняется если условие в заголовке if приняло нулевое значение, т.е стало ложным, а значение в заголовке данного оператора стало ненулевым, т.е истинным).

2.      Оператор for.

Оператор for несколько необычен в Питоне, он имеет вид for некая_переменная in некий_диапазон. Блок кода после заголовка выполняется, пока некая_переменная принадлежит некому_диапазону(причём этот диапазон может быть списком, числовой последовательностью, массивом каких-либо значений):

>>> # Определим какие-то строки:
... a = ['Linux', 'Open', 'Office']
>>> for x in a:
...     print x, len(x)
 
Результат работы: 
 
Linux 5
Open 4
Office 6

Довольно опасно менять в теле цикла for значение диапазона(это может повлечь весьма странную его работу, зацикливание и усложняет понимание программы), кроме случаев, когда в роли диапазона выступает список. В этом случае, можно сделать простое копирование списков, удвоение элементов в списке:

>>> for x in a[:]: # здесь мы делаем копию всего списка a
                   # в переменной x
...    if len(x) > 6: a.insert(0, x)#Если длина строки списка
                                   # больше 6
... 
  
>>> a 
  
Результат работы:
[Linux , Open, Office, Office]

Для задания диапазона в форме арифметической прогрессии (1 2 3 4 5 6...) удобно пользоваться функцией range(). Она имеет три формы, рассмотрим на примерах все:

>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Эта форма возвращает все целые числа в диапазоне от 0 до числа 10, не включая само число 10.

>>> range(5, 10)
[5, 6, 7, 8, 9]

Эта форма возвращает все целые числа в диапазоне от 5 до числа 10, не включая само число 10, но включая начальное число 5.

>>> range(0, 10, 3)
[0, 3, 6, 9]
>>> range(-10, -100, -30)
[-10, -40, -70]

Эта форма возвращает все целые значения в диапазоне от начального до конечного с шагом, заданным третьим параметром. Причём, если, например, вы попробуете ввести range(1, 100, -1), то очевидно, что чисел в этом диапазоне нет, то есть результатом будет пустое множество([]).

Если вы хотите задать диапазон через количество элементов в списке, то следует воспользоваться функцией range в сочетании с функцией len:

>>> a = [`Linux', 'is', 'the', 'best', 'system']
>>> for i in range(len(a)):
...     print i, a[i]#Обращение к элементу списка по его индексу
... 
 
0 Linux
1 is
2 the
3 best
4 system

3.      Прерывание и продолжение циклов for и while.

Для немедленного выхода из цикла можно использовать оператор break(хотя некоторые программисты считают применение break плохим стилем), а для продолжения цикла, но со следующим значением переменной(т.е следующей итерации цикла) можно использовать оператор continue. Всё сказанное выше можно показать на примере поиска простых чисел:

>>> for n in range(2, 10):#Задаёт верхнюю границу

...     for x in range(2, n):
...         if n % x == 0:#Если n делится на x без остатка
                       #и n не простое число
...            print n, 'равно', x, '*', n/x
...            break#Выход из цикла по x, следующее n
...     else:
...          # если n не разделилось без остатка ни на одно x
               #от 2 до n, то
...          print n, 'простое число'
... 
 
Результат работы:
2 простое число
3 простое число
4 равно 2 * 2
5 простое число
6 равно 2 * 3
7 простое число
8 равно 2 * 4
9 равно 3 * 3

4.      Оператор pass.

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

>>> while 1:
...       pass # Бесконечный цикл, ничего не делающий: ждём
                                     #прерывания с клавиатуры
...

Функции.

В современной теории информатики ключевым является понятие функции – небольшого модуля программного кода, выполняющего определённые действия и обособленного от основного кода программы. Основное достоинство использования функций – это возможность повторного использования программного кода, т вы можете вызывать функцию многократно не только в той программе, где она была написана, но, возможно, и в других программах, другими людьми и для других целей. Вы и до этого использовали много раз функции, функции написанные разработчиками Питона, которые очень универсальны и допускают использование в программах различного типа. При этом, вам совершеннно не нужно знать, как, например, работает функция range, вы просто используете её, не заботясь, кем и как она была написана. Этот принцип сокрытия информации позволяет легко использовать стандартные функции, не зная деталей их работы. В Питоне реализована исчерпывающая поддержка функций. В Питоне функция определяется ключевым словом def, имени функции, затем в скобках идут некие параметры, разделяемые запятой, передаваемые в функцию из программы. К этим параметрам можно обращаться внутри функции по их именам. Впрочем, функция может не принимать никаких параметров, тогда в скобках не нужно ничего писатьосле определения функции к ней можно обращаться по имени из любого места программы, передавая ей регламентированные в определении параметры:

>>> def fib(n):    # Функция, выводящая на экран числа Фибоначчи,
                                        #не превосходящие n
...     """Числа Фибоначчи"""
...     a, b = 0, 1
...     while b < n:
...         print b,
...         a, b = b, a+b
... 
 
>>> # Теперь функцию можно вызвать
... fib(2000)
 
Числа Фибоначчи
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597

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

>>> def fib(n):    # Функция, возвращающая числа Фибоначчи,
               # не превосходящие n
...     result = [1]#Этот список будет содержать числа Фибоначчи
...     a, b = 0, 1
...     while b < n:
...         print b,
...         a, b = b, a+b
...         result.append(b);#Вставление в результативный список
                            #очередного числа
...    return result #Возвращение результата
...
>>> # Теперь функцию можно вызвать
... fib(2000)
Результат выполнения:
[1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597]

В определении функций есть некоторые нюансы. Рассмотрим, к примеру, функцию range(). Её можно вызвать в 3-х разных формах – с один параметром, с двумя и с тремя. Для организации такого поведения совсем необязательно описывать три различные функции, можно применить параметры по умолчанию:

def ask_ok(prompt, retries=4, complaint='Yes or no, please!'):
    while 1:
        ok = raw_input(prompt)
        if ok in ('д', 'да', 'yes'): return 1
        if ok in ('н', 'нет', 'no', 'nop'): return
0
        retries = retries - 1
        if retries < 0: raise IOError,
'refusenik user'
        print complaint
или в таком виде:
i = 5
 
def f(arg=i):
    print arg
 
i = 6
f()#Выведет не 6, а 5

Механизм параметров по умолчанию действует так: если переменная задана при вызове функции, как её параметр, то в функцию передаётся именно это значение, иначе в функцию передаётся значение по умолчанию.

Внимание: значение по умолчанию оценивается лишь один раз, это играет роль при задании значения по умолчанию спискам, например:

def f(a, L=[]):
    L.append(a)
    return L
 
print f(1)
print f(2)
print f(3)
 
Результат работы программы:
[1]
[1, 2]
[1, 2, 3]

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

def f(a, L=None):
    if L is None:
        L = []
    L.append(a)
    return L

Ключи.

В Питоне есть другая возможность передавать значения в функцию – через ключи в формате 'ключ=значение', например:

def parrot(voltage, state='крутой', action='шок', type='Волнистый'):
    print "-- "Попугай не будет", action,
    print "если вы пропустите ток в", voltage, "вольт через него."
    print "-- Попугай", type
    print "-- Это", state, "!"

Такую функцию можно вызвать любым из способов ниже:

parrot(1000)
parrot(action = 'А-а-а-а-а-у-у-ш-ш-ш', voltage = 1000000)
parrot('тысячу', state = 'заболеет')
parrot('миллион', 'вернётся к жизни', 'прыжок')

А вот таким образом функцию вызывать нельзя:

parrot()              
      # требуемый аргумент опущен
parrot(voltage=5.0, 'dead')  #аргумент не ключ использован как ключ
parrot(110, voltage=220)     # повторение значение одного
                            # и того же аргумента
parrot(actor='John Cleese')  # неизвестный ключ

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

>>> def function(a):
...     pass
... 
 
>>> function(0, a=0)
ERROR: ключ переопределён

Если в заголовке функции присутствует параметр в формате **имя, то в него включаются все ключи, которые были переданы в функцию, но не были определены в её заголовке. С этим параметром может также употребляться другой параметр, имеющий формат *имя. В него передаются аргументы, не входящие в список обязательных параметров функции. Учтите, что аргумент *имя должен стоять перед **имя:

def cheeseshop(kind, *arguments, **keywords):
    print "-- У вас есть какие-нибудь", kind, '?'
    print "-- Нет, всех съели"
    for arg in arguments: print arg
    print '-'*40
    for kw in keywords.keys(): print kw, ':', keywords[kw]

Функция может быть вызвана, например, так:

cheeseshop('Зонты', "Очень жаль.",

"Действительно ужасно жаль, товарищ.",

client='Михаил Горбачёв',

shopkeeper='Борис Ельцин',

sketch='Белый Дом')

и вот каким будет результат работы:

-- У вас есть какие-нибудь зонты?
-- Нет, всех съели
Очень жаль.
Действительно, ужасно жаль.
----------------------------------------
client : Михаил Горбачёв
shopkeeper : Борис Ельцин
sketch : Белый Дом

Передача в функцию переменного числа аргументов.

Часто используемым приёмом в программировании является передача в функцию переменного числа аргументов. Для этого в Питоне можно воспользоваться символом * перед списком аргументов переменной длины. Аргументы в теле функции могут быть разделены(см. выше). Перед списком аргументов может следовать(необязательно) один или несколько обязательных аргументов:

def fprintf(file, format, *args):
   file.write(format % args)

Использование лямбда функций.

Лямбда функции пришли в Питон из языка Лисп и могут показаться необычными программисту на Си. Лямбда функции – это небольшие функции, которые создают другие функции, на своей основе. Чтобы быть более понятным, приведу такой пример: lambda a, b: a+b – вычисляет сумму двух своих аргументов. На основе функции, возвращающей lambda можно построить другие функции, например:

>>> 
def make_incrementor(n):
... return lambda x: x + n#x – параметр, который передаётся
                                   #в порождённую функцию f(x)
...
>>> f = make_incrementor(42)
>>> f(0)
42
>>> f(1)
43

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

Хорошим стилем является документация каждой функции. Для этого сразу после заголовка поместите краткое описание функции, заключённое в тройные кавычки. Всё содержимое внутри тройных кавычек выводится как есть, в “сыром” виде. Такой способ позволяет легко понять назначение функции, прочитав исходный текст или воспользовавшись специальным сервером документации Питона.

 






При перепечатке любого материала с сайта, видимая ссылка на источник www.warayg.narod.ru и все имена, ссылки авторов обязательны.

© 2005