Показаны сообщения с ярлыком Функции. Показать все сообщения
Показаны сообщения с ярлыком Функции. Показать все сообщения

29 ноября 2015 г.

Функция reload, углубляемся, примеры

Приведем более конкретный пример использования функции reload. В следующем примере мы изменяем и повторно загружаем файл модуля без остановки интерактивного сеанса работы с интерпретатором Python. Повторная  загрузка  может  использоваться  в  различных случаях  , но мы рассмотрим лишь самый простой пример. Во-первых, в текстовом редакторе создайте файл модуля с именем changer.py и добавьте в него следующее содержимое:

19 апреля 2013 г.

Альтернативные реализации модуля хронометража

Сегодня пятница, пора постить новый урок по программированию на Python.
Появилась новая страница в блоге, на нее не обращайте внимание, это для сэо.

Значит так, урок начинается....

Сегодня рассмотрим альтернативную реализацию модуля хронометража (смотреть предыдущий пост).

Примитивность,минуса предыдущего модуля хронометража с предыдущего поста:

  • В  нем  всегда  используется  функция  time.clock.  В  операционной  системе Windows она является лучшим выбором, однако на платформах в системе UNIX более высокую точность можно получить с помощью функции time.time.

  • Для  изменения  количества  повторений  требуется  изменять  глобальную переменную модуля – не самое идеальное решение, если функция timer импортируется и одновременно используется в нескольких модулях.

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


5 апреля 2013 г.

Полезные функции


Создание собственной версии функции map(func, ...)

Имеющиеся функции map и zip, имеют высокую производительность, но и мы можем добиться той же функциональности, написав несколько строк. В предыдущем посте и создавали функцию map для одной последовательности, сейчас же мы создадим ее для нескольких последовательностей:

#эта версия опирается на конструкцию *args передачи 
#аргументов – она получает множество аргументов-#последовательностей
def mymap(func, *seqs):
    res = []
    for args in zip(*seqs):
        res.append(func(*args))
    return res

print(mymap(abs, [-2, -1, 0, 1, 2]))
print(mymap(pow, [1, 2, 3], [2, 3, 4, 5]))
-----------------------------------------------------------------
Теперь создадим версию функции, которая использует генератор списков:

def mymap(func, *seqs):
    return [func(*args) for args in zip(*seqs)]

print(mymap(abs, [-2, -1, 0, 1, 2]))
print(mymap(pow, [1, 2, 3], [2, 3, 4, 5]))

Имитация функций zip и map



В данном посте будет рассказано о применении итераций для имитации функций zip и map.


Мы уже видели, как встроенные функции zip и map позволяют объединять итерируемые объекты и отображать на них функции соответственно. При  вызове с  несколькими аргументами  функция  map отображает  заданную функцию на  элементы,  взятые  из каждой последовательности, практически тем же способом, каким функция zip объединяет их:

3 декабря 2012 г.

Send и next


Расширенный протокол функций-генераторов: send и next

Метод send выполняет переход к следующему элементу и обеспечивает для вызывающей программы способ взаимодействия с генератором, влияя на его работу.

При использовании расширенного протокола значения передаются генератору G вызовом метода G.send(value). После этого выражение yield возвращает значение, полученное от метода send. Когда вызывается обычный метод G.__next__() (или выполняется эквивалентный вызов next(G)), выражение yield возвращает None.
Например:

>>> def gen():
...     for i in range(10):
...         X = yield i
...         print(X)
...
>>> G = gen()
>>> next(G)    # Чтобы запустить генератор, необходимо сначала вызвать next()
0
>>> G.send(77) # Переход к следующему значению 
77             # и передача значения выражению yield
1
>>> G.send(88)
88
2
>>> next(G)    # next() и X.__next__() передают значение None
None
3

21 ноября 2012 г.

Функция lambda


Анонимная функция lambda

Помимо def есть lambda, c их помощью можно создавать объекты функций.

Выражение lambda создает функцию, которая будет вызываться позднее, но в отличие от инструкции def, выражение возвращает функцию, а не связывает ее с именем.

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

Основы lambda - выражений:
lambda argument1, argument2,... argumentN : выражение, использующее аргументы

Различия lambda от def:
 lambda – это выражение, а не инструкция. По этой причине ключевое слово lambda  может  появляться там, где синтаксис  языка  Python не позволяет использовать инструкцию def, – внутри литералов или в вызовах функций, например.

   • Тело  lambda – это не блок инструкций, а единственное выражение.  Тело
lambda-выражения сродни тому, что вы помещаете в инструкцию return внутри определения def, – вы просто вводите результат в виде выражения вместо  его явного  возврата.

20 ноября 2012 г.

Снова функции


Функции и другие их возможности

Применяемые операции к функциям:
Рассмотрим некую функцию foo
>>> def foo(a):
...     b = ‘spam’
...     return b * a
...
>>> foo(8)   # является операцией(выражение вызова)применимой к 
‘spamspamspamspamspamspamspamspam’             # функции
-----------------------------------------------------------------

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

>>> foo.__name__


‘foo’
>>> dir(foo)
[‘__annotations__’, ‘__call__’, ‘__class__’, ‘__closure__’, ‘__code__’,
...остальные имена опущены...
‘__repr__’, ‘__setattr__’, ‘__sizeof__’, ‘__str__’, ‘__subclasshook__’]

19 ноября 2012 г.

Возможности функций


Расширенные возможности функций

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

• Взаимодействие: для передачи значений функции используйте аргументы, для возврата результатов  – инструкцию return.

• Взаимодействие: используйте глобальные переменные, только если это
действительно необходимо.

• Взаимодействие: не воздействуйте на изменяемые аргументы, если вызывающая программа не предполагает этого.

• Связность: каждая функция должна иметь единственное назначение.

• Размер: каждая функция должна иметь относительно небольшой размер.

• Взаимодействие: избегайте непосредственного изменения переменных в другом модуле.

16 ноября 2012 г.

Полезные функции, 1 часть


Помощь школьникам или же математикам

Небольшое вступление, насчет данной темы: 
В теме "Функции помощники", я буду выкладывать готовые решение каких либо задач в виде функций на языке Python. Можете писать свои задания в комментариях. Итак начинаем.

Сегодня просмотрим функции факториала и поиска минимума.
Нахождение Факториала:
как это выглядит в математике :-)
5! = 5*4*3*2*1

def fact(x):   
    if x==0:
        return 1
    else:
        return x*fact(x-1)


c=fact(5)
print(c)

Второй способ

def fact(x):
    return 1 if x==0 else reduce(lambda x,y:x*y,xrange(1,x+1))


c=fact(5)
print(c)


результат будет равен 120
-----------------------------------------------------------------

Нахождение минимума:
Функция должна находить минимальное значение из множества аргументов любого типа.

1-й способ:

def min1(*args):
    res = args[0]
    for arg in args[1:]:
        if arg < res:
            res = arg
 return res

2-й способ:

def min2(first, *rest):
    for arg in rest:
        if arg < first:
            first = arg
    return first

3-й способ: 
def min3(*args):
    tmp = list(args)   # Или, в Python 2.4+: return sorted(args)[0]
    tmp.sort()
    return tmp[0]

print(min1(3,4,1,2))
print(min2(“bb”, “aa”))
print(min3([2,2], [1,1], [3,3]))

результат:

1
aa
[1, 1]

Аргументы, углубляемся, продолжение


Передача аргументов, доходим до конца

Исчезнувшая встроенная функция apply (Python 2.6):
До появления версии Python 3.0 того же эффекта, который дает использование синтаксиса
*args и **args в вызовах функций, можно было добиться с помощью встроенной функции apply. Данная возможность убрана в версии 3.0, но осталась в версии 2.х и 2.6. Проще говоря, следующие две инструкции являются эквивалентными в версиях Python ниже версии 3.0:


func(*pargs, **kargs)     # Новейший синтаксис вызова:
                          #func(*sequence, **dict)

apply(func, pargs, kargs) # Устаревшая функция: 
                          #apply(func, sequence, dict)

В  качестве  примера  рассмотрим  следующую  функцию,  которая  принимает произвольное число позиционных и именованных аргументов:
>>> def echo(*args, **kwargs): print(args, kwargs)
...
>>> echo(1, 2, a=3, b=4)
(1, 2) {‘a’: 3, ‘b’: 4}

С использование функции  apply предыдущий код выглядел бы так:

>>> pargs = (1, 2)
>>> kargs = {‘a’:3, ‘b’:4}

>>> apply(echo, pargs, kargs)
(1, 2) {‘a’: 3, ‘b’: 4}

>>> echo(*pargs, **kargs)
(1, 2) {‘a’: 3, ‘b’: 4}


12 ноября 2012 г.

Аргументы, углубляемся


Передача аргументов
Углубляемся

Тонкости сопоставления:

• В вызове функции аргументы должны указываться в следующем порядке:
любые позиционные аргументы (значения), за которыми могут следовать любые именованные аргументы (name=value) и аргументы в форме *sequence, за которыми могут следовать аргументы в форме **dict.

• В заголовке функции аргументы должны указываться в следующем порядке: любые обычные аргументы (name), за которыми могут следовать аргументы со значениями по умолчанию (name=value), за которыми следуют аргументы в форме *name (или * в 3.0), если имеются, за которыми могут следовать любые имена или пары name=value аргументов, которые передаются только по имени (в 3.0), за которыми могут следовать аргументы в форме **name.

В обоих случаях, и в вызове, и в заголовке функции, форма **arg должна следовать последней в списке. В любых других случаях вызова получим синтаксическую ошибку.

Действия, которые выполняет интерпретатор при сопоставлении аргументов перед присваиванием, грубо можно описать так:
1. Сопоставление не именованных аргументов по позициям.
2. Сопоставление именованных аргументов по именам.
3. Сопоставление дополнительных не именованных аргументов с  кортежем
          *name.
4. Сопоставление дополнительных именованных аргументов со словарем
          **name.
5. Сопоставление значений по умолчанию с отсутствующими именованными
         аргументами.
После этого интерпретатор убеждается, что каждому аргументу соответствует только одно значение, – в противном случае возбуждается исключение. По окончании сопоставления всех аргументов интерпретатор связывает имена аргументов с полученными объектами.

11 ноября 2012 г.

Аргументы


Передача аргументов

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

  • Аргументы передаются через автоматическое присваивание объектов локальным переменным (передача по указателям).

  • Операция присваивания именам аргументов внутри функции не оказывает влияния на вызывающую программу.

  • Изменение внутри функции аргумента, который является изменяемым
объектом, может оказывать влияние на вызывающую программу.

Передача аргументов очень близка к языку С:
  • Неизменяемые объекты передаются «по значению». Такие  объекты,  как целые числа  и строки, передаются в виде ссылок на объекты, а не в виде копий объектов.

  • Изменяемые объекты передаются «по указателю».  Такие  объекты,  как списки и словари, также передаются в виде ссылок на объекты, что очень похоже на то, как в языке C передаются указатели на массивы, – изменяемые объекты допускают возможность непосредственного изменения внутри функции так же, как и массивы в языке C.

28 октября 2012 г.

Что то нужное в Python


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

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

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

Пример, где мы возьмем функцию, и превратим ее в универсальную утилиту нахождения пересечения:
def intersect(seq1, seq2):
    res = []                   # Изначально пустой результат
    for x in seq1:             # Обход последовательности seq1
        if x in seq2:          # Общий элемент?
            res.append(x)      # Добавить в конец
    return res

Вызов:

>>> s1 = “SPAM”
>>> s2 = “SCAM”
>>> intersect(s1, s2)  # Строки
[‘S’, ‘A’, ‘M’]


В данном примере мы передали функции две строки и получили список общих символов. Переменная res внутри функции intersect – это то, что в языке Python называется локальной переменной,  –  имя,  которое доступно только  программному код у внутри инструкции def и существует только во время  выполнения функции.


-----------------------------------------------------------------


В языке Python, наша функция intersect(которая описывается выше)также является полиморфной. То есть она может обрабатывать объекты произвольных типов, при условии, что они поддерживают ожидаемый интерфейс:

>>> x = intersect([1, 2, 3], (1, 4))   # Смешивание типов
>>> x                                  # Объект с результатом
[1]


На этот раз  функции  были переданы объекты разных типов  – список и кортеж, – и это не помешало ей отыскать общие элементы.
----------------------------------------------------------------- 

24 октября 2012 г.

Функции


Функции, основы

Вот и наконец то мы дошли до функций. В предыдущих постах мы сталкивались с функциями, но теперь мы рассмотрим их подробно и будем знать как создавать свои функции.

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

Инструкции и выражения, имеющие отношение к функциям:
Инструкция Примеры
Вызов - myfunc(‘spam’, ‘eggs’, meat=ham)

def, return - def adder(a, b=1, *c):
                  return a+b+c[0]


global  - def changer():
              global x; x = ‘new’


nonlocal - def changer():
               nonlocal x; x = ‘new’


yield - def squares(x):
            for i in range(x): yield i ** 2

lambda - funcs = [lambda x: x**2, lambda x: x*3]