独学プログラマーを読んでハングマンで遊んでみた
この記事は前回の続きとなっています。
前の記事をまだ読んでいない人はぜひそちらから読んで下さい。
第8章 モジュール
ここら辺からいよいよ自分の知らない知識がたくさん出てきます。
この章ではモジュールとは何か、使用に当たってどんなメリットがあるかが書いてあります。
#script.py def print_hello(): print("Hello") if __name__ == "__main__": print("koko") #self-taught programmer.py import script script.print_hello() import script >>Hello
if __name__ == "__main__":と書くとどうしてインポートした時にその下の行が実行されないんだと思ったので調べてみると下のような理由だそうです。
import ファイル名(今回の場合はscript)とすると、__name__の部分が"ファイル名"(今回は"script")という文字列に置き換わってif文がfalseと判断されるため実行されないそうです。
一方、ターミナルなどでpython ファイル名.pyとして呼び出した時には__name__が__main__に置き換わって実行されるそうです。
実際に試してみたところインポートでは実行されず、ファイル名.pyとした時には実行されたのでふーん、そういうものなのねという感じです。
ではp123のチャレンジ問題の自分のコードを載せておきます。
#charange6 #このファイルはself_taught_programmerです #Q1 import statistics num = [2,5,9,35,55,78] print(statistics.pvariance(num)) #Q2 import script print(script.cubed(5)) #以下の関数はscriptファイルに書かれています def cubed(n): return pow(n, 3)
Q1では母分散を求めました。
ここら辺の章はページ数が少ないのでサクサク進みます。
第9章 ファイル
この章ではファイルの書き出し方や読み込み方について書かれています。
最初読んだときはいくつか疑問が湧きましたがなんとか理解できました。
自分の単純なミスもあったので・・・。
open関数使ってもファイル開かんやんと思ってたらその前のコードでエラーが発生してたみたいな。
それではp132のコードを載せておきます。
#charange7 #Q1 with open("st.txt", "w") as f: f.write("fruits = [apple, banana, orange]") with open("st.txt", "r") as f: print(f.read()) #Q2 question = input("what are you name?") with open("st.txt", "w") as f: f.write(question) #Q3 import csv with open("im.csv", "w", newline='') as p: w = csv.writer(p, delimiter=",") w.writerow(["Top Gun","Risky Business"]) w.writerow(["Tintail","Obama","Choco"]) w.writerow(["Man on Fire","level 5"]) #Q4 import csv with open("im.csv1", "w", encoding="utf-8") as f: w = csv.writer(f, delimiter=",") w.writerow(["トップガン", "リスキービジネス"]) w.writerow(["チンタル","オバマ","チョコ"]) w.writerow(["マンオンファイア","レヴェル5"])
解答を見てみると
import csv movies = [["Top Gun", "Risky Business", "Minority Report"], ["Titanic", "The Revenant", "Inception"], ["Training Day", "Man on Fire", "Flight"]] with open("movies.csv", "w") as csvfile: spamwriter = csv.writer(csvfile, delimiter=",") for movie_list in movies: spamwriter.writerow(movie_list)
となっていてforを使っているのでスマートなコードになっているのが分かります。
解答の最後の行の
spamwriter.writerow(movie_list)
で、リストの中のリストを一行づつ表示するんですね。
第10章 知識を1つにまとめる
この章では今まで学習したことを用いてハングマンというゲームを作ります。
def hangman(word): wrong = 0 stages = ["", "_______ ", "| ", "| | ", "| o ", "| /|\ ", "| / \ ", "| ", ] rletters = list(word) board = ["_"] * len(word) win = False print("welcome to hangman!") while wrong < len(stages) - 1: print("\n") msg = "pridict a character" char = input(msg) if char in rletters: cind = rletters.index(char) board[cind] = char rletters[cind] = '$' else: wrong += 1 print(" ".join(board)) e = wrong + 1 print("\n".join(stages[0:e])) if "_" not in board: print("you win!") print(" ".join(board)) win = True break if not win: print("\n".join(stages[0:wrong+1])) print("you lose!Answer is {}.".format(word)) print(hangman("cat"))
最後らへんの
print("\n".join(stages[0:wrong+1]))はprint("\n".join(stages))でも問題なく動きます。
ではチャレンジ問題の自分のコードを載せておきます。
# create the hangman #charange8 import random word_list = ["blue","apple","marvel","fire","king"] def hangman(word): wrong = 0 stages = ["", "_______ ", "| ", "| | ", "| o ", "| /|\ ", "| / \ ", "| ", ] rletters = list(word) board = ["_"] * len(word) win = False print("welcome to hangman!") while wrong < len(stages) - 1: print("\n") msg = "pridict a character" char = input(msg) if char in rletters: cind = rletters.index(char) board[cind] = char rletters[cind] = '$' else: wrong += 1 print(" ".join(board)) e = wrong + 1 print("\n".join(stages[0:e])) if "_" not in board: print("you win!") print(" ".join(board)) win = True break if not win: print("\n".join(stages)) print("you lose!Answer is {}.".format(word)) print(hangman(random.choice(word_list)))
最初にrandomモジュールをインポートしてchoice関数を使いました。
第11章 ハマったときの助け
この章ではコードを書いていてうまくいかなかったときにどうすれば良いのかということが書いてあります。
有用なサイトやリンクも載っています。
調べてみたらこの書籍のリンクが全て載っているものを見つけたので一応載せておきます。
自分は一応self-taught programmerのヒントが受け取れるようにメール登録しておきました。
今回はここまでにしておきたいと思います。
何か間違いやアドバイスがあれば是非ください!