find100

日常の中で見つけた面白そうなことを発信します

MENU

独学プログラマーを読んでハングマンで遊んでみた

この記事は前回の続きとなっています。

前の記事をまだ読んでいない人はぜひそちらから読んで下さい。

find314.hatenablog.com

第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つにまとめる

f:id:find314:20190315120714j:plain
ハングマン

この章では今まで学習したことを用いてハングマンというゲームを作ります。

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章 ハマったときの助け

この章ではコードを書いていてうまくいかなかったときにどうすれば良いのかということが書いてあります。

有用なサイトやリンクも載っています。

調べてみたらこの書籍のリンクが全て載っているものを見つけたので一応載せておきます。

http://web-cache.stream.ne.jp/www11/nikkeibpw/com/sp/dokupro-link.pdf

自分は一応self-taught programmerのヒントが受け取れるようにメール登録しておきました。


今回はここまでにしておきたいと思います。

何か間違いやアドバイスがあれば是非ください!