четверг, 25 декабря 2014 г.

Язык программирования Python. Инструкции. Функции. (2)

     Отступы в языке являются важной часть синтаксиса. Все инструкции в пределах одного блока должны иметь равные отступы от левого края.
     Переменная - это ссылка на объект определенного типа.
Присваивание
a = 4                            // базовое присваивание
a, b, c, d = "next"         // присваивание последовательности (a="n", b="e" и т.д.)
a, b, *c = "string"          // (a="s", b="t", c = ['r','i','n','g'])
*a, b, c = "string"          // (a=['s','t','r','i'], b="n", c="g")
a = b = c = 4                // групповое присваивание
a, b, c = 4

Условная инструкция if
if one:
    smth1
elif two:
    smth2
else:
    smth3

краткая форма
 A=Y if X else Z


Инструкция while
 while one:
      smth1
      if two: break                  // выйти из цикла
      if three: continue         // к началу цикла  
 else:
      smth2

Инструкция for
 for x in object:
  smth1
  if two: break                  // выйти из цикла
  if three: continue         // к началу цикла  
 else:
  smth2

примеры со множественным присваиванием
for (a, b, c) in [(1, 2, 3), (4, 5, 6)]: ...
for (a, *b, c) in [(1, 2, 3, 4), (5, 6, 7, 8)]: ...


Функции range, zip, enumerate, map
list(range(4))                  // [0,1,2,3]
list(range(0, 10, 2))        // [0,2,4,6,8]   с шагом 2

zip - возвращает список кортежей, составленный из нескольких последовательностей
  L1 = [1, 2, 3, 4]
  L2 = [5, 6, 7, 8]
  L3 = list(zip(L1, L2))            // [(1, 5), (2, 6), (3, 7), (4, 8)]

enumerate - возвращает кортеж (index, value) для каждого элемента списка
  L = [1,2,3,4]
  for (x,y) in enumerate(L):
      print ('index:',x, '  value:',y)

map - применяет функцию к каждому элементу последовательности
 L = [6,7,8,9]
 L2 = list(map((lambda x: x*20),L))



Генераторы списков
L = [1,2,3,4]
L2 = [4,3,2,1]
print ([x+2 for x in L])                                       # [2,4,5,6]
print ([x+2 for x in L if x%2])                            # [3,5]
print ([x+y for x in L for y in L2])
print ([x+y for x in L for y in L2 if L.index(x)==L2.index(y)])       # [5,5,5,5]


Функции

def name (arg1, arg2, ..., argN):
   smth
   return value

области видимости
     Если необходимо изменить(переопределить) глобальную или локальную в объемлющей функции переменную нужно явно указать в функции перед переменной global или nonlocal. Для чтения переменной никакие указания не нужны.

b = 5                                                  # глобальная для всех
def env (a):
   c = a + b                           # a, c - локальные переменные для этой функции
   return print (a+b)              # здесь чтение переменной b

b = 5
def env ():
  global  b
  b = 10                                 # переопределяем глобальную переменную
  return
env()
print (b)                                # b будет равно 10 (вызов функции обязателен)


def one():
   a = 10
   def two():
       nonlocal a
       a = 20                  # изменение локальной переменной объемлющей функции

Идеал - это не использовать глобальных переменных внутри функций!

аргументы функции
def func (a,b,c): ...


def func (a=4, b=5, c=10): ...     # именованные аргументы, значения по умолчанию! 
      return a+b+c
func(1,2,3)                             # сумма значений аргументов - 6
func()                                     # 19
func(a=1, c=3)                       # 9

def func (*args): ...                # произвольное кол-во аргументов (на выходе будет кортеж)
                                              В вызове функции можно передавать любой итерируемый объект.
пр.
L = [45,34,21,10]
def func(*args):
    return print(args)
func(L)
на выходе ([45, 34, 21, 10],)

!если func(*L) то на выходе (45,34,21,10)

def func (**kargs): ...      # произвольное кол-во именованных аргументов (на выходе словарь)
func (a=1, b=5, c=7)

def func (a, b=5, *args, **kargs): ... # последовательность аргументов


Функция lambda

lambda arg1, arg2, ..., argN : выражение используещее аргументы

f = lambda x, y : x*y
f(5,2)                            # 10

f = lambda x, y : x if x > y else y


Итераторы, функции-генераторы, выражения генераторы

Итератор - объект(класс) с методами __iter__ и __next__
Доступ к итератору объекта можно получить с помощью функции iter()
     s = 'something'
     it = iter(s)
     ...
Итерируемые объекты определяют метод __next__

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

Выражения-генераторы
     ...
     (x for x in Seq)
     ...
возвращают объект-генератор, который поддерживает протокол итерации

Функции-генераторы
     Генерируют последовательность значений с течением времени. Автоматически поддерживают протокол итераций. Возвращают объект-генератор! Объект-генератор имеет метод __next__.
     ...
     def gr(st):
         for x in st:
             yield x*2
     G = gr("string")        # G - объект-генератор

     Метод __next__ генератора возобновляет каждый раз выполнение функции.
     Генераторы являются итераторами однократного применения! Чтобы выполнить повторный обход результатов, придется создать новый генератор.


Исключения

try:
     ...
     raise name()                 # вызываем исключение вручную (если необходимо)
                                           name - экземпляр класса исключения
except:                        # обрабатываем все исключения
      ...                          
except E1:                     # обрабатываем исключение E1
     ...
except (E2, E3, E4):      # обрабатываем несколько исключений
     ...
except E5 as name:       # перехватываем исключение и получаем экземпляр
     ...
else:                               # выполняется если в блоке try не возникло исключение
     ...
finally:                            # выполнит в любом случаем, было исключение или нет
    ...

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

Отправить комментарий