[英]Trying to understand Python maps
在我的編程經驗之前,我還沒有真正使用過maps
,所以我無法理解更complex versions of maps
。 所以讓我們說問題是你得到一個整數分鍾,在這種情況下n = 808
。 你用這個號碼做的是把它轉換成24 hour time
,所以hh:mm
。 這會給你13:28
。 完成此操作后,將該時間的數字相加以獲得答案。 所以, answer would be 14
。 我看到了這個解決方案的一個非常好的單行,我試圖理解它,因為我的解決方案需要大約5 more lines of code
。
這是解決方案:
sum(map(int, str(n // 60 * 100 + n % 60)))
所以我理解地圖在數字迭代中應用相同的函數,但是throws me off is the int,str(...) part
。 我不確定幕后會發生什么。
這里使用了兩個數學運算符:
//
表示分割,即分割后提取結果的整數部分。 %
表示模量,即除法后的余數。 因此,對於n = 808
,算法返回:
str(808 // 60 * 100 + 808 % 60) = str(13 * 100 + 28) = '1328'
map(int, '1328')
然后獲取字符串'1328'
中的每個字符並將其轉換為整數,它本身返回一個可迭代的。 map
需要一個iterable作為其第二個(和后續)參數。 可以迭代字符串以一次提取一個字符。
最后, sum
獲取從map
返回的每個整數並將它們加在一起。
通過與生成器表達式sum
,可以得到邏輯的等效公式:
sum(int(i) for i in str(n // 60 * 100 + n % 60))
如你所說, map
可以在一個iterable上應用一個函數。
所以,當你這樣做的時候
map(int, str(n // 60 * 100 + n % 60))
您在iterable str(n // 60 * 100 + n % 60)
上使用了int
函數str(n // 60 * 100 + n % 60)
。 您可能知道,字符串是可迭代的(因為,當然,您可以迭代它們) - 可以輕松檢查
for char in "abcd":
print(char)
a
b
c
d
str(n // 60 * 100 + n % 60)
的回報是'1328'
。 將int
應用於每個char時,將每個char轉換為整數。 你可以很容易地看到這一點,而不是立即拿走sum
,得到一個lsit
list(map(int, str(n // 60 * 100 + n % 60)))
[1, 3, 2, 8]
我想現在很容易看到sum
將得到這些數字的總和,這是你想從一開始:)
int()
和str()
都是函數。 在該特定示例中,當n=808
時, str()
函數的參數被計算為1328,其在轉換為字符串時變為'1328'
。 字符串是可迭代的,因此map
函數只是將int
應用於字符串的每個字符,從而生成序列[1,3,2,8]
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.