On 9/12/2011 9:06 AM, Duncan Booth wrote:
Terry Reedy<tjre...@udel.edu> wrote:
The statement containing the explicit next(items) call can optionally be
wrapped to explicitly handle the case of an empty iterable in whatever
manner is desired.
try:
<set up with next(items)>
except StopIteration:
raise ValueError("iterable cannot be empty")
Alternatively, if all you want is for an empty iterable to do nothing,
To do nothing, just pass above. If the function does nothing, it returns
None. In the fix_title function, it should return '', not None.
you could write it like this:
items = iter(iterable)
for first in items:
<process first>
break
I could, but I doubt I would ;-). Try...except StopIteration: pass is
more explicit and less roundabout.
for item in items:
<process non-first>
However, the issue I have with any of this pulling the first element out of
the loop is that if you want special processing for the first element you
are likely to also want it for the last,
Likely? I would say occasionally. Sentences have first words; file have
headers. Special processing for last items is only an issue if it
*replaces* the normal processing, rather than following the normal
processing.
> and if it is a single item you need
to process that item with both bits of special code. I don't see how that works
unless you have all elements within the single loop and test for first/last.
Like so, with tests:
def first_last_special(iterable):
print("\nIterable is",repr(iterable))
items = iter(iterable)
try:
first = next(items)
except StopIteration:
print('Nothing'); return
print(first, 'is the first item')
try:
current = next(items)
except StopIteration:
current = first
else:
for item in items:
print(current, 'is a middle item')
current = item
print(current, 'is the last item')
first_last_special('')
first_last_special('1')
first_last_special('12')
first_last_special('123')
first_last_special('12345')
--
Terry Jan Reedy
--
http://mail.python.org/mailman/listinfo/python-list