关于检查对象是否是Python中的迭代器的一个示例的混淆
我读过一些关于stackoverflow的文章,内容是关于如何在Python中检查对象是否是迭代器,但它们似乎并没有解决我的问题。我从《有效Python》一书中得到了这个例子 使用:关于检查对象是否是Python中的迭代器的一个示例的混淆,python,iterator,iterable,Python,Iterator,Iterable,我读过一些关于stackoverflow的文章,内容是关于如何在Python中检查对象是否是迭代器,但它们似乎并没有解决我的问题。我从《有效Python》一书中得到了这个例子 使用: visits = [15, 35, 80] normalize_defensive(visits) # No error visits = ReadVisits(path) # ReadVisits is a class with an __iter__ method. normalize_defensive(
visits = [15, 35, 80]
normalize_defensive(visits) # No error
visits = ReadVisits(path) # ReadVisits is a class with an __iter__ method.
normalize_defensive(visits) # No error
it = iter(visits)
normalize_defensive(it)
>>>
TypeError: Must supply a container
所以我的问题是:
if iter(numbers) is iter(numbers): # An iterator — bad!
为什么此行要检查变量数是否是迭代器?当访问量=[15,35,80]时,如果iter(numbers)是iter(numbers)
,那么当调用iterable时,对这样一个对象调用iter()
将始终生成一个新的迭代器对象。但是在迭代器上调用iter()
将始终返回相同的对象;这是一个要求,他们这样做
从:
返回迭代器对象本身。这需要允许容器和迭代器与for
和in
语句一起使用
由于iter(iterable)
总是返回自身,因此测试iter(obj)为iter(obj)
将为真;在这两种情况下都返回相同的对象。当您调用一个iterable时,对这样的对象调用iter()
将始终生成一个新的迭代器对象。但是在迭代器上调用iter()
将始终返回相同的对象;这是一个要求,他们这样做
从:
返回迭代器对象本身。这需要允许容器和迭代器与for
和in
语句一起使用
由于
iter(iterable)
总是返回自身,因此测试iter(obj)为iter(obj)
将为真;两种情况下都返回相同的对象。要帮助您理解Martijn的解释,请查看以下内容:
>>> numbers = [15, 35, 80]
>>> it = iter(numbers)
>>> it2 = iter(numbers)
>>> it3 = iter(it)
>>> id(it1)
51123792
>>> id(it2)
51056464 # id of it2 is different from it1
>>> id(it3)
51123792 # iterator of iterator it3 has the same id as iterator it1
因此,如果
numbers
是一个iterator
,在numbers
上调用iter
将始终返回内部相同的对象:iter(numbers)是iter(numbers)
将是True
为了帮助您理解Martijn的解释,请查看以下内容:
>>> numbers = [15, 35, 80]
>>> it = iter(numbers)
>>> it2 = iter(numbers)
>>> it3 = iter(it)
>>> id(it1)
51123792
>>> id(it2)
51056464 # id of it2 is different from it1
>>> id(it3)
51123792 # iterator of iterator it3 has the same id as iterator it1
因此,如果numbers
是一个iterator
,在numbers
上调用iter
将始终返回内部相同的对象:iter(numbers)是iter(numbers)
将是True