Hacker News new | past | comments | ask | show | jobs | submit login

I like this idea very much. I've thought about making something similar.

The example in the readme isn't idiomatic Python. It would be better to use enumerate.




Thanks! If you've wanted to make something similar, would you perhaps join me in making this? I'm looking for contributors.

Yes, enumerate is better, but I want to teach concepts one at a time and I want students to understand what's going on in code. Before teaching `for a, b in c` I want to teach `a, b = c`. And to motivate doing that I want to teach `return a, b`. At this point in the course they're only just starting to learn about lists - they haven't seen tuples and they've never defined a function. So it's not time yet.

Besides, it's important that students are intimately familiar with how to index a list a which indices are valid.


I'm too busy for any side projects :(


It's an example for beginners, presumingly to illustrate the range function, so that's probably why it's done that way.

To continue to be nit picky with that example, the range function produces an iterable object, which is different from a list.


This seems to be non-standard, but I make a serious effort to never teach the wrong way to do something. Primacy is just so strong.

It makes teaching harder. You really have to work to come up with great examples. But it makes learning easier and there's less correcting to do later.


In general, I agree, and I think it’s especially important in text.

A teacher is in a position of authoritative trust. As a student, after I learn an example is flawed, I often wonder if I’m just missing some context because I trust the teacher to have gotten it right. In a setting where communication is already established (e.g., a class room) this can be cleared up quickly with a question. In other settings (e.g., reading a text), it can leave me wondering until I reach a much higher level of competence.


When the course reaches the point that students are ready to learn about enumerate (see my reply above) the course will definitely cover it and emphatically point out that it is the better way.


Take it for what it's worth, but that's exactly what I think is a bad idea. It violates the principle of primacy in learning[1]. It also erodes trust in the lessons. (Is this the real way to do it?)

There's a similar strategy of building things up and then refactoring when they get bad (this ifelse is getting too big. We could use a dict). But the difference is every step along the way is valid or immediately corrected.

[1] https://psychology.wikia.org/wiki/Principles_of_learning#Pri...


What would you do in this case?

The student has never seen a tuple, or iterable unpacking of any form. Would you just show them `for index, word in enumerate(words)` and tell them not to worry about what that means?

Quite shortly after this, I ask them to essentially do `zip_longest`. Given two string variables:

    string1 = "Goodbye"
    string2 = "World"
output:

    G W
    o o
    o r
    d l
    b d
    y  
    e  
Here's what I expect their solution to look like:

            length1 = len(string1)
            length2 = len(string2)

            if length1 > length2:  # one could use max, but I don't expect them to
                length = length1
            else:
                length = length2

            for i in range(length):
                if i < len(string1):
                    char1 = string1[i]
                else:
                    char1 = ' '

                if i < len(string2):
                    char2 = string2[i]
                else:
                    char2 = ' '

                print(char1 + ' ' + char2)
That's not something that can nicely be solved with enumerate. Do you think this exercise is bad because they should just use zip_longest instead?


I'd split the problem into two. You're talking about these problems like they're fixed, but they're not. This is your project.

I'd teach index access and number generation separately, with small incrementing variations. Then I'd show iteration, then enumeration (maybe after tuple unpacking).

When you combine two concepts it doesn't create just a combination. It creates one or more new concepts. Those new concepts have their own idioms and they should be taught properly.

Combining looping over numbers and index access creates two new concepts: looping over items and looping over items with their index. Both of those things have their own idiom in Python and your solution shows neither.

I think telling someone not to worry about the details of how something works because you'll get back to it later is way better than showing them the wrong thing and then correcting it. One is a promise kept, the other a promise broken.

In my opinion, nailing this kind of stuff is like half of the value of the project you're doing. You need to lean way in on it and get it right.

My take is right now you're thinking backwards from the position of someone who knows how to code. You need to think forward like someone who doesn't, at least more often. A student isn't going to be motivated to learn a, b = c by learning return a, b first because they won't know that second concept exists!

In short, if your students aren't ready to use enumerate or zip_longest, don't hand them problems that call for enumerate or zip_longest.


> I think telling someone not to worry about the details of how something works because you'll get back to it later is way better than showing them the wrong thing and then correcting it. One is a promise kept, the other a promise broken.

I'm not sure I'd say teaching someone to do something by hand for which they could use an existing function is "wrong". There's huge pedagogical value in knowing how powerful tools you didn't make work. Going bottom-up is a very effective way to do that (just ask the lisp folks), and a culmination of "nice job, you've implemented something so useful that it mirrors what the language designers/library authors did as well, here's how to use their version to save time in the future" is far from a broken promise.


> I'm not sure I'd say teaching someone to do something by hand for which they could use an existing function is "wrong".

I didn't say it was wrong the wrong way to teach. I said the code was wrong. Like, if I removed myself from teaching and I just saw that in a PR, I'd definitely suggest they use enumerate instead.

I'm a huge fan of reimplementing built in functions as a way to learn. I'm learning Clojure right now (like I stopped to write this comment) and I do it all the time. But, I know I'm doing it.

The other thing that's fine is building up to the abstraction. "Let's get the index, now the item. Okay, there's a better way to do this". But you have to do it immediately.

I'm just not a fan of showing someone something, letting it sink in, and then having to go back and correct it.

And while I hope my arguments stand on their own, and I certainly could be wrong, I'm at least not speaking out of complete inexperience. I've spent a decent amount of time teaching people to code, juggle, work at rope courses, and fly airplanes.


Do you get reply notifications?


No, I just check my comments.


Which is why it specifically says "is similar to the list".

But you may be surprised how many list-like operations `range` supports. Subscripting, `len`, `in`, `.count`, `.index`. It might as well be a tuple.

And if you want to nitpick more, range isn't a function.




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: