<div dir="ltr"><br><br>On Tuesday, May 26, 2015 at 7:16:18 PM UTC+5:30, Terry Reedy wrote:<blockquote class="gmail_quote" style="margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;">On 5/26/2015 2:07 AM, Chris Angelico wrote:
<br>> On Tue, May 26, 2015 at 3:54 PM, Terry Reedy <<a href="javascript:" target="_blank" gdf-obfuscated-mailto="T-FZ2kPRwd8J" rel="nofollow" onmousedown="this.href='javascript:';return true;" onclick="this.href='javascript:';return true;">tjr...@udel.edu</a>> wrote:
<br>
<br>>> Programming is composition, the connections of outputs to inputs (as with
<br>>> circuit design).  'Print' is the enemy of composition. We agree so far.
<br>>
<br>> That's fine as long as it's okay to produce no results whatsoever
<br>> until all processing is complete.
<br>> In a pure sense, yes, a program's
<br>> goal is to produce output, and it doesn't make a lot of difference how
<br>> that output is produced. You can build a web framework in which the
<br>> only way to send a result is to return it from a function. But there
<br>> are innumerable times when it's more useful to produce intermediate
<br>> output; whether that output goes to a file, a socket, the console, or
<br>> something else, it's as much a part of real-world programming as
<br>> returned values are.
<br>
<br>The context is a beginning programming course where the goal is to teach 
<br>people to write
<br>
<br>def f(a, b, c): return a*b + c
<br>print(f(2, 3, 4))
<br>
<br>instead
<br>
<br>def f(a, b, d): print(a*b + c)
<br>f(2, 3, 4)
<br>
<br>In other words, to teach beginners to relegate output to top level code, 
<br>separate from the calculation code. (Or perhaps output functions, but 
<br>that is a more advanced topic.)  The first function is easy testable, 
<br>the second is not.
<br></blockquote><div><br>Thanks Terry for the elucidation<br> <br></div><blockquote class="gmail_quote" style="margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;">
<br>For printing intermediate results, yield lines to top-level code that 
<br>can do whatever with them, including printing.
<br>
<br>def text_generator(args):
<br>    ...
<br>        yield line
<br>
<br>for line in text_generator: print(line)
<br>
<br>is top-level code that prints intermediate results produced by a 
<br>testable generator.
<br>
<br></blockquote><div><br>And thanks-squared for that.<br>Generators are a really wonderful feature of python and not enough showcased.<br>Think of lazy lists in haskell and how much fanfaring and trumpeting goes on around these.<br>And by contrast how little of that for generators in the python world. Are the two all that different?<br><br>You just have to think of all the data-structure/AI/etc books explaining depth-first-search and more arcane algorithms with a 'print' in the innards of it.<br>And how far generators as a fundamental tool would go towards clarifying/modularizing these explanations <br><br>So yes generators are an important component towards the goal of 'print-less' programming<br></div><blockquote class="gmail_quote" style="margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;">People want to see results, which is half of why I said not to delete 
<br>print.  But proper assignments and grading can enforce separation of 
<br>calculations from use of results.  The idea of separation of concerns 
<br>did not start with OOP.
<br>
<br>-- 
<br>Terry Jan Reedy
<br>
<br>______________________________<wbr>_________________
<br>Python-ideas mailing list
<br><a href="javascript:" target="_blank" gdf-obfuscated-mailto="T-FZ2kPRwd8J" rel="nofollow" onmousedown="this.href='javascript:';return true;" onclick="this.href='javascript:';return true;">Python...@python.org</a>
<br><a href="https://mail.python.org/mailman/listinfo/python-ideas" target="_blank" rel="nofollow" onmousedown="this.href='https://www.google.com/url?q\75https%3A%2F%2Fmail.python.org%2Fmailman%2Flistinfo%2Fpython-ideas\46sa\75D\46sntz\0751\46usg\75AFQjCNFj1EaNHnVmh20FnFPoUi4J-MpfQw';return true;" onclick="this.href='https://www.google.com/url?q\75https%3A%2F%2Fmail.python.org%2Fmailman%2Flistinfo%2Fpython-ideas\46sa\75D\46sntz\0751\46usg\75AFQjCNFj1EaNHnVmh20FnFPoUi4J-MpfQw';return true;">https://mail.python.org/<wbr>mailman/listinfo/python-ideas</a>
<br>Code of Conduct: <a href="http://python.org/psf/codeofconduct/" target="_blank" rel="nofollow" onmousedown="this.href='http://www.google.com/url?q\75http%3A%2F%2Fpython.org%2Fpsf%2Fcodeofconduct%2F\46sa\75D\46sntz\0751\46usg\75AFQjCNHJOrArSUDKkjrnthO6_CznMzkPsA';return true;" onclick="this.href='http://www.google.com/url?q\75http%3A%2F%2Fpython.org%2Fpsf%2Fcodeofconduct%2F\46sa\75D\46sntz\0751\46usg\75AFQjCNHJOrArSUDKkjrnthO6_CznMzkPsA';return true;">http://python.org/psf/<wbr>codeofconduct/</a>
<br></blockquote></div>