ひぐぺん工房トップへ おかげさまで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/07/24
トップページへ
©ひぐぺん工房 禁無断転載
動画講座「 AIへまっしぐら! Pythonアニマルズ 」 最新刊『 AWSでつくる AIプログラミング入門 』
このサイトはリンクフリーです。 このサイトはChromeで動作検証しています。ブラウザにかかわらず表示に乱れがありましたらどうぞお知らせ下さい。メールを送る