How does this work?

Jon Clements joncle at googlemail.com
Sun Jun 5 02:32:16 EDT 2011


On Jun 5, 4:37 am, Ben Finney <ben+pyt... at benfinney.id.au> wrote:
> <jyoun... at kc.rr.com> writes:
> > I was surfing around looking for a way to split a list into equal
> > sections. I came upon this algorithm:
>
> > >>> f = lambda x, n, acc=[]: f(x[n:], n, acc+[(x[:n])]) if x else acc
> > >>> f("Hallo Welt", 3)
> > ['Hal', 'lo ', 'Wel', 't']
>
> > (http://stackoverflow.com/questions/312443/how-do-you-split-a-list-int...)
>
> This is an excellent example of why “clever” code is to be shunned.
> Whoever wrote this needs to spend more time trying to get their code
> past a peer review; the above would be rejected until it was re-written
> to be clear.
>
> Here is my attempt to write the above to be clear (and fixing a couple
> of bugs too):
>
>     def split_slices(seq, slicesize, accumulator=None):
>         """ Return a list of slices from `seq` each of size `slicesize`.
>
>             :param seq: The sequence to split.
>             :param slicesize: The maximum size of each slice.
>             :param accumulator: A sequence of existing slices to which
>                 ours should be appended.
>             :return: A list of the slices. Each item will be a slice
>                 from the original `seq` of `slicesize` length; the last
>                 item may be shorter if there were fewer than `slicesize`
>                 items remaining.
>
>             """
>         if accumulator is None:
>             accumulator = []
>         if seq:
>             slice = seq[:slicesize]
>             result = split_slices(
>                 seq[slicesize:], slicesize, accumulator + [slice])
>         else:
>             result = accumulator
>         return result
>
> > It doesn't work with a huge list, but looks like it could be handy in
> > certain circumstances. I'm trying to understand this code, but am
> > totally lost. I know a little bit about lambda, as well as the ternary
> > operator
>
> In Python, ‘lambda’ is merely an alternative syntax for creating
> function objects. The resulting object *is* a function, so I've written
> the above using the ‘def’ syntax for clarity.
>
> The ternary operator is often useful for very simple expressions, but
> quickly becomes too costly to read when the expression is complex. The
> above is one where the writer is so much in love with the ternary
> operator that they have crammed far too much complexity into a single
> expression.
>
> > Just curious if anyone could explain how this works or maybe share a link
> > to a website that might explain this?
>
> Does the above help?
>
> --
>  \       “We must find our way to a time when faith, without evidence, |
>   `\    disgraces anyone who would claim it.” —Sam Harris, _The End of |
> _o__)                                                     Faith_, 2004 |
> Ben Finney

Just my 2p, but isn't the itertools "grouper" recipe prudent?



More information about the Python-list mailing list