Python3下map函數的問題
今天在群裏有人問題,他的Python程序在家裏運行好好的,但在公司一運行,就出問題了,查來查去查不出來,於是我就把他的程序調轉過來看了一下,發現又是Python2.7與Python3的問題。
代碼是做了一個可定義任意位數的水仙花數函數
def fn(n): rs = [] for i in range(pow(10,n-1),pow(10,n)): rs = map(int, str(i)) sum = 0 for k in range(0,len(rs)): sum = sum + pow(rs[k],n) if sum == i: print(i) if __name__=="__main__": n = int(input("請輸入正整數的位數:")) fn(n)
在Python2.7下面運行結果:
請輸入正整數的位數:5
54748
92727
93084
Process finished with exit code 0
但在Python3下面運行結果:
請輸入正整數的位數:5
Traceback (most recent call last):
File "D:/Program Files/JetBrains/PyCharm 2017.1.5/myPY/myPYPro/lesson001.py", line 18, in <module>
fn(n)
File "D:/Program Files/JetBrains/PyCharm 2017.1.5/myPY/myPYPro/lesson001.py", line 11, in fn
for k in range(0,len(rs)):
TypeError: object of type ‘map‘ has no len()
Process finished with exit code 1
因為提示是:TypeError: object of type ‘map‘ has no len()
所以直接把代碼簡化,輸出list看看
簡化代碼如下:
rs = [] for i in range(100,1000): rs = map(int, str(i)) print(rs)
在Python2.7下面運行結果:
[9, 9, 9]
Process finished with exit code 0
但在Python3下面運行結果:
<map object at 0x00C6E530>
Process finished with exit code 0
好吧,這就明白了,Python3下發生的一些新的變化,再查了一下文檔,發現加入list就可以正常了
在Python3中,rs = map(int, str(i)) 要改成:rs = list(map(int, str(i)))
則簡化代碼要改成如下:
rs = [] for i in range(100,1000): rs = list(map(int, str(i))) print(rs)
Python3下面運行結果就正常了:
[9, 9, 9]
Process finished with exit code 0
之前就發布過一篇關於:Python 2.7.x 和 3.x 版本區別小結
基於兩個版本的不一樣,如果不知道將要把代碼部署到哪個版本下,可以暫時在代碼裏加入檢查版本號的代碼:
import platform
platform.python_version()
通過判斷版本號來臨時調整差異,不過現在只是過渡,以後大家都使用Python3以下版本後,就應該不需要這樣做了。
Python3下map函數的問題