在 python2 和 python3 中处理地图函数
Handling map function in python2 & python3
最近我遇到一个问题并对可能的解决方案感到困惑,
代码部分是
// code part in result reader
result = map(int, input())
// consumer call
result_consumer(result)
这与它们如何工作无关,问题是当您在 python2
中 运行 时,它会在结果获取部分引发异常,因此结果 reader 可以处理异常,但在 python3
的情况下返回了 map object
,因此只有消费者能够处理异常。
是否有任何解决方案保持 map
功能并处理 python2
和 python3
中的异常
python3
>>> d = map(int, input())
1,2,3,a
>>> d
<map object at 0x7f70b11ee518>
>>>
python2
>>> d = map(int, input())
1,2,3,'a'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'a'
>>>
如果您始终需要在同一位置发生异常,您始终可以通过将地图对象包装在 list
调用中来强制地图对象产生其结果:
result = list(map(int, input()))
如果在 Python 2 中发生错误,它将在调用 map
期间发生,而在 Python 3 中,错误将在 [=11= 期间出现] 称呼。
略有不足的是,在 Python 2 的情况下,您将创建一个新列表。为避免这种情况,您可以选择基于 sys.version
分支并仅在 Python 3 中使用 list
但这对您来说可能太乏味了。
map
的行为并不是 python2 和 python3 之间的唯一区别,input
也是区别,您需要牢记两者之间的基本区别两者使代码兼容
python 3 vs python 2
map = itertools.imap
zip = itertools.izip
filter = itertools.ifilter
range = xrange
input = raw_input
因此,要为两者编写代码,您可以使用替代方法,例如对两者都有效的列表理解,对于那些没有简单替代方法的方法,您可以制作新函数 and/or 使用条件重命名,例如
my_input = input
try:
raw_input
except NameError: #we are in python 3
my_input = lambda msj=None: eval(input(msj))
(或者用你最喜欢的方式检查哪个版本的 python 正在执行)
# code part in result reader
result = [ int(x) for x in my_input() ]
# consumer call
result_consumer(result)
无论您 运行 使用哪个 python 版本,您的代码都会执行相同的操作。
但是正如 jsbueno 提到的,eval
和 python2 的 input
是 dangerous 所以使用更安全的 raw_input
或 python3 的 input
try:
input = raw_input
except NameError: #we are in python 3
pass
(或者用你最喜欢的方式检查哪个版本的 python 正在执行)
然后,如果您的计划是将您的意见提供为 1,2,3
添加适当的拆分
# code part in result reader
result = [ int(x) for x in input().split(",") ]
# consumer call
result_consumer(result)
在这种情况下我通常使用我自己的地图版本来避免任何可能发生的问题,它是
def my_map(func,some_list):
done = []
for item in some_list:
done.append( func(item) )
return done
还有我自己的输入版本
def getinput(text):
import sys
ver = sys.version[0]
if ver=="3":
return input(text)
else:
return raw_input(text)
如果您正在处理一个大项目,请将它们添加到 python 文件中,并在您需要时随时导入它们,就像我所做的那样。
最近我遇到一个问题并对可能的解决方案感到困惑, 代码部分是
// code part in result reader
result = map(int, input())
// consumer call
result_consumer(result)
这与它们如何工作无关,问题是当您在 python2
中 运行 时,它会在结果获取部分引发异常,因此结果 reader 可以处理异常,但在 python3
的情况下返回了 map object
,因此只有消费者能够处理异常。
是否有任何解决方案保持 map
功能并处理 python2
和 python3
python3
>>> d = map(int, input())
1,2,3,a
>>> d
<map object at 0x7f70b11ee518>
>>>
python2
>>> d = map(int, input())
1,2,3,'a'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'a'
>>>
如果您始终需要在同一位置发生异常,您始终可以通过将地图对象包装在 list
调用中来强制地图对象产生其结果:
result = list(map(int, input()))
如果在 Python 2 中发生错误,它将在调用 map
期间发生,而在 Python 3 中,错误将在 [=11= 期间出现] 称呼。
略有不足的是,在 Python 2 的情况下,您将创建一个新列表。为避免这种情况,您可以选择基于 sys.version
分支并仅在 Python 3 中使用 list
但这对您来说可能太乏味了。
map
的行为并不是 python2 和 python3 之间的唯一区别,input
也是区别,您需要牢记两者之间的基本区别两者使代码兼容
python 3 vs python 2
map = itertools.imap
zip = itertools.izip
filter = itertools.ifilter
range = xrange
input = raw_input
因此,要为两者编写代码,您可以使用替代方法,例如对两者都有效的列表理解,对于那些没有简单替代方法的方法,您可以制作新函数 and/or 使用条件重命名,例如
my_input = input
try:
raw_input
except NameError: #we are in python 3
my_input = lambda msj=None: eval(input(msj))
(或者用你最喜欢的方式检查哪个版本的 python 正在执行)
# code part in result reader
result = [ int(x) for x in my_input() ]
# consumer call
result_consumer(result)
无论您 运行 使用哪个 python 版本,您的代码都会执行相同的操作。
但是正如 jsbueno 提到的,eval
和 python2 的 input
是 dangerous 所以使用更安全的 raw_input
或 python3 的 input
try:
input = raw_input
except NameError: #we are in python 3
pass
(或者用你最喜欢的方式检查哪个版本的 python 正在执行)
然后,如果您的计划是将您的意见提供为 1,2,3
添加适当的拆分
# code part in result reader
result = [ int(x) for x in input().split(",") ]
# consumer call
result_consumer(result)
在这种情况下我通常使用我自己的地图版本来避免任何可能发生的问题,它是
def my_map(func,some_list):
done = []
for item in some_list:
done.append( func(item) )
return done
还有我自己的输入版本
def getinput(text):
import sys
ver = sys.version[0]
if ver=="3":
return input(text)
else:
return raw_input(text)
如果您正在处理一个大项目,请将它们添加到 python 文件中,并在您需要时随时导入它们,就像我所做的那样。