ひぐぺん工房トップへ おかげさまで24周年!

ひぐぺん工房(松浦健一郎・司ゆき) - HigPen Works
・今までの仕事 ・書籍 ・最近の業務 ・対応可能言語 ・お見積

『わかるPython[決定版]』
Q&A

以下の回答で問題が解決しなかった場合には、 こちらから ご連絡ください。

サンプルプログラム

2018/07/25
Q.MNISTデータの取得(Chapter10, p.288)
A.
モデルの学習を行うプログラム(lr_train.py)において、MNISTデータが取得できないために、正しく実行できない場合があります。lr_train.pyが実行できない場合、以後のプログラム(lr_test.pyとlr_user.py)も実行することができません。これらのプログラムは、lr_train.pyが生成するモデルのファイル(lr.model)を使用するためです。
本来lr_train.pyのMNISTデータは、インターネット経由でサーバから取得することができますが、おそらくサーバ側の原因で、現在(2018/07/25)取得できないようです。そこで、MNISTデータ(mldata\mnist-original.mat)と学習済みモデル(lr.model)を含むアーカイブをこちらに用意しましたので、お使い頂けましたら幸いです。
またscikit-learnのバージョンが変わったために、本書の実行例とは動作が異なる場合があります。この場合は、コマンドラインで「pip install "scikit-learn<0.20.0"」としてから、サンプルプログラムを実行してみてください。本書で使用しているバージョン(0.19.1)に近いバージョンをインストールできるので、本書の例に近い実行結果が得られます。

2018/08/05
Q.抽象クラス(Chapter7, p.202)
A.
abstract2.pyの実行時に「AttributeError: 'module' object has no attribute 'ABC'」のように表示される場合には、以下をご確認ください。
(1) Python3を使用していること。「python -V」または「python3 -V」を実行すると、Pythonのバージョンを確認することができます。Mac/Linuxの場合、「python」コマンドではPython2、「python3」コマンドではPython3が起動する場合があるので、この場合は「python3」コマンドを使用してください。
(2) ファイル名やディレクトリ名(フォルダ名)に「abc」を使用していないこと。例えば、ファイル名を「abc.py」にしたり、「abc」ディレクトリ以下にファイルを配置したりしないでください。ファイル名やフォルダ名に、インポートするモジュール名(ここではabc)と同じ名前を使用していると、モジュールを正しく読み込めない場合があるようです。

2020/06/02
Q.TensorFlowのインストール(Chapter11, p.312)
A.
TensorFlowの仕様変更により、本書のプログラムが動作しなくなる場合があります。本書のプログラムを動作させるには、Python 3.7以前とTensorFlow 1.14以前が必要です。Python 3.8以降をお使いの場合には、一度アンインストールして、Python 3.7以前をインストールしてください。手順は下記です。

(1) Python 3.8以降をアンインストールします。
(2) Python 3.7をインストールします。64bit版をインストールしてください。Python 3.7.xの中から最新版をインストールするのがおすすめですが、Python 3.6.xでも構いません(ダウンロードページ)。
(3) コマンドプロンプトで「pip install "tensorflow<1.15"」を実行して、TensorFlow 1.14以前をインストールします。
(4) あとは本書の手順にしたがって、例えば「python tf_train.py」のように、サンプルプログラムを実行してみてください。

2020/06/02時点で、Python 3.7.7とTensorFlow 1.14.0の組み合わせで、本書のサンプルプログラムが動作することを確認しました。もし上記の手順でサンプルプログラムが動作しない場合には、コマンドラインで以下を実行して、PythonとTensorFlowのバージョンを確認してください。
なお本書では使用していませんが、CPythonのPython 3.8以降と、AnacondaまたはMinicondaのPython 3.7以前を併用することも可能です。

2019/01/15
Q.CGIプログラムの実行(Chapter14, p.365)
A.
本書のCGIプログラムをIDLE(Python用の統合開発環境)で実行すると、
sys.stdout = codecs.getwriter('utf_8')(sys.stdout.detach())
という箇所において、
io.UnsupportedOperation: detach
というエラーが発生することがあります。これは、出力ストリーム(sys.stdout)の仕様が、IDLEとコマンドラインとでは異なるためです。本書で説明しているように、コマンドラインで実行すれば動作します。以下に簡単な手順を示します。動作確認にはWindows10とPython3.6.8を使用しました。

(1) 本書のサンプルをダウンロードして、「C:\Users\ユーザ名」以下に展開します。
(2) コマンドライン(コマンドプロンプト)を起動します。
(3) コマンドラインで「cd C:\Users\ユーザ名\sample\chapter14」として、カレントディレクトリを移動します。
(4) コマンドラインで「python -V」として、Pythonのバージョンを確認します。「Python 3.6.8」のように表示されます。
(5) コマンドラインで「python cgi-bin\test.py」として、test.pyを実行します。次のように表示されます。
Content-type: text/html; charset=UTF-8
<!DOCTYPE html>
<html>
…
<p>
<img src="/daikon_happy.png" alt="大根">
このページが表示されたら、無事にCGIプログラムが動いているよ!
</p>
…
</html>
(6) コマンドラインで「python -m http.server --cgi」として、Webサーバを起動します。「Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...」と表示されます。
(7) Webブラウザで「http://localhost:8000/cgi-bin/test.py」を開きます。本書p.367のようなページが表示されます。ChromeとFirefoxで動作を確認しました。

2019/04/08
Q.lr_train.pyの実行(Chapter10, p.291)
A.
lr_train.pyなど、本書のサンプルプログラムを実行する際には、.pyファイルがあるディレクトリをカレントディレクトリにする必要があります。例えば「python lr_train.py」を実行しようとしたときに、

python: can't open file 'lr_train.py': [Errno 2] No such file or directory

のようなエラーが表示される場合、lr_train.pyのあるディレクトリがカレントディレクトリになっていない可能性があります。例えば本書のダウンロードファイルを、デスクトップのsampleディレクトリに展開した場合には、コマンドプロンプトで以下のコマンドを実行して、lr_train.pyのディレクトリをカレントディレクトリにします。

cd Desktop\sample\chapter10

または、以下のコマンドを実行します。

cd c:\Users\ユーザ名\Desktop\sample\chapter10

コマンドプロンプトのプロンプトが「C:\Users\ユーザ名\Desktop\sample\chapter10>」のように変化したら、成功です。この状態で「python lr_train.py」を実行してください。Chapter11以降のプログラムに関しても、同様にchapter11ディレクトリなどをカレントディレクトリにしてから、実行してください。

なお、MNISTのデータ(chapter10\mldata\mnist-original.mat)は、MATLAB(公式サイト)形式のデータです。データを開くには、MATLABもしくはSciPyのファイル入出力関数(scipy.io)などを使う必要があります。

また、scikit-learnのバージョンによっては、サンプルプログラム(lr_train.py, lr_test.py, lr_user.py)が正常に動作しません。この場合は、以下のようにscikit-learnのバージョンを指定してインストールことによって、動作する可能性があります。
pip install "scikit-learn<0.20"

2020/04/15
Q.scikit-learnのバージョン(Chapter10, p.288)
A.
scikit-learnの仕様が変わったために、プログラムが動作しない場合があります。例えば、以下のようなエラーが発生することがあります。
AttributeError: module 'sklearn.datasets' has no attribute 'fetch_mldata'

この場合は、以下のようにscikit-learnをインストールしてください。本書で使用しているバージョン(0.19.1)に近いバージョンをインストールできます。
pip install "scikit-learn<0.20.0"

なお2020/04/15に確認したところ、Python3.8では上記の方法でインストールすることができませんでした。Python3.7ではインストールできるようなので、Python3.7をお使いください。

補足

2018/08/24
Q.ファイルに保存したプログラムの実行[Windows](Chapter2, p.26)
A.
プログラムを「test.py」という名前で「ドキュメント」に保存した場合には、以下のいずれかの方法で実行してください。「Document」ではなく「Documents」を指定してください。
python C:\Users\ユーザ名\Documents\test.py
python Documents\test.py

メモ帳などにおいて、プログラムを「C:\Users\ユーザ名」に保存するには、保存ダイアログの上部にあるアドレスバー(「コンピュータ名 > デスクトップ」や「コンピュータ名 > ドキュメント」などと表示されている欄)をクリックしてから、キーボードで「C:\Users\ユーザ名」と入力してください。表示が「人のアイコン > ユーザ名」に変わりますので、この状態でファイルを保存します。

2018/08/30
Q.ファイルに保存したプログラムの実行[macOS](Chapter2, p.26)
A.
macOSでプログラムを保存する場合には、ホームディレクトリに保存してください。ホームディレクトリ名は、お使いのユーザ名によって異なります。例えばユーザ名が「higpen」の場合、ホームディレクトリ名は「higpen」です。OSに標準で付属するFinderを起動すると、最初にホームディレクトリが表示されます。
プログラムを作成する場合には、テキストエディタが必要です。macOS用の無償で使えるテキストエディタには、色々な製品(例えばatom, mi, CotEditor等)がありますので、お好みのテキストエディタを入手してお使いください。
また、OSに標準で付属するターミナルからも、いくつかのテキストエディタを起動することができます(例えばvi, nano等)。これらのテキストエディタを使う方法もあります。ターミナルの起動方法は本書p.19をご覧ください。
各テキストエディタの使い方は製品のマニュアルまたはWebをご覧ください。いずれのテキストエディタについても、ホームディレクトリにプログラムを保存すれば、ターミナルから「python3 ファイル名」でプログラムを実行することができます。例えばプログラムを「test.py」というファイル名で保存した場合、ターミナルから「python3 test.py」で実行することができます。

2018/12/19
Q.元の文字列が変更されていないことの確認(Chapter3, p.61)
A.
以下を実行すると、zipcodeの値は'1008924'から'100-8924'に変化します。

zipcode = '1008924'
zipcode = zipcode[:3] + '-' + zipcode[3:]

このとき、「元の'1008924'がメモリ上に保存されていること」を直接確認することはできませんが、「元の'1008924'とは別に'100-8924'が生成されていること」は、次のように確認することができます。

zipcode = '1008924'
zipcode2 = zipcode[:3] + '-' + zipcode[3:]

zipcodeの値は'1008924'のままで、zipcode2の値は'100-8924'となります。

2019/03/13
Q.help関数の練習問題(Chapter5, p.114)
A.
この練習問題を実行するときには、あらかじめインタプリタ上でtrip関数を定義しておく必要があります。p.113ではテキストエディタでtrip関数を定義していますが、同じ内容をインタプリタで入力してから、help関数を実行してください。

>>> def trip(dist, speed):
...   """距離と速度から所要時間を計算して返します.
...
...   引数:
...   dist -- 距離
...   speed -- 速度
...   """
...   return dist / speed
...
>>> help(trip)
Help on function trip in module __main__:

trip(dist, speed)
  距離と速度から所要時間を計算して返します.

  引数:
  dist -- 距離
  speed -- 速度

>>>

すでにテキストエディタでtrip関数の定義を入力し、ファイルに保存した場合には、以下のように実行する方法もあります。ファイル(ここではdoc.pyとします)を保存したディレクトリで、インタプリタを実行してください。

>>> from doc import trip
>>> help(trip)
Help on function trip in module doc:

trip(dist, speed)
  距離と速度から所要時間を計算して返します.

  引数:
  dist -- 距離
  speed -- 速度

>>>

2019/03/13
Q.class1.pyの実行(Chapter7, p.169)
A.
class1.pyが上手く実行できない場合、まずはサンプルファイルに収録されているclass1.pyが正しく実行できるかどうか、試してみてください。以下のような結果になれば成功です。

…\sample\chapter7>python class1.py
Name : Daikon
Level: 1
Name : Ninjin
Level: 2

手作業で入力したclass1.pyを実行したときに、もし以下のようなエラーが出る場合には、最初の行の「class Player:」が正しいかどうかを確認してください。「Player」を他の名前で入力している可能性があります。

Traceback (most recent call last):
 File "class1.py", line 7, in
  p1 = Player()
NameError: name 'Player' is not defined

2019/11/05
Q.本書と異なるバージョンのPythonの使用(Chapter2, p.9)
A.
Pythonは随時バージョンアップされています。基本的には最新版のPythonを使うことがおすすめですが、本書とは異なるバージョンのPythonを使用した場合、たまにバージョンが異なることが原因で、プログラムが動かないこともあります。この場合には、Pythonのダウンロードページから、本書と同じバージョンのPythonをダウンロードして、お使いください。

2020/04/15
Q.__check_levelメソッド(Chapter7, p.179)
A.
p.179の表において、FighterクラスとWizardクラスの__check_levelメソッドが「×(マングリング)」となっているのは、「マングリングされているため、通常のメソッド名では呼び出すことができない」という意味です。例えば、p.177のclass6.pyにおいて、次のような呼び出しはエラーになります。
w.__check_level()

マングリング後のメソッド名を使えば、呼び出すことができます。
w._Player__check_level()

FighterクラスやWizardクラスのメソッドからは、次のように呼び出します。
Player._Player__check_level(self)

次のように、Playerクラスから継承したlevel_upメソッドを呼び出したときには、level_upメソッドの内部で__check_levelメソッドが呼び出されるので、レベル上限値のチェックと補正が行われます。
w.level_up(20)
w.display()

つまり、FighterクラスとWizardクラスからは、__check_levelメソッドを「通常のメソッド名では呼び出すことができない」だけで、このようにPlayerクラスから継承したメソッドを介せば、間接的に利用できます。

2020/04/24
Q.負数のステップにおけるスライスの暗記法(Chapter3, p.64)
A.
スライスの暗記法(p.58)は、負数のステップ(p.64)に対してそのままでは適用できないのですが、見落としていました。大変申し訳ありません。

負数のステップ(p.64)に対しては、インデクスを左端の文字の右から始める必要があります。以下は「s = 'おもいかるいし'」に対する例です。s[5:2:-1]は「いるか」になります。

   お も い か る い し
    0 1 2 3 4 5 6

インデクスも負数の場合には、右端の文字の右を-1にします。s[-2:-5:-1]は「いるか」になります。
   お  も  い  か  る  い  し
 -8 -7 -6 -5 -4 -3 -2 -1

つまり、正数のステップの場合に比べて、負数のステップにおいては、インデクスを右に一文字分ずらす必要があります。

スライスの暗記法は、Pythonの公式チュートリアルで紹介されている方法で、最初にスライスを学ぶときには有用な方法の一つかと思います。しかし、インデクスが正数か負数かに応じて暗記法を変えなければならないのが煩雑だと感じたら、以下のように通常のインデクスを使って考えるのがおすすめです(筆者はこの方法を使っています)。
   お  も  い  か  る  い  し
   0  1  2  3  4  5  6
  -7 -6 -5 -4 -3 -2 -1

ステップが正数でも負数でも、「開始インデクスの文字は含み、終了インデクスの文字は含まない」という規則は同じです。そのため、s[5:2:-1]とs[-2:-5:-1]が両方とも「いるか」になることが、すぐに分かります。「終了インデクスの文字は含まない」という扱いに慣れることがポイントです。

2020/07/24
Q.Pythonインタプリタの終了(Chapter2, p.27)
A.
Pythonインタプリタのプロンプト「>>>」が表示されているときに、Ctrl+Zキー(Windows)やcontrol+Dキー(macOS)を押すと、Pythonインタプリタが終了しますが、これは正しい動作です。もう一度Pythonインタプリタのプロンプト「>>>」に戻りたいときには、「python」(Windows)や「python3」(macOS)を実行してください。

Pythonインタプリタには以下の2種類の使い方があります。
(1) コマンドプロンプト(Windows)やターミナル(macOS)から、「python」や「python3」を実行して、Pythonインタプリタのプロンプト「>>>」を表示し、Pythonプログラムを直接入力して実行する使い方。このモードのことを、Pythonインタプリタの対話モードと呼ぶことがあります。
(2) Pythonプログラムを.pyファイルに保存しておき、コマンドプロンプト(Windows)やターミナル(macOS)から、「python ファイル名」や「python3 ファイル名」で実行する使い方。実行後はコマンドプロンプト(Windows)やターミナル(macOS)に戻ってきます。

ごく短いプログラムを入力してすぐに動かしたいときには、(1)を使うのが便利です。(1)では入力しにくい、少し長いプログラムを動かすときには、(2)を使うのがおすすめです。(1)から(2)に移行するには、Ctrl+Zキー(Windows)やcontrol+Dキー(macOS)を使います。(2)から(1)に移行するには、「python」や「python3」を実行します。

2020/09/06
Q.Pythonの学習方法と関連書籍
A.
仕事や学業で本書をお読みいただく方のために、Pythonの学習方法と、ひぐぺん工房の関連書籍について紹介します。また著者の経験に基づく、仕事や学業における課題に対する、おすすめの取り組み方についても言及します。

仕事や学業の締め切りが迫っていると、Webなどで関連しそうなプログラム例を探し、それらのプログラム例を貼り合わせて目的のプログラムの作成を目指す…ということをしがちですが、これは効率の点でおすすめしません。少し時間をとって、一度Pythonの文法を体系的に学ぶことをおすすめします。

Pythonの文法を書籍で学ぶには、書店やWeb書店の試し読みなどを活用して、目的や好みに合った書籍を選ぶことがおすすめです。Web上の情報としては、Pythonの公式サイトにあるPythonチュートリアルがおすすめできます。Pythonの文法に関するひぐぺん工房の書籍には下記があるので、もし目的と好みに合うものがあれば、ぜひご利用ください。

『わかるPython[決定版]』
Pythonの文法について基本から応用まで詳しく記載しています。実践としてはscikit-learnによる機械学習や、TensorFlowによるディープラーニングなどを取り上げています。

『Technical Master はじめてのPython エンジニア入門編 Python3対応』
素早く実践に移れるように、Pythonの文法をコンパクトにまとめ、色々なライブラリを体験することに注力しています。scikit-learnやTensorFlowのほか、データ分析(pandas/Jupyter Notebook)、データベース(sqlite3/MySQL)、Web(Requests/Bottle/Flask/Django/slackweb)、プログラムの公開(PyPI/GitHub)などを扱います。

『100問でわかるPython』
クイズ形式でPythonの文法を学んだり、文法の知識を確認したりできる本です。付属の赤シートを使うことで、重要キーワードを暗記したり、問題の難易度を上げたりして楽しめます。

上記の書籍はいずれもPythonの文法を扱っているので、内容が重なる部分はありますが、書籍ごとに性格付けや説明の方法を変えてあります。もし上記のいずれかの書籍をお読みいただいて、分からない部分があったり、他の書籍にも興味を持っていただいた場合には、他の書籍もお読みください。Pythonに対する理解を深めていただけると思います。

Pythonの言語とライブラリを比べると、ライブラリは流行や開発状況が変動しやすく、深く学んでもすぐに使えなくなってしまうことがよくあります。それに比べると言語はもう少し息が長いので(それでも長年使える言語は少ないのですが)、落ち着いて学ぶ価値があります。ライブラリについては、明日はなくなるかも…というくらいの気持ちで、軽く付き合う方が上手くいくようです。ライブラリを使ったプログラム例を読むときには、「Pythonのどの文法を使っているのか」を常に理解しながら読むことが重要で、文法をよく理解していると処理の内容もよく分かり、応用も利くようになります。

Pythonの文法について体系的に整理できたら、次は仕事や学業の課題に取り組んでみることがおすすめです。その際には仕事や学業を監督する方(上司や指導教官)に、課題の内容や目的についてよく確認することをおすすめします。課題において作成するものが明確に決まっている場合は、「作成物が満たさなければならない仕様は何か」をよく確認しましょう。もし作成するものが決まっていなかったり、よく確認したら仕様が明確でなかった場合には、学習などにおいて達成するべき目標を確認したり、監督者と相談しながら目標を設定したりしましょう。

成果を定期的に監督者に報告することも重要です。毎週や隔週くらいのタイミングで監督者に成果を報告して、課題が進んでいるか、相談したい問題はないか、このまま進んでいってよいのか、監督者の意図する目的に沿っているのか、監督者の要望がその後変化していないか、といったことを確認しながら進めましょう。特に監督者が忙しい場合、お互いに「無事に進んでいるはず」と思い込んで進めてしまい、後になってから想定が食い違っていた…ということになりがちです。監督者が忙しくても何とか捕まえて、このまま進めてよいかどうか、確認しながら進めましょう。

課題が特定のライブラリを使う場合には、そのライブラリの公式ドキュメントを確認することをおすすめします。ライブラリにもよりますが、Web上にある非公式の情報やプログラム例に比べて、公式ドキュメントは体系的である傾向があり、またライブラリの本質や推奨される使い方について言及されていることが多くあります。Web上にある断片的な情報を探して回るよりも、公式ドキュメントを読む方が一般に早道です。多くのライブラリの公式ドキュメントには、入門用のチュートリアルやガイドが用意されています。

例えばデータ分析ライブラリのpandasならば、公式サイトを見るとUser Guide(ユーザガイド)があります。この中の先頭にある10 minutes to pandas(10分で学べるpandas)を読めば、pandasの使い方を一通り、短時間で(内容が多いので10分よりは時間がかかりそうですが)効果的に学べそうです。原語(英語)で読むのが新しさや正確さの点でおすすめですが、難しい場合は日本語訳を利用したり、自動翻訳を利用する方法もあります。

ひぐぺん工房による以下の書籍はPythonを使用しているので、Pythonの文法を学んだ後には、スムーズに読みこなすことができます。もし課題の内容に合致している書籍があったり、書籍の内容に興味を持っていただいた場合には、ぜひお読みください。

『AWSでつくる AIプログラミング入門』
AWSのAIサービスを使って、話題のAIを使ったソフトウェアを手軽に開発してみる本です。言語はPythonを使います。最近のAIでは何ができるのか、どのくらいの性能が出るのかを素早く体験することができます。仕事や学業の目的に合えば、開発したソフトウェアをそのまま活用することも可能でしょう。

『 入門 仮想通貨の作り方 - プログラミングで学ぶブロックチェーン技術・ハッシュ・P2Pのしくみ 』
仮想通貨を支えているブロックチェーンやプルーフオブワークといった仕組みを学ぶ本です。図解による解説と、実際に仮想通貨の仕組みをPythonでゼロからプログラミングしてみることで学べることが特徴です。

『おもしろまじめな AIスピーカーアプリをつくろう - Google Home(アシスタント) & Amazon Echo(Alexa)音声アシスタント開発』
AIスピーカーのアプリ(プログラム)をPythonで開発する本です。一冊でGoogle用とAmazon用の両方に対応しています。このWebサイト(ひぐぺん工房)のQ&Aで一部をサポートしていますが、Google/Amazon両社ともAIスピーカー開発環境の仕様を色々と変更したので、本書の記載とは異なる部分が生じています。


最終更新 2020/09/06
トップページへ
©ひぐぺん工房 禁無断転載
動画講座「 AIへまっしぐら! Pythonアニマルズ 」 最新刊『 伝説のアーケードゲームを支えた技術 』
このサイトはリンクフリーです。 このサイトはChromeで動作検証しています。ブラウザにかかわらず表示に乱れがありましたらどうぞお知らせ下さい。メールを送る