【问题标题】:Handle For loop for a number, a string, or a list in python在 python 中处理数字、字符串或列表的 For 循环
【发布时间】:2023-02-26 03:10:31
【问题描述】:

如果循环变量可以是数字或字符串或列表,是否有更好的方法来编写 for 循环?

例如原始代码:

foo(x) x 接受一个数字 ex: 7,或一个字符串 ex:'hello'。

要在向后兼容的同时升级代码以获取列表(或 range() ),我首先检查类型:

if type(x) != list and type(x) != range:
    x = [x]
for i in x:
    foo(i)

想知道是否有更好的方法或函数来处理这种情况而不检查类型?

【问题讨论】:

  • 不检查类型- 但是代码仍然需要一些类型的推断
  • “更好的方法”是首先避免这种情况。一旦您处于那种情况,那么这种(或类似的)方法确实是唯一的方法。所以,既然听起来你决定这样做,那么最好的解决办法就是不这样做。

标签: python list


【解决方案1】:

一般来说,您希望避免检查特定类型。相反,检查行为.

在这种情况下,您可能想要检查 x 是否是 iterable,而不是 str

from collections.abc import Iterable


if isinstance(x, Iterable) and not isinstance(x, str):
    it = x
else:
    it = (x,)

for i in it:
    foo(x)

请注意,类无需显式继承 Iterable ABC 即可通过 isinstance 检查。任何遵循可迭代协议的类都被视为 Iterable 的“虚拟子类”,用于 isinstance 检查。

【讨论】:

  • string 是一个可迭代的字符,这不是 OP 的情况
  • @RomanPerekhrest 好点,已编辑以解决该问题。
【解决方案2】:
if not isinstance(x, (list, range)):
    x = [x]
for i in x:
    foo(i)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-22
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 2021-08-25
    • 1970-01-01
    • 2012-04-03
    相关资源
    最近更新 更多