On Friday, May 8, 2015 at 10:04:02 AM UTC+5:30, Chris Angelico wrote: > On Fri, May 8, 2015 at 2:06 PM, Rustom Mody wrote: > >> > If the classic Pascal (or Fortran or Basic) sibling balanced abstractions > >> > of function-for-value procedure-for-effect were more in the collective > >> > consciousness rather than C's travesty of function, things might not have > >> > been so messy. > >> > >> I'm not really sure that having distinct procedures, as opposed to > >> functions > >> that you just ignore their return result, makes *such* a big difference. > >> Can > >> you explain what is the difference between these? > >> > >> sort(stuff) # A procedure. > >> sort(stuff) # ignore the function return result > >> > >> And why the first is so much better than the second? > > > > Here are 3 None-returning functions/methods in python. > > ie semantically the returns are identical. Are they conceptually identical? > > > >>>> x=print(1) > > 1 > >>>> x > >>>> ["hello",None].__getitem__(1) > >>>> {"a":1, "b":2}.get("c") > >>>> > > Your second example is a poor one, as it involves calling a dunder > method. But all you've proven with that is that the empty return value > of Python is a real value, and can thus be stored and retrieved. > > With print(), you have a conceptual procedure - it invariably returns > None, so it'll normally be called in contexts that don't care about > the return value. What about sys.stdout.write(), though? That's most > often going to be called procedurally - you just write your piece and > move on - but it has a meaningful return value. In normal usage, both > are procedures. The ability to upgrade a function from "always returns > None" to "returns some occasionally-useful information" is one of the > strengths of a unified function/procedure system. > > With .get(), it's actually nothing to do with procedures vs functions,
That's backwards. get is very much a function and the None return is semantically significant. print is just round peg -- what you call conceptual function -- stuffed into square hole -- function the only available syntax-category > but more to do with Python's use of None where C would most likely use > NULL. By default, .get() uses None as its default return value, so > something that isn't there will be treated as None. In the same way as > your second example, that's just a result of None being a real value > that you can pass around - nothing more special than that. > > The other thing you're seeing here is that the *interactive > interpreter* treats None specially. Yeah I know And if python did not try to be so clever, I'd save some time with student-surprises > In a program, an expression > statement simply discards its result, whether it's None or 42 or > [1,2,3] or anything else. You could write an interactive interpreter > that has some magic that recognizes that certain functions always > return None (maybe by checking their annotations), and omits printing > their return values, while still printing the return values of other > functions. Hoo Boy! You seem to be in the 'the-more-the-better' (of magic) camp > I'm not sure what it'd gain you, but it wouldn't change the > concepts or semantics surrounding None returns. It would sure help teachers who get paid by the hour and would rather spend time on technical irrelevantia than grapple with significant concepts -- https://mail.python.org/mailman/listinfo/python-list