[Tutor] Basic Question
Osmaan Mysorewala
osmaan at mysorewala.com
Thu Sep 9 17:58:31 EDT 2021
Thank you so much for your help Mr. Simpson. I understand why what I used
doesn’t work and I understand the fix.
A followup question for Mr. Wichmann, I've heard that global variables are
not great, and I see that you wrote some pseduocode on how to fix it. Still
I don't really understand how to implement that in my code. Everytime I
tried using local variables to store the arrays, it gave the error "local
variable referenced before assignment". If possible, do you think you could
go into a bit more depth on how it would work?
One more question. In my get_neighbors function I use a terrible
if-statement spam, how would I go about replacing that?
On Thu, Sep 9, 2021 at 12:58 PM Mats Wichmann <mats at wichmann.us> wrote:
> On 9/9/21 12:50 AM, Osmaan Mysorewala via Tutor wrote:
> > Hello,
> >
> > I'm trying to write a python program to create the game of life (Here's
> the
> > wikipedia link to how the game of life works:
> > https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life). Right now it
> works
> > only for the first iteration but then the new_arr becomes something
> > completely wrong the second time I run the function. I think something is
> > logically wrong with the neighbors function (other than how badly the
> > if-statements are written). For reference, I'm eventually trying to put
> it
> > on a display so that's why there's some display stuff in the comments
> > there. Here's the code:
>
> As you work through the jobs of collections full of mutable objects,
> shallow and deep copies, etc - and this is definitely part of the Python
> learning experience, and a trap not just for beginners at Python,
> experienced heads get into trouble too - here are some other things you
> might think about:
>
> There's not really a good reason to use a pair of globals to store two
> generations of the Conway "board". The use of globals is frowned upon
> in many cases just because it's so easy to get into trouble keeping
> track of what the state of things is. Instead, you could think of a
> flow like this:
>
> def main():
> # do setup things - figure out boundaries, #generatrions, etc.
> # create first generation datastructure
> # loop for generations:
> # board = advance(board)
> # optionally call a board-printing routine
> # (if you have a need to print, good idea to separate out the
> logic)
>
> def advance(obj):
> # calculate the next generation from obj
> return newobj
>
> def neighbors(point):
> # do what's needed to figure out neighbors info
>
> See - no globals!
>
>
> You almost never want to write this if you don't actually _need_ the index:
>
> for i in range(len(new_arr)):
> print(new_arr[i])
>
> because new_arr is iterable already, you sould prefer:
>
> for point in new_arr:
> print(point)
>
> There *are* times when you want to work with the index.
>
> As a design matter, you're storing a populated matrix, which is not
> wrong, but since the states are completely binary, you could store
> something sparse instead - like keep a list of the points that are "on",
> only. You easily know that if a point is not in that list, then it's
> off, so you didn't need to explicitly store the other value anywhere.
> That's just a different design to a solution, you certainly don't have
> to use it!
>
> For the original poster, and other Python newcomers, it's not unheard of
> that writing a program for Comway is a job interview question... and
> you'll be asked to make it efficient, too, not just working. It's
> probably worth leaving yourself a note to come back to this problem much
> later, when you're a lot more experienced in Python, and seeing if you
> would work a new solution differently given your new knowledge :) It's
> good practice!
> _______________________________________________
> Tutor maillist - Tutor at python.org
> To unsubscribe or change subscription options:
> https://mail.python.org/mailman/listinfo/tutor
>
More information about the Tutor
mailing list