Есть ли в Python функции, или действительно ли все - метод?

В то время как они находятся оба в том же классе сложности, который не означает, что у них обоих есть то же время выполнения. Quicksort обычно быстрее, чем сортировка с объединением, просто потому что легче кодировать трудную реализацию и операции, которые это делает может пойти быстрее. Именно, потому что это, quicksort обычно быстрее люди, использует его вместо сортировки с объединением.

Однако! Я лично часто буду использовать сортировку с объединением или quicksort вариант, который ухудшается для сортировки с объединением, когда quicksort делает плохо. Помнить. Quicksort только O (n, регистрируют n) на среднее число . Это - худший случай, O (n^2)! Сортировка с объединением всегда O (n, регистрируют n). В случаях, где производительность в реальном времени или скорость отклика - необходимость и Ваши входные данные, мог прибывать из злонамеренного источника, Вы не должны использовать плоскость quicksort.

8
задан smci 22 August 2018 в 20:06
поделиться

3 ответа

Python имеет функции. Поскольку все является объектом , функции также являются объектами .

Итак, чтобы использовать ваш пример:

>>> def whatever():
...     pass
...
>>> whatever
<function whatever at 0x00AF5F30>

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

>>> whatever.func_name
'whatever'

В ответ на ваш вопрос - something () is not a метод of file.py . Лучше думать об этом как о функциональном объекте, привязанном к имени something в глобальном пространстве имен file.py .

>>> globals()
{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__d
oc__': None, 'whatever': <function whatever at 0x00AF5EB0>}

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

>>> whatever
<function whatever at 0x00AF5F30>
>>> whatever = "string"
>>> whatever
'string'

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

>>> somelambda = lambda x: x * 2
>>> somelambda
<function <lambda> at 0x00AF5F30>

Метод подобен атрибуту объекта, который является функцией. Что делает его методом, так это то, что методы привязываются к объекту. Это приводит к тому, что объект передается в функцию в качестве первого аргумента, который мы обычно называем self .

Давайте определим класс SomeClass с помощью метода somemethod и экземпляр someobject :

>>> class SomeClass:
...     def somemethod(one="Not Passed", two="Not passed"):
...         print "one = %s\ntwo = %s" % (one,two)
...
>>> someobject = SomeClass()

Давайте посмотрим на somemethod как на атрибут:

>>> SomeClass.somemethod
<unbound method SomeClass.somemethod>
>>> someobject.somemethod
<bound method SomeClass.somemethod of <__main__.SomeClass instance at 0x00AFE030

Мы видим, что это связанный метод объекта и несвязанный метод класса. Итак, теперь давайте вызовем метод и посмотрим, что произойдет:

>>> someobject.somemethod("Hello world")
one = <__main__.SomeClass instance at 0x00AFE030>
two = Hello world

Поскольку это связанный метод, первый аргумент, полученный somemethod , является объектом, а второй аргумент - первым аргументом в вызове метода. Назовем метод класса:

>>> SomeClass.somemethod("Hello world")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unbound method somemethod() must be called with SomeClass instance as first argument (got str instance instead)

Python жалуется, потому что мы пытаемся вызвать метод, не передавая ему объект соответствующего типа. Таким образом, мы можем исправить это, передав объект «вручную»:

>>> SomeClass.somemethod(someobject,"Hello world")
one = <__main__.SomeClass instance at 0x00AFE030>
two = Hello world

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

(It можно взять функцию и связать ее с классом, чтобы сделать из нее метод , но обычно это не то, что вам обычно нужно делать.)

31
ответ дан 3 November 2019 в 13:09
поделиться

В отличие от Java, в Python файл с именем file.py не обязательно содержит класс с именем file , как вы могли бы ожидать, если бы это был java файл с именем file.java .

В Python файл - это модуль, который на самом деле является просто пространством имен (более сопоставимым с пакетом Java, чем классом Java), а не классом. Рассмотрим пример file.py ниже:

def whatever_func():
    print "What ever function"

class SomeClass(object):
    def whatever_meth(self):
        print "What ever method"

В примере выше файл модуль / пространство имен содержит обычную функцию с именем Any_func и класс SomeClass , у которого есть метод any_meth .

2
ответ дан 3 November 2019 в 13:09
поделиться

Хм ... Вы можете работать с "чем угодно" как с обычной функцией в пространстве имен файлов.

0
ответ дан 3 November 2019 в 13:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: