473,396 Members | 2,004 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,396 software developers and data experts.

Python 2.4 | 7.3 The for statement

Hi My name is Juan Carlos Rodrigo, and I love Python.
It is the most impressive and usefull language that
I have ever seen.

I am studing, at http://www.uoc.edu, an Information
Technology Postgraduate. And I have programmed some
REXX applications in my past Jobs (So I love python,
no more ENDS).

** Reposting from Python-Dev with some more comments.

--------8<--------8<--------8<--------8<--------8<--------8<--------

Python 2.4 | 7.3 The for statement:
-----------------------------------

for_stmt ::= "for" target_list "in" expression_list ":"
suite ["else" ":" suite]
New for statement:
------------------

for_stmt ::= "for" target_list "in" expression_list
[ "and" expression ] ":"
suite ["else" ":" suite]

** If the expression evaluates to False before
entering the for, jump else.
** If the expression is evaluated to False after
the first iteration, break.
So ¿What we can do with this new for?,
and ¿It is going to avoid line exceed?:

"My second remark is that our intellectual powers are rather
geared to master static relations and that our powers to
visualize processes evolving in time are relatively poorly
developed." [1]
It is easier if we see it beforehand:
-------------------------------------

leave = False
alist = [1,2,3,3,4,5,6,7,8,9]
for item in alist and not leave:
if item is 1: leave = True
Avoiding code exceed:
---------------------

a = 1
b = 2
c = 3
alist = [1,2,3,4,5,6,7,8,9]
for item in alist and a < 2 and b < 3 and c < 4:
if item == 3: a += 1
if item == 2: b += 1
if item == 1: c += 1
print "%d %d %d" % (a,b,c)
# three lines off (25% less on breaks)
Other features and the else:
----------------------------

alist = [1,2,3]
enter = False
if list[0] == 4:
enter = True
for item in alist and enter:
print item
else:
print "No account"
The real problem:
-----------------

"The exercise to translate an arbitrary flow diagram more or
less mechanically into a jump-less one, however, is not to be
recommended." [1]

Ok, it's not recommended, at large, but Python should make it possible,
and then the people will choose.
[1] Go To Statement Considered Harmful
Edsger W. Dijkstra
http://www.acm.org/classics/oct95/

PD: Your work is impressive, thanks.

--------8<--------8<--------8<--------8<--------8<--------8<--------

+++ Andrew Koenig wrote:
for_stmt ::= "for" target_list "in" expression_list
[ "and" expression ] ":"
suite ["else" ":" suite] It can't work. The expression_list could be just a variable, as could the expression, in which case you get "for" target_list "in" variable "and" variable ":"
Considering that your for definition is not correct.
and, of course variable "and" variable is already an expression. So it's ambiguous.
No my definition has no ambiguity in it and your idea does
not work as you think, because is not an expression as you
incorrectly wrote out, is an expression_list:
leave = True
l = [1,2,3,4]
form item in l and leave: File "<stdin>", line 1
form item in l and leave:

And your example what really does is iterating over the
expression_list (BTW: "and" cannot be used as you point out):
leave = True
l = [1,2,3,4]
for item in l, leave:

.... print item
....
[1, 2, 3, 4]
True
+++ Nick Coghlan wrote:
Interesting idea, but not really needed given the
existence of the break statement: for item in alist:
if item is 1:
break
Well Nick the point here is to have the possibility
to leave for loops without using the break statement,
and of course use breaks too.
+++ Nick Coghlan wrote:
All non-sequential control structures are merely constrained ways of
using goto (the underlying machine code will devolve into conditional and unconditional branches and jumps - i.e. goto's).
No doubt Nick, but were are programming on a very, very high level
language.

____________________________________________ 'break' is a highly constrained form of goto and a fundamental part
of structured programming (as is 'continue')
Well you are expressing it better than I am.
I used to share your sentiment regarding break and continue -
experience (especially Python experience) has convinced me otherwise. Python embraces the concept of breaking out of a loop to the point
that it even has an 'else' clause on loop structures that is executed only if the loop is exited naturally rather than via a break statement.

And It will be better with by for breaking possibilities.
Regardless of whether you personally choose to use break and
continue, the existence of those statements is the main reason
that the addition of a flag condition to for loops is highly
unlikely.


¿Why is that C has both break, continue and in for breaking
capabilities?

Thanks for your comments.

Jul 18 '05 #1
11 2246
brainsucker wrote:
Python 2.4 | 7.3 The for statement:
-----------------------------------

for_stmt ::= "for" target_list "in" expression_list ":"
suite ["else" ":" suite]
New for statement:
------------------

for_stmt ::= "for" target_list "in" expression_list
[ "and" expression ] ":"
suite ["else" ":" suite]

** If the expression evaluates to False before
entering the for, jump else.
** If the expression is evaluated to False after
the first iteration, break.



I think that your idea is good but as others said the "and" literal
could be confusing. ¿Maybe we can use another word instead of "and"?

The for definition could be like this:

for_stmt ::= "for" target_list "in" expression_list
[ "until" expression ] ":"
suite ["else" ":" suite]

or some other word that clarifies the work of the expression

leave_cond_1 = False
leave_cond_2 = False
mylist = [1,2,3,4,5]
for item in mylist until leave_cond_1 or leave_cond_2:
print item

Jul 18 '05 #2
On 22 Mar 2005 06:32:38 -0800, he*************************@gmail.com
<he*************************@gmail.com> wrote:
The for definition could be like this:

for_stmt ::= "for" target_list "in" expression_list
[ "until" expression ] ":"
suite ["else" ":" suite]

or some other word that clarifies the work of the expression

leave_cond_1 = False
leave_cond_2 = False
mylist = [1,2,3,4,5]
for item in mylist until leave_cond_1 or leave_cond_2:
print item


Still, this can be acomplished with the break statement, in a more
clear way, with less variables (which implies less work for the gc and
everybody).

In your example, instead of verifying some condition and setting
leave_cond_n to True, you just check the same condition, and use
break.

.. Facundo

Blog: http://www.taniquetil.com.ar/plog/
PyAr: http://pyar.decode.com.ar/
Jul 18 '05 #3
>Still, this can be acomplished with the break statement, in a more
clear way, with less variables (which implies less work for the gc and
everybody).


Glad to read from you Francisco. :) Keep up that hard work, thanks.

I have been talking with those Python programmers (And Role players),
:) and I have made a bit of code for you avoiding the "and" keyword:
cordure = 54
monster = [ "Tchulu", "Golum", "Cerberus"]
for wow in monster until cordure < 0:
if wow == "Tchulu": cordure -= 30
elif wow == "Cerberus": cordure -= 20
elif wow == "Golum": cordure -= 5
if cordure <= 0:
print "End game"
else:
print "Next task"

This is your version:
cordure = 54
monster = [ "Tchulu", "Golum", "Cerberus"]
for wow in monster:
if wow == "Tchulu": cordure -= 30
elif wow == "Cerberus": cordure -= 20
elif wow == "Golum": cordure -= 5
if cordure < 0: break # :|
if cordure <= 0:
print "End game"
else:
print "Next task"

a) As you can see, one more line of code...
Plus, in your code I do not see beforehand
when this roleplayer runs out of cordure.
# Little things matter. :)
b) Given that your IF condition is evaluated
ON every iteration, I see one line less on code,
evaluating the SAME conditions, for every
iteration.
c) I did not want to say this :|

+Debugging and friends:
+Tools > Search
+Break

ummmm in the new for I can see what is going
to happend beforehand, so I can search faster
when debugging:

"...our intellectual powers are rather
geared to master static relations..." [1]
d) I just wont more power on the just impressive
Python for loop, we can have it all.
[1] Go To Statement Considered Harmful
Edsger W. Dijkstra
http://www.acm.org/classics/oct95/

PD1: Francisco we have talked about this on the IRC,
the code presented is somehow TOY code to express
what I (Somebody?) want Python to do.

PD2: Try to imagine that nested loop with those
200+ lines in it ( Probably is bad coded :?, or not! )
and try to debug all those BREAKS.

Jul 18 '05 #4
On 22 Mar 2005 21:05:45 -0800, "brainsucker" <jr*******@gmail.com>
declaimed the following in comp.lang.python:

cordure = 54
monster = [ "Tchulu", "Golum", "Cerberus"]
for wow in monster until cordure < 0:
if wow == "Tchulu": cordure -= 30
elif wow == "Cerberus": cordure -= 20
elif wow == "Golum": cordure -= 5
if cordure <= 0:
print "End game"
else:
print "Next task"

And that could be modified even further, using current
(unextended) Python...

Data structures are your friend...

-=-=-=-=-=-=-=-

monsterValue = { "Tchulu" : 30, #is this "cthulhu"?
"Cerberus" : 20,
"Golum" : 5 #wimp!
}

cordure = 56

for (m, c) in monsterValue.items(): #don't need m, actually
if cordure < 0: break
print m
cordure -= c

if cordure <= 0:
print "End Game!"
else:
print "Next Task"

# Using the dictionary allows for such things as:

strikes = [ "Golum", "Golum", "Tchulu",
"Golum", "Cerberus", "Golum" ]
cordure = 56

for m in strikes:
if cordure < 0 : break
print m
cordure -= monsterValue[m]

if cordure <= 0:
print "End Game!"
else:
print "Next Task"

-=-=-=-=-=-=-=-=-
G:\My Documents>python t.py
Golum
Tchulu
Cerberus
Next Task
Golum
Golum
Tchulu
Golum
Cerberus
End Game!

G:\My Documents>

-- ================================================== ============ <
wl*****@ix.netcom.com | Wulfraed Dennis Lee Bieber KD6MOG <
wu******@dm.net | Bestiaria Support Staff <
================================================== ============ <
Home Page: <http://www.dm.net/~wulfraed/> <
Overflow Page: <http://wlfraed.home.netcom.com/> <

Jul 18 '05 #5
>And that could be modified even further, using current
(unextended) Python...


Nice code Wulfraed (or Dennis), back to the basics:

-- Your code
foo = 0
for item1 in range(10):
for item2 in range(10):
foo = item1 + item2
if foo == 2:
print "Let's see"
break # let's go
if (item1 + item2) == 2:
break # one more time
print foo

(7)
-- Another version
foo = 0
for item1 in range(10) until foo == 2:
for item2 in range(10) until foo == 2:
foo = item1 + item2
if foo == 2: print "Let's see"
print foo

# ~40% lines off on the n^2 breaking loop

PD: This for helps avoiding python bytecode too.
PD2: Nice pictures and links on your webpages Wulfraed. :)
PD3: Just don't imagine a n^16 breaking loop, could that exist?

Jul 18 '05 #6
On 24 Mar 2005 19:49:38 -0800, brainsucker <jr*******@gmail.com> wrote:

foo = 0
for item1 in range(10) until foo == 2:
for item2 in range(10) until foo == 2:
foo = item1 + item2
if foo == 2: print "Let's see"
print foo


In this case, I'll use the following:

try:
for item1 in range(10):
for item2 in range(10):
if item1 + item2 == 2:
print "Let's see"
raise StopIteration
except StopIteration:
pass
print item1 + item2

And I tell you what. Actually I'm very lousy remembering things, and
if I want the loop to stop in a different number, I'll have to change
the code in TWO places. In mine, just one (and this in your codes get
worse with more for levels).

Another approach:

def bar():
for item1 in range(10):
for item2 in range(10):
if item1 + item2 == 2:
print "Let's see"
return item1 + item2
foo = bar()
print foo

.. Facundo

Blog: http://www.taniquetil.com.ar/plog/
PyAr: http://pyar.decode.com.ar/
Jul 18 '05 #7
-- Your code
foo = 0
for item1 in range(10):
for item2 in range(10):
foo = item1 + item2
if foo == 2:
print "Let's see"
break # let's go
if (item1 + item2) == 2:
break # one more time
print foo


The outer loop never reaches 1, so we can get rid of it along with the
second if statement, the additions aren't needed either.

So what you have left is this.

for foo in range(3):
pass
print "Let's see"
print foo

Which is the same as:

print "let's see\n", foo
I know that isn't the point. Just couldn't resist. ;)

Ron_Adam
Jul 18 '05 #8
Well facundo, I knew that you were going for the return inside the
loop.
The exception is cool, but not for newcomers.
My proposend code is simpler clearer and more compact, I keep watching
your code, and don't know....

Funcs for breaking loops, exceptions for breaking loops.
:o

Jul 18 '05 #9
As you know is not functional...
It represents something that happens everyday on Python programming.
We can reduce the other examples of code to:

prinf foo

Too. :)

Jul 18 '05 #10
Franciso, some more code.

Breaking with two conditions, and fun with exceptions:

moflo = 1
try:
for item1 in range(10):
if (item1 * moflo) == 3: raise StopIteration
for item2 in range(10):
if (item2 * moflo) == 2: raise StopIteration
print "Let's see"
except StopIteration:
pass

As oppossed to:

leave = False
moflo = 1
for item1 in range(10) until ((item1 * moflo) == 3) or leave:
for item2 in range(10) until leave:
if (item2 * moflo) == 2: leave = True
print "Let's see"

What can I say.

Jul 18 '05 #11
On 25 Mar 2005 15:41:25 -0800, "brainsucker" <jr*******@gmail.com> wrote:
Franciso, some more code.

Breaking with two conditions, and fun with exceptions:

moflo = 1
try:
for item1 in range(10):
if (item1 * moflo) == 3: raise StopIteration
for item2 in range(10):
if (item2 * moflo) == 2: raise StopIteration
print "Let's see"
except StopIteration:
pass

As oppossed to:

leave = False
moflo = 1
for item1 in range(10) until ((item1 * moflo) == 3) or leave:
for item2 in range(10) until leave:
if (item2 * moflo) == 2: leave = True
print "Let's see"

What can I say.

You could play with until in this form (in 2.4 generator expressions):
def until(cond): ... if not cond: return True
... raise StopIteration
... for x in (x for x in xrange(10) if until(x==3)): print x,

...
0 1 2

actually, that until would read better as "notyet" after the "if"

Regards,
Bengt Richter
Jul 18 '05 #12

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

0
by: Eric Wichterich | last post by:
Hello Pythonistas, does anyone know an equivalent python statement for perl's "next"-statement? (Perl's "next" skips a loop cycle and continues with the next loop cycle - it does not abort the...
4
by: Nick Craig-Wood | last post by:
Python newbie advice needed! I'm tring to write what I would have expressed in Perl as my ($a, $b, $c) = @array; This is very similar to the python statement a, b, c = array
4
by: Chang LI | last post by:
I tried to launch "python.exe test.py" in another program. After the launch the console was showed and exited on Windows. I want the console stay there. Is there a Python statement to wait an event...
15
by: Judi Keplar | last post by:
I am currently taking a course to learn Python and was looking for some help. I need to write a Python statement to print a comma- separated repetition of the word, "Spam", written 511 times...
0
by: Mile Blenton | last post by:
Hello all, I am considering python as a 'scripting' language to be used in my application where users must be able to write their own code to access application data, use the application...
26
by: Christoph Zwerschke | last post by:
You will often hear that for reasons of fault minimization, you should use a programming language with strict typing: http://turing.une.edu.au/~comp284/Lectures/Lecture_18/lecture/node1.html I...
6
by: ronrsr | last post by:
but I keep getting syntax errors on this one - adict = {'zid': result, 'keywords': result{0], 'quotations':result,'citations':result{3]}; zhtml.print_update_form(adict); result = 22L
852
by: Mark Tarver | last post by:
How do you compare Python to Lisp? What specific advantages do you think that one has over the other? Note I'm not a Python person and I have no axes to grind here. This is just a question for...
13
by: John Dann | last post by:
A Python newbie, but some basic understanding of how classes, objects etc work in eg VB.Net. However, I'm struggling a little to translate this knowledge into the Python context. I'm trying to...
6
by: tcfg | last post by:
dear all: I have searched the debug informations of many python's IDE, but I cannot find the method about debuging the extend module written in Visual studio 2008 on windows. The wingIDE tell...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
0
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows...
0
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each...
0
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing,...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.