杰瑞科技汇

Python iteritems()怎么用?和items()有何区别?

Of course! Let's break down iteritems() in Python, which is a concept that's crucial for understanding the evolution of Python versions.

Python iteritems()怎么用?和items()有何区别?-图1
(图片来源网络,侵删)

The Short Answer (TL;DR)

iteritems() was a method on dictionaries in Python 2 that returned an iterator over the dictionary's (key, value) pairs.

It was replaced by the items() method in Python 3, where items() now returns an iterator by default.


The Detailed Explanation

The story of iteritems() is a great example of a major change between Python 2 and Python 3, specifically regarding memory efficiency.

What is an Iterator?

First, it's important to understand what an iterator is. An iterator is an object that represents a stream of data. You can get the next item from the stream using the next() function, and it doesn't hold the entire sequence in memory at once.

Python iteritems()怎么用?和items()有何区别?-图2
(图片来源网络,侵删)

Think of it like a conveyor belt in a factory: you can see the next item that's coming, but you don't have the entire warehouse of products on the belt at the same time.

iteritems() in Python 2

In Python 2, dictionaries had three methods for getting key-value pairs:

  1. items(): Returned a list of (key, value) tuples.
  2. iteritems(): Returned an iterator over the (key, value) pairs.
  3. viewitems(): Returned a dynamic view object (a more advanced concept, similar to Python 3's items()).

Why did iteritems() exist? The Memory Problem

Let's see the difference in action.

# Python 2 Example
my_dict = {'a': 1, 'b': 2, 'c': 3}
# Using items()
# This creates a FULL LIST of all (key, value) pairs in memory.
items_list = my_dict.items()
print "Type of items():", type(items_list)
# Output: Type of items(): <type 'list'>
print "items() list:", items_list
# Output: items() list: [('a', 1), ('c', 3), ('b', 2)]
# Using iteritems()
# This creates an ITERATOR. It doesn't build the whole list upfront.
items_iterator = my_dict.iteritems()
print "Type of iteritems():", type(items_iterator)
# Output: Type of iteritems(): <type 'dictionary-iterator'>
# You can loop over it, and it generates items one by one on the fly.
print "Looping over iteritems():"
for key, value in items_iterator:
    print key, value
# Output:
# a 1
# c 3
# b 2
# You can also use the next() function
# items_iterator = my_dict.iteritems() # You have to re-create it, as it's exhausted
print "next() on iteritems():", next(items_iterator)
# Output: next() on iteritems(): ('a', 1)

The Big Advantage: If you had a dictionary with millions of entries, my_dict.items() would try to create a list of millions of tuples in memory, which could be slow and consume a huge amount of RAM. my_dict.iteritems() would use very little memory because it only generates one pair at a time.

The Python 3 Revolution: items() is the New iteritems()

The Python developers decided that the memory-efficient iterator behavior was almost always what developers wanted. Therefore, they made it the default behavior.

In Python 3:

  • items() was changed to return an iterator (specifically, a dict_items view object that behaves like an iterator).
  • iteritems() was completely removed.
  • viewitems() was also removed, and its functionality is now handled by items().

This simplified the API and promoted more memory-efficient code by default.

Let's see the Python 3 equivalent:

# Python 3 Example
my_dict = {'a': 1, 'b': 2, 'c': 3}
# In Python 3, items() returns an iterator-like object (a dict_items view)
items_iterator = my_dict.items()
print "Type of items():", type(items_iterator)
# Output: Type of items(): <class 'dict_items'>
print "items() object:", items_iterator
# Output: items() object: dict_items([('a', 1), ('b', 2), ('c', 3)])
# You can loop over it directly, just like in Python 2's iteritems()
print "Looping over items():"
for key, value in items_iterator:
    print key, value
# Output:
# a 1
# b 2
# c 3
# You can also use next() after converting it to an iterator
# The dict_items object is iterable, but not an iterator itself.
# You can get an iterator from it using iter().
iterator_from_items = iter(my_dict.items())
print "next() on items() iterator:", next(iterator_from_items)
# Output: next() on items() iterator: ('a', 1)

Summary Table

Method Python 2 Python 3 Return Type Key Characteristic
items() Returns a list of tuples. Returns an iterator (dict_items view). list (Py2) / dict_items (Py3) Memory usage: Py2 (High), Py3 (Low)
iteritems() Returns an iterator. Does not exist. dictionary-iterator Memory efficient. Replaced by items() in Py3.
viewitems() Returns a dynamic view object. Does not exist. dict_items view Similar to Py3's items().

How to Write Code for Both Python 2 and 3

If you are maintaining legacy code that needs to run on both Python 2 and 3, you cannot use iteritems() directly. The standard solution is to use the six library, which provides compatibility helpers.

First, install six: pip install six

Then, in your code:

import six
my_dict = {'a': 1, 'b': 2}
# This will use iteritems() in Python 2 and items() in Python 3
items_iterator = six.iteritems(my_dict)
for key, value in items_iterator:
    print(key, value)

Conclusion

  • iteritems() was a Python 2 method for getting a memory-efficient iterator over a dictionary's key-value pairs.
  • It was removed in Python 3.
  • In Python 3, the items() method now provides this memory-efficient iterator behavior by default.
  • The change was made to encourage more efficient coding practices and simplify the dictionary API.
  • For cross-compatible code, use a library like six.
分享:
扫描分享到社交APP
上一篇
下一篇