歡迎關(guān)注本人博客:云端筑夢師
首先洛退,先來看一下網(wǎng)上教程range()的用法照藻。
語法
range(start, stop[, step])
參數(shù)
- start: 計數(shù)從 start 開始另患。默認是從 0 開始凭语。例如range(5)等價于range(0, 5);
- stop: 計數(shù)到 stop 結(jié)束薄啥,但不包括 stop辕羽。例如:range(0, 5) 是[0, 1, 2, 3, 4]沒有5;
- step:步長垄惧,默認為1刁愿。例如:range(0, 5) 等價于 range(0, 5, 1).
實例
示例代碼:
>>>range(10) # 從 0 開始到 10
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> range(1, 11) # 從 1 開始到 11
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> range(0, 30, 5) # 步長為 5
[0, 5, 10, 15, 20, 25]
>>> range(0, 10, 3) # 步長為 3
[0, 3, 6, 9]
>>> range(0, -10, -1) # 負數(shù)
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
>>> range(0)
[]
>>> range(1, 0)
[]
看到這里你是不是覺得已經(jīng)掌握了range()函數(shù)呢到逊,起初我也是這么認為的铣口,直到今天,看到這樣一段代碼觉壶,我才知道事情沒有那么簡單脑题,先貼代碼:
pattern='asda'
f = lambda s: list(map({}.setdefault, s, range(len(s))))
print(f(pattern))
大家覺得這段代碼會打印出什么呢?起初小編認為應(yīng)該打印出[0,1,2,3],因為字符串長為4,所以應(yīng)該打印出range(4)铜靶,但是叔遂,控制臺的結(jié)果卻是這樣的:
[0, 1, 2, 0]
和我所想的完全不一樣,苦思冥想了半天,終于發(fā)現(xiàn)問題出在range()函數(shù)上掏熬,我們不妨先來看這樣一段代碼:
def a(b,d):
print('b=',b,'d=',d)
list(map(a,'abcd',range(4)))
輸出:
b= a d= 0
b= b d= 1
b= c d= 2
b= d d= 3
看到這里應(yīng)該思路就明了了,當(dāng)range()函數(shù)和map()函數(shù)嵌套使用時秒梅,range()函數(shù)里的值會一個一個迭代出來旗芬,而不是每次都是d=range(4)
,即map()函數(shù)每映射一次捆蜀,range(4)從0開始遞增一直到3疮丛,現(xiàn)在再來看一下上面那段代碼,第一次映射辆它,range(4)為0誊薄,字典里沒有字母a,于是給字典綁定鍵值對{a:0},并返回鍵值0锰茉,第二次映射呢蔫,range(4)為1,以此類推飒筑,字典沒有s綁定鍵值對{s:1}并返回鍵值1......到第四次片吊,字典里已經(jīng)有a關(guān)鍵字了,于是不再給他綁定值协屡,setdefault()函數(shù)就返回a的鍵值0俏脊,于是,setdefault()返回的值就依次是0肤晓,1爷贫,2,0补憾,符合控制臺打印的值漫萄。怎么樣,是不是很神奇盈匾,小編的也是問了大佬才知道的卷胯,有興趣的可以聯(lián)系小編找到這位大佬噢!嘿嘿威酒,新手上路窑睁,多多指教!