Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中确定变量是int还是list for loop_Python_For Loop_Isinstance - Fatal编程技术网

如何在Python中确定变量是int还是list for loop

如何在Python中确定变量是int还是list for loop,python,for-loop,isinstance,Python,For Loop,Isinstance,我想写一个函数,它接受一个int或int的列表作为参数,并处理这些值 诸如此类: def func(input): if isinstance(input, int): print(input) else: for i in input: print(i) 对我来说,这看起来不太像蟒蛇,但我不知道如何做得更好。有没有办法在int上循环或将int打包到处理这两个选项的列表中 谢谢 根据您的需要将int打包到列表中,但我不认为它比您的原始代码更优雅 if typ

我想写一个函数,它接受一个int或int的列表作为参数,并处理这些值

诸如此类:

def func(input):
  if isinstance(input, int):
    print(input)
  else:
    for i in input:
      print(i)
对我来说,这看起来不太像蟒蛇,但我不知道如何做得更好。有没有办法在int上循环或将int打包到处理这两个选项的列表中

谢谢

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

if type(input) == int:
    print('Integer')
    # Do integer operation
elif isinstance(input, list):
    print('List')
    # Do list operation 

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

您也可以遵循pythonic原则,EAFP更容易请求原谅而不是允许

if type(input) == int:
    print('Integer')
    # Do integer operation
elif isinstance(input, list):
    print('List')
    # Do list operation 
您尝试迭代输入中的条目并打印它们。若输入的类型不像int那个样是可iterable的,那个么尝试迭代一个不可iterable的对象会引发一个TypeError异常。在EXPECT子句中,您可以打印输入


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

您也可以遵循pythonic原则,EAFP更容易请求原谅而不是许可

您尝试迭代输入中的条目并打印它们。若输入的类型不像int那个样是可iterable的,那个么尝试迭代一个不可iterable的对象会引发一个TypeError异常。在EXPECT子句中,您可以打印输入


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

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

定义函数输入: 如果不是hasattrinput,“\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu 输入=[输入] 对于输入中的i: 普林蒂 但是另一个潜在的更清洁的选择可以是:

def func*输入: 对于输入中的i: 普林蒂
您可以稍微不同地调用此函数:func5用于标量,func*lst用于iterables。

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

定义函数输入: 如果不是hasattrinput,“\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu 输入=[输入] 对于输入中的i: 普林蒂 但是另一个潜在的更清洁的选择可以是:

def func*输入: 对于输入中的i: 普林蒂
您可以稍微不同地调用此函数:func5用于标量,func*lst用于可比性。

为了完整起见,除了@jcf answer之外,您还可以在类中使用或 它允许使用不同的实现重载函数,具体取决于第一个参数的类型

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])
现在的问题是,如果您得到的是与列表不同的东西,比如元组或生成器等,您应该怎么做。您可能希望使用来自的抽象类而不是列表


另一方面,请注意-不要将输入用作名称-它是一个内置函数。

为了完整起见,除了@jcf answer之外,您还可以在课堂上使用或 它允许使用不同的实现重载函数,具体取决于第一个参数的类型

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])
现在的问题是,如果您得到的是与列表不同的东西,比如元组或生成器等,您应该怎么做。您可能希望使用来自的抽象类而不是列表


另一方面,不要使用输入作为名称,它是一个内置函数。

如果isinstanceinput,则可以使用类似lst=[input]的东西,然后使用int-else-input,然后在循环中迭代lst……这是合理的pythonic。我更经常这样做的一种方法是,如果不是isinstancex,则list:x=[x],从而使其成为一个单元素列表。然后,您可以继续假设输入是一个列表。您的列表处理代码原则上应该能够使用任意大小的列表。谢谢,这是两个漂亮的单行程序,我同样可以处理以下内容。您可以使用类似lst=[input]的东西,如果isinstanceinput,则使用int-else-input,然后在循环中迭代lst……这是合理的python。我更经常这样做的一种方法是,如果不是isinstancex,则list:x=[x],从而使其成为一个单元素列表。然后,您可以继续假设输入是一个列表。您的列表处理代码原则上应该能够使用任意大小的列表。谢谢,这是两个漂亮的单行程序,我同样可以处理以下内容。是什么让您认为任意Python对象都有一个is_integer方法?@Iguananaut只需将它修补到作用域中的每个对象上;是什么让你认为一个任意的Python对象有一个is_integer方法?@Iguananaut只需将它修补到范围内的每个对象上;我喜欢你的第一种方法。关于第二个,这有点问题,因为这就像说他可以在函数中执行打印循环,并将其称为func[5]for int。我认为这个问题的目的是为了让它对你来说是错误的
函数的调用者…非常好的观点。但是我想把它包括在内,因为对我来说,透明地处理标量和iterables作为同一个参数的需要有时可能表明设计有问题,在这种情况下,最好让调用方清楚地知道应该通过什么。我喜欢你的第一种方法。关于第二个,这有点问题,因为这就像说他可以在函数中执行打印循环,并将其称为func[5]for int。我认为这个问题的目的是让函数的调用者明白这一点……非常好。但是我想包括它,因为对我来说,需要透明地将标量和可伸缩性作为同一个参数来处理,这有时可能表明设计有问题,在这种情况下,最好让调用方清楚地知道应该传递什么。请用其他名称替换输入。虽然由OP使用,但它是一个内置函数,不应被覆盖。我认为,Ups已修复!EAFP是一个有趣的原则,我正在尝试越来越多地使用它。但是我的问题的背景是我不想把print语句写两遍。请用其他名称替换input。虽然由OP使用,但它是一个内置函数,不应被覆盖。我认为,Ups已修复!EAFP是一个有趣的原则,我正在尝试越来越多地使用它。但我问题的背景是,我不想把打印声明写得太重。