a = iter([1]) next(a) next(a)
引发StopIteration
*
a = iter([1]) next(a) next(a, None)
没有StopIteration
*但是next
的定义是
def next(迭代器,默认=无):
Python如何区分参数是默认参数还是用户指定的参数?
问题来源:stackoverflow
内置函数next
不使用None
作为默认值。实际上,正如您在C源代码(对于cpython,官方Python解释器)中所看到的那样,其参数处理非常低级。纯Python等效项将在函数定义中使用* rgs
并手动检查是否有一个或两个参数。可能是这样的:
def next(\*rgs):
assert(1 <= len(args) <= 2)
try:
return args[0].__next__()
except StopIteration:
if len(args) > 1:
return args[1]
else:
raise
在Python中复制类似行为的一种更好的方法是使用默认值,该默认值对于外部代码意外提供是不可能的。这是执行此操作的一种好方法:
_sentinel = object() # a unique object that no user should ever pass to us
def next(iterator, default=_sentinel):
try:
return iterator.__next__()
except StopIteration:
if default is not _sentinel:
return default
else:
raise
回答来源:stackoverflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。