首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >不用*拆包(星号)

不用*拆包(星号)
EN

Stack Overflow用户
提问于 2022-04-10 15:03:10
回答 4查看 274关注 0票数 3

如果我想保持功能,而不想在中间使用*,那么等效的替代函数是什么?例如,

代码语言:javascript
运行
复制
import operator as op
print(op.eq(*map(str.upper, ['a', 'A'])))

如何避免在这里使用*

我创建了一个函数,比如,

代码语言:javascript
运行
复制
def unpack(args):
  return *args

但是它会产生语法错误,print(*args)工作,但return失败。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2022-04-11 07:06:26

实现这一目标的一种方法是创建一个名为apply的函数。

代码语言:javascript
运行
复制
def apply(func, args):
    return func(*args)
代码语言:javascript
运行
复制
apply(op.eq, map(str.upper, ['a', 'A']))
票数 1
EN

Stack Overflow用户

发布于 2022-04-10 15:09:16

functools.reduce可用于将两个参数的函数应用于可累积迭代,这将适用于您的示例情况。

代码语言:javascript
运行
复制
import operator as op
from functools import reduce
print(reduce(op.eq, map(str.upper, ['a', 'A'])))
票数 2
EN

Stack Overflow用户

发布于 2022-04-10 15:09:43

您可以使用reduce来检查所有映射的元素是否彼此相等。

代码语言:javascript
运行
复制
from functools import reduce
print(reduce(op.eq, map(str.upper, ['a', 'A'])))

不过,这并不是一件明智的事。我之所以这样说,是因为上面的reduce调用并不泛化为多或少元素的情况:

如果输入为空,它将在TypeError: reduce() of empty sequence with no initial value.

  • If中失败,它会被赋予一个单项输入列表,它将返回一个字符串,而不是一个布尔型的TrueFalse.

  • If,它会给出一个带有3+项的列表,它最终会将字符串与布尔值进行比较,并且总是会导致False.

如果您的计划是使用确切的两个操作数调用op.eq,那么使用*解压缩是合适的。即使是在功能范围内。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71817809

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档