python - 将元素或元素数组作为参数传递的统一方式
问题描述
这是一个关于一般编程的问题,更准确地说是关于 python 的问题:我想将一个参数传递给一个函数,该函数有时是一个类型,有时是一个相同类型的数组。我还想编写函数的主体,以便在它只有一个元素时对那个元素执行某些操作,并逐点对每个元素执行此操作,并在它是数组时返回它们的列表。
编辑:让我补充一下,我现在正在使用
def foo(cards):
if isinstance(cards, list) == False :
cards = [cards]
for card in cards:
my_stuff
但对我来说它看起来不太像pythonic,我想知道是否有另一种使用解包*或其他运算符的方法。谢谢!
解决方案
这是多态性的一个很好的例子
您可以尝试迭代它,如果失败假设这是一个单一的值
def somefunc(value):
try:
for v in value:
dosomething(v)
except TypeError:
dosomething(value)
你也可以使用 isinstance 来测试是否是一个列表
def somefunc(value):
if isinstance(value, list):
for v in value:
dosomething(v)
else:
dosomething(value)
第一种方法更pythonic,也更通用
- 编辑 -
只是扩展我的答案。第一个示例更通用,因为它尝试迭代值而不是尝试检查它的类型。除了列表之外,python 中还有更多可迭代的东西,例如,迭代 dics,给你键,迭代文件,给你行,迭代生成器给你生成的值,等等。当您检查一个类型时,只有该类型及其子类型可以工作,但是当尝试迭代它时,任何实现迭代器协议的东西都可以工作。
这就是背后的“请求原谅优于请求许可”原则。作为一种鸭子类型的语言,尝试行为比子类型更普遍,我希望这会有所帮助
推荐阅读
- python - 如何解决google colab上python代码中的错误“KeyError:'Class'”?
- vb.net - 检查 ms 访问数据库中是否存在记录
- java - 在整数数组中找到最长连续序列的长度的程序的时间复杂度是多少?
- javascript - 使用 Fetch 访问 API 令牌
- flutter - 将图像类型转换为文件类型颤动
- javascript - 计算数组中锻炼的总持续时间
- oracle - Oracle ORDER BY 输入值
- string - 批处理字符串操作获得前 3 个块
- ptp - 配置 PTP_Timescale 参数
- docker - 在 Windows 10 容器上启用远程桌面