【问题标题】:How to determine if variable is int or list for loop in Python如何在 Python 中确定变量是 int 还是 list for 循环
【发布时间】:2020-02-21 11:15:48
【问题描述】:

我想编写一个函数,它接受一个 int 或一个 int 列表作为参数并处理该值。

类似的东西:

def func(input):
  if isinstance(input, int):
    print(input)
  else:
    for i in input:
      print(i)

这对我来说看起来不是很pythonic,但我不知道如何做得更好。有没有办法在 int 上“循环”或将 int “打包”到处理这两个选项的列表中

谢谢

【问题讨论】:

  • 您可以使用 lst = [input] if isinstance(input, int) else input 之类的东西,然后在循环中迭代 lst...
  • 这是合理的“pythonic”。我更经常这样做的一种方法是if not isinstance(x, list): x = [x],从而使其成为一个元素列表。然后你可以假设输入是一个列表开始。原则上,您的列表处理代码当然应该能够使用任意大小的列表。
  • 谢谢,这是两个漂亮的单行,我可以处理所有相同的。

标签: python for-loop isinstance


【解决方案1】:

你也可以遵循pythonic原则EAFP请求原谅比请求许可更容易

def func(your_input):
    try:
        for i in your_input:
            print(i)
    except TypeError:
        print(your_input)

您尝试迭代 input 中的条目并打印它们。如果输入类型不可迭代(如 int),则尝试迭代不可迭代对象会引发 TypeError 异常。在except 子句中,您可以打印输入。

编辑:正如@buran 所说,input 是 Python 的保留关键字,因此您应该避免使用它。

【讨论】:

  • 请用其他名称替换input。虽然被 OP 使用,但它是一个内置函数,不应被覆盖。
  • Ups,我忽略了,修复了!
  • EAFP 是一个有趣的原理,我正在尝试越来越多地使用它。但我问题的背景是我不想写 print-Statement double。
【解决方案2】:

我不会太担心它是否是 Pythonic。但是这是另一种方法,它不会限制您使用列表或整数,而是检查您是否有可迭代的:

def func(input):
    if not hasattr(input, '__iter__'):
        input = [input]

    for i in input:
        print(i)

但要考虑的另一个可能更清洁的选择可能是:

def func(*inputs):
    for i in inputs:
        print(i)

这个函数的调用方式略有不同:func(5) 用于标量,func(*lst) 用于迭代。

【讨论】:

  • 我喜欢你的第一种方法。关于第二个,它有点问题,因为这就像说他可以在函数中执行循环打印并将其称为func([5]) for ints。我认为这个问题的想法是让它对函数的调用者来说是透明的......
  • 非常好。但是我想包含它,因为对我来说,需要透明地处理标量和迭代,因为相同的参数可能(有时)表明设计存在问题,在这些情况下,最好让调用者清楚预期的内容通过。
【解决方案3】:

为了完整起见,除了@jcf 答案,您还可以使用functoools.sigledispatch(或functools.singledispatchmethod,如果在课堂上) 它允许重载具有不同实现的函数,具体取决于第一个参数的类型

from functools import singledispatch

@singledispatch
def func(foo):
    print(foo)

@func.register(list)
def _(foo):
    for item in foo:
        print(item)

func(1)
func([2, 3, 4])

现在的问题是,如果你得到不同于列表的东西,比如元组或生成器等,你会怎么做。你可能想要使用来自 collections.abc 的抽象类,而不是 list

附带说明 - 不要使用 input 作为名称 - 这是一个内置函数。

【讨论】:

    【解决方案4】:
    def func(input):
        for i in ([input] if isinstance(input, int) else input):
            print(i)
    

    根据需要将 int “打包”到列表中,但我认为它不会比您的原始代码更优雅。

    【讨论】:

      【解决方案5】:
      if type(input) == int:
          print('Integer')
          # Do integer operation
      elif isinstance(input, list):
          print('List')
          # Do list operation 
      

      【讨论】:

      • 是什么让您认为任意 Python 对象具有 is_integer() 方法?
      • @Iguananaut 只需将其修补到范围内的每个对象上;)
      猜你喜欢
      • 1970-01-01
      • 2011-02-08
      • 1970-01-01
      • 2019-12-20
      • 2017-12-21
      • 2013-08-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多