▲訂正とお詫び▲
テキスト本体(第3.2版以前のもの)の中のオブジェクト指向プログラミングの解説部分で,デストラクタ(ファイナライザ)に関する記述に誤りがありましたので修正しました.どうか最新版に差し替えてください.
●テキスト本体(PDF形式475ページ:3.84MB) 2024/11/06更新
(→ミラーサイトからDL)(→GitHubからDL)
言及している主なライブラリ:
Kivy, argparse, socket, threading, multiprocessing, concurrent,
requests, BeautifulSoup, mpmath, subprocess, datetime, time,
timeit, tzlocal, zoneinfo, pickle, struct, locale, re, csv,
functools, asyncio, aioconsole, aiofiles, sched, schedule,
traceback, pprint, platform, base64, collections, itertools,
enum, shutil, zipfile, atexit, wave, PyAudio, Tkinter, psutil,
curses
→テキスト中のサンプルプログラム
【学び方】 1,2章を読みながらサンプルを実行
しながら理解するのが良いと思います.
難しいと思ったところはスキップして大丈夫です.
(必要に応じて,後で読み返すというので構いません)
他の章は必要に応じてお読みください.
テキスト中の実行例のバリエーションを自分で作って
試しながら進むと理解が深まります.
既にある程度Pythonを知っている人は,文法や事例を
調べるのに使うこともできると思います.
●ライブラリブック(PDF形式227ページ:4.13MB) 2022/03/25更新
(→ミラーサイトからDL)(→GitHubからDL)
(旧名称:Python3モジュールブック)
言及しているライブラリ:
OpenCV, Pillow, pygame, Eel, PyDub, NumPy, matplotlib,
SciPy, SymPy, hashlib, passlib, Cython, Numba, ctypes,
PyInstaller, JupyterLab, json, urllib, zenhan, jaconv
→ライブラリブック中のサンプルプログラム
NumPy,matplotlib は極めて高機能ですが
「どこまで憶えておけばよいのか」と悩みますね.それで,
「とりあえず憶えておくと後々楽になりそう」という内容の量を
模索しています.
---------------------
Pythonを盲信する人が出てくるといけませんので,Pythonの長所/短所について冷静に考えてほしくて記事を書いています.
→Pythonの長所と短所についての考察
---------------------
【有用なリンク】
・Windows用コンパイル済みライブラリ
PIPでインストールする形式のものです.標準的なインストール方法でだめな場合に重宝します.("Unofficial"ということですので自己責任でお願いします)
・オブジェクト指向プログラミングに関する良い記事
オブジェクト指向プログラミング(OOP)の考え方は理解しやすいですが,非常に奥が深いものです.単に「動くプログラムが書ける」というだけではOOPの概念と目的,作法を十分に理解したことにはなりません.Pythonのオブジェクト指向に関して大変に良い記事を@kaitoluciferさんが投稿してくださっていますのでお勧めします.
---------------------
【データ処理関連】
Pythonでデータ処理するための基礎知識についてテキスト作っています.まだ試作品でして,ご意見やご助言いただきたいです.
→Pythonによるデータ処理のテキスト
---------------------
【PySimpleGUI】
おそらくPython用のGUIライブラリの中で最も使い方が簡単だと思います.
こちらもご意見いただけたらと思います.
→PySimpleGUIの基本的な使用方法
---------------------
Pythonを用いたゼミ活動の紹介をしています.
→Pythonを応用した活動の紹介
---------------------
(2017/05/16)
学校でプログラミング教えています.
初心者に教えるためのPython3の入門テキストを作りました.
既に何かの言語を習得している人が迅速にPythonに慣れるための入門書というスタンスです.
GUIライブラリ「Kivy」を使ってアプリを作れるところまで一気に解説しています.(Kivyの入門)それと,Webスクレイピング用にrequests, BeautifulSoup4の入門的解説もしています.
(Tkinterに関しても基本的な解説をしています)
まだまだ完成度が低い状態ですが,教育現場で使いならがテキストも修正・アップデートしてゆきます.
無料で公開しますので,ご意見いただけたら嬉しいです.
誤った箇所を見つけられましたら是非ご一報くださいませ.連絡先はテキスト裏表紙にあります.
紹介ページ
「これ使いたい」という方は大歓迎です.ご意見をいただきながら完成度を高めて行きたいです.
特に学校でプログラミングの指導をしておられる先生方に使っていただけたらと思います.現場から上がってきた要求やご指摘などいただけましたら幸いです.(可能な限りテキストに反映します)
本書はフリーソフトウェアの書籍です.出典明記していただければ自由に使っていただいて結構です.(印刷,再配布も可)
●書籍情報
「Python3入門 - KivyによるGUIアプリケーション開発,サウンド入出力,ウェブスクレイピング」, 中村勝則, IDEJ出版, 2024年, ISBN978-4-9910291-3-4 C3004
本書の内容の範囲でしたらご質問も送っていただいて結構です.可能な限りということで対応いたします.
(2024/08/01)
おかげさまをもちまして,公開8年目となりました.
今となってはかなりのボリュームとなりまして「気軽にPython入門」のためのテキストという感じではなくなりました.(そして今もアップデートを続けいています)
職業エンジニアを目指す学生さん達とのお付き合いを通してテキストが成長してきました.
現状を言いますと「軽くPython入門」を終えた人たち向けの「次のステップに進むためのテキスト」という立ち位置になったような感があります.
Pythonは学びやすい言語だとよく言われますが,どこまで学べば基礎作りになるのかよくわからない言語だとも言えます.
それで「実用レベルの基礎学習」の目安となるテキストを目指しています.
これからもご指摘やご要望をいただけたらと思います.
チャット系の生成AIが普及しつつある今でも,まとまった解説を提供するという意味で,人間が編纂したテキストの存在意義は大きいと考えています.
生成AIに十分な指示を与えるためにも,あるいは生成AIからの回答を十分に理解するためにも,言語とAPIに関する基礎知識は必須です.
テキストの内容をもっと要約したビデオ教材も配信しています.
「それでもだめだ…」という人のために,「入門のための入門の動画」も作っています.これを観て実習していただければここで紹介しているPDFテキストが読めると思います.
補足(更新に関すること,ご案内など)
--------------
【補足】(2024/10/11-11/06)
テキスト本体を修正.Python3.12の版からint型オブジェクトに対してもis_integer()メソッドが有効になりましたので,この件をテキストに反映しました.ご協力くださいました京都情報大学院大学の岳五一先生,ありがとうございます.
その他,若干の追加.
--------------
【補足】(2024/08/01-09/29)
前期学期(春学期)終了後のメンテナンスをしました.最新版を秋学期授業用とします.
テキスト本体に加筆.async,awaitによる非同期処理が理解しにくいとの相談を時々受けますので,asyncioのところの解説を増補しました.
TCP/IP通信の機能に関する解説がお粗末でしたので増補しました.通信機能を持ったアプリを作る場合の基礎知識として重要な事柄を追記しました.
マルチプロセスプログラミングのためのmultiprocessingライブラリの基本的な使用方法の解説を載せました.今では複数コアのCPUが当然の時代ですので追記しました.
psutilライブラリに関する基本的な解説を載せました.システムの状態,プロセスの状態を監視するための基本ツールとして重要だと判断しました.IoTとか遠隔制御で重要です.
キャラクタ端末の入出力のためのcursesライブラリの基本的な解説を載せました.キャラクタ端末でのUI構築に必要になります.
--------------
【補足】(2024/06/18-07/13)
テキスト本体(第3.2版以前のもの)の中のオブジェクト指向プログラミングの解説部分で,デストラクタ(ファイナライザ)に関する記述に誤りがありましたので修正しました.また,timeモジュールの解説の部分に乱調があったので修正しました.どうか最新版に差し替えてください.
--------------
【補足】(2024/03/14)
テキスト本体の年度末メンテナンスを一旦終了とします.まだチェックは続けますが,とりあえず新年度用とします.
--------------
【補足】(2024/02/11-23)
テキスト本体の年度末メンテナンスしています.これから新学期にかけて頻繁にアップデートします.ご指摘や要望,ご相談頂いた件が溜まっていますのでこの春休み中にテキストに反映しようと思います.
・乱数生成に関する事柄に追記.
・「イテレータ」と「イテラブルなオブジェクト」の用語が錯綜していました.これに関する用語法も誤っていた部分があったので修正.
・Kivyに関して増補.ウィジェットのサイズ設定に関するサンプルプログラムと解説を追記.
・マルチスレッド,マルチプロセスの解説部分を増補.共有記憶の排他制御などについての解説を入れました.
・asyncioの解説の部分に増補しました.
・pkg_resourcesが非推奨になるようですので,モジュール一覧を作成するための代替案を掲載しました.
--------------
【補足】(2023/08/01-09/10)
前期学期終了後のメンテナンス(テキスト本体)しました.後期学期用として公開します.
処理系のローカルタイムゾーンを調べるためにtzlocalモジュールの解説を入れました.
timeモジュールの解説内容が薄かったので増強しました.
ロケール(locale)に関する解説がなかったので入れました.
ユーザが独自に定義したクラスのインスタンスを'=='などの演算子で比較する際の注意事項を掲載しました.
asyncioライブラリに関する初歩的な解説を入れました.
内部関数の応用例としてクロージャとエンクロージャに関する記述を入れました.
その他,不適切な用語や誤植の修正など.
--------------
【補足】(2023/03/14)
テキスト本体の年度末メンテナンスを一応終え,新学期用とします.
--------------
【補足】(2023/03/02)
テキスト本体の年度末メンテナンスが一段落しました.
ご指摘,ご提案をくださった方々に心よりお礼申し上げます.
--------------
【補足】(2023/02/01-28)
後期学期が終わりましたので年度末のメンテナンスしています.
テキスト本体の内容の検査と修正をしています.古い版での実行例が多数含まれていますので少しずつ修正しています.
--------------
【補足】(2022/12/25-2023/01/27)
テキスト本体の修正と追記.冬休みのメンテナンスです.
関数の引数の扱いに関することと itertools に関することなどを追記しました.
プログラムの実行時間をtimeitモジュールで計測する方法について加筆.
正規表現で多バイト文字を表現する方法について加筆.
例外処理に関する説明の部分に加筆.
演算子の優先順位の表を付録に追加.
オブジェクト指向プログラミングの解説に加筆して整理.
桁数が大きな整数値を扱う際の注意事項を追記.(重要な事柄かもしれません)
その他,細々と追記と修正.
複数の方々からご指摘,ご助言いただいていますので参考にさせていただきます.これから年度末にかけてかなり手を入れていきます.
--------------
【補足】(2022/10/29-30)
テキスト本体を若干修正.後期(秋学期)途中のマイナーアップデートです.
--------------
【補足】(2022/09/04)
テキスト本体を若干修正.前期(春学期)終了後のメンテナンスでした.
--------------
【補足】(2022/05/19-06/24)
テキスト本体に加筆.
Jupyter Notebook環境でセットを出力すると要素が整列されて表示されます.これはIPython環境の性質のようです.これに関して若干の追記をしました.
enumerateによる付番の方法の解説の部分に若干の加筆.
print関数に与えるキーワード引数「file=」の記述位置の説明が誤っておりました.お詫びします.修正しましたので最新版に差し替えてください.
--------------
【補足】(2022/02/14-03/25)
テキスト本体に加筆.
datetimeのタイムゾーンに関する解説を加えました.
ライブラリブックに加筆.
NumPyのdatetime64, timedelta64クラスについて基本的な解説を載せました.
NumPyで配列データの相関行列を求める方法の解説を載せました.
今回も年度末のメンテナンスしています.作成開始から5年経ちますが,まだ恥ずかしい間違いが見つかっています… よろしければご指摘お寄せください.
--------------
【補足】(2021/09/10-10/31)
テキスト本体に加筆.
システムが標準的に提供するオブジェクトの名前を変数名として採用してはいけないということに関して言及.初心者向けの対応です.
ord,chr関数の解説の部分に若干追記しました.
テキスト内で「文字コード」という言葉が不適切な形で多数使われていたので修正しました.
「type(値) is 型名」で型の検査をする方法について加筆しました.
Python3.10で導入された「構造的パターンマッチング」(match~case構文)に関して基本的な解説を載せました.
--------------
【補足】(2021/06/02-08/18)
テキスト本体に加筆.
辞書のエントリの順序に関する解説を加えました.
書式設定における「プレースホルダ」の用語説明を加えました.
osモジュールでホームディレクトリを取得する方法の解説に加筆しました.
csvモジュールの解説の部分に若干追記しました.
datetimeモジュールの解説を若干修正しました.
正規表現の使用例を1つ追加しました.
セットや辞書に対するpopメソッドの実行について解説を加えました.
スライスオブジェクトの解説の部分に若干追記しました.
--------------
【補足】(2021/04/14-05/26)
テキスト本体に加筆.
threading.Thread,concurrent.futureの解説の部分に若干加筆しました.
日本円記号「¥」とバックスラッシュの違いに関する注意事項を記載しました.
for文で辞書を使用する方法についての解説を載せました.
setattr,getattr関数に関する解説を載せました.
os._exit関数の簡単な解説を載せました.
atexitモジュールの基本的な使用方法を載せました.
データ列に対するindexメソッドに関する解説を補強しました.
f-stringの解説に関してPython3.8で強化された点を追記.
mathモジュールのgcd,lcm関数に関する解説を追加.
辞書の結合(Python3.9)に関する解説を追加.
その他,若干の修正と追記.
--------------
【補足】(2021/03/03-16)
テキスト本体の年度末メンテナンスを一段階終えました.
多数の不備(誤植や誤りなど)を修正しましたので最新版に差し替えてください.今回のアップデートで多大なご助力をくださいました鈴鹿医療科学大学の梶山先生,誠にありがとうございます.この場を借りてお礼申し上げます.
(主なアップデート)
・Kivyのスクロールビューでマウスドラッグを有効にする方法の解説を追加
・KivyのKV言語の解説の部分のサンプルプログラムを修正
・schedモジュールによるスケジューリングの解説を修正
・その他,誤字脱字を多数修正
--------------
【補足】(2021/02/23-27)
テキスト本体に加筆.
クラス定義の際のファイナライザ(デストラクタ)に関する解説を載せました.
Tkinterのウィジェットの親と子を調べる方法の解説を載せました.
Pythonスクリプトでパッケージ情報を参照する方法の解説を載せました.
ライブラリブックに加筆
matplotlibの解説の部分に加筆しました.ポリゴンなどの図形を表示する方法についての解説を入れました.
--------------
【補足】(2021/01/01-01/16)
テキスト本体に加筆.
setオブジェクトの集合演算の部分に加筆.
イテラブルの要素を展開する「*」に関する説明を入れました.
アンダースコア「_」の使い方に関して若干追記.
その他,若干の修正をしました.
--------------
【補足】(2020/12/06-12/26)
テキスト本体に加筆.
分数(Fraction)に関する解説の部分に追記.
オブジェクト指向プログラミングに関する解説が浅い(粗い)もの
でしたので加筆しました.
あと,上記に伴ってPythonのクラス階層に関する解説も載せました.
文書化文字列(docstring)と関数アノテーション(Function Annotations)に関する基本的な解説を載せました.
その他,若干追記,修正しました.
--------------
【補足】(2020/09/04-12/03)
テキスト本体に加筆.
関数定義に関する解説の部分に若干の加筆.
bytearrayに関する解説を加えました.
enumerateに関する解説の部分に若干の加筆.
BOM付きUTF-8エンコーディングについての解説を追加.
テキストファイルの入出力における改行コードの指定方法について加筆.
csvモジュールの基本的な使用方法について加筆.
ジョブのスケジューリングのためのschedモジュール,scheduleモジュールに関する基本的な解説を載せました.
デコレータに関する基本的な解説を追加.
その他,若干追記,修正しました.
ライブラリブックに加筆.
NumPyの「@」演算子(行列の積)に関する解説を入れました.
--------------
【補足】(2020/07/04-08/24)
テキスト本体に加筆.
Python処理系に読み込まれているモジュールを調べる方法について追記しました.
os.path関連の解説に追記しました.(パス文字列の分解・合成)
pathlibの解説を増強しました.
mathモジュールの解説部分を修正(用語の誤りを直しました)
ライブラリブックに加筆.
OpenCVでグレースケール→B/W2値と変換する方法の解説を増強しました.
OpenCVの色空間とチャネルに関して整理,加筆しました.
OpenCVの画像フレームに描画する方法について加筆しました.
NumPyの配列を複製する方法(copy関数/メソッド)の解説を入れました.
NumPyの配列とバイト列の間の変換方法に関する解説を入れました.
NumPyの基本的な計算機能に関する部分に追記しました.
NumPyの複素数に関する解説に追記しました.
NumPyの行列計算において,型によって計算速度が異なります.これに関してサンプルプログラムを挙げて解説を入れました.
matplotlibの解説を少し増強しました.
scipy.io.wavfileに関する基本的な解説を載せました.
--------------
【補足】(2020/05/27-06/27)
ライブラリブックに加筆.
NumPy,SymPyの行列の扱いに関する解説の部分に色々加筆しました.
matplotlibで円グラフ,横向きの棒グラフを描く方法の解説を入れました.
NumPy配列のCSV入出力の解説部分に加筆しました.
(ヘッダーの指定方法,文字列データの入出力など)
NumPyのcount_nonzero関数に関する解説を入れました.
NumPyでカテゴリーデータを集計する方法について解説を加えました.
NumPyのdigitize関数,matplotlibのhist関数に関する解説の部分に追記しました.
度数分布の最頻値を求める方法に関する解説を載せました.
matplotlibのグラフの目盛りの設定に関する解説を載せました.
NumPyの画像データの扱いのところに追記しました.
OpenCVでRGB→グレースケール→B/W2値と変換する方法の解説を載せました.
PillowでRGB→グレースケールと変換する方法の解説を載せました.
(訂正とお詫び)
ライブラリブックに大きな誤りがありました.OpenCVライブラリで扱う画像フレームはsplitメソッドで色成分に分解すると「青,緑,赤,α」の順番(BGRα)で得られますが,これに関する解説が誤っておりました.利用者の方々にお詫びします.修正しましたので最新版に差し替えてくださいませ.
--------------
【補足】(2020/04/05-05/14)
テキスト本体に加筆.
分割代入の部分に少し加筆しました.
floatの計算誤差に関する解説を加えました.
ZIP書庫を扱うためのzipfileモジュールに関する解説を加えました.
pprintに関する最も基本的な解説を載せました.
正規表現のところに若干の追記.
小数点付きの数を2進数に変換する/逆変換するサンプルを掲載しました.
比較演算子の連鎖についての解説を加えました.
付録「メモリの使用状態の管理」に若干の加筆.
他,若干の修正(チェックする度に恥ずかしい間違いを発見します…)
ライブラリブックに加筆.
matplotlibで3次元の棒グラフを描画する方法の解説を加えました.
それと,ゼロ行列作成の解説(NumPy)に若干の追記.
jsonモジュールの解説にファイルI/Oの方法を加えました.
NumPyのmin,max,argmin,argmaxの部分に若干の追記.
matplotlibで極座標プロットする方法について解説を入れました.
sympyモジュールの項にvar関数の解説,それに素数に関する関数群の解説を入れました.
(お詫び)ライブラリブックのsympyの項のLaTeX出力に関する解説に誤りがありました.訂正しましたので最新版に差し替えてください.
--------------
【補足】(2020/03/13-24)
テキスト本体に加筆.
print関数でファイル出力する方法の解説を追加.
for文後ろに変数のタプルを書いて分割代入する方法について解説を追加.
collections.Counterに関する解説を追加.
クラスの継承関係を調べるissubclassに関する解説を追加.
WAVファイルの出力に関して加筆.
その他,若干の追記と修正
ライブラリブックに加筆.
NumPyの配列をuniqueで集計する方法について解説.
NumPyの配列に対する要素の挿入や削除をする方法について解説.
--------------
【補足】(2019/12/01-20)
テキスト本体に加筆.
正規表現のところに追記(re.sub, re.split)しました.
複数行にわたる文字列を分割する splitlines について解説を入れました.
代入式(Python3.8~)に関する解説を入れました.
コマンド引数解析のための argparse モジュールの解説を入れました.
enumモジュールに関する初歩的な解説を入れました.
その他,若干の修正と加筆.
--------------
【補足】(2019/09/01-14)
テキスト本体に若干の加筆と修正.文字が定義されている全てのUnicodeを列挙するサンプルプログラムを掲載しました.
--------------
【補足】(2019/08/01-31)
テキスト本体に加筆.
・例外を発生させるassertとraiseについての基本的な解説の追記
・辞書オブジェクトに関する解説の部分に追記
・ビット演算に関する説明の追記
・shutilモジュールに関する説明の追記
・他,若干の追記と修正
「\」記号の表記についてご指摘(といいますかお叱り)をいただいています.
テキストをTeXで書いている関係上,半角の「日本円記号」が出しにくく,苦し紛れに全角の「¥」を用いて書いている部分が多数ありました.
ご指摘の通り,これは大変に良くないことなので修正します.
→(かなり直ってまいりました)
ライブラリブックに加筆.matplotlibで3次元の散布図を描く手順の例を掲載しました.あと,SciPyに関することも書き始めました.その他,若干の追記と修正.
訂正とお詫び:7/31版のライブラリブック掲載のサンプルプログラム scatter3d01.py には誤りがあります.訂正しましたので最新版に差し替えてください.
--------------
【補足】(2019/06/08-07/26)
テキスト本体に加筆.NumPy使用の有無によって計算速度がどの程度変わるかを調べるサンプルプログラムを付録に載せました.あと,警告メッセージの表示を抑止する方法の解説と,Python処理系のメモリの使用量を調べる memory-profiler について紹介する内容を加えました.これらはJupyterLabでデータ処理する際に必要となってきます.
ライブラリブックのNumPyの箇所に若干の加筆.行列演算の高速性の応用方法と,画像を配列データとして取り扱う方法について解説を加えました.また,matplotlibで2次元配列を表として描画するtable関数の解説を加えました.
訂正とお詫び:NumPyのFFTの解説の中で「振幅スペクトル」のことを「パワースペクトル」と誤記しておりました.申し訳ありません.修正しましたので差し替えてください.
--------------
【補足】(2019/05/21-06/06)
「モジュールブック」という名称は良くないかもしれませんね.配布している一連のテキストの内容の中で "モジュール","パッケージ","ライブラリ" といった用語の扱いに誤りが残っています.ぼちぼち直そうかと考え始めました.
名称を「Python3ライブラリブック」に変更します.
文部科学省のサイトによりますと,高校の情報科のプログラミングでPythonが使われるようなことが書かれています.
配布するテキストの内容にはかなり慎重な配慮が必要になる感じがしてきました.
--------------
【補足】(2019/05/01-18)
テキスト本体に加筆.enumerateに関する解説を入れました.
Pythonは学ぶほどに「やりやすさのための小技の宝庫」と実感する言語ですね.
モジュールブックに加筆.NumPyの部分に加筆しました.
PyDubモジュールの基本的な使用方法を載せました.それにOpenCV, PyGame関連も若干の加筆.
そろそろモジュールブックを全体的にチェック(オーバーホール)しないといけない感じになってきました(ちょっとお待ち下さい)
--------------
【補足】(2019/04/06-30)
テキスト本体に加筆.f-stringはとても便利な機能なので,基本的な使い方の説明を入れました.あと,Anacondaのcondaコマンドに関する簡単な説明を追加.
モジュールブックに加筆.matplotlibでヒートマップを描画する方法,画像を画素の数値配列に変換する方法の解説を入れました.その他,NumPyの解説を若干追加と修正.
--------------
【補足】(2019/02/22-03/28)
テキスト本体のメンテナンス.
- マルチプロセス実行に関するProcessPoolExecutorの解説に誤りあり
- zipオブジェクトに関する解説に誤りあり
利用者の方々にお詫びします.修正しましたので最新版に差し替えてください.
テキスト本体にstructモジュールに関する基本的な解説を加えました.バイナリデータの生成と展開に必要になります.
オブジェクト指向,関数定義の部分の解説に若干の追記.
データ構造に付ける「スライス」を明にオブジェクトとして扱う「スライスオブジェクト」に関する基本的な解説を追加しました.普段はあまり使うことはありませんが,Pandasでデータ処理する場合に扱う機会が少し出てきますので解説しておきました.
モジュールブックのメンテナンス.
NumPy, matplotlibの解説のところで若干の追記と修正.
--------------
【補足】(2019/01/01-02/21)
テキスト本体の体裁を若干調整.それと,base64モジュールに関する基本的な解説,inf,nanに関する解説を追加.
最新のPythonでは「is」によるオブジェクトの比較の扱いが若干変わりましたので,それに伴う変更.(Python自体のバグ修正でしょうか…)
利用者の方から「all,any関数も重要では?」と助言いただきました.まさにデータ処理には便利な関数なので,早速追記しました.(助言くださった方に感謝)
Kivyでのフォントの扱いに関してサンプルプログラムを載せました.
そろそろ年度末なので,テキストのメンテナンス作業します.新年度にかけて更新が多くなりそうです.
--------------
【補足】(2018/12/16-26)
テキスト本体に加筆.
with構文に関する基本的な解説を加えました.ファイルアクセスや通信といった処理をするプログラムをスッキリと仕上げるのにwith構文が役立ちます.
データ構造にアクセスする際の処理時間に関する記述を加えました.Pythonでは「リスト」「セット」「辞書」が基本的なデータ構造ですが,使い方が適切でないと意外なくらい処理に時間がかかってしまうことがあります.その判断のための基礎知識になれば幸いです.
fractionsモジュールの基本的な使い方の解説を載せました.分数の計算ができます.
(その他,若干の加筆と修正)
--------------
【補足】(2018/12/06-10)
テキスト本体に加筆.ジェネレータについて基本的な解説を加えました.あと,リストの整列と反転に関する加筆(他,若干の修正)など.
--------------
【補足】(2018/11/26-12/05)
テキスト本体に加筆.pickleモジュールに関して基本的な解説を加えました.Pythonで扱うデータ構造の内容をバイナリデータとしてファイルに保存するのに必要となります.pickleモジュールの機能によって保存されるバイナリデータには,対象データのデータ型やクラス定義の情報(メソッドの定義など)も含まれるので大変便利です.
あと,若干の追記.
--------------
【補足】(2018/10/24-11/02)
テキスト本体に加筆.pathlibモジュールの解説に若干の追加をしました.また,このモジュールを応用してファイルをディレクトリの中から見つけ出す(再帰的に)サンプルプログラムを掲載しました.
あと,データ型を調べるtype関数についての解説を加えました.
モジュールブックに加筆.jsonモジュールの基本的な使用方法について解説を加えました.
--------------
【補足】(2018/10/08-11)
以前から時々いただく相談に「Pythonの演習問題などはないのか?」というのがあります.問題集みたいなものを作るのも1つの考えではあるのですが,効果的な学習方法としては「自分で演習問題を作る」というのが良いと思います.具体的には,テキスト中の実行例のバリエーション(変種)を自分で作ってやってみるのが良いと思います.
なかなか問題集を作るところまでは手が回らない状況にありますが,教育現場では,学生(受講生)の動きを見ながら,その場で小さな演習問題を作ってやってみてもらうというのが現状です.割と効果的ですので「テキストの実行例を弄る」というのをお勧めします.
テキスト本体に加筆.複数のデータ列をまとめてイテレータにするzip関数について初歩的な解説を載せました.あと,functoolsモジュールについて紹介程度の記述.
モジュールブックに若干の加筆.数式処理モジュールSymPyに関する内容.
式を検査する`is_'プロパティに関する簡単な解説と,パターンマッチの方法に関して解説を載せました.
--------------
【補足】(2018/09/22-25)
テキスト本体に加筆.os.system関数で外部プログラムを起動する方法の解説を追加.
モジュールブックに加筆.jaconvの使い方を書きました.
その他,若干の修正と追加.
--------------
【補足】(2018/09/16)
テキスト本体に加筆.データ構造から部分を選択的に抽出する方法について簡単に解説しました.Pythonでは
a,b = 2,3
などという代入文が書けますが,これは代入が並列に動作したと見るよりも「変数の並びに対応するデータ構造の部分が参照された」と見るべきです.これを応用すると,かなり複雑なデータ構造の解析が簡単に実現できます.Prologにおける「単一化」(unification)ほどではないのですが,「ちょっと嬉しい機能」です.
--------------
【補足】(2018/09/12-14)
テキスト本体に若干の加筆.def文で定義した関数をdel文で削除できることを書きました.(加えて若干の修正)
Pythonには exec, eval もありますので「実行中に動的にプログラミングできる」ことになります.つまり「Lispにできることは,ほぼPythonでもできる」ということになります.このことは「AI開発環境として大きな強みとなる」わけです.
PythonにはDNNのための強力なパッケージ群が揃っていますし,C/C++のライブラリを実行時にリンクできる.更にPrologとの連携も容易ですので,AI開発環境が整った感じがします.
あと,モジュールブックに passlib,PyInstaller の基本的な使い方の解説を追加.それにPillowモジュールでEPSを読み込む際のラスタライズの設定の方法について簡単な解説を追加.(その他,若干の加筆・修正)
--------------
【補足】(2018/09/01-11)
テキスト本体に加筆.モジュール読み込みの際の注意事項を書きました.ついつい
「from モジュール名 import *」
とやってしまう人がいますが「名前の衝突事故」の元です.これをやる場合は慎重にしましょう.それと,パッケージを自作する際の '__init__.py' の書き方について若干の解説を追加しました.
更に,'is'によるオブジェクトの比較に関して若干の追記.
モジュールブックに加筆.urllibを用いて多バイト文字をエンコード/デコードする方法について解説.WebのURLに含まれる多バイト文字を'%'付き文字コードにする(その逆も)方法です.
それと,文字列の全角⇔半角を変換するモジュールzenhanに関しても基本的な解説を載せました.
--------------
【補足】(2018/08/22-29)
テキスト本体に加筆.Anaconda環境下のコマンド操作でPythonインタプリタを起動する方法について簡単な説明を加えました.(その他,若干の追加と修正)
私の周りではAnacondaユーザが増え始めています.PSF版Pythonの解説のみでは対応できない状況が出てきそうですね.
--------------
【補足】(2018/08/15-21)
テキスト本体に加筆と修正.map関数の解説に若干の追記と修正,それに,Tkinterのメッセージボックス(messagebox)に関する解説を追加しました.
テキストのページ数がかなり多くなってきましたが,初心の方がはじめに読むべき部分はあまり多くありません.そういったことを「はじめに」の章に書きました.
あと,モジュールブックのSymPyの解説に若干の加筆.
--------------
【補足】(2018/07/25-08/11)
クロスプラットフォームのアプリやモジュールを作る際に,計算機環境に関する情報を取得する必要が出てきます.それでplatformモジュールの基本的な使い方をテキスト本体に載せました.
strftimeの書式指定の解説に誤りがありました.お詫びします.
最新版に差し替えてくださいませ.
その他,些細な修正とアップデートしました.
(環境変数の参照,文字列の処理など)
テキスト本体のサンプルプログラムはKivyやサウンドまで含めて,一応3.7で動作することを確認しました.でも,3.7を人に薦めるのはもうちょっと先にします.
--------------
【補足】(2018/07/25)
「Kivyが動かなくなった」という相談を受けることが最近少し増えています.基本的には
「Kivy関連パッケージを全てアンインストールしてから再インストールしてください」
と助言していますが,それでも解決できないケースがありました.私が対応したケースでは「SDL2.dllのバージョン違い」が原因となっていました.対応策としてSDLの公式サイトから最新の安定版のSDL2.dllを入手してインストールしてから,Kivyのアンインストール&再インストールをしたところKivyが動作しました.(この件,テキスト本体にも載せました)
ご参考まで.
(更に補足)
SDLに限らず,dllは必ず「正しい出処」から入手してくださいませ.一見して「公式サイト」や「正規の再配布サイト」に見えて,実はマルウェアが付いてくるところがありますのでご注意ください.
--------------
【補足】(2018/07/21)
テキスト本体にAnacondaに関する概略的な紹介を載せました.Pythonをはじめるに当たって,PSFの純正ディストリビューションを使用するかAnacondaを使用するかで迷う人が多いようです.データ処理をやるにはAnacondaが良いですね.特にAnacondaは大量のライブラリ(モジュール)が予め付いている上にパッケージ管理もやりやすいので,学生さんにはおすすめです.各種モジュールのインストールで苦戦することが無くなると思います.
注意するべき点としては,
・PSF版とAnacondaを混在させるのはあまり良くない
・Anaconda環境下でのPIPは慎重に
というのがあります.最悪の場合はPython環境を破壊してしまい,再インストールする羽目になります.もちろん多くの場合はAnaconda環境下でPIPでモジュールをインストールしても「大体は大丈夫」ですが,常に注意してくださいませ.
余談ですが,WindowsでPythonを使う場合,PSF版やAnacondaでもなくMSYS/MinGW環境の利用という選択肢があります.これはWindows環境でUNIXライクな開発環境(POSIX環境)を実現するものでして,VirtualBoxとか使ってシステムを仮想化するのとは全く違ったものです.こちらの場合でも,Python用のビルド済みパッケージが揃い始めていますので,選択肢が増えて良い感じだと思います.ただしMSYS/MinGWでのPython利用は学生にはお薦めできません.
--------------
【補足】(2018/07/17)
Pythonとモジュール群を活発に利用し始めると,パッケージ管理が煩わしくなりますね.今のテキストでは,素のPythonのインストーラ(PSF版)によるインストール方法と,PIPによる基本的なパッケージ管理について解説していますが,そろそろAnacondaも無視できない感じがしています.
(自宅でPython使う学生はAnacondaを選ぶようです)
ちょっと考えてみます.
--------------
【補足】(2018/07/07-15)
テキスト本体に加筆.collectionsモジュールのnamedtupleに関して基本的な解説を載せました.かなり便利なデータ構造です.「クラス定義するほどでもないんだけど…」というときにnamedtupleを使いましょう.
テキストを公開してから1年以上になって内容が1段階そろった感がありますので,そろそろ全体の校正作業(クリーニング)を一度やった方がよいですね.
しばらく細かい修正を続けます.
あと,Python3.7もウォッチし始めています.今の所,テキスト本体で紹介しているサンプルは大体動いていますが,私の環境ではKivyがまだダメですね…
3.7を実戦投入するのは今は控えたほうが安全です.各種モジュールが3.7に対応するにはもう少し時間がかかりそうです.
3.6と3.7を同時にインストールしておいて,起動時にバージョンを選ぶこともできますので,一応3.7も入れておいて動作を確認するのも良いかと思います.切り替え起動の方法についてもテキスト本体に解説を載せました.(2.7も同居可能です)
--------------
【補足】(2018/07/04-05)
モジュールブックに Eel の基本的な使い方を載せました.HTML5の枠組みでGUIが構築できるのは大変にありがたいですね.しかも大変に手軽な使い勝手です.Eelは今後の発展が期待できますね.アプリ開発にPythonとJavaScriptが同時に利用できるので利便性の大きさははかり知れません.(EelのGUI基盤はGoogle Chromeです)
Eel使用上の注意点としては,Python⇔JavaScript間での値のやり取りがあります.互いに異なるプロセスですから,関数呼出しに引数を渡すことはできますが,素朴にreturnで値を返すことができません(不可能ではありませんが,ちょっと面倒な作業になります)ので,ちょっと独特の工夫(割と単純な)が必要になります.
でもHTML5に慣れた人にとっては,Eelの利用は最も手軽な形のGUIアプリ構築の手段となります.しかもHTML5ですからGUIの機能性,デザイン性共に抜群です.更に,JavaScriptの各種ライブラリが使えるので,大げさに表現しますと「どんなアプリでも作れる」感じで嬉しくなりますね.
JavaScriptのテキストも作っています.こちらはかなり「未完成感」が強いですが,またご意見くださいませ.
--------------
【補足】(2018/07/01-04)
テキスト本体にexec関数,eval関数に関する基本的な解説を載せました.データをプログラムとして実行できる,とても便利な関数です.
あと,TkinterとPillowを組み合わせて画像表示をする際,PhotoImageの扱いに意外な注意点がありますね… 「Tkinterで画像が表示されない…,原因がわからない…」そんなことになりそうな落とし穴がありますので,ご一読を.
--------------
【補足】(2018/06/18-07/01)
テキスト本体にTkinterの基本的な解説載せました.
あと,用語の乱れ("関数"と"メソッド"の取り違え)をいくつか発見したので修正しました.
またしばらくはアップデート(修正)が続くと思います.
引き続き「感想」「誤りの指摘」「要望」くださいませ.
お待ちしています.
--------------
【訂正とお詫び】(2018/06/09)
テキスト本体に重大な誤りがありました…
モジュールの作成方法の説明の中の誤りを修正しました.
使ってくださっている方々にお詫び申し上げます.最新版に差し替えてくださいませ.
ご指摘くださったM.K.さん,ありがとうございます.本当に助かります.
今後もご指摘いただけたら幸いです.
--------------
【補足】(2018/06/04)
「Tkinterの解説はしないのか?」というメッセージがちらほら…(公開当初から…)
Kivyだけで良いかと思っていましたが,気軽さの面ではTkinterも無視はできないですね.検討します.
--------------
【補足】(2018/05/26-29)
テキスト本体に加筆.datetimeの日付・時刻の書式整形方法(strftimeによる書式整形)の解説を追加しました.
あと,リストの要素を並べ替えるsortメソッドに関して若干の加筆.
--------------
【補足】(2018/05/22-23)
テキスト本体に加筆.Kivyのテキスト入力(TextInput)で,複数行を扱うかどうかの設定に関して説明を加えました.
それと「イテレータ」について初歩的な解説を入れました.入門書には必要ないかと考えていましたが,紹介くらいはしておかないと,学生が後々困るのではないかと感じた次第です.
あと,ファイルサイズの取得方法の解説を追加して,更に,文字列検索の finditer に関する解説に誤りを見つけましたので修正しました.
その他,「関数」と「メソッド」の言葉の取り違えなど,用語の誤りをいくつか修正.ただし,用語がまだ怪しいところがありそうです…(修正つづく)
--------------
【ご案内】(2018/05/12)
データ処理パッケージの基本的な使用方法についてテキスト(試作品)を公開しました.
→ Pythonによるデータ処理のテキスト
「データ処理」は個別の目的があってはじめて意味を持ちますので「言語の解説」の範疇に収まりません.それで,自分が教える範囲のみのことを書いていますと,かなり偏狭な内容になりますので,是非ともまたアドバイスやご指摘いただきたくお願いいたします.
--------------
【補足】(2018/05/12)
テキスト本体に加筆.sysモジュールによる標準入出力の使用の際に,エンコーディングを設定(文字コードを指定)する方法を追記しました.
--------------
【補足】(2018/05/05)
テキスト本体に加筆.書式整形の方法とpathlibモジュールの使用方法に関して若干加筆しました.
--------------
【補足】(2018/05/01)
テキスト本体に加筆.バイナリファイルから,指定したバイト数だけデータを読み込む方法について加筆しました.
「何故もっと早く説明を入れなかったのか?」と思う今日このごろです.この分で行くとまだ色々ありそうですね.
--------------
【ご案内】(2018/04/25)
テキスト本体を入手してくださった方からご意見いただきました.
「量が多すぎますね」とのことですが,最初は1章,2章,4章だけ使っていただけば良いですよ.要するに,はじめに必要となるのは60ページ強です.
Kivy,サウンドなどは後回しにして,必要に応じてご使用ください.
PDFを紙に印刷出力する場合は「両面印刷」をお薦めします.
--------------
【補足】(2018/04/24)
テキスト本体に加筆.「標準エラー出力」については何も触れていなかったので,今回加筆しました.
--------------
【ご案内】(2018/04/21)
Jupyter関連モジュールが急に動作しなくなったと数人の方からご相談いただいています.
私の環境でも発生しましたが,関連パッケージを一旦アンインストールして,新たにインストールし直したら解決しました.
--------------
【補足】(2018/04/21)
モジュールブックに加筆.Jupyter Notebook上でinput関数を使用した例を掲載しました.
--------------
【補足】(2018/04/11-16)
テキスト本体に加筆.誤りを見つけて修正しました.
forなどの繰り返しでよく使用するrangeですが,これはrangeクラスのオブジェクトを返す関数であると見るわけですね.(ややこしい…)関数なのかオブジェクトなのかを間違えることがありそうです.
これでなんとか新学期の素材準備ができたような感じです.しかし,アップデートは当分終わりそうにありません.
--------------
【補足】(2018/04/01-6)
モジュールブックにJupyter Labに関して若干の加筆.数式処理モジュール(SymPy)使用時に数式をMathJaxで整形表示する方法と,サウンド再生に関する方法の基本的な解説を加筆しました.
--------------
【補足】(2018/03/22)
テキスト本体に加筆.Python3では変数名に日本語が使えるのですね.完全に盲点でした.学生から「変数名に日本語使えるんですか?」と聞かれて,「だめ! 半角アルファベットで書き始めること!」とか言ってしまったような気がします.大変恥ずかしい…
--------------
【補足】(2018/03/16)
モジュールブックに加筆.JupyterLabの基本的な使い方の解説を載せました.
Pythonを対話モードで使う場合に表やグラフを扱うケースでは,やっぱりそれなりの見やすさと使いやすさが重要になりますね.特にデータ解析やモデリングなんかをやる場合はJupyterLabが良いと思います.
Pythonスクリプトをアプリとして実行するスタイルも重要ですが,「ワークベンチ」として対話的に使うスタイルも今後重要になると思います.JupyterLabがPython利用のインターフェースの標準になるような予感もありますね.
統計解析と機械学習のテキストを執筆中ですが,作業を例示する部分は全てJupyterLabで書き直そうと思います…
JupyterLabは今後頻繁にアップデートされそうですね.目が離せません.
--------------
【補足】(2018/03/09)
テキスト本体に加筆.pipコマンドでパッケージ管理する場合,pipコマンドのディレクトリがコマンドサーチパスに登録されていない場合に,直接pipコマンドを実行することができません.その場合はPython処理系を介してpipを実行することになります.その方法について加筆しました.
--------------
【補足】(2018/02/19-20)
テキスト本体に若干の加筆.Pythonでは関数定義の内外でのグローバル/ローカル変数の区別(変数のスコープ)が微妙な印象を与えます.慣れないうちは不思議な挙動に悩まされることもあります.
うっかりすると見つけにくいバグをつくることになりますので,これに関して加筆しました.
バイト列を文字列オブジェクトに変換する際に,文字コードの体系が分からない場合がありますが,それを識別するための chardet パッケージについても基本的な解説を加えました.
春休みに入りますので,更新作業が増えます.
--------------
【補足】(2018/02/12-16)
モジュールブックに加筆.pygameライブラリでスプライトを扱う方法について基本的な解説を加えました.ゲーム開発には必須の機能ですね.
テキスト本体もメンテナンスはじめました.新学期に向けて何回かアップデートする予定です.
サンプルプログラムのMacの環境における動作検証が甘いとのご指摘を頂きました.一度,全て検証しますのでちょっとお待ち下さい.
--------------
【補足】(2018/01/16)
テキスト本体の条件判定の部分に加筆.条件式に特殊な値を与えた場合の挙動について解説.
真理値(True/False)以外の値の論理演算(and,or,not)はあまり使わない方が良いようです.といいますか,論理演算の結果どのよう値になるかについては個別に検証すべきだと思います.そうでないと見つけにくいバグを作ってしまうことにつながります.
あと,テキスト中に掲載しているサンプルプログラムの一覧も公開しました.ダウンロード可能です.学生(初心者)向けに「かなり冗長に」作ったプログラムですので,そのへんご了解くださいませ.余分な変数を用意したり,余計に行を分割したりと「だらだら」しています.実際はもっと簡潔に書けますので,どうぞご自由に改良してください.良いトレーニングになると思います.
--------------
【補足】(2018/01/13-14)
テキスト本体に加筆.「四捨五入はどうやるんですか?」という素朴な指摘が来ましたので加筆.
モジュールブックにも加筆.NumPyでCSVデータを読み込む際に,見出し行をスキップする方法を加筆しました.
pygameでスプライトが使えるのですね.ゲーム作りが楽しくなりそうです.使い方を調べてモジュールブックに加筆しようと思います.(春休みの課題ですね)
--------------
【補足】(2018/01/08)
テキスト本体にケアレスミス発見… 修正しました.
パラパラ見ていただけでミスが見つかりました.このぶんでいくと,かなり変なところが点在してそうですね…
今度の春休みにはしっかりオーバーホールして新学期に備えようと思います.
(もちろん随時修正していきます)
--------------
【補足】(2018/01/01)
新年,明けましておめでとうございます.みなさん,今年もよろしくお願いします.
テキスト本体,モジュールブック共,若干の加筆しました.今年もご指摘,ご意見いただけますようお願いいたします.
--------------
【補足】(2017/12/29)
テキスト本体とモジュールブックに加筆.卒業研究もラストスパートとなって,指導しながら次々と具体的な追記項目が上がってきています.来月いっぱいは更新が多くなるかもしれません.
--------------
【補足】(2017/12/22-23)
テキスト本体に加筆.文字列の置換方法,正規表現による文字列検索の部分に加筆.(その他,若干の加筆)
統計解析と機械学習に関するテキスト&教材の準備について現状報告.
統計学の最も基本的な部分(確率分布,推定,仮説検定など)の実演と解説ができた感じですが,モデリングや機械学習に関する部分はこれからです.
学校(職場)で使える形になるのは来年度中になりそうです.
--------------
【補足】(2017/11/08)
テキスト本体に加筆.PyAudioとwaveモジュールに関する部分に,音声再生の終了検出や繰り返し再生の方法についての解説を追加.
--------------
【補足】(2017/11/04)
モジュールブックに索引項目の追加.それに体裁の乱れを修正しました.
他大学の先生(友人)から問い合わせがありまして 「テキストの使用上の許諾とかどうなっているのか?」 とのことでした.
公開しているテキストは「フリーソフト」とします.著作権は保持していますが,商用/非商用問わず自由に使ってください.印刷と再配布もしていただいて構いませんが,内容は変更せずにお願いします.
そんなことより,修正依頼とかツッコミがいただける方がありがたいので奔放にやっております次第です.(ご指摘お待ちしております)
--------------
【補足】(2017/11/03)
テキスト本体の誤りを修正しました.
今回もご指摘くださったY.N様,ありがとうございます.
--------------
【補足】(2017/11/01)
テキスト本体に加筆.久しぶりにKivy関連です.
アプリケーションの開始時と終了時のハンドリング方法について加筆.
統計解析と機械学習に関するテキスト&教材の準備について現状報告.
作業は進んでいるのですが,取り扱う内容の射程が思っていたよりも広くて溜息が出ています…
要望としていただいているものとしては,各種パッケージの使い方をコンパクトに取りまとめて欲しいというのが多いですが,パッケージの数も多い上,この分野は基礎知識(統計学)が無いと学生にとっては全く意味不明になりますので,基礎的な統計学に関しても言及しはじめています…
というので,日の目を見るまでまだ時間がかかりそうです.
--------------
【補足】(2017/10/22)
モジュールブックに加筆.
NumPyでユーザ定義関数を「ベクトル化」する方法について加筆しました.
データサイエンス・機械学習のための教材準備をしている最中ですが,多量のデータに対する処理の効率化が重要になってきますので,ベクトル化で処理を高速化する方法について書いた次第です.
データサイエンス・機械学習のための準備ですが,サンプルデータの用意と基礎理論の分かりやすい解説の思案に時間がかかっています…
また,学生を実験台にしながら…(笑)
--------------
【補足】(2017/10/21)
モジュールブックに加筆.
SymPy(数式処理モジュール)のグラフ描画機能に関する説明を加えました.
--------------
【補足】(2017/10/19)
Kivy利用時に発生するトラブルへの対処について,テキスト本体に加筆しました.(付録の章に加筆)
Kivyが使用するグラフィックAPIを選択設定できます.これがうまく設定されていないと,Kivyを使ったプログラムが動かないことがあります.
再度Y.N様からご指摘,ありがとうございます.
テキストの編集を私1人でやっている関係上,多くのケースを予めテストすることができない状況にありますので,ご指摘いただけると助かります.
別件で,matplotlibに関してモジュールブックも加筆しました.
グラフの見出しやラベルに日本語フォントを使用する方法の説明を加えました.
--------------
【補足】(2017/10/14)
テキスト本体にあった誤字の修正.
ご指摘くださったY.N様,ありがとうございます.
現在,統計解析と機械学習に関するモジュールの使用方法について解説の準備をしています.(今度はかなり時間がかかりそうですが…)
ご指摘,ご要望お寄せいただけますと助かります.(To:皆様)
--------------
【補足】(2017/10/13)
モジュールブックに加筆.
matplotlib で複数のグラフを1枚に描画する方法(subplotsの使用方法)について解説を加えました.
--------------
【補足】(2017/10/08)
map, lambda, filter に関してテキスト本体に加筆.
Pythonらしいスッキリしたプログラムの記述に役立ちます.
「PythonはLISPみたい」という感想があります.この特徴は個人的に気に入っております.
--------------
【補足】(2017/10/04)
テキスト本体,モジュールブック共に若干の修正・加筆.
・WAV音声をNumpyで読み込んだ際の左右の音声の格納順番
・Numpyで使える関数の紹介を少々
--------------
【補足】(2017/10/01)
モジュールブックに ctypes の解説を加筆しました.
C言語&Pythonでしっかり開発できるように,データの受け渡し(引数と戻り値の扱い)の方法について説明を加えました.
--------------
【補足】(2017/09/29)
モジュールブックに ctypes の使い方(導入的レベル)を加筆しました.
当然といいますか,最速です.(C言語ですので当たり前ですね)
今後は,Cython, Numba, ctypes をゼミ活動で使ってみて,得られたTipsを追記していこうと思います.
--------------
【補足】(2017/09/27)
モジュールブックに Numba の使い方(導入的レベル)を加筆しました.
Cython, Numbaを触ってみた感触ですが,速度チューニングの「勘所」をしっかり把握しないといけない感じがあります.
やっぱり速度対策は「Cで書いてPythonから呼び出す」というのが確実かもしれません.
これに関しましても,是非ご意見いただきたいです.
次の速度対策は ctypes ですね.
--------------
【補足】(2017/09/24)
Cythonの解説を書いた途端に他大学の先生方から助言いただきました.
「Numbaというのがありますよ」とか
「Cプログラムとつなげるにはctypesが良いですよ」とか…
大変ありがたいです.とても良さそうなので使い方を整理してみようと思います.
Cythonは「独自の言語」という感じで,Pythonから少し離れてしまう感がありますね.それで「LLVMを応用したNumbaの方が良いのではないか」というご意見でした.元のPythonと互換性が高いならありがたい限りですね.調べてみます.
--------------
【補足】(2017/09/22)
モジュールブックに Cython の使い方を書き始めました.
ゼミでPython使っていますが,そろそろ実行速度に対する不満の声が出始めています.C言語がまだ苦手な人に向けて,手軽にPythonプログラムを高速化する方法として紹介しています.
Cythonに関する解説はまだまだ加筆が続きそうです.
--------------
【補足】(2017/09/18)
テキスト本体内の用語の表記を部分的に修正・加筆しました.
--------------
【補足】(2017/09/11)
mpmathの使い方について,テキスト本体に若干の加筆.
--------------
【補足】(2017/09/10)
モジュールブックに加筆.PillowでアニメーションGIFを作成する方法の簡単な解説を入れました.
--------------
【補足】(2017/09/07)
「データベースへのアクセス方法も重要では?」と他大学の先生から助言あり.
すみません,体が1つしかないもので… でも自分の「やることリスト」には入れておきます.(SQLite と MySQL というところでしょうか)
今の優先順位からすると,機械学習に向けた方面を念頭に置いています.
--------------
【補足】(2017/09/06)
本日,アクセス数が15,000を超えました.そろそろ責任が重くなってきました.テキストのほころびが怖くなってきます.
テキスト本体,モジュールブックの両方において,用語が少々怪しい感じのところがあります.
インポートして使用するライブラリにおいて,「クラス・メソッド」なのか「ライブリの関数」なのかはっきりしない書き方の部分が散見されますね.
もう少し我慢しておつきあいお願いします.
--------------
【補足】(2017/09/04)
MacにKivyをインストールする方法を加筆.Macユーザの方からのリクエストがありましたので加筆しました.
--------------
【補足】(2017/09/01)
やっぱりデータサイエンスのテーマを扱うためにpandasモジュールの使い方を教える用意をした方がよさそうですね.日本語処理の方法の整理が一段落したらこちらに取り掛かろうかと考えています.
結局この夏休みは,日本語音声の入出力と形態素解析の方法の整理に時間を費やした感じです.
--------------
【補足-2】(2017/08/31)
知人のMacファンからお叱りを受けました.MacのOSの名称が誤っているとのことで,早速修正しました.
--------------
【補足】(2017/08/31)
テキスト本体に,AppleのMac(OS X, mac OS)にPython3をインストールする方法を加筆.Macユーザからの相談があったので加筆しました.
Pythonインタプリタ,PIPコマンドの起動方法がWindowsとMacで少しだけ異なる点があります.
--------------
【補足】(2017/08/26)
ファイルやフォルダ(空)を削除する方法についてテキスト本体に加筆.
あと,条件式の書き方についての説明が無かったので加筆.
--------------
【補足】(2017/08/25)
テキスト本体に加筆.桁数の大きな数の計算をするために mpmath モジュールの使い方の簡単な説明を入れました.
マンデルブロ集合の画像をどこまでも拡大するというのをテーマに持つ学生に対応するためですが,実際には GMP を使って C で書くことになります.
Pythonの長所短所を理解することができるテーマですね.
あと,関数定義の内部で大域変数を扱う方法について加筆.といいますか,基礎事項の解説し忘れですね.
--------------
【補足】(2017/08/22)
テキスト本体に申し訳ない誤植を発見.修正しました.
Kivyの解説の「ウィンドウサイズを固定(リサイズを禁止)する設定」のところでタイプミスしていました…
--------------
【補足】(2017/08/19)
学生から質問を受けました.
「withってどういう構文なんですか?」
という質問です.
Pythonらしい部分だと思いますので加筆しようと思いますが,分かりやすい解説をうまく書けるかどうか,ちょっと時間をかけて考えてみます.
--------------
【補足】(2017/08/14)
テキスト本体にconcurrent.futuresモジュールの基本的な使用方法を加筆.
サンプルプログラムを掲載して,マルチスレッドとマルチプロセスの間で実行時間の違いを調べる方法を例示しました.
CPUやコアの数が多い計算機環境でそのメリットが分かります.
--------------
【補足】(2017/08/13)
subprocessモジュールに関してテキスト本体に加筆.外部プロセスの終了に同期する方法(waitメッソド)の説明を追加.
--------------
【補足】(2017/08/12)
テキスト本体に若干の加筆.コマンド引数の取得方法の説明が抜けていました.
あと,pathlibも便利そうなので基本的な使用方法の解説を入れました.
他大学の先生から並列処理に関してご指摘いただきました.threadingモジュールではCPUコアの多いマシンの性能が活かせないとのこと.これは私の無知でした.
concurrent.futuresモジュールが良いとのことですので,色々と試行してからそのうちテキスト本体に加筆しようと思います.
--------------
【補足】(2017/08/11)
Kivyに関してテキスト本体に加筆.一度登録したウィジェットを後から削除する方法の説明を追加.
アプリ作りについて具体的に試行錯誤する学生が出はじめました.
凝ったGUIの構築方法を模索するにつれ,今後Kivyの加筆が続く予感がします.
--------------
【補足】(2017/08/09)
Kivyに関してテキスト本体に加筆.(スクロールビュー/ScrollViewの使用方法)
「サイズの大きなウィジェットをスクロール表示したい」という学生からの相談を受けて加筆しました.確かに重要な機能です.
--------------
【補足】(2017/08/05)
テキスト本体に,例外処理に関する加筆.
私の主観かもしれませんが,Pythonを学ぶと「自分にもアプリが作れる」という意識を持つ学生が増えるような気がしています.
一斉の授業ではJavaを使ってプログラミング系の教育をしていますが,ゼミでPythonやった場合の方が手応えがあるような感じがあります.
(現実的な教育成果が見られるのはまだ先ですが…)
--------------
【補足】(2017/08/02)
モジュールブックのSymPyの解説に加筆.
テキスト本体の例外処理の解説部分に若干の加筆.あと体裁修正と索引の追加.
--------------
【補足】(2017/07/31)
添字の使い方に関する加筆.まだまだ基礎事項の加筆が止まりませんね.
--------------
【補足】(2017/07/30)
近い将来ビッグデータを取り扱うことに備えて,ファイルのランダムアクセスの方法について加筆しました.といってもファイルのシークの方法程度です.
テキスト本体
--------------
【補足】(2017/07/29)
家のPCでもPythonやりたいという学生が出てきました.大変良いことです.それでインストール方法に関する相談を受けるようになってきました.
ただ,Kivy に関する最新情報は本家の英語のサイトでないと見れません…
それで,テキスト本体に,Pythonのインストール方法とPIPコマンドの使い方,それにKivyのインストール方法を加筆しました.
テキスト本体
http://www.lfd.uci.edu/~gohlke/pythonlibs/ に,コンパイル済みのwheelバッケージ(Windows用)がありますね.PIPでネットからの直接インストールが失敗する場合などに重宝します.「非公式」とありますので自己責任で…
@dario_okazakiさんによる「Kivyドキュメントサイトの日本語翻訳」が一応出来上がったとのことです.
Kivyドキュメントサイト
大変ありがたいです.学生にも薦めます.
--------------
【補足-2】(2017/07/25)
テキスト中の恥ずかしい間違いを見つけた学生は,鬼の首を取ったように喜びますね.
今のところクレーマーに噛みつかれたりしてはいませんが,ほころびへの対応をぼちぼちと…
あと,学生からではなく他大学の先生からのリクエストで「pandasの使い方まとめて欲しい」というのがあります.
成績の処理が終わって,夏休みに入ったらpandas触ってみようかと思います.(執筆はいつになるかわかりませんので念のため)
--------------
【補足】(2017/07/25)
モジュールブックに pygame の導入的解説を入れました.
モジュールブック
モジュールの名前からしますと「ゲーム開発ライブラリ」という印象ですが,その実態は SDL をちょっとラップして使いやすくしたという感じですね.
特にゲーム開発に有利な機能が提供されているわけでもありません.(そのあたりはゲーム開発専用プラットフォームには全くかないません)
「とにかく簡単に使えて,軽快に動作するウィンドウ描画ライブラリが欲しい」という場合に適しています.「立派なGUIライブラリは不要!」という人にも良いと思います.
気になるのは,PygletやPySDLと今後どのような関係になるかです.
PygletやPySDL2がpygameに取って代わるような雰囲気もありますが,pygameの活気が衰えるかどうかもよくわかりません…
それぞれの住み分けになるかもしれませんが,今後各モジュールには注目すべきですね.
pygameの特徴は「とにかく簡単で高速」という点ですが,線の描画に関しては不満が残ると思います(笑) 使ってみるとわかります…
ベタ塗りの描画に関しては今のところ特に不満はありません.
Kivyは私も大好きでして今後注目なんですが,実験的な描画をPythonで迅速にやるにはpygameが圧倒的に有利だと思います.もちろんゲーム開発にも向いていると思います.(念のため)
Kivyは「ちゃんとしたアプリ」を作る場合にお薦めしています.
--------------
【補足】(2017/07/23)
ウィンドウ描画とキーボード&マウスのハンドリングを高速に実行する必要が出てきたため,Pygameの使用方法についてまとめはじめました.
近々,モジュールブックに加筆しようと思います.
--------------
【補足】(2017/07/17)
テキスト本体に加筆.辞書型オブジェクトの解説部分に,辞書にキーが存在するかどうかを検査する方法を追記しました.あと,データ型の変換についても追記.
意外なくらい初歩的な事柄の解説が抜けていると実感.やっぱり実際にテキストを使い始めるとほころびが次々と見つかりますね.
テキスト本体
--------------
【補足】(2017/07/16)
モジュールブックにhashlibの導入解説を入れました.
モジュールブック
(暗号学的ハッシュ生成モジュール)
パスワード文字列の秘匿化や,文書のデジタル署名作成に必要です.
--------------
【補足】(2017/07/15)
テキスト本体の「forを使ったリストの生成」の部分の加筆,それに文字と文字コード相互の変換について加筆しました.
テキスト本体
学生に使わせはじめると,次々と加筆箇所が出てきます.
--------------
【補足】(2017/07/11)
各テキストに「免責事項」加筆しました.
--------------
【補足】(2017/07/10)
テキスト本体をほんの少し加筆しました.(サブプロセスの部分)
あと,文字列の連結方法の解説を追加しました.(重要な方法なのに解説を逃していました)
テキスト本体
--------------
【補足】(2017/07/08)
テキスト本体の索引がお粗末だったので少しテコ入れしました.
テキスト本体
--------------
【補足】(2017/07/02)
「pandasモジュールの解説はしないのか?」と質問(リクエスト?)をいただきました.
ちょっと待ってくださいね.私も体が1つしかないもので… ただ,気にはしていましたので夏休みくらいには着手するかもしれません.実際に私のゼミ活動でも必要になるでしょうから…(いつになるか確約なしですが)
pandas は統計解析に便利そうですね.
--------------
【補足】(2017/06/27)
モジュールブックに numpy, matplotlib の記述をはじめました.
モジュールブック
これからはゼミの活動に伴って,モジュールブックの加筆が増えそうです.
--------------
【補足】(2017/06/25)
subprocess モジュールを使用して外部のプログラムを起動する方法について加筆しました.
テキスト本体
複数の外部プログラムを起動して,それらと非同期にパイプI/Oする方法についても解説しています.
asyncio モジュールに関しては「初心者」「入門」の域を超えそうなので,このテキストとは別の形で解説コンテンツにしようと考えています.(若干方針変更)
あとは,numpy, matplotlib モジュールの入門解説をモジュールブックに載せると,しばらくゼミの教材として使えそうな感じです.
あと,乱数生成の方法を加筆しました.(ゲーム作成には欠かせません)
--------------
【補足】(2017/06/18)
Pythonで高速に数値演算するには numpy が定番ですね.ただ研究課題のあらゆる局面で numpy が万能というわけでもなく,任意に立てた微分方程式の数値解を得るにはやっぱり個別にシミュレーションプログラム書くことになります.
numpy に関しては,その内モジュールブックに入門解説を記述しようと思いますが,うちのゼミのテーマに早く対応しないといけないので,しばらくはC言語でシミュレーションコード書くことにします.
ということで,Cで書いたプログラム(実行可能ファイル)をPythonから呼び出して,スピードを要する部分だけCに投げるという方策を取ります.
といいますか,多くのモジュールがそんな風に外部プログラム呼び出しているようですね.
というわけで,subprocess, asyncio モジュールの使い方を早急にまとめてテキスト本体に組み込むつもりです.
--------------
【補足】(2017/06/10)
KivyのKV言語,初心者向けに情報整理しないといけないですね.
学生の学び方と,相談の仕方を見ていて思いました.
次のテーマですね.ちょっと時間いただいて,またテキスト修正・追加します…
--------------
【補足-2】(2017/06/08)
Kivyのテキスト入力がWindows/Macの日本語入力メソッドに対応していないと学生から「落胆の声」が出ました.でも,まだこれからです.
入力中の表示が崩れたりしますが,一応はなんとか日本語入力できますね…
Kivyはまさに発展途上.「最も将来性が高くて,これから注目のUIですよ!」と学生を説得しています.個人的な期待も込めていますが,しばらくKivyと付き合って行きます.
その内,アップデートで大幅に改善されることは間違いないと思います.
--------------
【補足】(2017/06/08)
Kivyドキュメントサイトの日本語翻訳が進んでいるようです.
Kivyドキュメントサイト
ありがたいことです.
詳細なリファレンスが必要なときに役立ちます.
--------------
【補足】(2017/06/06)
モジュールブックにSymPyの導入解説を入れました.
モジュールブック
(数式処理モジュール)
MathematicaやMaximaみたいなことが可能になります.
「何でSymPy?」と思われるかもしれませんが,うちのゼミのテーマで「使いやすい数式処理システムのユーザインターフェースの提案」みたいなことをやってまして,そういう事情です.
SymPyはすごいパッケージでして,グラフィカルな機能を除けば商用システムと張り合うレベルですね(おそらく)
マニュアルもPDFで1,700ページ以上ありますし…
数式電卓として使うにはフリーのMaximaか,お金がある人はMathematicaが良いと思います.手軽に3次元プロットまでできますし.(無理してSymPyを素のまま数式電卓にするのは,私個人としてはあまりおすすめではありません.面倒くさいと思いますよ…)
SymPyは数式処理機能を組み込んだアプリ(教育系ソフトとか,思考サポートアプリとか)を開発する場合に威力を発揮すると思います.
--------------
【補足】(2017/06/03)
Kivyについて:ActionBar(Kivy流のメニュー), ScreenManager, Carousel, TabbedPanel の基本的な使い方の解説を追加しました.(学生からの要望に応えました)
あと,Kivyで時間イベント(タイマー)のハンドリングをするのに必要なClockモジュールについても基礎解説を追加しました.
GUIアプリで,タイミングで起動する処理の繰り返しに for や while を使おうとする学生がいました.そうではなくて,タイマーを仕掛けるのです.
これで,一通りアプリ作りの指導ができるかと…
そろそろ,ほころびが気になりますが,時間をかけてつぶしていきます.
テキスト本体
まずいところありましたら,ご連絡いただけますと助かります.すぐに修正・アップロードさせていただきます.
--------------
【補足-2】(2017/06/03)
Kivyでアプリ作る際,KV言語を使うと,ちょっと初心者にはデバッグがしんどい感じですね…
Pythonプログラムで間違いやるとエラーメッセージが分かりやすいですが,KVの中で起こした間違いの検出がなかなかやりにくいですね…
要するに,「KV言語の何行目に○○○なエラーがある」というメッセージが出ないわけです.
熟達者にとっては開発効率の面でKV言語はありがたいでしょうが,初心者にとってKV言語は勉強の能率を落としてしまう可能性が大きいですね…
Kivyは慣れるまでは,普通にPythonでAPI書き並べた方が良いと思いますが,みなさんはどのように思われますでしょうか…
--------------
【補足】(2017/05/30)
Kivyのフレームバッファ(FBO)の扱いについてご相談いただきましたので,解説を追加しました.
普通のCanvas描画ではピクセル値を取り出すのが困難なようです.それでFBOを使用することになるわけです.
テキスト本体
--------------
【補足】(2017/05/29)
モジュールブックにPillowの導入解説を入れました.
モジュールブック
(画像処理モジュール)
Photoshpみたいなことが可能になります.
--------------
【補足】(2017/05/24)
公開日は7月にしていますが,早速「サウンドの使い方を教えてほしい」との声が来ていまして,内容追加しました.(wave, PyAudio)
その他にも学生からの相談を受けて,若干の追加や修正もしています.
「モジュールブック」作りはじめました.OpenCVモジュールの入門みたいな部分だけ書きました.(画像認識モジュール)
モジュールブック
モジュールに関しては公開されているものの種類が多すぎるので,私のゼミで使用方法を発掘したものを中心に書いてゆくことになると思います.
Udemy関連
人文科学系(文系)学部出身の方(あるいは在籍中の方)が独学でプログラミングを学ぶのはかなり大変です.
無料公開しておりますPythonのテキストは,既に別の言語に通じた方が短時間でPythonを学ぶことを想定しています.
はじめてプログラミングを学ぶ場合は,具体的にどのような作業を行うのかについての詳細なガイドが必要になります.
実際に学校でPython言語に関する教育を受けておられる方や,Pythonに詳しい仲間をある程度の人数でお持ち方は,学びにおけるきめ細かいポイントが自然に了解できるのですが,そのような環境下にない方は学びにおいてかなり不利なものがあると考えています.
私も実際にプログラミングを教えていまして,これに関して強く実感しています.C++やJava,JavaScriptをある程度習得した方はPythonのテキストのみで自力で学んで行けるのですが,そうでない方はテキストのみでは早々に立ち往生してしまいます.そのような方に対しては,実際にPCを前にして操作のレベルで噛み砕いた説明をしてあげないといけません.
昨今はPythonに関する優良なる教材(書籍,インターネットサイトなど)が有料・無料のものを含めて多く販売・公開されており,情報源を得ること自体に苦慮することは少なくなってきていると思います.ただ,先に述べましたような「操作上のきめ細かいポイント」を文字媒体から得ることは難しいと考えておりまして,これに関しては当面はビデオ教材で対応してゆくことを考えております.
今の所,Udemyでビデオコースを2つ配信しておりまして,ここに紹介させていただきます.
1つは,ここで配布していますテキスト「Python3入門」を更にコンパクトに要約した内容になっています.
テキスト「Python3入門」やその他の書籍,インターネットサイトの情報のみでPythonを学んで行ける方にとっては全く必要のないビデオコースですので,どうかそのようにご理解くださいませ.
このビデオ教材は,Pythonの自学自習に挫折を体験された方や,Pythonではじめてプログラミングを学ぶ方に向けて作成しました.(合計11時間)
2つ目は,ここで配布しています冊子「Python3ライブラリブック」の内容の内,NumPyやmatplotlib,OpenCVに関する部分を更に要約した内容になっています.特に,データサイエンスや機械学習あるいは人工知能のプログラミングを学ぶ前に必要となる前提知識に関するものです.
>>> Udemy「Python3によるデータ処理・機械学習のための基礎」
冊子「Python3ライブラリブック」やその他の書籍,インターネットサイトの情報のみで学んで行ける方には,このビデオ教材も全く必要ありませんが,NumPyやmatplotlib,OpenCVの使い方を自力で学習するのが苦手である方にお勧めしています.(合計24時間)
目次
【テキスト本体の目次】
1 はじめに --- 1
1.1 Pythonでできること --- 1
1.2 本書の内容 --- 1
1.3 本書の読み方 --- 1
1.4 処理系の導入(インストール)と起動の方法 --- 2
1.4.1 Python処理系のディストリビューション(配布形態) --- 2
1.4.2 Python処理系の起動 --- 2
1.4.3 対話モード --- 3
1.4.3.1 ヒストリ --- 3
1.4.3.2 直前の値 --- 3
1.5 本書で取り扱うGUIライブラリ --- 4
1.6 表記に関する注意事項 --- 4
1.7 Pythonに関する詳しい情報 --- 4
2 Pythonの基礎 --- 5
2.1 スクリプトの実行 --- 5
2.1.1 プログラム中に記述するコメント --- 6
2.1.2 プログラムのインデント --- 7
2.2 文を分割して/連結して記述する方法 --- 7
2.3 変数とデータの型 --- 8
2.3.1 日本語の変数名の使用 --- 9
2.3.2 変数名に関する注意 --- 9
2.3.3 イコール「=」の連鎖(Multiple Assignment) --- 10
2.3.4 変数の解放(廃棄) --- 10
2.3.5 変数が値を保持する仕組みの概観 --- 10
2.3.5.1 識別値に関する注意事項 --- 12
2.3.6 数値 --- 12
2.3.6.1 整数: int型 --- 12
2.3.6.2 巨大な整数値を扱う際の注意 --- 13
2.3.6.3 浮動小数点数: float型 --- 14
2.3.6.4 アンダースコア「_」を含む数値リテラルの記述 --- 15
2.3.6.5 基数の指定: 2進数,8進数,16進数 --- 15
2.3.6.6 複素数: complex型 --- 15
2.3.6.7 最大値,最小値 --- 16
2.3.6.8 浮動小数点数の誤差と丸め --- 17
2.3.6.9 数学関数 --- 17
2.3.6.10 特殊な値:inf, nan --- 19
2.3.6.11 多倍長精度の浮動小数点数の扱い --- 21
2.3.6.12 分数の扱い --- 24
2.3.6.13 乱数の生成 --- 26
2.3.7 文字列 --- 29
2.3.7.1 エスケープシーケンス --- 29
2.3.7.2 raw文字列(raw string) --- 30
2.3.7.3 複数行に渡る文字列 --- 30
2.3.7.4 文字列の長さ(文字数) --- 31
2.3.7.5 文字列リテラルの連接 --- 31
2.3.7.6 文字列の分解と合成 --- 31
2.3.7.7 文字列の置換 --- 33
2.3.7.8 文字の置換 --- 33
2.3.7.9 英字,数字の判定 --- 34
2.3.7.10 大文字/小文字の変換と判定 --- 34
2.3.7.11 文字列の含有検査 --- 34
2.3.7.12 文字列の検索 --- 35
2.3.7.13 両端の文字の除去 --- 37
2.3.7.14 文字コード,文字の種別に関すること --- 37
2.3.8 真理値(bool型) --- 39
2.3.9 ヌルオブジェクト: None --- 40
2.3.10 型の変換 --- 40
2.3.10.1 各種の値の文字列への変換(str,repr) --- 40
2.3.11 型の検査 --- 41
2.3.11.1 floatの値が整数値かどうかを検査する方法 --- 42
2.3.12 基数の変換 --- 42
2.3.12.1 n進数→10進数 --- 42
2.3.12.2 10進数→n進数 --- 43
2.3.13 ビット演算 --- 43
2.3.13.1 ビット演算の累算代入 --- 44
2.3.13.2 整数値のビット長を求める方法 --- 44
2.3.14 バイト列 --- 45
2.4 データ構造 --- 46
2.4.1 リスト --- 46
2.4.1.1 空リスト --- 46
2.4.1.2 リストの要素へのアクセス --- 46
2.4.1.3 リストの編集 --- 47
2.4.1.4 リストによるスタック,キューの実現: popメソッド --- 49
2.4.1.5 リストに対する検査 --- 50
2.4.1.6 例外処理 --- 51
2.4.1.7 要素の個数のカウント --- 51
2.4.1.8 要素の合計: sum関数 --- 52
2.4.1.9 要素の整列 (1): sortメソッド --- 53
2.4.1.10 要素の整列 (2): sorted関数 --- 53
2.4.1.11 要素の順序の反転 --- 54
2.4.1.12 リストの複製 --- 54
2.4.1.13 リストか否かの判定 --- 56
2.4.1.14 リストの内部に他のリストを展開する方法 --- 56
2.4.2 タプル --- 56
2.4.2.1 リストとタプルの違い --- 56
2.4.2.2 括弧の表記が省略できるケース --- 57
2.4.2.3 特殊なタプル --- 57
2.4.2.4 タプルの要素を整列(ソート)する方法 --- 57
2.4.2.5 タプルか否かの判定 --- 58
2.4.3 セット --- 58
2.4.3.1 セットの要素となるオブジェクト --- 58
2.4.3.2 セットの生成 --- 59
2.4.3.3 セットに対する各種の操作 --- 59
2.4.3.4 集合論の操作 --- 61
2.4.3.5 セットか否かの判定 --- 62
2.4.3.6 frozenset --- 62
2.4.4 辞書型 --- 62
2.4.4.1 空の辞書の作成 --- 63
2.4.4.2 エントリの削除 --- 63
2.4.4.3 getメソッドによる辞書へのアクセス --- 63
2.4.4.4 辞書に対するpop --- 64
2.4.4.5 辞書の更新 --- 64
2.4.4.6 辞書の結合 --- 65
2.4.4.7 辞書を他の辞書の内部に展開する方法 --- 65
2.4.4.8 キーや値の列を取り出す方法 --- 66
2.4.4.9 エントリの数を調べる方法 --- 66
2.4.4.10 リストやタプルから辞書を生成する方法 --- 66
2.4.4.11 辞書の全エントリを列として取り出す方法 --- 67
2.4.4.12 辞書の複製 --- 67
2.4.4.13 エントリの順序 --- 67
2.4.4.14 辞書の整列 --- 68
2.4.4.15 辞書の同値性 --- 68
2.4.4.16 辞書か否かの判定 --- 68
2.4.5 添字(スライス)の高度な応用 --- 69
2.4.5.1 添字の値の省略 --- 69
2.4.5.2 スライスオブジェクト --- 69
2.4.5.3 逆順の要素指定 --- 70
2.4.5.4 不連続な部分の取り出し --- 70
2.4.6 データ構造の変換 --- 70
2.4.7 データ構造の要素を他のデータ構造の中に展開する方法 --- 71
2.4.8 データ構造に沿った値の割当て(分割代入) --- 72
2.4.8.1 応用例: 変数の値の交換 --- 73
2.4.8.2 データ構造の選択的な部分抽出 --- 73
2.4.9 データ構造のシャッフル,ランダムサンプリング --- 73
2.4.10 データ構造へのアクセスの速度について --- 74
2.5 制御構造 --- 75
2.5.1 繰り返し(1): for --- 75
2.5.1.1 イテラブルなオブジェクト --- 75
2.5.1.2 「スイート」の概念 --- 75
2.5.1.3 スイートが1行の場合の書き方 --- 76
2.5.1.4 range関数,rangeオブジェクト --- 76
2.5.1.5 辞書のfor文への応用 --- 77
2.5.1.6 for文におけるelse --- 77
2.5.1.7 forを使ったデータ構造の生成(要素の内包表記) --- 78
2.5.1.8 イテレータ --- 78
2.5.1.9 分割代入を用いたfor文 --- 80
2.5.1.10 zip関数とzipオブジェクト --- 80
2.5.1.11 enumerateによるインデックス情報の付与 --- 82
2.5.2 繰り返し(2): while --- 83
2.5.3 繰り返しの中断とスキップ --- 83
2.5.4 条件分岐 --- 84
2.5.4.1 条件式 --- 84
2.5.4.2 比較演算子の連鎖 --- 85
2.5.4.3 各種の「空」値に関する条件判定 --- 86
2.5.4.4 is演算子による比較 --- 87
2.5.4.5 値の型の判定 --- 88
2.6 入出力 --- 89
2.6.1 標準出力 --- 89
2.6.1.1 出力データの書式設定 --- 89
2.6.1.2 sysモジュールによる標準出力の扱い --- 92
2.6.2 標準入力 --- 93
2.6.2.1 input関数による入力の取得 --- 93
2.6.2.2 sysモジュールによる標準入力の扱い --- 94
2.6.3 ファイルからの入力 --- 94
2.6.3.1 ファイル,ディレクトリのパスについて --- 95
2.6.3.2 扱うファイルのエンコーディング,改行コードの指定 --- 96
2.6.3.3 テキストファイルとバイナリファイルについて --- 98
2.6.3.4 バイト列の扱い --- 98
2.6.3.5 バイト列のコード体系を調べる方法 --- 100
2.6.3.6 指定したバイト数だけ読み込む方法 --- 100
2.6.3.7 ファイルの内容を一度で読み込む方法 --- 100
2.6.3.8 ファイルをイテラブルとして読み込む方法 --- 101
2.6.3.9 readlinesメソッドによるテキストファイルの読み込み --- 101
2.6.3.10 データを読み込む際のファイル中の位置について --- 102
2.6.4 ファイルへの出力 --- 102
2.6.4.1 print関数によるファイルへの出力 --- 102
2.6.4.2 writelinesメソッドによる出力 --- 103
2.6.4.3 出力バッファの書き出し --- 103
2.6.5 標準エラー出力 --- 103
2.6.6 標準入出力でバイナリデータを扱う方法 --- 105
2.6.7 パス(ファイル,ディレクトリ)の扱い:その1 - osモジュール --- 105
2.6.7.1 カレントディレクトリに関する操作 --- 105
2.6.7.2 ホームディレクトリの取得 --- 106
2.6.7.3 ディレクトリ内容の一覧(1) --- 106
2.6.7.4 ディレクトリ内容の一覧(2) --- 106
2.6.7.5 ファイルのサイズの取得 --- 107
2.6.7.6 ファイル,ディレクトリの検査 --- 107
2.6.7.7 ファイル,ディレクトリの削除 --- 107
2.6.7.8 実行中のスクリプトに関する情報 --- 107
2.6.7.9 パスの表現に関すること --- 108
2.6.8 パス(ファイル,ディレクトリ)の扱い:その2 - pathlibモジュール --- 109
2.6.8.1 パスオブジェクトの生成 --- 109
2.6.8.2 カレントディレクトリ,ホームディレクトリの取得 --- 109
2.6.8.3 パスの存在の検査 --- 110
2.6.8.4 ファイル,ディレクトリの検査 --- 110
2.6.8.5 ディレクトリの要素を取得する --- 110
2.6.8.6 ディレクトリ名,ファイル名,拡張子の取り出し --- 110
2.6.8.7 パスの連結 --- 111
2.6.8.8 ファイルシステム毎のパスの表現 --- 111
2.6.8.9 URIへの変換 --- 111
2.6.8.10 ファイルのオープン --- 111
2.6.8.11 ファイル入出力 --- 111
2.6.8.12 ディレクトリの作成 --- 112
2.6.8.13 ファイル,ディレクトリの削除 --- 112
2.6.9 コマンド引数の取得 --- 113
2.6.10 入出力処理の際に注意すること --- 113
2.6.11 CSVファイルの取り扱い: csvモジュール --- 113
2.6.11.1 CSVファイルの出力 --- 114
2.6.11.2 CSVファイルの入力 --- 117
2.7 関数の定義 --- 122
2.7.1 引数について --- 122
2.7.1.1 引数に暗黙値を設定する方法 --- 123
2.7.1.2 仮引数のシンボルを明に指定する関数呼び出し(キーワード引数) --- 123
2.7.1.3 引数の個数が不定の関数 --- 123
2.7.1.4 実引数に`*’を記述する方法 --- 124
2.7.1.5 キーワード引数を辞書として受け取る方法 --- 124
2.7.1.6 実引数に`**’を記述する方法 --- 125
2.7.1.7 引数に与えたオブジェクトに対する変更の影響 --- 125
2.7.1.8 引数に関するその他の事柄 --- 127
2.7.2 変数のスコープ(関数定義の内外での変数の扱いの違い) --- 128
2.7.3 関数の再帰的定義 --- 129
2.7.3.1 再帰的呼び出しの回数の上限 --- 129
2.7.3.2 再帰的呼び出しを応用する際の注意 --- 131
2.7.4 内部関数 --- 131
2.7.4.1 内部関数におけるローカル変数 --- 132
2.7.4.2 内部関数はいつ作成されるのか --- 133
2.7.4.3 内部関数の応用:クロージャ,エンクロージャ --- 133
2.7.5 定義した関数の削除 --- 135
2.8 オブジェクト指向プログラミング --- 136
2.8.1 クラスの定義 --- 136
2.8.1.1 コンストラクタとファイナライザ --- 136
2.8.1.2 インスタンス変数 --- 138
2.8.1.3 メソッドの定義 --- 138
2.8.1.4 クラス変数 --- 139
2.8.2 クラス,インスタンス間での属性の関係 --- 141
2.8.3 setattr,getattr による属性へのアクセス --- 142
2.8.4 組み込みの演算子や関数との連携 --- 143
2.8.4.1 各種クラスのコンストラクタに対するフック --- 144
2.8.4.2 算術演算子,比較演算子,各種関数に対するフック --- 145
2.8.4.3 累算代入演算子に対するフック --- 147
2.8.5 コンテナのクラスを実装する方法 --- 147
2.8.6 イテレータのクラスを実装する方法 --- 148
2.8.7 カプセル化 --- 149
2.8.7.1 変数の隠蔽 --- 149
2.8.7.2 アクセサ(ゲッタ,セッタ) --- 150
2.8.8 オブジェクト指向プログラミングに関するその他の事柄 --- 152
2.8.8.1 クラス変数,インスタンス変数の調査 --- 152
2.8.8.2 クラスの継承関係の調査 --- 152
2.8.8.3 インスタンスのクラスの調査 --- 153
2.8.8.4 属性の調査(プロパティの調査) --- 153
2.8.8.5 多重継承におけるメソッドの優先順位 --- 153
2.8.8.6 静的メソッド(スタティックメソッド) --- 155
2.9 データ構造に則したプログラミング --- 156
2.9.1 map関数 --- 156
2.9.1.1 複数の引数を取る関数のmap --- 158
2.9.1.2 map関数にzipオブジェクトを与える方法 --- 158
2.9.2 lambdaと関数定義 --- 159
2.9.3 filter --- 160
2.9.4 3項演算子としての if~else… --- 161
2.9.5 all, anyによる一括判定 --- 161
2.9.6 高階関数モジュール:functools --- 163
2.9.6.1 reduce --- 163
2.10 代入式 --- 164
2.11 構造的パターンマッチング --- 165
2.11.1 構造的なパターン --- 166
2.11.2 条件付きのパターンマッチング --- 167
2.11.3 クラスのインスタンスに対するパターンマッチング --- 167
3 KivyによるGUIアプリケーションの構築 --- 169
3.1 Kivyの基本 --- 169
3.1.1 アプリケーションプログラムの実装 --- 169
3.1.2 GUI構築の考え方 --- 169
3.1.2.1 Widget(ウィジェット) --- 170
3.1.2.2 Layout(レイアウト) --- 170
3.1.2.3 Screen(スクリーン) --- 172
3.1.3 ウィンドウの扱い --- 173
3.1.4 マルチタッチの無効化 --- 173
3.2 基本的なGUIアプリケーション構築の方法 --- 174
3.2.1 イベント処理(導入編) --- 174
3.2.1.1 イベントハンドリング --- 174
3.2.2 アプリケーション構築の例 --- 175
3.2.3 イベント処理(コールバックの登録による方法) --- 178
3.2.4 ウィジェットの登録と削除 --- 179
3.2.5 アプリケーションの開始と終了のハンドリング --- 180
3.3 各種ウィジェットの使い方 --- 180
3.3.1 ラベル:Label --- 181
3.3.1.1 リソースへのフォントの登録 --- 182
3.3.2 ボタン:Button --- 183
3.3.3 テキスト入力:TextInput --- 183
3.3.4 チェックボックス:CheckBox --- 184
3.3.5 進捗バー:ProgressBar --- 184
3.3.6 スライダ:Slider --- 184
3.3.7 スイッチ:Switch --- 184
3.3.8 トグルボタン:ToggleButton --- 185
3.3.9 画像:Image --- 185
3.3.9.1 サンプルプログラム --- 185
3.4 Canvasグラフィックス --- 186
3.4.1 Graphicsクラス --- 187
3.4.1.1 Color --- 187
3.4.1.2 Line --- 187
3.4.1.3 Rectangle --- 187
3.4.1.4 Ellipse --- 188
3.4.2 サンプルプログラム --- 188
3.4.2.1 正弦関数のプロット --- 188
3.4.2.2 各種図形,画像の表示 --- 188
3.4.3 フレームバッファへの描画 --- 190
3.4.3.1 ピクセル値の取り出し --- 191
3.4.3.2 イベントから得られる座標位置 --- 191
3.5 スクロールビュー(ScrollView) --- 192
3.5.1 ウィジェットのサイズ設定 --- 193
3.5.2 マウスのドラッグによるスクロール --- 193
3.6 ウィンドウサイズを固定(リサイズを禁止)する設定 --- 193
3.7 Kivy言語によるUIの構築 --- 193
3.7.1 Kivy言語の基礎 --- 194
3.7.1.1 サンプルプログラムを用いた説明 --- 194
3.7.1.2 PythonプログラムとKvファイルの対応 --- 196
3.8 時間によるイベント --- 197
3.8.1 時間イベントのスケジュール --- 197
3.9 GUI構築の形式 --- 197
3.9.1 スクリーンの扱い: ScreenとScreenManager --- 197
3.9.1.1 ScreenManager --- 197
3.9.1.2 Screen --- 198
3.9.2 アクションバー: ActionBar --- 199
3.9.3 タブパネル: TabbedPanel --- 201
3.9.4 スワイプ: Carousel --- 202
4 実用的なアプリケーション開発に必要な事柄 --- 204
4.1 日付と時間に関する処理 --- 204
4.1.1 日付と時刻の取り扱い: datetime モジュール --- 204
4.1.1.1 datetimeオブジェクトの分解と合成 --- 204
4.1.1.2 文字列をdatetimeオブジェクトに変換する方法 --- 205
4.1.1.3 datetimeオブジェクトの差: timedelta --- 205
4.1.1.4 日付,時刻の書式整形 --- 206
4.1.1.5 datetimeのプロパティ --- 206
4.1.1.6 タイムゾーンについて --- 207
4.1.2 timeモジュール --- 210
4.1.2.1 基本的な機能 --- 210
4.1.2.2 日付,時刻を表す文字列表現 --- 211
4.1.2.3 応用例:datetimeオブジェクトとの間の変換 --- 212
4.1.2.4 時間の計測 --- 213
4.1.2.5 プログラムの実行待ち --- 215
4.1.3 timeitモジュール --- 216
4.2 ロケール(locale) --- 217
4.2.1 ロケール設定の確認 --- 217
4.2.2 使用できるロケールの調査 --- 218
4.2.3 その他 --- 219
4.2.3.1 現在のエンコーディングの調査 --- 219
4.2.3.2 通貨の書式整形 --- 219
4.3 文字列検索と正規表現 --- 220
4.3.1 パターンの検索 --- 220
4.3.1.1 正規表現を用いた検索 --- 222
4.3.1.2 検索パターンの和結合 --- 224
4.3.1.3 正規表現を用いたパターンマッチ --- 224
4.3.1.4 行頭や行末でのパターンマッチ --- 225
4.3.2 置換処理: re.sub --- 226
4.3.2.1 複数行に渡る置換処理 --- 226
4.3.2.2 パターンマッチのグループを参照した置換処理 --- 227
4.3.3 文字列の分解への応用: re.split --- 227
4.4 マルチスレッドとマルチプロセス --- 228
4.4.1 マルチスレッド --- 228
4.4.1.1 スレッドの実行状態の確認 --- 229
4.4.1.2 実行中のスレッドのリストを取得する方法 --- 230
4.4.1.3 スレッド間の排他制御 --- 230
4.4.2 マルチプロセス --- 233
4.4.2.1 プロセスごとに実行されるモジュール --- 234
4.4.2.2 プロセスの実行状態の確認 --- 234
4.4.2.3 実行中プロセスのリストを取得する方法 --- 235
4.4.2.4 共有メモリと排他制御 --- 235
4.4.3 concurrent.futures --- 242
4.4.3.1 ProcessPoolExecutor --- 242
4.4.3.2 プロセスの実行状態と戻り値 --- 242
4.4.3.3 同時に実行されるプロセスの個数について --- 244
4.4.3.4 プロセス終了の同期 --- 244
4.4.4 マルチスレッドとマルチプロセスの実行時間の比較 --- 245
4.5 非同期処理: asyncio --- 247
4.5.1 コルーチン --- 247
4.5.2 コルーチンとタスクの違い --- 248
4.5.2.1 複数のタスクの並行実行 --- 248
4.5.3 await によるタスクの一時停止と切替え --- 248
4.5.4 タスク登録の簡便な方法 --- 249
4.5.5 イベントループとrun関数 --- 250
4.5.5.1 スレッド毎に実行されるイベントループ --- 250
4.5.5.2 実行中のイベントループを調べる方法 --- 251
4.5.6 理解を深めるためのサンプル --- 251
4.5.6.1 非同期処理とイベントループの概観 --- 252
4.5.7 スレッドを非同期処理で管理する方法 --- 253
4.5.8 非同期のコンソール入力を実現するためのライブラリ:aioconsole --- 255
4.5.9 永続するイベントループ上でのタスク管理 --- 256
4.5.9.1 永続するイベントループ --- 256
4.5.9.2 タスクの一覧取得とタスクのキャンセル --- 257
4.5.10 非同期のイテレーション --- 259
4.5.10.1 非同期のイテラブル --- 259
4.5.11 非同期のファイル入出力:aiofiles --- 260
4.5.11.1 サンプルプログラム --- 261
4.6 処理のスケジューリング --- 263
4.6.1 sched モジュール --- 263
4.6.1.1 基本的な使用方法 --- 263
4.6.1.2 イベントを独立したスレッドで実行する方法 --- 264
4.6.1.3 イベントの管理 --- 266
4.6.2 schedule モジュール --- 266
4.6.2.1 一定の時間間隔で処理を起動する方法 --- 267
4.6.2.2 指定した時刻に処理を起動する方法 --- 268
4.7 ジェネレータ --- 269
4.7.1 ジェネレータ関数 --- 269
4.7.2 ジェネレータ式 --- 270
4.7.3 ジェネレータの入れ子 --- 270
4.8 モジュール,パッケージの作成による分割プログラミング --- 271
4.8.1 モジュール --- 271
4.8.1.1 単体のソースファイルとしてのモジュール --- 271
4.8.2 パッケージ(ディレクトリとして構成するライブラリ) --- 272
4.8.2.1 モジュールの実行 --- 273
4.8.3 モジュールが配置されているディレクトリの調査 --- 273
4.8.4 __init__.pyについて --- 274
4.9 ファイル内でのランダムアクセス --- 276
4.9.1 ファイルのアクセス位置の指定(ファイルのシーク) --- 276
4.9.2 サンプルプログラム --- 276
4.10 オブジェクトの保存と読込み: pickleモジュール --- 278
4.11 バイナリデータの作成と展開: structモジュール --- 280
4.11.1 バイナリデータの作成 --- 280
4.11.2 バイナリデータの展開 --- 281
4.11.3 バイトオーダーについて --- 281
4.12 バイナリデータをテキストに変換する方法: base64モジュール --- 283
4.12.1 バイト列→Base64データ --- 283
4.12.2 Base64データ→バイト列 --- 283
4.12.3 サンプルプログラム --- 283
4.13 編集可能なバイト列:bytearray --- 284
4.13.1 bytearrayの作成方法 --- 284
4.13.2 他の型への変換 --- 285
4.13.3 ファイルへの出力 --- 285
4.14 execとeval --- 286
4.14.1 名前空間の指定 --- 286
4.14.2 eval関数 --- 286
4.15 collectionsモジュール --- 287
4.15.1 キュー: deque --- 287
4.15.1.1 要素の追加と取り出し: append,pop --- 287
4.15.1.2 要素の順序の回転: rotate --- 287
4.15.2 要素の集計: Counter --- 288
4.15.2.1 出現頻度の順に集計結果を取り出す --- 288
4.15.3 namedtuple --- 289
4.16 itertoolsモジュール --- 290
4.16.1 イテラブルの連結: chain --- 290
4.16.2 無限のカウンタ: count --- 290
4.16.3 イテラブルの繰り返し: cycle --- 291
4.16.4 オブジェクトの繰り返し: repeat --- 291
4.16.5 連続要素のグループ化: groupby --- 291
4.16.6 直積集合: product --- 292
4.16.7 組合せ: combinations --- 293
4.16.8 順列: permutations --- 293
4.17 列挙型: enumモジュール --- 294
4.17.1 Enum型 --- 294
4.17.2 定数の取り扱いを実現する方法の例 --- 295
4.17.3 IntEnum --- 296
4.17.4 auto関数によるEnum要素への値の割り当て --- 296
4.17.4.1 非数値要素へのauto関数による値の割り当て(参考事項) --- 297
4.18 例外(エラー)の処理 --- 298
4.18.1 エラーメッセージをデータとして取得する方法: tracebackモジュール --- 298
4.18.2 例外を発生させる方法 --- 298
4.18.3 例外オブジェクト --- 299
4.18.3.1 例外オブジェクトのクラス階層 --- 300
4.19 使用されているシンボルの調査 --- 300
4.20 with構文 --- 301
4.21 デコレータ --- 305
4.21.1 引数を取るデコレータ --- 306
4.22 データ構造の整形表示: pprintモジュール --- 308
4.23 処理環境に関する情報の取得 --- 309
4.23.1 Pythonのバージョン情報の取得 --- 309
4.23.2 platformモジュールの利用 --- 309
4.23.3 実行中のプログラムのPIDの取得 --- 310
4.23.4 環境変数の参照 --- 310
4.24 ファイル,ディレクトリに対する操作: shutil モジュール --- 312
4.24.1 ファイルの複製 --- 312
4.24.2 ディレクトリ階層の複製 --- 312
4.24.3 書庫ファイル(アーカイブ)の取り扱いと圧縮処理に関すること --- 312
4.24.3.1 書庫(アーカイブ)の作成 --- 313
4.24.3.2 書庫(アーカイブ)の展開 --- 313
4.25 ZIP書庫の扱い: zipfileモジュール --- 313
4.25.1 ZIP書庫ファイルを開く --- 313
4.25.2 書庫へのメンバの追加 --- 314
4.25.3 書庫の内容の確認 --- 314
4.25.4 書庫のメンバの読み込み --- 314
4.25.5 書庫の展開 --- 315
4.25.5.1 パスワードで保護されたZIP書庫へのアクセス --- 315
4.26 コマンド引数の扱い: argparseモジュール --- 316
4.26.1 コマンド引数の形式 --- 316
4.26.2 使用方法 --- 316
4.26.2.1 オプション引数の設定 --- 316
4.26.2.2 位置引数の設定 --- 317
4.26.2.3 コマンドラインの解析処理 --- 317
4.26.3 サンプルプログラムに沿った説明 --- 317
4.26.3.1 ヘルプ機能 --- 318
4.26.3.2 コマンド引数の型の指定 --- 318
4.26.4 サブコマンドの実現方法 --- 319
4.27 スクリプトの終了(プログラムの終了) --- 320
4.27.1 sys.exit 関数 --- 320
4.27.2 os._exit 関数 --- 321
4.27.3 スクリプト終了時に実行する処理: atexitモジュール --- 321
4.28 Pythonの型システム --- 322
4.28.1 型の階層(クラス階層) --- 322
4.28.1.1 スーパークラス,サブクラスを調べる方法 --- 323
5 TCP/IPによる通信 --- 325
5.1 socketモジュール --- 325
5.1.1 ソケットの用意 --- 325
5.1.2 サーバ側プログラムの処理 --- 325
5.1.3 クライアント側プログラムの処理 --- 326
5.1.4 送信と受信 --- 326
5.1.5 サンプルプログラム:最も基本的な通信 --- 326
5.1.6 実用的な通信機能を実現する方法 --- 328
5.1.6.1 socketライブラリとasyncioライブラリの併用 --- 328
5.1.6.2 asyncioライブラリのみで通信を実現する方法 --- 330
5.1.6.3 通信の処理において注意すべき例外 --- 333
5.2 WWWコンテンツ解析 --- 334
5.2.1 requestsライブラリ --- 334
5.2.1.1 リクエストの送信に関するメソッド --- 334
5.2.1.2 取得したコンテンツに関するメソッド --- 334
5.2.1.3 Sessionオブジェクトに基づくアクセス --- 335
5.2.2 Beautiful Soupライブラリ --- 336
5.2.2.1 BSにおけるHTMLコンテンツの扱い --- 336
6 外部プログラムとの連携 --- 338
6.1 外部プログラムを起動する方法 --- 338
6.1.1 標準入出力の接続 --- 338
6.1.1.1 外部プログラムの標準入力のクローズ --- 341
6.1.2 非同期の入出力 --- 341
6.1.3 外部プロセスとの同期(終了の待機) --- 343
6.1.4 外部プログラムを起動する更に簡単な方法 --- 343
7 サウンドの入出力 --- 345
7.1 基礎知識 --- 345
7.2 WAV形式ファイルの入出力:waveモジュール --- 345
7.2.1 WAV形式ファイルのオープンとクローズ --- 345
7.2.1.1 WAV形式データの各種属性について --- 346
7.2.2 WAV形式ファイルからの読込み --- 346
7.2.3 サンプルプログラム --- 346
7.2.4 量子化ビット数とサンプリング値の関係 --- 347
7.2.5 読み込んだフレームデータの扱い --- 347
7.2.6 WAV形式データを出力する例(1):リストからWAVファイルへ --- 349
7.2.7 WAV形式データを出力する例(2):NumPyの配列からWAVファイルへ --- 350
7.2.8 サウンドのデータサイズに関する注意点 --- 350
7.3 サウンドの入力と再生:PyAudioライブラリ --- 352
7.3.1 ストリームを介したサウンド入出力 --- 352
7.3.2 WAV形式サウンドファイルの再生 --- 353
7.3.2.1 サウンド再生の終了の検出 --- 355
7.3.3 音声入力デバイスからの入力 --- 355
A Pythonに関する情報 --- 358
A.1 Pythonのインターネットサイト --- 358
A.2 Pythonのインストール作業の例 --- 358
A.2.1 PSF版インストールパッケージによる方法 --- 358
A.2.2 Anacondaによる方法 --- 359
A.3 Python起動のしくみ --- 360
A.3.1 PSF版Pythonの起動 --- 360
A.3.2 Anaconda Navigatorの起動 --- 360
A.3.3 Anaconda Promptの起動 --- 360
A.3.3.1 condaコマンドによるPython環境の管理 --- 362
A.4 PIPによるライブラリ管理 --- 362
A.4.1 PIPコマンドが実行できない場合の解決策 --- 363
B Kivyに関する情報 --- 364
B.1 Kivy利用時のトラブルを回避するための情報 --- 364
B.1.1 Kivyが使用する描画APIの設定 --- 364
B.1.2 SDLについて --- 364
B.2 GUIデザインツール --- 364
C Tkinter:基本的なGUIツールキット --- 365
C.1 基本的な扱い方 --- 365
C.1.1 使用例 --- 366
C.1.1.1 ウィンドウサイズ変更の可否の設定 --- 367
C.1.2 ウィジェットの配置 --- 367
C.2 各種のウィジェット --- 369
C.2.1 チェックボタンとラジオボタン --- 369
C.2.1.1 Variableクラス --- 369
C.2.2 エントリ(テキストボックス)とコンボボックス --- 371
C.2.2.1 プログラムの終了 --- 372
C.2.3 リストボックス --- 372
C.2.4 テキスト(文字編集領域)とスクロールバー --- 374
C.2.5 スケール(スライダ)とプログレスバー --- 375
C.2.5.1 Variableクラスのコールバック関数設定 --- 376
C.3 メニューの構築 --- 377
C.4 Canvasの描画 --- 378
C.4.1 描画メソッド(一部) --- 378
C.4.1.1 使用できるフォントを調べる方法 --- 379
C.4.2 図形の管理 --- 381
C.5 イベントハンドリング --- 383
C.5.1 時間を指定した関数の実行 --- 385
C.6 複数のウィンドウの表示 --- 386
C.7 ディスプレイやウィンドウに関する情報の取得 --- 387
C.8 メッセージボックス(messagebox) --- 388
C.8.1 アプリケーション終了のハンドリング --- 389
C.9 ウィジェットの親,子を調べる方法 --- 390
D curses --- 391
D.1 curses使用の流れ --- 392
D.2 画面に対する出力,制御 --- 392
D.2.1 色の設定と適用 --- 392
D.2.2 装飾の適用 --- 393
D.2.3 テキストカーソルの設定 --- 393
D.2.4 画面の消去,更新 --- 393
D.2.5 警告表現 --- 393
D.3 キーボード入力 --- 395
D.3.1 文字列の入力 --- 395
D.3.2 rawモード入力 --- 395
D.4 ウィンドウのリサイズ --- 396
D.5 画面の内容の採取 --- 398
D.5.1 文字コードや属性情報の採取 --- 398
D.5.2 画面の中の文字列の採取 --- 399
E psutilライブラリ --- 401
E.1 CPU関連の情報の取得 --- 401
E.1.1 CPUの構成:cpu_count関数 --- 401
E.1.2 CPUのクロック周波数:cpu_freq関数 --- 401
E.1.3 CPU時間:cpu_times関数 --- 401
E.1.4 CPU使用率:cpu_percent関数 --- 402
E.2 メモリ関連の情報の取得 --- 402
E.2.1 仮想記憶の状況:virtual_memory関数 --- 402
E.2.2 スワップ領域の使用状況:swap_memory関数 --- 402
E.3 ディスク関連の情報の取得 --- 403
E.3.1 パーティションの構成:disk_partitions関数 --- 403
E.3.2 ディスクの使用状況:disk_usage関数 --- 404
E.3.3 ディスクのI/O状況:disk_io_counters関数 --- 404
E.4 ネットワーク関連の情報の取得 --- 404
E.4.1 ネットワークのI/O状況:net_io_counters関数 --- 404
E.4.2 現在の通信状況:net_connections関数 --- 405
E.5 プロセス関連の情報の取得 --- 406
E.5.1 実行中のプロセス:pids関数 --- 406
E.5.2 Process クラス --- 407
E.5.2.1 メモリの使用状況の調査:memory_info --- 407
E.5.2.2 CPU使用率:cpu_percent --- 408
E.5.2.3 CPU時間:cpu_times --- 409
E.5.2.4 開いているファイルの調査:open_files --- 409
E.5.2.5 プロセスの通信状況:net_connections --- 409
E.5.2.6 プロセスの終了:terminate --- 410
E.5.3 サンプルプログラム:プロセスの監視 --- 410
F ライブラリの取り扱いについて --- 412
F.1 ライブラリの読込みに関すること --- 412
F.1.1 ライブラリ読込みにおける別名の付与 --- 412
F.1.2 接頭辞を省略するためのライブラリの読込み --- 412
F.1.2.1 接頭辞を省略する際の注意(名前の衝突) --- 413
F.1.3 ライブラリのパス: sys.path --- 413
F.1.4 既に読み込まれているライブラリの調査: sys.modules --- 413
F.1.5 The Zen of Python --- 414
F.2 ライブラリ情報の取得 --- 414
F.2.1 pkg_resources による方法 --- 414
F.2.2 pkgutil,importlib による方法 --- 415
F.3 各種ライブラリの紹介 --- 417
G 対話モードを使いやすくするための工夫 --- 418
G.1 警告メッセージの抑止と表示 --- 418
G.2 メモリの使用状態の管理 --- 419
G.2.1 オブジェクトのサイズの調査 --- 419
H 文書化文字列と関数アノテーション --- 421
H.1 関数アノテーション(Function Annotations) --- 422
I サンプルプログラム --- 423
I.1 リスト/セット/辞書のアクセス速度の比較 --- 423
I.1.1 スライスに整数のインデックスを与える形のアクセス --- 423
I.1.2 メンバシップ検査に要する時間 --- 424
I.2 ライブラリ使用の有無における計算速度の比較 --- 427
I.3 os.walk関数の応用例 --- 430
I.4 pathlibの応用例 --- 431
I.5 浮動小数点数と2進数の間の変換 --- 432
I.5.1 mpmathを用いた例 --- 433
I.6 全てのUnicode文字の列挙 --- 434
J その他 --- 435
J.1 演算子の優先順位 --- 435
J.2 アスキーコード表 --- 436
【ライブラリブックの目次】
1 画像の入出力と処理 --- 1
1.1 OpenCV --- 1
1.1.1 動画像の入力 --- 2
1.1.2 ユーザインターフェース --- 2
1.1.2.1 動画ファイルからの入力 --- 3
1.1.3 フレームのファイルへの保存 --- 3
1.1.4 静止画像の読込み --- 3
1.1.5 色空間とチャネル --- 4
1.1.5.1 画像フレームのチャネルの順序 --- 5
1.1.5.2 色空間の変換 --- 6
1.1.5.3 チャネルの分解と合成 --- 7
1.1.5.4 色空間の選択に関すること --- 8
1.1.5.5 参考)HSVの色相に関すること --- 9
1.1.6 カラー画像からモノクロ画像への変換 --- 10
1.1.6.1 モノクロ2値化 (1):一定の閾値で判定 --- 10
1.1.6.2 モノクロ2値化 (2):閾値を適応的に判定 --- 11
1.1.7 画像フレームに対する描画 --- 13
1.1.7.1 基本的な考え方 --- 13
1.1.7.2 線分,矢印 --- 13
1.1.7.3 矩形,円,楕円,円弧 --- 14
1.1.7.4 折れ線,多角形 --- 16
1.1.7.5 文字列 --- 17
1.1.7.6 マーカー --- 18
1.2 Pillow --- 20
1.2.1 画像ファイルの読込みと保存 --- 20
1.2.1.1 EPSを読み込む際の解像度 --- 21
1.2.1.2 画像ファイルの保存 --- 21
1.2.2 Imageオブジェクトの新規作成 --- 21
1.2.3 画像の閲覧 --- 22
1.2.4 画像の編集 --- 22
1.2.4.1 画像の拡大と縮小 --- 22
1.2.4.2 画像の部分の取り出し --- 22
1.2.4.3 画像の複製 --- 23
1.2.4.4 画像の貼り付け --- 23
1.2.4.5 画像の回転 --- 23
1.2.5 画像処理 --- 23
1.2.5.1 色の分解と合成 --- 23
1.2.5.2 カラー画像からモノクロ画像への変換 --- 24
1.2.6 描画 --- 25
1.2.7 アニメーションGIFの作成 --- 26
1.2.8 Imageオブジェクトから画素の数値配列への変換 --- 27
2 GUIとマルチメディア --- 28
2.1 pygame --- 28
2.1.1 基礎事項 --- 28
2.1.1.1 Surfaceオブジェクト --- 28
2.1.1.2 アプリケーションの実行ループ --- 28
2.1.2 描画機能 --- 30
2.1.2.1 描画のサンプルプログラム --- 32
2.1.2.2 回転,拡縮のサンプルプログラム --- 34
2.1.3 キーボードとマウスのハンドリング --- 36
2.1.4 音声の再生 --- 37
2.1.4.1 Soundオブジェクトを用いる方法 --- 38
2.1.4.2 SoundオブジェクトからNumPyの配列への変換 --- 39
2.1.5 スプライトの利用 --- 40
2.2 Eel --- 45
2.2.1 基礎事項 --- 45
2.2.1.1 Chromeの起動モード --- 46
2.2.2 Python/JavaScriptで記述した関数の呼出し --- 46
2.2.2.1 関数の戻り値について --- 48
2.3 メディアデータの変換: PyDub --- 49
2.3.1 音声ファイルの読込み --- 49
2.3.2 音声データからNumPyの配列への変換 --- 49
2.3.3 NumPyの配列から音声データへの変換 --- 50
2.3.4 音声ファイルの保存 --- 50
2.3.4.1 MP3形式ファイルとして保存 --- 50
2.3.4.2 WAV形式ファイルとして保存 --- 50
3 科学技術系 --- 51
3.1 数値計算と可視化のためのライブラリ:NumPy / matplotlib --- 51
3.1.1 NumPyで扱うデータ型 --- 51
3.1.2 配列オブジェクトの基本的な扱い方 --- 51
3.1.2.1 配列の要素の型について --- 52
3.1.2.2 真理値の配列 --- 52
3.1.2.3 基本的な計算処理 --- 53
3.1.2.4 扱える値の範囲 --- 54
3.1.2.5 特殊な値:無限大と非数 --- 54
3.1.2.6 データ列の生成(数列の生成) --- 55
3.1.2.7 多次元配列の生成 --- 56
3.1.2.8 配列の形状の調査 --- 56
3.1.2.9 配列の要素へのアクセス --- 57
3.1.2.10 スライスにデータ列を与えた場合の動作 --- 57
3.1.2.11 指定した行,列へのアクセス --- 58
3.1.2.12 配列形状の変形 --- 58
3.1.2.13 行,列の転置 --- 60
3.1.2.14 行,列の反転と回転 --- 60
3.1.2.15 型の変換 --- 61
3.1.2.16 配列の複製(コピー) --- 61
3.1.3 配列の連結と繰り返し --- 62
3.1.3.1 append,concatenateによる連結 --- 62
3.1.3.2 hstack,vstackによる連結 --- 63
3.1.3.3 tileによる配列の繰り返し --- 64
3.1.4 配列への要素の挿入 --- 64
3.1.4.1 行,列の挿入 --- 65
3.1.5 配列要素の部分的削除 --- 66
3.1.5.1 区間を指定した削除 --- 66
3.1.5.2 行,列の削除 --- 67
3.1.6 配列の次元の拡大 --- 67
3.1.6.1 newaxisオブジェクトによる方法 --- 67
3.1.6.2 expand_dimsによる方法 --- 68
3.1.7 データの抽出 --- 68
3.1.7.1 真理値列によるマスキング --- 68
3.1.7.2 条件式による要素の抽出 --- 69
3.1.7.3 論理演算子による条件式の結合 --- 69
3.1.7.4 whereによる要素の抽出と置換 --- 69
3.1.7.5 最大値,最小値,その位置の探索 --- 70
3.1.8 データの整列(ソート) --- 72
3.1.8.1 2次元配列の整列 --- 72
3.1.8.2 整列結果のインデックスを取得する方法 --- 73
3.1.9 配列要素の差分の配列 --- 73
3.1.10 配列に対する様々な処理 --- 74
3.1.10.1 重複する要素の排除 --- 74
3.1.10.2 要素の個数の集計 --- 74
3.1.10.3 整数要素の集計 --- 75
3.1.10.4 指定した条件を満たす要素の集計 --- 75
3.1.11 配列に対する演算:1次元から1次元 --- 75
3.1.12 データの可視化(基本) --- 76
3.1.12.1 作図処理の基本的な手順 --- 77
3.1.12.2 2次元のプロット:折れ線グラフ --- 77
3.1.12.3 グラフの目盛りの設定 --- 80
3.1.12.4 複数のグラフの作成 --- 81
3.1.12.5 matplotlibのグラフの構造 --- 83
3.1.12.6 グラフの枠を非表示にする方法 --- 87
3.1.12.7 極座標プロット --- 87
3.1.12.8 レーダーチャート(極座標の応用) --- 88
3.1.12.9 日本語の見出し・ラベルの表示 --- 89
3.1.12.10 グラフを画像ファイルとして保存する方法 --- 90
3.1.13 乱数の生成 --- 91
3.1.13.1 一様乱数の生成 --- 91
3.1.13.2 整数の乱数の生成 --- 91
3.1.13.3 正規乱数の生成 --- 91
3.1.13.4 乱数のseedについて --- 91
3.1.13.5 RandomStateオブジェクト --- 92
3.1.14 統計に関する処理 --- 93
3.1.14.1 合計 --- 93
3.1.14.2 最大値,最小値 --- 93
3.1.14.3 平均,分散,標準偏差 --- 93
3.1.14.4 分位点,パーセント点 --- 94
3.1.14.5 区間と集計(階級と度数調査) --- 94
3.1.14.6 最頻値を求める方法 --- 97
3.1.14.7 相関係数 --- 100
3.1.14.8 データのシャッフル --- 101
3.1.15 データの可視化(2) --- 101
3.1.15.1 ヒストグラム --- 101
3.1.15.2 散布図 --- 103
3.1.15.3 棒グラフ --- 103
3.1.15.4 円グラフ --- 105
3.1.15.5 箱ひげ図 --- 107
3.1.16 多次元配列に対する演算 --- 108
3.1.16.1 meshgrid関数の働き --- 109
3.1.17 データの可視化:3次元プロット --- 110
3.1.17.1 ワイヤフレーム --- 110
3.1.17.2 面プロット(surface plot) --- 110
3.1.17.3 3次元の棒グラフ --- 112
3.1.17.4 3次元の散布図 --- 112
3.1.18 データの可視化:その他 --- 114
3.1.18.1 ヒートマップ --- 114
3.1.18.2 表の作成 --- 116
3.1.19 高速フーリエ変換(FFT) --- 118
3.1.19.1 時間領域から周波数領域への変換:フーリエ変換 --- 118
3.1.19.2 周波数領域から時間領域への変換:フーリエ変逆換 --- 118
3.1.19.3 プロットのアスペクト比の指定 --- 121
3.1.19.4 フーリエ変換を使用する際の注意 --- 121
3.1.20 複素数の計算 --- 122
3.1.20.1 複素数の平方根 --- 122
3.1.20.2 複素数のノルム --- 122
3.1.20.3 共役複素数 --- 122
3.1.20.4 複素数の偏角(位相) --- 123
3.1.21 行列,ベクトルの計算(線形代数のための計算) --- 123
3.1.21.1 行列の和と積 --- 123
3.1.21.2 単位行列,ゼロ行列,他 --- 123
3.1.21.3 行列の要素を全て同じ値にする --- 124
3.1.21.4 ベクトルの内積 --- 125
3.1.21.5 対角成分,対角行列 --- 125
3.1.21.6 行列の転置 --- 126
3.1.21.7 行列式と逆行列 --- 126
3.1.21.8 固有値と固有ベクトル --- 126
3.1.21.9 行列のランク --- 127
3.1.21.10 複素共役行列 --- 127
3.1.21.11 エルミート共役行列 --- 127
3.1.21.12 ベクトルのノルム --- 127
3.1.22 入出力:配列オブジェクトのファイルI/O --- 128
3.1.22.1 テキストファイルへの保存 --- 128
3.1.22.2 テキストファイルからの読み込み --- 130
3.1.22.3 バイナリファイルへのI/O --- 131
3.1.22.4 データの圧縮保存と読み込み --- 132
3.1.22.5 配列をバイトデータに変換して入出力に使用する --- 133
3.1.23 行列の検査 --- 134
3.1.23.1 全て真,少なくとも1つは真: all,any --- 134
3.1.24 配列を処理するユーザ定義関数の実装について --- 135
3.1.25 行列の計算を応用した計算速度の改善の例 --- 137
3.1.25.1 要素の型によって異なる計算速度 --- 138
3.1.26 画像データの扱い --- 138
3.1.26.1 画素の配列から画像データへの変換(PILライブラリとの連携) --- 140
3.1.26.2 画像データから画素の配列への変換(PILライブラリとの連携) --- 140
3.1.26.3 OpenCVにおける画素の配列 --- 141
3.1.26.4 サンプルプログラム:画像の三色分解 --- 142
3.1.27 図形の描画:matplotlib.patches --- 144
3.1.27.1 四角形,円,楕円,正多角形 --- 144
3.1.27.2 円弧(楕円弧) --- 145
3.1.27.3 ポリゴン --- 146
3.1.28 3次元のポリゴン表示 --- 146
3.1.29 日付,時刻の扱い --- 148
3.1.29.1 datetime64クラス --- 148
3.1.29.2 timedelta64クラス --- 148
3.1.29.3 日付,時刻の応用例 --- 149
3.1.30 その他の機能 --- 151
3.1.30.1 基準以上/以下のデータの抽出 --- 151
3.1.30.2 指定した範囲のデータの抽出 --- 153
3.2 科学技術計算用ライブラリ: SciPy --- 155
3.2.1 信号処理ツール: scipy.signal --- 155
3.2.1.1 基本的な波形の生成 --- 155
3.2.2 WAVファイル入出力ツール: scipy.io.wavfile --- 158
3.2.2.1 WAV形式ファイル出力: write関数 --- 158
3.2.2.2 WAV形式ファイル入力: read関数 --- 159
3.2.2.3 32-bit floating-point のWAV形式サウンドデータ --- 159
3.3 数式処理ライブラリ: SymPy --- 161
3.3.1 モジュールの読込みに関する注意 --- 161
3.3.2 基礎事項 --- 161
3.3.2.1 記号オブジェクトの生成 --- 162
3.3.2.2 数式の簡単化(評価) --- 162
3.3.2.3 式 f(x,y,...) の構造 (頭部と引数列の取り出し) --- 163
3.3.2.4 定数 --- 164
3.3.3 基本的な数式処理機能 --- 164
3.3.3.1 式の展開 --- 164
3.3.3.2 因数分解 --- 164
3.3.3.3 指定した記号による整理 --- 164
3.3.3.4 約分:分数の簡単化(1) --- 165
3.3.3.5 部分分数 --- 165
3.3.3.6 分数の簡単化(2) --- 166
3.3.3.7 代入(記号の置換) --- 166
3.3.3.8 各種の数学関数 --- 166
3.3.3.9 式の型 --- 166
3.3.4 解析学的処理 --- 167
3.3.4.1 極限 --- 167
3.3.4.2 導関数 --- 167
3.3.4.3 微分操作の遅延実行 --- 168
3.3.4.4 原始関数 --- 168
3.3.4.5 integrateの遅延実行 --- 168
3.3.4.6 定積分 --- 169
3.3.4.7 級数展開 --- 169
3.3.5 各種方程式の求解 --- 169
3.3.5.1 代数方程式の求解 --- 169
3.3.5.2 微分方程式の求解 --- 170
3.3.5.3 階差方程式の求解(差分方程式,漸化式) --- 170
3.3.6 線形代数 --- 171
3.3.6.1 行列の連結 --- 171
3.3.6.2 行列の形状 --- 172
3.3.6.3 行列の要素へのアクセス --- 172
3.3.6.4 行列式 --- 173
3.3.6.5 逆行列 --- 173
3.3.6.6 行列の転置 --- 173
3.3.6.7 ベクトル,内積 --- 173
3.3.6.8 固有値,固有ベクトル --- 174
3.3.7 総和 --- 174
3.3.8 パターンマッチ --- 175
3.3.9 数値計算 --- 175
3.3.9.1 素因数分解 --- 175
3.3.9.2 素数 --- 176
3.3.9.3 近似値 --- 177
3.3.10 書式の変換出力 --- 177
3.3.10.1 LaTeX --- 177
3.3.10.2 MathML --- 177
3.3.11 グラフのプロット --- 178
3.3.11.1 グラフを画像ファイルに保存する方法 --- 179
4 セキュリティ関連 --- 180
4.1 hashlib --- 180
4.1.1 基本的な使用方法 --- 180
4.2 passlib --- 180
4.2.1 使用できるアルゴリズム --- 180
5 プログラムの高速化/アプリケーション構築 --- 182
5.1 Cython --- 182
5.1.1 使用例 --- 182
5.1.2 高速化のための調整 --- 184
5.2 Numba --- 185
5.2.1 基本的な使用方法 --- 185
5.2.2 型指定による高速化 --- 186
5.3 ctypes --- 186
5.3.1 C言語による共有ライブラリ作成の例 --- 186
5.3.2 共有ライブラリ内の関数を呼び出す例 --- 187
5.3.3 引数と戻り値の扱いについて --- 187
5.3.3.1 配列データの受け渡し --- 190
5.4 PyInstaller --- 193
5.4.1 簡単な使用例 --- 193
5.4.1.1 単一の実行ファイルとしてビルドする方法 --- 194
6 対話作業環境(JupyterLab) --- 195
6.1 基礎事項 --- 195
6.1.1 起動と終了 --- 196
6.1.2 表示領域の構成と操作方法 --- 196
6.1.2.1 ノートブックの使用例 --- 197
6.1.2.2 カーネル(Kernel)について --- 199
6.1.3 Notebookでのinput関数の実行 --- 199
6.2 Markdownによるコメント表示 --- 199
6.3 使用例 --- 201
6.3.1 MathJaxによるSymPyの式の整形表示 --- 201
6.3.2 IPython.displayモジュールによるサウンドの再生 --- 202
7 その他 --- 204
7.1 json:データ交換フォーマットJSONの使用 --- 204
7.1.1 JSONの表記 --- 204
7.1.2 使用例 --- 204
7.1.2.1 JSONデータのファイルI/O --- 204
7.1.2.2 真理値,Noneの扱い --- 205
7.2 urllib:URLに関する処理 --- 206
7.2.1 他バイト文字の扱い(「%」エンコーディング) --- 206
7.2.1.1 文字コード体系の指定 --- 206
7.3 zenhan:全角⇔半角変換 --- 207
7.4 jaconv:日本語文字に関する各種の変換 --- 207
written by 中村勝則