【问题标题】:sqrt() argument after * must be a sequence* 后的 sqrt() 参数必须是一个序列
【发布时间】:2023-03-16 12:40:01
【问题描述】:

首先,我是 python 的超级新手,我实际上是在寻找我的问题,但这些例子太难理解了。

这是我的作业;我需要一个函数,它将两个函数作为参数并返回两个函数的结果是否相同?基本上,它会给出 TRUE 或 FALSE。

为此我写道:

def f(x,y,z):
    k=x(*z)
    l=y(*z)
    return k == l

我为单个函数编写的 previos 代码正在运行,但是当我将其修改为上面的两个函数时,它给出了如下错误:

import math
>>> f(math.sqrt,math.cos,5)

Traceback (most recent call last):
  File "<pyshell#56>", line 1, in <module>
    f(math.sqrt,math.cos,5)
  File "D:/Users/karabulut-ug/Desktop/yalanmakinesi.py", line 2, in f
    k=x(*z)
TypeError: sqrt() argument after * must be a sequence
>>> 

我想不通,因为错误给出函数通常不带序列。所以我认为这没有任何意义:) 任何帮助表示赞赏.. 谢谢 :)

【问题讨论】:

  • 你认为 splat 运算符 * 在这种情况下会做什么?

标签: python function parameters arguments typeerror


【解决方案1】:

您需要删除*。它用于拆包。所以:

def f(x,y,z):
    k=x(z)
    l=y(z)
    return k == l

当你想传入一个可迭代的对象时,你可以使用* 操作符,比如listtuple 作为被拆分的东西。所以,例如:

a = [1,2,3,4,5]

所以,对于任意函数,f:

f(*a) = f(1,2,3,4,5)

【讨论】:

    【解决方案2】:

    语法*zz 上调用argument unpacking。当z 只是一个整数时,没有定义迭代器行为,因此您会看到此错误。试试:

    >>> f(math.sqrt, math.cos, [5])
    

    【讨论】:

      【解决方案3】:

      z 只是一个数字,但* 参数扩展语法要求您传入一个序列(例如listtuplestr)。

      删除 *(并使您的函数仅适用于单个参数),或在函数签名中使用 *z 以使 z 成为包含 0 个或多个捕获参数的元组:

      def f(x, y, z):
          k = x(z)
          l = y(z)
          return k == l
      

      def f(x, y, *z):
          k = x(*z)
          l = y(*z)
          return k == l
      

      后者现在也适用于具有多个参数的函数:

      f(math.pow, math.log, 10, 10)
      

      如果您在签名中添加了**kw 参数,则也可以处理关键字参数:

      def f(x, y, *args, **kwargs):
          k = x(*args, **kwargs)
          l = y(*args, **kwargs)
          return k == l
      

      这里我将z重命名为args,以更好地体现其用途。

      【讨论】:

        猜你喜欢
        • 2016-07-23
        • 1970-01-01
        • 1970-01-01
        • 2013-10-16
        • 2020-03-29
        • 1970-01-01
        • 1970-01-01
        • 2015-08-27
        • 2012-07-26
        相关资源
        最近更新 更多