1. 程式人生 > >Python3下map函數的問題

Python3下map函數的問題

python 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函數的問題