InfoCity
InfoCity - виртуальный город компьютерной документации
Реклама на сайте







Размещение сквозной ссылки

 

Глава 4. Операторы управления


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


4.1 Оператор if


Возможно, самым известным из операторов управления является оператор if . Пример:

>>> if x<0:
...     x=0
...     print ‘Отрицательное заменено нулем’
... elif x==0:
...     print ‘Нуль’
... elif x==1:
...     print ‘Один’
... else:
...     print ‘Больше’
...

Ветка elif может как совсем отсутствовать, так и присутствовать несколько раз. Ветка else тоже является необязательной. Ключевое слово "elif" - это сокращение для "else if", и полезно для избежания чрезмерных отступов. Последовательность if ... elif ... elif ... является заменой операторам switch или case из других языков.


4.2 Оператор for


Оператор for в Python немного отличается от того, которым Вы, возможно, пользовались в С или Pascal. Вместо того, чтобы всегда перебирать элементы арифметической прогрессии (как в Pascal), или предоставлять пользователю полную свободу в выборе итерационной проверки и шага (как в С), Python-овский оператор for перебирает все элементы какой-нибудь последовательности (например, списка или строки), в том порядке в котором они находятся в последовательности. Например:

>>> # Мера нескольких строк:
... a=[‘cat’,’window’,’defenestrate’]
>>> for x in a:
...     print x, len(x)
...
cat 3
window 6
defenestrate 12
>>>

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

>>> for x in a[:]: # делает кусочную копию всего списка
...    if len(x)>6: a.insert(0,x)
...
>>> a
[’defenestrate’,’cat’,’window’,’defenestrate’]
>>>

4.3 Функция range()


Если Вам необходимо итерировать последовательность чисел, то встроенная функция range() - это как раз то, что надо. Она генерирует списки, содержащие арифметическую прогрессию, например:

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

Переданный конечный элемент никогда не включается в сгенерированный список; range(10) генерирует список из 10 значений, равных легальным индексам элементов последовательности длины 10. Есть возможность разрешить range начать с другого числа, или специфицировать другой шаг инкремента (даже отрицательный):

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

Чтобы итерировать индексы последовательности, комбинируйте range() и len() , как следует ниже:

>>> a=[‘У’,’Мэри’,’есть’,’маленький’,’ягненок’]
>>> for i in range(len(a)):
...     print i,a[i]
...
0 У
1 Мэри
2 есть
3 маленький
4 ягненок
>>>

4.4 Операторы break и continue , пункт else для циклов


Оператор break , как и в С, прерывает выполнение самого внутреннего закрытого цикла for или while.

Оператор continue , также позаимствованный из С, продолжает выполнение со следующей итерации цикла.

Операторы цикла могут иметь пункт else ; он выполняется после завершения цикла от исчерпания списка (в случае for ) или когда условие становится ложным (для while ), то только не тогда, когда цикл прерван оператором break. Это демонстрируется следующим циклом, отыскивающим простые числа:

>>> for n in range(2,10):
...     for x in range(2,n):
...         if n%x == 0:
...            print n,’равен’,x,’*’,n/x
...            break
...     else:
...         print n,’-простое число’
...
2 -простое число
3 -простое число
4 равен 2*2
5 -простое число
6 равен 2*3
7 -простое число
8 равен 2*4
9 равен 3*3
>>>

4.5 Оператор pass


Оператор pass ничего не делает. Его нужно использовать когда синтаксически требуется оператор, но программа ничего не должна делать. Например:

>>> while 1:
...       pass # Ожидание прерывания от клавиатуры
...

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


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

>>> 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
>>>

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

Выполнение функции вводит новую таблицу символов, используемую для локальных переменных функции. Иначе говоря, все присваивания в теле функции осуществляются для переменных в локальной таблице символов. При ссылке на переменную, они сперва ищутся в локальной таблице символов, затем в глобальной таблице символов и в последнюю очередь, в таблице встроенных имен. Так, глобальным переменным нельзя прямо присвоить значение внутри функции (не упомянув их перед этим в операторе global ), хотя на них можно ссылаться. Действительные параметры (аргументы) вызова функции, в момент вызова, помещаются в локальную таблицу символов вызываемой функции. При этом используется вызов с передачей аргументов по значению 8 . В случае вызова функции другой функцией, также создается новая локальная таблица символов для этого вызова.

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

>>> fib

>>> f=fib
>>> f(100)
1 1 2 3 5 8 13 21 34 55 89
>>>

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

>>> print fib(0)
None
>>>

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

>>> def fib2(n): # Возвращает первые числа Фибоначчи, не превосходящие n
...      result=[]
...      a,b=0,1
...      while b<n:
...            result.append(b) # смотрите ниже
...            a,b=b,a+b
...      return result
...
>>> f100=fib2(100) # вызов
>>> f100           # вывод результата
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
>>>

Этот пример, как обычно, демонстрирует несколько новых особенностей Python:

  • Оператор return возвращает значение. return без аргумента используется для выхода из середины функции (если не встретился оператор return , то возврат осуществляется при достижении конца функции), и в этом случае возвращается значение None .
  • Оператор result.append(b) вызывает метод спискового объекта result . Метод является функцией, "принадлежащей" некоторому объекту, и имеющей имя obj.methodname , где obj - некий объект метода, который определен в типе объекта. Различные типы определяют различные методы. Методы разных типов могут иметь одинаковые имена, без возникновения двусмысленности. (Есть возможность определения Ваших собственных объектных типов и методов, используя классы, что обсуждается ниже.) Метод append , показанный в примере, определен для списковых объектов; он добавляет новый элемент в конец списка. В данном примере это эквивалентно записи result=result+[b] , но намного эффективней.

[Назад][Содержание][Вперед]


Реклама на InfoCity

Яндекс цитирования



Финансы: форекс для тебя








1999-2009 © InfoCity.kiev.ua