<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""><div><blockquote type="cite" class=""><div class="">On 19 Mar 2016, at 22:49, Charles Constant via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; wrote:</div><div class=""><div dir="ltr" class=""><div class=""><div class=""><span style="font-size:13px" class=""><br class=""></span></div><div class="">I'd like to see a comparison, but Python "for" loops seem more flexible to me than Swifts. It's been a couple years since I moved to Swift, but I vaguely remember a lot of cool loop stuff in Python, like "for {} else" for empty loops, etc.</div></div></div></div></blockquote><br class=""></div><div>Python does have a few nice features, but then that’s an argument for adding the ones we like to Swift I think. That said, the else branch for loops that don’t run is the one that stands out to me; it seems vaguely familiar like it might have been discussed already, but I don’t know what happened with it.&nbsp;</div><div><br class=""></div><div>Otherwise a lot of Python’s list handling is from how values are generated, which is what we already have Generators/Sequences so we can generate values however we like, though it might mean defining a new type to do it. (or push for the stdlib to add one if it’s useful enough).</div><div><br class=""></div><div>Oh actually, there is one other neat feature in Python loops which is the ability to yield; essentially it just lets you resume a loop type operation where you left off, which can make methods simpler, as an example on the Python wiki here:&nbsp;<a href="https://wiki.python.org/moin/ForLoop" class="">https://wiki.python.org/moin/ForLoop</a></div><div><pre style="border: 1pt solid rgb(174, 189, 204); background-color: rgb(243, 245, 247); padding: 5pt; font-family: courier, monospace; white-space: pre-wrap; word-wrap: break-word; font-size: 14px;" class="">def my_range(start, end, step):
<span class="anchor" id="line-2-11"></span>    while start &lt;= end:
<span class="anchor" id="line-3-10"></span>        yield start
<span class="anchor" id="line-4-6"></span>        start += step
<span class="anchor" id="line-5-3"></span>
<span class="anchor" id="line-6-3"></span>for x in my_range(1, 10, 0.5):
<span class="anchor" id="line-7-3"></span>    print x</pre><div class="">Here a function is defined to implementing a strided range, and it uses the yield command to avoid having to add extra conditionals (not sure what that actually compiles into, but I imagine it’s just hiding boilerplate you’d otherwise have to add yourself), so that’s something that might be nice too.</div><div class=""><br class=""></div><div class=""><br class=""></div><div class="">It’s a bit of a tangent, but at the same time it is a feature that avoids some tricky cases in Swift loops such as when you decide to break a loop but want to resume it later; both it and else blocks on loops can avoid some common boiler-plate, but they don’t necessarily do anything specifically that we can’t do. There’s also a short-hand for striding through arrays if I remember right, something like foo[:2], I don’t remember exactly, it’s been a while since I used it, but of course that’d be ambiguous with dictionaries, but other than brevity (which is arguably added learning curve) it’s no different than a .stride(2) method or whatever.</div></div></body></html>