5 ms·
Maybe in the context of the book it is a major reason. Strings are ubiquitous to programming. I'd argue that it's even more for first time programmers. Zed wan
by Vaskivo 10y ago
Maybe in the context of the book it is a major reason.
Strings are ubiquitous to programming. I'd argue that it's even more for first time programmers. Zed wanted something that would be easy to use.
(ASCII) Strings formatting is more important to beginners than unicode support, new style classes by default, iterators in range()/enumerate()/etc. , the new division operator, etc.
I haven't recommended his book to beginners because it was stuck in Python 2. But I have to agree that Python 2 had some stuff that was more "newbie-friendly" than Python 3
- Sean1708 10y ago> But I have to agree that Python 2 had some stuff that was more "newbie-friendly" than Python 3 What stuff, out of interest? Also I suspect that a huge proportion of newcomer's got very confused as to why 3/2 == 1.
- Vaskivo 10y agoYes. But that is easy to explain. "It always rounds down" Of the top of my head come the range/enumerate/zip returns. They are really useful and needed to teach "pythonic Python". But it's hard to explain that it doesn't return a list. "It returns an iterator, that is lazy, and you need to call 'list()' on it to use it as a list..." You get my point. You fall to a "just do like I told you. You'll get it later." that plagues a lot of other languages when being taught to newbies. But I never said that Python 3 is less "newbie-friendly" than Python 2...
- cgriswald 10y ago> Yes. But that is easy to explain. "It always rounds down" The explanation is easy, but it isn't simple. With respect, "It always rounds down" is a terrible explanation. It explains the apparent behavior of the / operated in Python 2, but it does not really explain why. A better explanation is that the Python is both dynamically- and strongly-typed and that / does integer division on integers and "true" division on floats. For the newbie who understands these concepts, this is a far more useful explanation and metaphor; and for the newbie who doesn't, he has to learn somewhere, and frankly the / operator is not a bad example.
- webmaven 10y ago> / does integer division on integers and "true" division on floats. Floats don't really get true division either: https://docs.python.org/3/tutorial/floatingpoint.html https://docs.python.org/3/tutorial/floatingpoint.html And as it happens, I once explained a related problem with round() to Zed Shaw on Twitter: https://twitter.com/zedshaw/status/777780480737357824 https://twitter.com/zedshaw/status/777780480737357824
- amyjess 10y agoThis is one reason why I go out of my way to avoid floats and instead use Decimal whenever I need to support non-integral numbers. (and from playing around with Perl 6, I love how decimal literals are of type Rat instead of Num; I wish Python decided to do something similar in Python 3) Edit in response to Zed's question, in 3.6 I always just do: print(f'{foo:.2f}') Works with Decimals and floats.
- webmaven 10y agoYeah, I'm pretty sure he'll turn up his nose at that solution as well. For purposes of teaching the language to a beginner, he wants literals being rounded or divided to "just work" in a way that is unsurprising to those beginners, and there isn't any way to achieve that unless the default type of a number with a decimal point is Decimal rather than float (which isn't at all likely to happen). The closest we are likely to get to that ideal is by introducing a Decimal literal like 0d2.125, riffing off the Hex and Octal literals (eg. 0xDEADB33F, 0o76510). P.S., unless I am mistaken, you're just truncating the float, not actually rounding it
- deleted 10y ago[deleted]
- kstrauser 10y agoSlight correction: it always rounds toward zero. -3/2 == -2 in Python 2.
- willhslade 10y agoThat's away from zero.
- kstrauser 10y agoI am s-m-r-t smart! Sigh. Yes, it's rounding down. I feel a little vindicated that at least three people saw that and said, "oh, he's right. Have my upvote!"
- Sean1708 10y agoDon't get me wrong, I wasn't having a go at you. It's just that I learnt 3 when I already had quite a handle on 2, and I'm not very good at putting myself in the shoes of a beginner.
- Vaskivo 10y agoNo problem. I didn't think you were. And I understand that it is hard for some to jump back to a newbie perspective. Some people look for performance in a programming language. Others for a thriving ecosystem. I look for usability and elegance. So I tend to look at programming languages that way.
- TorKlingberg 10y agoTo take one example >>> range(10) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] So that's what range() does! >>> range(10) range(0, 10) Uhhh... I love iterators, but they're not an obvious concept at first.
- fnordfnordfnord 10y agoprint thing # Works in Python 2 print(thing) # the parenthesis are optional in Python 2 print(thing) # the parenthesis are required in Python 3 A lot of problems I've encountered in the transition are a result of the huge amount of simple examples available to newcomers which are written in the Python 2 syntax.
- TheOneTrueKyle 10y agoAs someone new to python, this has been confusing. The process involves learning using some blog post, the spending time refactoring because its old.
- fnordfnordfnord 10y agoYeah, it's an unfortunate added frustration for beginners, but one you can quickly overcome, once you're made aware.
- Orangeair 10y agoSaying the parentheses are optional in Python 2 is kind of inaccurate. "print(thing)" is just "print (thing)", and "(thing)" is just an unnecessarily parenthesized version of "thing". So basically it's just redundant syntax that happens to make it look like a function. If you try to do something like "print(thing1, thing2)" in Python 2, you'll find that "(thing1, thing2)" is interpreted as a tuple, so Python prints it as a tuple (instead of printing thing1 and thing2 individually).