Hangman game, written after taking a Python course












7














I have recently finished a course on Python 3 and I really learned a lot, but every time I write a script, it is messy and I often feel like there must be shorter, more efficient ways to write and structure my scripts.



So my question is: How could I rewrite the below script to be shorter and more efficient, and what advice would you guys give me to improve my coding skills in general (maybe a way of thinking about the program that will make it easier to define the structure of what my script should look like...)



I am really enthused about the possibilities that coding bring and I would really like to improve, so don't hesitate to be harsh with your comments ;)



Here below is one of the scripts I wrote. This one is a hangman game: (The word list for the game are being picked from a .txt file that lives in the same directory as my script)



import string
import random


class Main:

def __init__(self):
self.place_holder =
self.wrong_guesses = 10
self.guesses =
with open('./words.txt', mode='r') as f:
self.word = random.choice(f.readlines())
self.word = self.word.strip()
print(self.word, end='')
return self.place_holders()

def place_holders(self):
# creates the placeholders for the word
for char in self.word:
if char != " ":
self.place_holder.append(' _ ')
elif char == " ":
self.place_holder.append(' ')
print("".join(self.place_holder)) # prints initial placeholder
return self.is_letter()

@staticmethod
def guess():
# Prompts the user for a guess
while True:
guessed_letter = input(str('Give a guess: ')).lower()
if guessed_letter not in string.ascii_lowercase or len(guessed_letter) > 1:
print(
'You have inputted more than one character or the character entered was not recognized.nPlease try again.')
else:
break
return guessed_letter

def is_letter(self):
# finds out if the letter belongs to the word, and if so, places it on the right placeholder
guessed_letter = self.guess()
if guessed_letter in self.word and guessed_letter not in self.guesses:
for i in range(len(self.word)):
if guessed_letter == self.word[i]:
self.place_holder[i] = f' {self.word[i]} '
elif guessed_letter in self.guesses:
print('You already said that..n')
else:
self.wrong_guesses -= 1
print(f'Sorry, missed.nYou have {self.wrong_guesses} guesses left.n')

self.guesses.append(guessed_letter)
print("".join(self.place_holder)) # prints the updated placeholder
return self.is_over()

def is_over(self):
# Checks if the players has guessed the full word or if the player ran out of guesses
if ' _ ' in self.place_holder and self.wrong_guesses > 0:
self.is_letter()
elif ' _ ' in self.place_holder and self.wrong_guesses == 0:
print(f'Sorry, Game Over!nThe word to guess was: {self.word}')
self.play_again()
else:
self.play_again()

@staticmethod
def play_again():
# Prompts the player if he wants to play again or not
if input('Do you want to play again? (y/n): ').lower().startswith('y'):
Main()
else:
print('Fair enough.. Thanks for playing!')
quit()


Main()









share|improve this question









New contributor




iAmWaldo is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
















  • 1




    Why do you print the word immediately after choosing it? That takes all the challenge out of the game.
    – 200_success
    Dec 27 '18 at 23:52






  • 1




    oh yeah sorry about that, that was just for testing purposes, I guess I forgot to take it out lol
    – iAmWaldo
    Dec 28 '18 at 0:41
















7














I have recently finished a course on Python 3 and I really learned a lot, but every time I write a script, it is messy and I often feel like there must be shorter, more efficient ways to write and structure my scripts.



So my question is: How could I rewrite the below script to be shorter and more efficient, and what advice would you guys give me to improve my coding skills in general (maybe a way of thinking about the program that will make it easier to define the structure of what my script should look like...)



I am really enthused about the possibilities that coding bring and I would really like to improve, so don't hesitate to be harsh with your comments ;)



Here below is one of the scripts I wrote. This one is a hangman game: (The word list for the game are being picked from a .txt file that lives in the same directory as my script)



import string
import random


class Main:

def __init__(self):
self.place_holder =
self.wrong_guesses = 10
self.guesses =
with open('./words.txt', mode='r') as f:
self.word = random.choice(f.readlines())
self.word = self.word.strip()
print(self.word, end='')
return self.place_holders()

def place_holders(self):
# creates the placeholders for the word
for char in self.word:
if char != " ":
self.place_holder.append(' _ ')
elif char == " ":
self.place_holder.append(' ')
print("".join(self.place_holder)) # prints initial placeholder
return self.is_letter()

@staticmethod
def guess():
# Prompts the user for a guess
while True:
guessed_letter = input(str('Give a guess: ')).lower()
if guessed_letter not in string.ascii_lowercase or len(guessed_letter) > 1:
print(
'You have inputted more than one character or the character entered was not recognized.nPlease try again.')
else:
break
return guessed_letter

def is_letter(self):
# finds out if the letter belongs to the word, and if so, places it on the right placeholder
guessed_letter = self.guess()
if guessed_letter in self.word and guessed_letter not in self.guesses:
for i in range(len(self.word)):
if guessed_letter == self.word[i]:
self.place_holder[i] = f' {self.word[i]} '
elif guessed_letter in self.guesses:
print('You already said that..n')
else:
self.wrong_guesses -= 1
print(f'Sorry, missed.nYou have {self.wrong_guesses} guesses left.n')

self.guesses.append(guessed_letter)
print("".join(self.place_holder)) # prints the updated placeholder
return self.is_over()

def is_over(self):
# Checks if the players has guessed the full word or if the player ran out of guesses
if ' _ ' in self.place_holder and self.wrong_guesses > 0:
self.is_letter()
elif ' _ ' in self.place_holder and self.wrong_guesses == 0:
print(f'Sorry, Game Over!nThe word to guess was: {self.word}')
self.play_again()
else:
self.play_again()

@staticmethod
def play_again():
# Prompts the player if he wants to play again or not
if input('Do you want to play again? (y/n): ').lower().startswith('y'):
Main()
else:
print('Fair enough.. Thanks for playing!')
quit()


Main()









share|improve this question









New contributor




iAmWaldo is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
















  • 1




    Why do you print the word immediately after choosing it? That takes all the challenge out of the game.
    – 200_success
    Dec 27 '18 at 23:52






  • 1




    oh yeah sorry about that, that was just for testing purposes, I guess I forgot to take it out lol
    – iAmWaldo
    Dec 28 '18 at 0:41














7












7








7


1





I have recently finished a course on Python 3 and I really learned a lot, but every time I write a script, it is messy and I often feel like there must be shorter, more efficient ways to write and structure my scripts.



So my question is: How could I rewrite the below script to be shorter and more efficient, and what advice would you guys give me to improve my coding skills in general (maybe a way of thinking about the program that will make it easier to define the structure of what my script should look like...)



I am really enthused about the possibilities that coding bring and I would really like to improve, so don't hesitate to be harsh with your comments ;)



Here below is one of the scripts I wrote. This one is a hangman game: (The word list for the game are being picked from a .txt file that lives in the same directory as my script)



import string
import random


class Main:

def __init__(self):
self.place_holder =
self.wrong_guesses = 10
self.guesses =
with open('./words.txt', mode='r') as f:
self.word = random.choice(f.readlines())
self.word = self.word.strip()
print(self.word, end='')
return self.place_holders()

def place_holders(self):
# creates the placeholders for the word
for char in self.word:
if char != " ":
self.place_holder.append(' _ ')
elif char == " ":
self.place_holder.append(' ')
print("".join(self.place_holder)) # prints initial placeholder
return self.is_letter()

@staticmethod
def guess():
# Prompts the user for a guess
while True:
guessed_letter = input(str('Give a guess: ')).lower()
if guessed_letter not in string.ascii_lowercase or len(guessed_letter) > 1:
print(
'You have inputted more than one character or the character entered was not recognized.nPlease try again.')
else:
break
return guessed_letter

def is_letter(self):
# finds out if the letter belongs to the word, and if so, places it on the right placeholder
guessed_letter = self.guess()
if guessed_letter in self.word and guessed_letter not in self.guesses:
for i in range(len(self.word)):
if guessed_letter == self.word[i]:
self.place_holder[i] = f' {self.word[i]} '
elif guessed_letter in self.guesses:
print('You already said that..n')
else:
self.wrong_guesses -= 1
print(f'Sorry, missed.nYou have {self.wrong_guesses} guesses left.n')

self.guesses.append(guessed_letter)
print("".join(self.place_holder)) # prints the updated placeholder
return self.is_over()

def is_over(self):
# Checks if the players has guessed the full word or if the player ran out of guesses
if ' _ ' in self.place_holder and self.wrong_guesses > 0:
self.is_letter()
elif ' _ ' in self.place_holder and self.wrong_guesses == 0:
print(f'Sorry, Game Over!nThe word to guess was: {self.word}')
self.play_again()
else:
self.play_again()

@staticmethod
def play_again():
# Prompts the player if he wants to play again or not
if input('Do you want to play again? (y/n): ').lower().startswith('y'):
Main()
else:
print('Fair enough.. Thanks for playing!')
quit()


Main()









share|improve this question









New contributor




iAmWaldo is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.











I have recently finished a course on Python 3 and I really learned a lot, but every time I write a script, it is messy and I often feel like there must be shorter, more efficient ways to write and structure my scripts.



So my question is: How could I rewrite the below script to be shorter and more efficient, and what advice would you guys give me to improve my coding skills in general (maybe a way of thinking about the program that will make it easier to define the structure of what my script should look like...)



I am really enthused about the possibilities that coding bring and I would really like to improve, so don't hesitate to be harsh with your comments ;)



Here below is one of the scripts I wrote. This one is a hangman game: (The word list for the game are being picked from a .txt file that lives in the same directory as my script)



import string
import random


class Main:

def __init__(self):
self.place_holder =
self.wrong_guesses = 10
self.guesses =
with open('./words.txt', mode='r') as f:
self.word = random.choice(f.readlines())
self.word = self.word.strip()
print(self.word, end='')
return self.place_holders()

def place_holders(self):
# creates the placeholders for the word
for char in self.word:
if char != " ":
self.place_holder.append(' _ ')
elif char == " ":
self.place_holder.append(' ')
print("".join(self.place_holder)) # prints initial placeholder
return self.is_letter()

@staticmethod
def guess():
# Prompts the user for a guess
while True:
guessed_letter = input(str('Give a guess: ')).lower()
if guessed_letter not in string.ascii_lowercase or len(guessed_letter) > 1:
print(
'You have inputted more than one character or the character entered was not recognized.nPlease try again.')
else:
break
return guessed_letter

def is_letter(self):
# finds out if the letter belongs to the word, and if so, places it on the right placeholder
guessed_letter = self.guess()
if guessed_letter in self.word and guessed_letter not in self.guesses:
for i in range(len(self.word)):
if guessed_letter == self.word[i]:
self.place_holder[i] = f' {self.word[i]} '
elif guessed_letter in self.guesses:
print('You already said that..n')
else:
self.wrong_guesses -= 1
print(f'Sorry, missed.nYou have {self.wrong_guesses} guesses left.n')

self.guesses.append(guessed_letter)
print("".join(self.place_holder)) # prints the updated placeholder
return self.is_over()

def is_over(self):
# Checks if the players has guessed the full word or if the player ran out of guesses
if ' _ ' in self.place_holder and self.wrong_guesses > 0:
self.is_letter()
elif ' _ ' in self.place_holder and self.wrong_guesses == 0:
print(f'Sorry, Game Over!nThe word to guess was: {self.word}')
self.play_again()
else:
self.play_again()

@staticmethod
def play_again():
# Prompts the player if he wants to play again or not
if input('Do you want to play again? (y/n): ').lower().startswith('y'):
Main()
else:
print('Fair enough.. Thanks for playing!')
quit()


Main()






python python-3.x hangman






share|improve this question









New contributor




iAmWaldo is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.











share|improve this question









New contributor




iAmWaldo is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.









share|improve this question




share|improve this question








edited Dec 27 '18 at 23:35









200_success

128k15150413




128k15150413






New contributor




iAmWaldo is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.









asked Dec 27 '18 at 22:24









iAmWaldo

383




383




New contributor




iAmWaldo is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.





New contributor





iAmWaldo is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.






iAmWaldo is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.








  • 1




    Why do you print the word immediately after choosing it? That takes all the challenge out of the game.
    – 200_success
    Dec 27 '18 at 23:52






  • 1




    oh yeah sorry about that, that was just for testing purposes, I guess I forgot to take it out lol
    – iAmWaldo
    Dec 28 '18 at 0:41














  • 1




    Why do you print the word immediately after choosing it? That takes all the challenge out of the game.
    – 200_success
    Dec 27 '18 at 23:52






  • 1




    oh yeah sorry about that, that was just for testing purposes, I guess I forgot to take it out lol
    – iAmWaldo
    Dec 28 '18 at 0:41








1




1




Why do you print the word immediately after choosing it? That takes all the challenge out of the game.
– 200_success
Dec 27 '18 at 23:52




Why do you print the word immediately after choosing it? That takes all the challenge out of the game.
– 200_success
Dec 27 '18 at 23:52




1




1




oh yeah sorry about that, that was just for testing purposes, I guess I forgot to take it out lol
– iAmWaldo
Dec 28 '18 at 0:41




oh yeah sorry about that, that was just for testing purposes, I guess I forgot to take it out lol
– iAmWaldo
Dec 28 '18 at 0:41










2 Answers
2






active

oldest

votes


















7














Your code structure is one of infinite recursion. Main() calls placeholder(), which calls is_letter() which calls is_over() which calls is_letter() (recursive), or play_again() which calls Main() (recursive)! Eventually, you will end up with a Stack Overflow if you play long enough!



What you want is a loop. Two loops, actually. Your program should be structured to operate something like:



play_again = True
while play_again:
# initialize game state
while not solved and guesses_left:
# get guess
# update game state
play_again = ask_play_again()


No recursive calls are necessary.





You read all lines of the file to choose a random puzzle. When you play again, you again read all lines in the file. Perhaps you could read and store all the puzzles, and each time a game is played, you just select one randomly from the list.





Your placeholders are complicated, 3 character entities. They could just be single characters, and spaces could be added during printing.



self.placeholder = [ "_" if ch != " " else " "  for ch in self.word ]


To print:



print("".join(f" {ch} " for ch in self.placeholder))


Or simply:



print("", "  ".join(self.placeholder))




You should allow for punctuation in the puzzles. Like spaces, these should be directly shown, not converted to underscores.



 _  _  _  _  _  ’  _     _  _  _  _





share|improve this answer





















  • Thanks! that helps a lot! These are things I didn't even think about, very thoughtful!
    – iAmWaldo
    Dec 28 '18 at 0:44












  • The list comprehension for self.placeholder in this answer is an especially valuable Pythonic technique when you are looking to trim your code. Also, be cautious with quit() as this resets the kernel in some IDEs, such as Spyder (reference here).
    – Miller
    Dec 28 '18 at 0:57



















5














Don't unconditionally call Main() from global scope - if someone else imports your file, you want to leave it up to them what should be executed. This is why you should use the if __name__ == '__main__' pattern that we see so often elsewhere.



self.guesses shouldn't be a list. Since you need fast lookup, even though it won't make a noticeable difference, you should be using a set.






share|improve this answer





















    Your Answer





    StackExchange.ifUsing("editor", function () {
    return StackExchange.using("mathjaxEditing", function () {
    StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix) {
    StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
    });
    });
    }, "mathjax-editing");

    StackExchange.ifUsing("editor", function () {
    StackExchange.using("externalEditor", function () {
    StackExchange.using("snippets", function () {
    StackExchange.snippets.init();
    });
    });
    }, "code-snippets");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "196"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: false,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: null,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });






    iAmWaldo is a new contributor. Be nice, and check out our Code of Conduct.










    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f210455%2fhangman-game-written-after-taking-a-python-course%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    2 Answers
    2






    active

    oldest

    votes








    2 Answers
    2






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    7














    Your code structure is one of infinite recursion. Main() calls placeholder(), which calls is_letter() which calls is_over() which calls is_letter() (recursive), or play_again() which calls Main() (recursive)! Eventually, you will end up with a Stack Overflow if you play long enough!



    What you want is a loop. Two loops, actually. Your program should be structured to operate something like:



    play_again = True
    while play_again:
    # initialize game state
    while not solved and guesses_left:
    # get guess
    # update game state
    play_again = ask_play_again()


    No recursive calls are necessary.





    You read all lines of the file to choose a random puzzle. When you play again, you again read all lines in the file. Perhaps you could read and store all the puzzles, and each time a game is played, you just select one randomly from the list.





    Your placeholders are complicated, 3 character entities. They could just be single characters, and spaces could be added during printing.



    self.placeholder = [ "_" if ch != " " else " "  for ch in self.word ]


    To print:



    print("".join(f" {ch} " for ch in self.placeholder))


    Or simply:



    print("", "  ".join(self.placeholder))




    You should allow for punctuation in the puzzles. Like spaces, these should be directly shown, not converted to underscores.



     _  _  _  _  _  ’  _     _  _  _  _





    share|improve this answer





















    • Thanks! that helps a lot! These are things I didn't even think about, very thoughtful!
      – iAmWaldo
      Dec 28 '18 at 0:44












    • The list comprehension for self.placeholder in this answer is an especially valuable Pythonic technique when you are looking to trim your code. Also, be cautious with quit() as this resets the kernel in some IDEs, such as Spyder (reference here).
      – Miller
      Dec 28 '18 at 0:57
















    7














    Your code structure is one of infinite recursion. Main() calls placeholder(), which calls is_letter() which calls is_over() which calls is_letter() (recursive), or play_again() which calls Main() (recursive)! Eventually, you will end up with a Stack Overflow if you play long enough!



    What you want is a loop. Two loops, actually. Your program should be structured to operate something like:



    play_again = True
    while play_again:
    # initialize game state
    while not solved and guesses_left:
    # get guess
    # update game state
    play_again = ask_play_again()


    No recursive calls are necessary.





    You read all lines of the file to choose a random puzzle. When you play again, you again read all lines in the file. Perhaps you could read and store all the puzzles, and each time a game is played, you just select one randomly from the list.





    Your placeholders are complicated, 3 character entities. They could just be single characters, and spaces could be added during printing.



    self.placeholder = [ "_" if ch != " " else " "  for ch in self.word ]


    To print:



    print("".join(f" {ch} " for ch in self.placeholder))


    Or simply:



    print("", "  ".join(self.placeholder))




    You should allow for punctuation in the puzzles. Like spaces, these should be directly shown, not converted to underscores.



     _  _  _  _  _  ’  _     _  _  _  _





    share|improve this answer





















    • Thanks! that helps a lot! These are things I didn't even think about, very thoughtful!
      – iAmWaldo
      Dec 28 '18 at 0:44












    • The list comprehension for self.placeholder in this answer is an especially valuable Pythonic technique when you are looking to trim your code. Also, be cautious with quit() as this resets the kernel in some IDEs, such as Spyder (reference here).
      – Miller
      Dec 28 '18 at 0:57














    7












    7








    7






    Your code structure is one of infinite recursion. Main() calls placeholder(), which calls is_letter() which calls is_over() which calls is_letter() (recursive), or play_again() which calls Main() (recursive)! Eventually, you will end up with a Stack Overflow if you play long enough!



    What you want is a loop. Two loops, actually. Your program should be structured to operate something like:



    play_again = True
    while play_again:
    # initialize game state
    while not solved and guesses_left:
    # get guess
    # update game state
    play_again = ask_play_again()


    No recursive calls are necessary.





    You read all lines of the file to choose a random puzzle. When you play again, you again read all lines in the file. Perhaps you could read and store all the puzzles, and each time a game is played, you just select one randomly from the list.





    Your placeholders are complicated, 3 character entities. They could just be single characters, and spaces could be added during printing.



    self.placeholder = [ "_" if ch != " " else " "  for ch in self.word ]


    To print:



    print("".join(f" {ch} " for ch in self.placeholder))


    Or simply:



    print("", "  ".join(self.placeholder))




    You should allow for punctuation in the puzzles. Like spaces, these should be directly shown, not converted to underscores.



     _  _  _  _  _  ’  _     _  _  _  _





    share|improve this answer












    Your code structure is one of infinite recursion. Main() calls placeholder(), which calls is_letter() which calls is_over() which calls is_letter() (recursive), or play_again() which calls Main() (recursive)! Eventually, you will end up with a Stack Overflow if you play long enough!



    What you want is a loop. Two loops, actually. Your program should be structured to operate something like:



    play_again = True
    while play_again:
    # initialize game state
    while not solved and guesses_left:
    # get guess
    # update game state
    play_again = ask_play_again()


    No recursive calls are necessary.





    You read all lines of the file to choose a random puzzle. When you play again, you again read all lines in the file. Perhaps you could read and store all the puzzles, and each time a game is played, you just select one randomly from the list.





    Your placeholders are complicated, 3 character entities. They could just be single characters, and spaces could be added during printing.



    self.placeholder = [ "_" if ch != " " else " "  for ch in self.word ]


    To print:



    print("".join(f" {ch} " for ch in self.placeholder))


    Or simply:



    print("", "  ".join(self.placeholder))




    You should allow for punctuation in the puzzles. Like spaces, these should be directly shown, not converted to underscores.



     _  _  _  _  _  ’  _     _  _  _  _






    share|improve this answer












    share|improve this answer



    share|improve this answer










    answered Dec 28 '18 at 0:10









    AJNeufeld

    4,382318




    4,382318












    • Thanks! that helps a lot! These are things I didn't even think about, very thoughtful!
      – iAmWaldo
      Dec 28 '18 at 0:44












    • The list comprehension for self.placeholder in this answer is an especially valuable Pythonic technique when you are looking to trim your code. Also, be cautious with quit() as this resets the kernel in some IDEs, such as Spyder (reference here).
      – Miller
      Dec 28 '18 at 0:57


















    • Thanks! that helps a lot! These are things I didn't even think about, very thoughtful!
      – iAmWaldo
      Dec 28 '18 at 0:44












    • The list comprehension for self.placeholder in this answer is an especially valuable Pythonic technique when you are looking to trim your code. Also, be cautious with quit() as this resets the kernel in some IDEs, such as Spyder (reference here).
      – Miller
      Dec 28 '18 at 0:57
















    Thanks! that helps a lot! These are things I didn't even think about, very thoughtful!
    – iAmWaldo
    Dec 28 '18 at 0:44






    Thanks! that helps a lot! These are things I didn't even think about, very thoughtful!
    – iAmWaldo
    Dec 28 '18 at 0:44














    The list comprehension for self.placeholder in this answer is an especially valuable Pythonic technique when you are looking to trim your code. Also, be cautious with quit() as this resets the kernel in some IDEs, such as Spyder (reference here).
    – Miller
    Dec 28 '18 at 0:57




    The list comprehension for self.placeholder in this answer is an especially valuable Pythonic technique when you are looking to trim your code. Also, be cautious with quit() as this resets the kernel in some IDEs, such as Spyder (reference here).
    – Miller
    Dec 28 '18 at 0:57













    5














    Don't unconditionally call Main() from global scope - if someone else imports your file, you want to leave it up to them what should be executed. This is why you should use the if __name__ == '__main__' pattern that we see so often elsewhere.



    self.guesses shouldn't be a list. Since you need fast lookup, even though it won't make a noticeable difference, you should be using a set.






    share|improve this answer


























      5














      Don't unconditionally call Main() from global scope - if someone else imports your file, you want to leave it up to them what should be executed. This is why you should use the if __name__ == '__main__' pattern that we see so often elsewhere.



      self.guesses shouldn't be a list. Since you need fast lookup, even though it won't make a noticeable difference, you should be using a set.






      share|improve this answer
























        5












        5








        5






        Don't unconditionally call Main() from global scope - if someone else imports your file, you want to leave it up to them what should be executed. This is why you should use the if __name__ == '__main__' pattern that we see so often elsewhere.



        self.guesses shouldn't be a list. Since you need fast lookup, even though it won't make a noticeable difference, you should be using a set.






        share|improve this answer












        Don't unconditionally call Main() from global scope - if someone else imports your file, you want to leave it up to them what should be executed. This is why you should use the if __name__ == '__main__' pattern that we see so often elsewhere.



        self.guesses shouldn't be a list. Since you need fast lookup, even though it won't make a noticeable difference, you should be using a set.







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Dec 28 '18 at 3:19









        Reinderien

        3,349720




        3,349720






















            iAmWaldo is a new contributor. Be nice, and check out our Code of Conduct.










            draft saved

            draft discarded


















            iAmWaldo is a new contributor. Be nice, and check out our Code of Conduct.













            iAmWaldo is a new contributor. Be nice, and check out our Code of Conduct.












            iAmWaldo is a new contributor. Be nice, and check out our Code of Conduct.
















            Thanks for contributing an answer to Code Review Stack Exchange!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            Use MathJax to format equations. MathJax reference.


            To learn more, see our tips on writing great answers.





            Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


            Please pay close attention to the following guidance:


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f210455%2fhangman-game-written-after-taking-a-python-course%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            Human spaceflight

            Can not write log (Is /dev/pts mounted?) - openpty in Ubuntu-on-Windows?

            張江高科駅