这两天看到某个练习中的函数定义,遇到了一个新函数enumerate()
def get_slot(aMap, key, default=None):
"""
Returns the index, key, and value of a slot found in a bucket.
Returns -1, key, and default (None if not set) when not found.
"""
bucket = get_bucket(aMap, key)
for i, kv in enumerate(bucket):
k, v = kv #注意这个地方kv是一个含有两个元素的列表,这种等式可以把两个元素先后赋值给k和v
if key == k:
return i, k, v
return -1, key, default
下面来简单解释一下这个函数的用法。参考链接:www.cnblogs.com/vivilisa/archive/2009/03/19/1417083.html
假设我们定义一个list
testlist = ['a', 'b', 'c', 'd']
我们想遍历这个list中的索引和元素(所谓索引,就是testlist[0], testlist[1] 中的,0,1等等 元素位置编号),怎么办呢?
一般情况下会写成:
for i in range(0, len(testlist)):
print i, testlist[i]
注意range从0开始数,一直数到len(testlist)-1为止
但是这样写呢比较累赘。(其实我觉得蛮好的不知道为啥累赘...),所以就用到了python内置的enumerate()函数了。同样的需求,用新函数可以写成:
for index, text in enumerate(testlist):
print index, text
循环testlist 返回了此列表的索引和元素内容
enumerate的官方定义如下:
def enumerate(collection):
'Generates an indexed series: (0,coll[0]), (1,coll[1]) ...'
i = 0
it = iter(collection)
while 1:
yield (i, it.next())
i += 1
请看,这实际上是一个生成器,不占内存,无限吞吐。(关于yield生成器内容请参看我的
上一篇文章)
iter()是迭代器函数,举例:
>>> a = [123, 456, 789]
>>> b = iter(a)
>>> b.next()
123
>>> b.next()
456
>>> b.next()
789
>>> b.next()
Traceback (most recent call last):
File "", line 1, in ?
StopIteration