Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.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 变量类型检查_Python_Python 2.7 - Fatal编程技术网

Python 变量类型检查

Python 变量类型检查,python,python-2.7,Python,Python 2.7,我有一个包含字符串的列表。这些字符串可以是单词,也可以是整数值。例如,此列表可能如下所示: ['0', 'Negate', '-3', '2', 'SPECIALCASE', '3'] 现在,根据它们的类型(整数或字符串),我想对它们进行不同的处理。但是,正如您所注意到的,我不能使用isinstace()。我仍然可以使用type()并尝试使用int()函数转换整数值,然后将整个过程放入try-except方法中,以避免在转换单词时出现错误。但这对我来说似乎有点刻薄。你知道处理这个案子的正确方法

我有一个包含字符串的列表。这些字符串可以是单词,也可以是整数值。例如,此列表可能如下所示:

['0', 'Negate', '-3', '2', 'SPECIALCASE', '3']

现在,根据它们的类型(整数或字符串),我想对它们进行不同的处理。但是,正如您所注意到的,我不能使用
isinstace()
。我仍然可以使用
type()
并尝试使用
int()
函数转换整数值,然后将整个过程放入try-except方法中,以避免在转换单词时出现错误。但这对我来说似乎有点刻薄。你知道处理这个案子的正确方法吗?提前谢谢

我会采取不同的方法。如果你知道所有可能的“特殊”词,检查一下这些词。其他所有内容都必须是int:

keywords = {'Negate', 'SPECIALCASE'}
tmp = []
for i in lis:
    if i in keywords:
        tmp.append(i)
    else
        tmp.append(int(i))

当然,如果您不想转换而接受INT以外的任何东西,那么尝试转换并退回到未转换的使用是一种方法。

我会采取不同的方法。如果你知道所有可能的“特殊”词,检查一下这些词。其他所有内容都必须是int:

keywords = {'Negate', 'SPECIALCASE'}
tmp = []
for i in lis:
    if i in keywords:
        tmp.append(i)
    else
        tmp.append(int(i))
当然,如果你想接受除INT以外的任何东西而不进行转换,那么尝试转换并退回到未转换的用途是一条可行之路。

一种“不要请求许可,请求原谅”的python方式:

请注意,如果您希望列表中只有少数项目是“特殊”案例项目,则应该这样做。否则,按照@doomster建议进行检查

一种“不要请求许可,请求原谅”的python方式:


请注意,如果您希望列表中只有少数项目是“特殊”案例项目,则应该这样做。否则,按照@doomster建议进行检查

这里有一个正则表达式方法供参考。这可能太过分了

mylist = ['0', 'Negate', '-3', '2', 'SPECIALCASE', '3']

import re
p = re.compile(r'-?\d+')
[p.match(e) is not None for e in mylist]
# returns [True, False, True, True, False, True]
这将返回一个带有
True
的列表,该列表适用于任意以
-
开头,然后包含一个或多个数字的字符串<对于任何其他字符串,代码>False

或者,如果您不需要列表,只想执行不同的操作:

for item in mylist:
    if p.match(item):
        # it's a number
    else:
        # it's a string

由于
None
(即不匹配)的计算结果为
False
,而其他任何内容(涉及正则表达式匹配时)的计算结果为
True
,因此上述方法有效。如果希望更明确,可以使用
如果p.match(item)不是None:

作为参考,这里有一个regex方法。这可能太过分了

mylist = ['0', 'Negate', '-3', '2', 'SPECIALCASE', '3']

import re
p = re.compile(r'-?\d+')
[p.match(e) is not None for e in mylist]
# returns [True, False, True, True, False, True]
这将返回一个带有
True
的列表,该列表适用于任意以
-
开头,然后包含一个或多个数字的字符串<对于任何其他字符串,代码>False

或者,如果您不需要列表,只想执行不同的操作:

for item in mylist:
    if p.match(item):
        # it's a number
    else:
        # it's a string

由于
None
(即不匹配)的计算结果为
False
,而其他任何内容(涉及正则表达式匹配时)的计算结果为
True
,因此上述方法有效。如果您想更明确,可以使用
如果p.match(item)不是None:

您可以使用类型转换来检查它是整数还是字符串

def is_integer(input):
  try:
    int(input)
    return True
  except:
    return False

for item in ['0', 'Negate', '-3', '2', 'SPECIALCASE', '3']:
  if is_integer(item):
     ...
  else:
     ...

您可以使用类型转换来检查它是整数还是字符串

def is_integer(input):
  try:
    int(input)
    return True
  except:
    return False

for item in ['0', 'Negate', '-3', '2', 'SPECIALCASE', '3']:
  if is_integer(item):
     ...
  else:
     ...

“尝试使用int()函数转换整数值”-这是一种方法,或者使用正则表达式…实现这一点的最佳方法在很大程度上取决于您希望最终结果是什么,您希望如何处理
'-3'
?这应该是一个
int
?如果您的
2.45
是字符串还是数字?是否应将其转换为
浮点
整数
?除非你想进行逐位检查,否则最好的方法应该是try/except。你说你想根据类型对它们进行不同的处理,但这是你真正想要的吗?Python不是为类型检查而设计的,它是作为duck类型语言设计的。根据对象是否可以执行操作而不是它的类型来执行操作。“尝试使用int()函数转换整数值”-这就是方法,或者使用正则表达式…执行此操作的最佳方法在很大程度上取决于您希望最终结果是什么,您希望如何处理
'-3'
?这应该是一个
int
?如果您的
2.45
是字符串还是数字?是否应将其转换为
浮点
整数
?除非你想进行逐位检查,否则最好的方法应该是try/except。你说你想根据类型对它们进行不同的处理,但这是你真正想要的吗?Python不是为类型检查而设计的,它是作为duck类型语言设计的。根据对象是否可以执行操作,而不是对象的类型,执行您想要的操作。+1,如果可能,这是一个很好的方法(尽管如果关键字非常少,则可能是次优的)。然而,列表的构建可以简化为:
tmp=[i if i in keywords else int(i)for i in lis]
+1,如果可能的话,这是一种很好的方法(尽管如果关键字非常罕见,它可能是次优的)。但是,列表的构建可以简化为:
tmp=[i if i in keywords else int(i)for i in lis]
不要使用
except
而不指定异常,它可以隐藏错误并使问题极难发现。不要使用
except
而不指定异常,它可以隐藏bug,使发现问题变得极其困难。