原来,一直没有完全理解range()函数


欢迎关注本人博客:云端筑梦师

首先,先来看一下网上教程range()的用法。
语法
range(start, stop[, step])
参数

  • start: 计数从 start 开始。默认是从 0 开始。例如range(5)等价于range(0, 5);
  • stop: 计数到 stop 结束,但不包括 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) # 负数
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
>>> range(0)
[]
>>> range(1, 0)
[]

看到这里你是不是觉得已经掌握了range()函数呢,起初我也是这么认为的,直到今天,看到这样一段代码,我才知道事情没有那么简单,先贴代码:

pattern='asda'
f = lambda s: list(map({}.setdefault, s, range(len(s))))
print(f(pattern))

大家觉得这段代码会打印出什么呢?起初小编认为应该打印出[0,1,2,3],因为字符串长为4,所以应该打印出range(4),但是,控制台的结果却是这样的:
[0, 1, 2, 0]
和我所想的完全不一样,苦思冥想了半天,终于发现问题出在range()函数上,我们不妨先来看这样一段代码:

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

看到这里应该思路就明了了,当range()函数和map()函数嵌套使用时,range()函数里的值会一个一个迭代出来,而不是每次都是d=range(4),即map()函数每映射一次,range(4)从0开始递增一直到3,现在再来看一下上面那段代码,第一次映射,range(4)为0,字典里没有字母a,于是给字典绑定键值对{a:0},并返回键值0,第二次映射,range(4)为1,以此类推,字典没有s绑定键值对{s:1}并返回键值1......到第四次,字典里已经有a关键字了,于是不再给他绑定值,setdefault()函数就返回a的键值0,于是,setdefault()返回的值就依次是0,1,2,0,符合控制台打印的值。怎么样,是不是很神奇,小编的也是问了大佬才知道的,有兴趣的可以联系小编找到这位大佬噢!嘿嘿,新手上路,多多指教!

初心易得,始终难守。
原文地址:https://www.cnblogs.com/Aurora-Twinkle/p/8666769.html