Функции библиотеки Python без аргументов - PullRequest
5 голосов
/ 03 мая 2019

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

from operator import pow
from functools import partial 

squared = list(map(partial(pow, b=2), range(10))

Как оказалось, это не сработало. TypeError: pow() takes no keyword arguments

Смущен Я проверил, если pow(b=2, a=3) сделал. Это не так.

Я проверил исходный код оператора , ничего подозрительного.

В замешательстве, я начал сомневаться в собственных знаниях Python, я сам сделал функцию Pow.

def pow(a, b):
  return a ** b

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

Я не собираюсь догадываться, в чем причина проблемы, я просто спрашиваю: почему это вещь, и если существует обходной путь.

Ответы [ 4 ]

5 голосов
/ 03 мая 2019

Если вы проверите подпись встроенной pow() или operator.pow() с помощью функции help() в интерактивной оболочке, вы увидите, что им требуется только для позиционирования Параметры (обратите внимание на косую черту):

pow(x, y, z=None, /)
pow(a, b, /)

Причина в том, что обе функции реализованы на C и не имеют имен для своих аргументов. Вы должны предоставить аргументы позиционно. В качестве обходного пути вы можете создать функцию Python pow():

def pow(a, b):
    return a ** b

См. Также Что означает косая черта (/) в списке параметров функции? в разделе часто задаваемых вопросов.

1 голос
/ 03 мая 2019

Ошибка исходит из оператора b = 2.

squared = list(map(partial(pow, b=2), range(10))

Функция с частичной передачей ключевого параметра 'b' в функцию pow, что приводит к ошибке, так как функция pow ()принимает только позиционные аргументы.См. help(pow) для получения дополнительной информации.

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

map(partial(pow, 2), range(10))

приводит к созданию этой последовательности:

[1, 2, 4, 8, 16, 32, 64, 128, 256, 512]

, который показывает, что частичная функция фактически вычисляет 2^range(10)

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

b=2
test = map(lambda x: x**b, range(10))
print(list(test))

, что приводит к:

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

без импорта.

1 голос
/ 03 мая 2019

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

>>>>help(pow)

Справка по встроенной функции pow во встроенных модулях:

pow (x, y, z = Нет, /) Эквивалентно x**y (с двумя аргументами) или x**y% z (с тремя аргументами)

Some types, such as ints, are able to use a more efficient algorithm when
invoked using the three argument form.

Исходный код оператора, упомянутый в вашемвопрос может не совпадать с вопросом о версии Python, в которой вы пытаетесь.

0 голосов
/ 03 мая 2019

pow в качестве библиотечной функции принимает только позиционные параметры. Итак, вот как вы могли бы сделать выше:

squared = list(map(partial(pow,2), range(10)))

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

...