444,035 Members | 1,408 Online
Need help? Post your question and get tips & solutions from a community of 444,035 IT Pros & Developers. It's quick & easy.

Python IF THEN chain equivalence

 P: n/a I'm translating a program in Python that has this IF Then chain IF x1 < limit: --- do a --- IF x2 < limit: --- do b --- IF x3 < limit: --- do c --- .----- ------ IF x10 < limt: --- do j --- THEN THEN ----- THEN THEN THEN In other words, as long as 'xi' is less than 'limit' keep going down the chain, and when 'xi' isn't less than 'limit' jump to end of chain a continue. Is this the equivalence in Python? IF x1 < limit: --- do a --- elif x2 < limit: --- do b --- ---- ---- elif x10 < limit: --- do j --- Nov 13 '08 #1
15 Replies

 P: n/a jzakiya schrieb: I'm translating a program in Python that has this IF Then chain IF x1 < limit: --- do a --- IF x2 < limit: --- do b --- IF x3 < limit: --- do c --- .----- ------ IF x10 < limt: --- do j --- THEN THEN ----- THEN THEN THEN In other words, as long as 'xi' is less than 'limit' keep going down the chain, and when 'xi' isn't less than 'limit' jump to end of chain a continue. Is this the equivalence in Python? IF x1 < limit: --- do a --- elif x2 < limit: --- do b --- ---- ---- elif x10 < limit: --- do j --- Of course not. After "do a", it would stop. You need to use if x1 < limit: do a if x2 < limit: do b ... Alternatively, and depending on the nature of "do X", you can do for x, todo in ((x1, do_a), (x2, do_b), ...): if x < limit: todo() else: break This implies though that the "dos" are pure functions without (variable) arguments. Diez Nov 13 '08 #2

 P: n/a I think you should rethink your post. The first case you posted makes no sense in any language I know. Also, a whole lot of nested IF's is a bad idea in any language. In Python, you will end up with code indented 40+ characters if you keep going. ----- Original Message ---- From: jzakiya To: py*********@python.org Sent: Thursday, November 13, 2008 5:06:53 PM Subject: Python IF THEN chain equivalence I'm translating a program in Python that has this IF Then chain IF x1 < limit: --- do a --- IF x2 < limit: --- do b --- IF x3 < limit: --- do c --- .----- ------ IF x10 < limt: --- do j --- THEN THEN ----- THEN THEN THEN In other words, as long as 'xi' is less than 'limit' keep going down the chain, and when 'xi' isn't less than 'limit' jump to end of chain a continue. Is this the equivalence in Python? IF x1 < limit: --- do a --- elif x2 < limit: --- do b --- ---- ---- elif x10 < limit: --- do j --- -- http://mail.python.org/mailman/listinfo/python-list __________________________________________________ ________________ Ask a question on any topic and get answers from real people. Go to Yahoo! Answers and share what you know at http://ca.answers.yahoo.com Nov 13 '08 #3

 P: n/a On Nov 13, 5:21*pm, Alan Baljeu To: python-l...@python.org Sent: Thursday, November 13, 2008 5:06:53 PM Subject: Python IF THEN chain equivalence I'm translating a program in Python that has this IF Then chain IF *x1 < limit: * --- do a --- * * IF *x2 < limit: *--- do b --- * * * * IF x3 < limit: *--- do c --- * * * * * * * * * * * *.----- * * * * * * * * * * * * ------ * * * * * * * * * * IF *x10 < limt: --- do j --- * * * * * * * * * * THEN * * * * * * * * *THEN * * * * * * * ----- * * * * * THEN * * *THEN THEN In other words, as long as * *'xi' is less than 'limit' keep going down the chain, and when 'xi' isn't less than 'limit' jump to end of chain a continue. Is this the equivalence in Python? IF *x1 < limit: * * * * --- do a *--- elif x2 < limit: * * * * --- do b --- ---- ---- elif x10 < limit: * * * *--- do j --- --http://mail.python.org/mailman/listinfo/python-list * * * __________________________________________________ ________________ Ask a question on any topic and get answers from real people. Go to Yahoo! Answers and share what you know athttp://ca.answers.yahoo.com In the code the 'xi's and 'limit' are variables and the --- do letters --- phrases are simply writes to any array: an_array[xi]=0 Actually, the code makes perfectly good sense, and is a necessity of the algorithm I'm implementing, and works perfectly good in Forth, and can be written quite nicely within a normal page width. I was just hoping I could perform the equivalent chain in Python without having to grossly indent the source code past the normal width of a printed page. But if that's the only way to do it in Python, then so be it. Nov 13 '08 #4

 P: n/a On 2008-11-13, jzakiya

 P: n/a On 2008-11-13, Grant Edwards I'm translating a program in Python that has this IF Then chain IF x1 < limit: --- do a --- IF x2 < limit: --- do b --- IF x3 < limit: --- do c --- .----- ------ IF x10 < limt: --- do j --- THEN THEN ----- THEN THENTHEN The placement of the THEN statements makes absolutely no sense in any language I've ever seen. >In other words, as long as 'xi' is less than 'limit' keep goingdown the chain, and when 'xi' isn't less than 'limit' jump to end ofchain a continue.Is this the equivalence in Python? IF x1 < limit: --- do a --- elif x2 < limit: --- do b --- ---- ---- elif x10 < limit: --- do j --- No. That's not the same at all. Here's one solution: while True: if x1 limit: break do a if x2 limit: break do b if x3 limit: break do c ... if x10 limit: break do j break Oops. I botched the case where xN == limit. Each of the tests should be xN >= limit. -- Grant Edwards grante Yow! ... I see TOILET at SEATS ... visi.com Nov 13 '08 #6

 P: n/a On 2008-11-14 00:19, jzakiya wrote: On Nov 13, 5:48 pm, "M.-A. Lemburg" >>From: jzakiya To: python-l...@python.orgSent: Thursday, November 13, 2008 5:06:53 PMSubject: Python IF THEN chain equivalenceI'm translating a program in Python that has this IF Then chainIF x1 < limit: --- do a --- IF x2 < limit: --- do b --- IF x3 < limit: --- do c --- .----- ------ IF x10 < limt: --- do j --- THEN THEN ----- THEN THENTHEN You should probably consider using a function and thenconvert the conditions to define return points:def do_something(...args...): if x1 >= limit: return ...do a... if x2 >= limit: return ...do b... etc.That is provided I understand the flow of control in yourexample... it's kind of strange to have THEN mark the *end*of the then-branch in an if-then-else construct. It's interesting to see people think it's strange to have code that has multiple nested levels of IF THEN. Not at all, that's fairly common in a lot of languages. It's not common to mark the end of the then-part using the THEN keyword, though. You'd normally expect the body of the then-part after the keyword. Apparently you haven't seen any Forth, assembly, et al code. All you're doing is having the branch point for each conditional be the end of the chain, otherwise it falls through to the code after the conditional. This is done all the time in languages that let you actually manipulate the hardware. Just as a suggestion :-) a little humility would go a long way toward being open minded and receptive to different paradigms. Without giving any hint as to what the quoted snippet of code is written in, how do you expect people to make any sense of it ? Especially when using an RPN stack oriented language in a Python forum. There's a reason why we hide Python byte code running on the VM stack machine from Python users ;-) -- Marc-Andre Lemburg eGenix.com Professional Python Services directly from the Source (#1, Nov 14 2008) >>Python/Zope Consulting and Support ... http://www.egenix.com/mxODBC.Zope.Database.Adapter ... http://zope.egenix.com/mxODBC, mxDateTime, mxTextTools ... http://python.egenix.com/ __________________________________________________ ______________________ 2008-11-12: Released mxODBC Connect 0.9.3 http://python.egenix.com/ :::: Try mxODBC.Zope.DA for Windows,Linux,Solaris,MacOSX for free ! :::: eGenix.com Software, Skills and Services GmbH Pastor-Loeh-Str.48 D-40764 Langenfeld, Germany. CEO Dipl.-Math. Marc-Andre Lemburg Registered at Amtsgericht Duesseldorf: HRB 46611 Nov 14 '08 #9

 P: n/a jzakiya: I asked a very narrow question about a very specific language mechanism, and I know exactly what and why I'm doing what I'm doing. You are of course free to use Python as you want. And probably some of the answers weren't fully polite. But it's interesting to see why they have given such answers. While your code can be fit for Forth or assembly, it may be unfit, in its current form, for the usual practices of Python programming (or C#/ Java programming, etc). In high-level languages large trees of very nested ifs are seen as error-prone, not much readable, brittle... So some alternative solutions are often used (even if they may be a little slower). If you need speed you may use Psyco too. Bye, bearophile Nov 14 '08 #10

 P: n/a On Nov 13, 4:39*pm, Grant Edwards In other words, as long as * *'xi' is less than 'limit' keep going down the chain, and when 'xi' isn't less than 'limit' jump to end of chain a continue. Is this the equivalence in Python? *IF *x1 < limit: * * * * --- do a *--- *elif x2 < limit: * * * * --- do b --- *---- *---- *elif x10 < limit: * * * *--- do j --- No. *That's not the same at all. Here's one solution: while True: * if x1 limit: break * do a * if x2 limit: break * do b * if x3 limit: break * do c * ... * if x10 limit: break * do j * break * -- Grant Edwards * * * * * * * * * grante * * * * * * Yow! Eisenhower!! *Your * * * * * * * * * * * * * * * * * at * * * * * * * mimeograph machine upsets * * * * * * * * * * * * * * * *visi.com * * * * * *my stomach!! Nov 14 '08 #11

 P: n/a jzakiya wrote: I'm translating a program in Python that has this IF Then chain IF x1 < limit: --- do a --- IF x2 < limit: --- do b --- IF x3 < limit: --- do c --- .----- ------ IF x10 < limt: --- do j --- THEN THEN ----- THEN THEN THEN In other words, as long as 'xi' is less than 'limit' keep going down the chain, and when 'xi' isn't less than 'limit' jump to end of chain a continue. if x1 < limit: do a if x2 < limit: do b if x3 < limit: do c Nov 14 '08 #12

 P: n/a On 2008-11-14, Ethan Furman I'm translating a program in Python that has this IF Then chain IF x1 < limit: --- do a --- IF x2 < limit: --- do b --- IF x3 < limit: --- do c --- .----- ------ IF x10 < limt: --- do j --- THEN THEN ----- THEN THENTHENIn other words, as long as 'xi' is less than 'limit' keep goingdown the chain, and when 'xi' isn't less than 'limit' jump to end ofchain a continue. if x1 < limit: do a if x2 < limit: do b if x3 < limit: do c . . . etc That doesn't do what the OP specified. If any of the conditions fail, it should "jump" to the end and not execute _any_ further "do" statements regardless of the values of subsequent conditions. On the plus side, it's easy to read and understand -- on the minus side, it doesn't jump to the end once the tests start failing. If all you want is easy to read and understand, then this is event simpler: sys.exit(0) -- Grant Nov 14 '08 #13

 P: n/a Grant Edwards wrote: On 2008-11-14, Ethan Furman jzakiya wrote: >>I'm translating a program in Python that has this IF Then chain IF x1 < limit: --- do a --- IF x2 < limit: --- do b --- IF x3 < limit: --- do c --- .----- ------ IF x10 < limt: --- do j --- THEN THEN ----- THEN THENTHENIn other words, as long as 'xi' is less than 'limit' keep goingdown the chain, and when 'xi' isn't less than 'limit' jump to end ofchain a continue. if x1 < limit: do aif x2 < limit: do bif x3 < limit: do c . . . etc That doesn't do what the OP specified. If any of the conditions fail, it should "jump" to the end and not execute _any_ further "do" statements regardless of the values of subsequent conditions. Ack -- I was aware of the lack of jump, but missed that x7 might be less than limit even if x6 is greater -- thanks. >On the plus side, it's easy to read and understand -- on theminus side, it doesn't jump to the end once the tests startfailing. If all you want is easy to read and understand, then this is event simpler: sys.exit(0) ~ethan~ Nov 14 '08 #14

 P: n/a On Fri, 14 Nov 2008 01:24:32 +0100, M.-A. Lemburg wrote: >Apparently you haven't seenany Forth, assembly, et al code. All you're doing is having the branchpoint for each conditional be the end of the chain, otherwise it fallsthrough to the code after the conditional. This is done all the timein languages that let you actually manipulate the hardware.Just as a suggestion a little humility would go a long way towardbeing open minded and receptive to different paradigms. Without giving any hint as to what the quoted snippet of code is written in, how do you expect people to make any sense of it ? Especially when using an RPN stack oriented language in a Python forum. There's a reason why we hide Python byte code running on the VM stack machine from Python users ;-) It's not like Forth is precisely an obscure little language. For a time, it was possibly more popular than C. Or predated C? Whatever. I know I learned about Forth long before I had even heard of C. Other RPN languages include Postscript, not exactly unheard of either. Open Firmware is Forth-like, and as you point out yourself, Python byte code also is a stack-based language. In conclusion, I'm not sure which is more disappointing: that the OP couldn't be bothered to mention he was using a Forth-like syntax, or that so many people failed to recognize it. Anyway, for what it's worth, here's my translation into Python. if x1 < limit: a() if x2 < limit: b() if x3 < limit: c() # blah blah blah... if x10 < limt: j() Not very nice code. I think a better way is something like this: keys = [x1, x2, x3, x4, x5, x6, x7, x8, x9, x10] functions = [a, b, c, d, e, f, g, h, i, j] for key, function in zip(keys, functions): if key < limit: function() else: break -- Steven Nov 14 '08 #15