С точки зрения разработки программного обеспечения , было бы интересно разделить это на две функции:
- функция, которая делает что-то итеративное в случае, если это не список иликортеж (или что-то еще), например, упаковав его в список или кортеж;и
- функция, которая выполняет итерацию по элементам после того, как мы делаем ее итеративной, и выполняет обработку, например:
def make_iterable(iterable):
if not isinstance(iteable, (list,tuple)):
return (iterable, )
return iterable
def foo(arg1 ,sequence=None):
for item in <b>make_iterable(</b>sequence<b>)</b>:
do_something(arg1, item)
Так что теперь мы можем легко сделать больше вещей итеративными.Например, мы можем вернуть пустой кортеж для None
, так что None
разрешен как способ избежать любой итерации:
def make_iterable(iterable):
if <b>iterable is None</b>:
return ()
if not isinstance(iteable, (list,tuple)):
return (iterable, )
return iterable
Также легко повторно использовать описанный выше метод во всех видах методов, которые позволяют вводить как один объект, так и повторяемый.
Обратите внимание, что могут быть некоторые проблемы с вышеупомянутымНекоторые типы являются итеративными, но сами по себе не являются элементами, для которых вы хотите выполнить итерацию: например, str
ing является итеративным (вы можете выполнять итерацию по его символам).В этом случае В Python, как мне определить, является ли объект итеративным? будет успешным, но может быть плохой идеей «распаковать» строку.Но вы, возможно, не захотите перебирать строку, когда вы называете ее foo(4, 'foobar')
, а видите ее как отдельный элемент.