[英]Python: what type of object is here?
我在LPTHW這本書( http://learnpythonthehardway.org/book/ex39.html)上掙扎
這是代碼:
def new(num_buckets=256):
"""Initializes a Map with the given number of buckets."""
aMap = []
for i in range(0, num_buckets):
aMap.append([])
return aMap
def hash_key(aMap, key):
"""Given a key this will create a number and then convert it to
an index for the aMap's buckets."""
return hash(key) % len(aMap)
def get_bucket(aMap, key):
"""Given a key, find the bucket where it would go."""
bucket_id = hash_key(aMap, key)
return aMap[bucket_id]
def get_slot(aMap, key, default=None):
bucket = get_bucket(aMap, key)
for i, kv in enumerate(bucket):
k, v = kv
if key == k:
return i, k, v
return -1, key, default
kv
在get_slot
是什么意思? 這是什么類型的物體? 為什么下面的代碼不起作用? 我收到TypeError: 'int' object is not iterable
for i, kv in enumerate([1,2,3,4,5]):
k, v = kv
print(kv)
更新:最好再檢查一次enumerate
工作方式https://docs.python.org/2/library/functions.html#enumerate 。 謝謝大家的回答。
kv
分配了get_bucket(aMap, key)
產生的序列中的值之一; enumerate()
每次迭代都會生成這些值中的另一個(連同在示例代碼中分配給i
的整數計數器)。 顯然,這些對象中的每個對象本身都可以由兩個元素迭代。
您的嘗試產生了一個僅包含整數的列表,這些整數本身不可迭代,這就是為什么k, v = kv
分配失敗的原因。 嘗試以下方法:
for i, kv in enumerate([('foo', 1), ('bar', 2), ('baz', 3)]):
k, v = kv
這遍歷了(str, int)
元組的序列,因此k, v = kv
可迭代的拆包工作。
通常,所有enumerate()
所做的只是添加一個序列號。 默認是0,所以開始的每次迭代中for
循環, enumerate(something)
生產(counter, value_from_something)
該value_from_something
本身仍然只是一個Python對象,它可以支持各種操作。
您可以從同一示例的new()
函數中看到,該代碼處理的是列表列表:
def new(num_buckets=256):
"""Initializes a Map with the given number of buckets."""
aMap = []
for i in range(0, num_buckets):
aMap.append([])
return aMap
因此aMap
是一個包含其他列表的列表。 該代碼將每個列表稱為存儲桶 。 set()
函數表明,這些存儲桶包含具有兩個值的元組 ,即鍵和值:
else:
# the key does not, append to create it
bucket.append((key, value))
get_slot()
函數處理這些存儲桶中的一個,其中包含0個或多個(key, value)
對(並且所有鍵都已散列到同一存儲桶)。
enumerate()
返回一個元組的迭代器 。 每個元組都是一個索引和一個值。 例如,如果您說enumerate([2, 3, 4])
,您將得到(0, 2)
, (1, 3)
和(2, 4)
。 因為您for i, kv in enumerate(...)
使用for i, kv in enumerate(...)
,所以例如第一次迭代將具有i == 0
和kv == 2
。 然后k, v = kv
您說k, v = kv
,但kv
只是一個整數。 它不是元組或列表等,因此您不能將其分為兩個變量。 如果你說enumerate([(2, 3), (4, 5), (6, 7])
代替,就可以做到這一點,因為i
將是0
時kv
是(2, 3)
kv
可以再分分為兩個變量,因此k
為2
, v
為3
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.