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

15 мая 2013 г.

Хронометраж, используя аргументы, которые передаются по именам


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

Для упрощения реализации модуля mytimer, мы можем также использовать аргументы, которые могут передаваться только по именам, появившиеся в Python 3.0.


# Файл mytimer.py (только для 3.X)

“””
Вместо формы ** и метода pop словарей используются аргументы, которые могут 
передаваться только по именам, появившиеся в версии 3.0.
В версии 3.0 нет необходимости выносить вызов range() за пределы цикла, так как эта 
функция возвращает генератор, а не список
“””
import time, sys
trace = lambda *args: None # or print
timefunc = time.clock if sys.platform == ‘win32’ else time.time

def timer(func, *pargs, _reps=1000, **kargs):
    trace(func, pargs, kargs, _reps)
    start = timefunc()
    for i in range(_reps):
        ret = func(*pargs, **kargs)
    elapsed = timefunc() - start
    return (elapsed, ret)

def best(func, *pargs, _reps=50, **kargs):
    best = 2 ** 32
    for i in range(_reps):
        (time, ret) = timer(func, *pargs, _reps=1, **kargs)
        if time < best: best = time
          return (best, ret)

Результат будет идентичен предыдущей версии...

19 апреля 2013 г.

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

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

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

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

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

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

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

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


11 апреля 2013 г.

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


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

Поэтому в этом посте мы это полностью исправим. Кстати в разных версиях, map работает по разному, вот некоторые примеры для Python 2.x и Python 3.0.


C:\misc> c:\python26\python
>>> map(None, [1, 2, 3], [2, 3, 4, 5])
[(1, 2), (2, 3), (3, 4), (None, 5)]
>>> map(None, ‘abc’, ‘xyz123’)
[(‘a’, ‘x’), (‘b’, ‘y’), (‘c’, ‘z’), (None, ‘1’), (None, ‘2’), (None, ‘3’)]

16 ноября 2012 г.

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


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

Исчезнувшая встроенная функция 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.