簡體   English   中英

Python:這是什么類型的對象?

[英]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

kvget_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 == 0kv == 2 然后k, v = kv您說k, v = kv ,但kv只是一個整數。 它不是元組或列表等,因此您不能將其分為兩個變量。 如果你說enumerate([(2, 3), (4, 5), (6, 7])代替,就可以做到這一點,因為i將是0kv(2, 3) kv可以再分分為兩個變量,因此k2v3

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM