「3人で2日かかる作業を君は2時間で仕上げたんだよ」 私の大学のルームメイトは2000年代の初めに家電量販店で働いていました。 その店では、他店の何千種類もの製品価格をまとめたスプレッドシートを用意していました。 3人の従業員がそのスプレッドシートを印刷して、分厚い紙の束を分担して作業していました。 製品ごとに価格を比較して、他店のほうが安い製品をリストアップしていました。 この作業には数日かかっていました。
私のルームメイトは、紙をまき散らして床に座って作業している姿を見て、「この印刷物の元ファイルがあれば、その作業をしてくれるプログラムを書くよ」と言いました。
数時間後、ファイルから他店の製品価格を読み取り、自店のデータベースから同じ製品の価格を取得して、他店のほうが安ければ記録する短いプログラムを、ルームメイトは書き上げました。そのルームメイトはまだプログラミングの初心者だったので、プログラミング本を読んで調べるのにほとんどの時間を費やしました。プログラムの実行にかかった時間はほんの数秒です。その日、ルームメイトとその家電量販店の従業員は、とても長い昼食をとりました。
これがコンピュータプログラミングの力です。コンピュータはさまざまな作業に使える万能ツールです。クリックして入力して…という反復作業に時間を浪費している人は多いです。正しい指示を与えればコンピュータは数秒でその作業ができることに気づいていないのでしょう。
私たちが今使っているたくさんのツールの中心にはソフトウェアがあります。多くの人がSNSを使っていて、かばんやポケットの中にはインターネットに接続した電話があり、事務仕事にはコンピュータが欠かせません。その結果、コードを書ける人がますます求められるようになってきています。初心者でも年収1000万円のエンジニアになれると約束する本やオンライン教材やトレーニングコースがあふれています。
本書はその類ではありません。万人に向けて書いた本です。
この本を読んだだけでプロのソフトウェア開発者になれるわけではありません。ギターのレッスンを少し受けただけではロックスターになれないのと同じです。事務員であれ管理職であれ研究者であれ、コンピュータを仕事や趣味に使う人なら、本書を読めばプログラミングの基礎を身につけられます。以下のような単純作業を自動化できます。
こうした作業は単純ですが、人間が行うと時間がかかりますし、状況に特化しているため既製のソフトウェアでは対応できません。しかし、プログラミングの基礎知識があれば、コンピュータにこうした作業をさせることができます。
この本はリファレンスマニュアルではなく初心者用のガイドブックです。学習の便宜上、コーディングのスタイルがベストプラクティスから逸脱している場合があります(例:グローバル変数の使用)。オブジェクト指向、リスト内包表記、ジェネレータなどの複雑なプログラミングの概念は扱いません。熟練したプログラマはこうしたらもっと効率がよくなるのにと思うかもしれませんが、本書は最小限の労力でプログラムを動作させることに重点を置いています。
テレビ番組や映画では、プログラマが狂ったように0と1の羅列を光り輝くスクリーンに打ち込んでいる姿が映し出されますが、現代のプログラミングはその姿とほど遠いです。プログラミングとは、コンピュータが理解して実行できる指示を書くことです。数値計算、文書編集、情報検索、インターネット通信といった指示です。
どのようなプログラムも、次のように、基本的な指示を組み合わせています。
「これをして、次にあれをする」
「この条件が真であればこれをして、偽であればあれをする」
「27回これをする」
「この条件が真になるまでこれをする」
こうした基本的な指示を組み合わせてもっと複雑なことができます。以下の例は、Pythonというプログラミング言語で書かれた、ソースコードと呼ばれるプログラミングの指示です。Pythonのソフトウェアが最初の行から最後の行までコードを実行していきます(条件が真であるが偽であるかによって実行される行が変わります)。
❶ password_file = open('SecretPasswordFile.txt')
❷ secret_password = password_file.read()
❸ print('Enter your password.')
typed_password = input()
❹ if typed_password == secret_password:
❺ print('Access granted')
❻ if typed_password == '12345':
❼ print('That password is one that an idiot puts on their luggage.')
else:
❽ print('Access denied')
プログラミングがわからなくても、コードを読めば(英語の意味がわかれば)何をしようとしているか推測できるかもしれません。まず、SecretPasswordFile.txtを開き(❶)、秘密のパスワードを読み取ります(❷)。次に、ユーザーはパスワードを(キーボードから)入力するように求められます(❸)。ファイルから読みったパスワードとユーザーが入力したパスワードを比較し(❹)、一致すればAccess grantedと画面に表示します(❺)。そして、パスワードが12345であるかをチェックし(❻)、そうであれば不適切なパスワードである旨を表示します(❼)。パスワードが一致しなければ、Access deniedと画面に表示します(❽)。
プログラミングは、絵を描いたり、文章を書いたり、編み物をしたり、レゴで城を作ったりするのと同じように創造的な作業です。キャンバスに絵を描くのと同じで、ソフトウェアのプログラミングには制約がありますが無限の可能性に開かれています。プログラミングとその他の創造的な活動との違いは、お使いのコンピュータでプログラミングに必要な原材料が揃っているということです。キャンバス、糸、画材、フィルム、レゴブロック、電子部品のような材料を買う必要はありません。10年落ちのノートパソコンでも十分にプログラミングを書けます。プログラムを一度書けば、何回でも繰り返し使えます。セーターを編んでも一人しか着れませんが、プログラムはオンラインで共有して世界中の人が使えます。
Python という用語は、プログラミング言語(Pythonのコードには構文が決まっています)とソースコード(プログラミング言語Pythonで書かれたもの)を読んで指示を実行するインタープリタソフトウェアの両方を指します。WindowsでもmacOSでもLinuxでも、 https://
プログラミング言語の種類はいろいろあり、それぞれに強みと弱みがあります。どのプログラミング言語が最高かという議論は好みの違いですから無益です。とはいえ、私見を述べるなら、Pythonが最初に学ぶプログラミング言語として最適です。Pythonの学習曲線はなだらかで、構文が読みやすいです。簡単な作業を行うために複雑な概念を学ぶ必要はありません。プログラミングをさらに極めたければ、最初にPythonを理解していると、次の言語を学ぶのが簡単になります。
Pythonという名前は、ヘビではなく英国のコメディグループのMonty Pythonに由来しています。Pythonプログラマは親しみを込めてパイソニスタと呼ばれます。チュートリアルなどのドキュメントでは、Monty Pythonとヘビがよく題材に使われます。
プログラミングはとっつきづらく、有名なソフトウェア会社は大金を稼いでいます。英語のコード(code)という単語には暗号という含意があります。ひと握りの選ばれた人しかプログラムを書けないと考えがちです。しかし、プログラミングは誰でも学べる技術です。以下では、いくつかのよく聞く神話に反論します。
プログラミングには高度な数学が必要だという神話をよく耳にします。実際には、ほとんどのプログラミング言語で必要な数学は初歩的な計算です。数学よりも論理的に考えて細部に注意を払うことが求められます。プログラミングが得意だというのは、数独のパズルを解くのが得意だということとそう変わりはありません。
数独は、行、列、3×3の太線の範囲のそれぞれについて、1から9までの数字を埋めるというパズルです。いくつかの数字が入った状態から始めて、それを手がかりに論理的に考えて解いていきます。図1では、5が1行目と2行目に入っているので、1行目と2行目にはもう5を入れることができません。右上の3×3の太線の範囲に着目すると、3行目に5を入れなければなりません。一番右の列にはすでに5が入っていますから、6の右隣に5を入れることはできません。よって、6の左隣に5を入れると確定できます。行、列、3×3の太線の範囲に着目しながら数字を埋めていくと、空白マスを埋める手がかりが増え、そのようにして数字を入れていくと、最終的には全部のマスを埋められます。
図1:数独のパズル例(左図)とその解答(右図)。数独では数字を扱いますが、数学とはあまり関係がありません。(図 © Wikimedia Commons)
数独が数字に関係あるからといって、数学が得意でないとパズルが解けないわけではありません。プログラミングも同じです。数独のパズルを解くのと同様に、プログラムを書くにも細部に注意を払って問題を順々に解きほぐしていくことが求められます。プログラムの デバッグ(エラーを発見して修正すること)をするにも、プログラムが何をしているか辛抱強く追っていき、バグの原因を突き止めます。どのような技術でもそうですが、やればやるほどうまくなります。
次によく聞く神話は、歳を取りすぎているのでプログラムを学ぶことができないというものです。もう23歳だから遅すぎるといったインターネット上の書き込みをよく目にします。遅すぎることなんてありません。もっと年齢を重ねてからプログラムを学ぶ人はたくさんいます。
有能なプログラマになるためには幼い頃から学び始めなければならないというのは神話です。しかし、プログラマは天才少年であるというイメージが根強いです。私もこの神話の一端を担っているかもしれません。というのも、私はプログラミングを小学生の頃に始めたからです。
とはいえ、プログラミングを始めるのは、1990年代よりも今のほうがはるかに簡単です。本がたくさんありますし、検索エンジンの性能も上がっていますし、オンラインの質問回答サイトもたくさんあります。そして何より、プログラミング言語自体が非常に使いやすくなっています。こうした理由から、私が小学生から高校生の間に学んだ内容は、今なら3か月ほど週末に学習すれば追いつけます。私は全然有利な位置にいたわけではなかったのです。
プログラミングでは向上心が重要です。言い換えると、練習が大事だということです。生まれつきのプログラマなんていませんし、今はプログラミングができなくても才能がないということではありません。
1990年代には、ナノテクノロジーがあらゆる面において変革をもたらすと喧伝されていました。新しい製造工程と科学革新が社会を変えると言われていました。細菌くらいの大きさのナノボットが炭素原子を1個ずつ組み立てる、カーボンナノチューブとバックミンスターフラーレンと鉛筆の芯と同じくらい安いダイヤモンドが、重量と価格が数分の1なのに鋼鉄よりも10倍硬い素材をもたらすと言われていました。この技術により、スタートレックのレプリケーターのように、宇宙エレベーターでも薬でも電化製品でも何でも作れるとされていました。希少性という経済学の概念が無用になり、世界的な飢餓と戦争を終わらせることを意味していました。ナノボットが蜂起して人間に歯向かわない限り、新しい啓蒙時代をもたらすはずでした。10年後にはそうなると言われていたのです。
もちろん、そのような誇大広告が実現することはありませんでした。確かにナノテクノロジーが革新をもたらした面はあります(スマートフォンはナノテクノロジーを活用しています)。しかし、スタートレックのレプリケーターのような壮大な約束は果たされず、ナノテクノロジーへの熱狂は現実的な大きさにしぼみました。
さて、AIについて述べましょう。
パソコンがあらゆる物事を変えました。インターネットもソーシャルメディアもスマートフォンもあらゆる物事を変えました。暗号通貨はそこまでではありませんが、詐欺に騙されやすい人をあぶり出したかもしれません。今、AIがテクノロジー産業では最新の驚異になっています。通俗的には、AIという用語が、チェスをプレイするコンピュータからチャットボット、いわゆるエキスパートシステム、機械学習まで幅広い内容を指します。本書では、大規模言語モデル(LLM)を指して用います。LLMは、OpenAIのChatGPT、GoogleのGemini、FacebookのLLaMAなど、テキスト生成システムの背景となる概念です。
LLMについては激しく議論されています。AIが私たちの仕事を奪うのだろうか、もうコードを書くための学習は不要なのか、AIは生きているのか、AIロボットの反乱に立ち向かえるのだろうか、などです。
LLMの技術はすごいですが、センセーショナルな報道や疑わしい投資機会を勧める人たちの餌食とならずLLMを有効に活用するためには、現実的な期待を設定する必要があります。ここではLLMとコーディングについて、誇大広告ではなく現実的な視点を提供したいと思います。よくある誤解を解いておきます。
実際にLLMを使った経験ではなく、SF映画などに基づいてこうした誤解に固執する人がいます。Python Software Foundationの理事でウェブフレームワークDjangoの共同開発者であるSimon Willisonの解説をご覧いただきたいです。AIに関する記事を https://
LLMはプログラマにどう役立つのでしょうか。現時点ではっきりしていることは、LLMとのコミュニケーション(プロンプトエンジニアリング)は一つの技術だということです。検索エンジンをうまく使うのが一つの技術であるのと同じです。LLMは人間ではないので、意義があり信頼できる回答を得るためには質問文を工夫する必要があります。LLMは自信満々で不正確な回答をすることがあります。ハルシネーションと呼ばれる現象です。しかしこれはアルゴリズムの擬人化であって正確な表現ではありません。LLMは思考するのではなくテキストを生成します。つまり、LLMの回答は、その内容が正しかろうが正しくなかろうが、すべてハルシネーションです。
LLMは目につきやすい大きな間違いを犯すこともあれば、目につきにくい小さな間違いを犯すこともあります。LLMを学習に用いるなら、回答の正確性をチェックしなければなりません。学習段階ではLLMをまったく使わないという選択をするのが妥当です。現在のところ、教育でLLMが有効かどうかは定かではありません。どういう状況であればLLMが学習に役立つか、利点が欠点を上回るかについては、まだ不確かです。
LLMのの誇大広告に賭ける人がたくさんいても驚きはしません。20世紀のスーパーコンピュータに匹敵するデバイスを私たちはポケットの中に入れているくらいですから。しかもそのデバイスはグローバルなネットワークに接続しています(ネットワーク上の情報は正しいこともあれば正しくないこともありますが)。宇宙空間にある人工衛星からそのデバイスが存在する地球上の位置を特定することもできます。ソフトウェアは魔法のように見えることがありますが、魔法ではありません。プログラミングを学ぶと、コンピュータができることをしっかりと把握して、誇大広告と判別できるようになります。
本書の前半の第1部ではPythonプログラミングの基礎を扱います。後半の第2部では多種多様な作業を自動化できるさまざまなソフトウェアライブラリを紹介します。第1部は最初から順番に読むことをおすすめしますが、第2部は興味のある章をつまみ食いして構いません。各章の概要を紹介します。
第1部 プログラミングの基礎
第1章 Pythonの基礎 Pythonの命令の基本形である式を扱います。Python対話型シェルソフトウェアを使ってコードを実行してみる方法も説明します。
第2章 if-elseとフロー制御 プログラムがどの命令を実行するか決められる方法を説明します。条件に応じて賢く振る舞えるようになります。
第3章 ループ 命令を一定の回数または一定の条件が満たされる間実行する方法を説明します。
第4章 関数 自分で関数を定義する方法を説明します。関数を定義すると、コードを整理して管理しやすくなります。
第5章 デバッグ Pythonで利用できる、バグを発見して修正するツールを紹介します。
第6章 リスト リストデータ型を紹介し、データを整理する方法を説明します。
第7章 辞書とデータの構造化 辞書データ型を紹介し、データを整理するより強力な方法を説明します。
第8章 文字列とテキスト編集 テキストデータ(Pythonでは文字列と呼ばれます)を扱います。
第2部 業務自動化
第9章 正規表現によるテキストパターンマッチング Pythonで文字列を操作して正規表現でパターンを検索する方法を説明します。
第10章 ファイルの読み書き テキストファイルの中身の読み取りと書き込みを扱います。
第11章 ファイルの整理 手動で行うよりも素早く大量のファイルをコピー、移動、リネーム、削除する方法を説明します。ファイルの圧縮と解凍も扱います。
第12章 コマンドラインプログラム Pythonのプログラムを自分のコンピュータや他人のコンピュータで簡単に実行する方法を説明します。
第13章 ウェブスクレイピング ウェブページを自動的にダウンロードして情報を解析するプログラムを書きます。これはウェブスクレイピングと呼ばれます。
第14章 Excelファイル プログラムからExcelファイルを操作します。大量のExcelファイルを分析する際に役立ちます。
第15章 Googleスプレッドシート GoogleスプレッドシートをPythonで読み書きする方法を説明します。
第16章 SQLiteデータベース リレーショナルデータベースの使い方を説明します。Pythonですぐに使える小規模ながら強力なオープンソースのデータベースであるSQLiteを利用します。
第17章 PDFとWord文書 プログラムでWordとPDFの文書を読む方法を説明します。
第18章 CSV、JSON、XML データシリアライズフォーマットのCSV、JSON、XMLをプログラムで操作する方法を説明します。
第19章 日時、スケジュール、プログラムの起動 Pythonでの日時の扱い方と、コンピュータに指定した時間に作業を実行させる方法を説明します。Pythonから別のプログラムをどのように起動するかも説明します。
第20章 メール送信、ショートメール送信、プッシュ通知 メールやショートメールなどで通知を行うプログラムを書く方法を説明します。
第21章 グラフ作成と画像処理 JPEGやPNGの画像処理と、Matplotlibライブラリを利用したグラフ作成を説明します。
第22章 画像中の文字認識 画像やスキャンした文書から文字を抽出してPyTesseractパッケージで処理する方法を説明します。
第23章 キーボードとマウスの制御 クリックとキー入力を自動化するためにマウスとキーボードをプログラムで制御する方法を説明します。
第24章 読み上げと音声認識 高度なコンピュータ科学パッケージを使って読み上げと音声認識を行う方法を説明します。
本書で示したコード例その他の資料を https://
Windows、macOS、Ubuntu(Linux)用のPythonを https://
ダウンロードページはお使いのOSに応じたパッケージのダウンロードを勧めてくれます。AndroidとiOS用の非公式のPythonインストーラーも存在しますが、本書では扱いません。Windows、macOS、Linuxでインストールオプションがいろいろあります。OSに応じたインストーラーをダウンロードして実行し、Pythonインタープリタソフトウェアをインストールしてください。
PythonやOSのバージョンによってはインストールの手順が異なる場合があります。うまくいかないときは https://
前節で紹介したPythonインタープリタはPythonプログラムを実行するソフトウェアであるのに対し、本節で紹介するMuエディタ はワープロで文書を作成するのと同じ要領でプログラムを書くソフトウェアです。https://
WindowsとmacOSでは、OSに応じたインストーラーをダウンロードしてダブルクリックして実行します。macOSをお使いでしたら、インストーラーを実行するとウィンドウが開くので、Muのアイコンをアプリケーションフォルダアイコンにドラッグしてインストールを継続します。Ubuntuをお使いでしたら、MuをPythonのパッケージとしてインストールします。ダウンロードページのPython PackageセクションにあるInstructionsボタンをクリックします。
インストール後は以下のようにしてMuを起動します。
Muの初回起動時には、モードの選択ウィンドウが表示されます。Adafruit CircuitPython、BBC micro:bit、Pygame Zero、Python 3その他の選択肢があります。Python 3を選んでください。後からでもエディタ画面上部の モードボタンをクリックすれば変更できます。
本書ではエディタと対話型シェルにMuを用いますが、他のエディタを使用しても構いません。interactive development environment (IDLE)がPythonといっしょにインストールされますから、Muがうまく使えない場合にはIDLEをご利用ください。以下ではIDLEの使い方を説明します(Pythonのバージョンは3.13だと仮定します)。
Muを起動すると、file editorウィンドウが表示されます。REPLボタンをクリックすると対話型シェルが開きます。シェルはコンピュータに命令できるプログラムです。macOSのターミナルやWindowsのコマンドプロンプトに似ています。Python対話型シェルに入力した命令はすぐにPythonのインタープリタによって実行されます。
Muでは、以下のような対話型シェルがウィンドウの下半分の枠に表示されます。
Jupyter QtConsole
Python 3
Type 'copyright', 'credits' or 'license' for more information
IPython -- An enhanced Interactive Python. Type '?' for help.
In [1]:
IDLEを実行すると、まず対話型シェルのウィンドウが立ち上がります。以下のようなほぼ空白のウィンドウが表示されます。
>>>
In [1]: と >>> は プロンプトと呼ばれます。本書では >>> で対話型シェルのプロンプトを表します。これは一般的な表記です。ターミナルまたはコマンドプロンプトからPythonを実行するときにも、 >>> というプロンプトが表示されます。In [1]: というプロンプトはJupyter Notebookというまた別のPythonエディタによるものです。
例えば、以下の内容を対話型シェルのプロンプトに続けて入力してください。
>>> print('Hello, world!')
この行を入力してエンターキーを押すと、対話型シェルは次のように反応します。
>>> print('Hello, world!')
Hello, world!
コンピュータに指示を与え、指示した内容を実行させました。
プログラマはインターネットを検索して疑問を解消しながら学習を進める傾向にあります。これは多くの人がなじんできた、教師が講義と質疑応答を行う学習方法とは異なります。学習にインターネットを用いる大きな利点は、問題の解決を助けてくれる人たちのコミュニティが存在することです。実際、自分が抱いた疑問はおそらくすでに誰かが答えてくれていて、その回答がオンラインに準備されています。エラーメッセージを目にしたりコードを動かすのに苦労しているとしたら、同じ問題をほかの人がすでに経験しているでしょうから、解決策を見つけるのは意外と簡単です。
一例として、意図的にエラーを発生させてみましょう。'42' + 3 と対話型シェルに入力してください。この命令がどういう意味なのか現時点ではわからなくても大丈夫です。以下のような結果が表示されるはずです。
>>> '42' + 3
❶ Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
'42' + 3
❷ TypeError: can only concatenate str (not "int") to str
>>>
Pythonがこの命令を理解できなかったためにエラーメッセージが表示されます(❷)。エラーメッセージのtracebackの部分(❶)にエラーの原因となった命令と行番号が表示されています。エラーメッセージの意味がわからなかったとしても、オンラインで検索できます。検索エンジンで“TypeError: can only concatenate str (not "int") to str”とクォーテーションマークを含めてエラーメッセージを入力して検索してみてください。図2のように、このエラーメッセージの意味と原因を説明するリンクがたくさん見つかるはずです。
図2:Googleでエラーメッセージを検索すると大きな助けが得られます。
すでに誰かが同じ質問をして回答が付いているのがわかるでしょう。プログラムのすべてを知っている人などいませんから、ソフトウェア開発者は誰でも日常的に技術的な疑問の回答を調べています。
オンラインで検索しても回答が見つからなければ、Stack Overflow (https://
プログラミングの質問をする際には、以下の点に注意してください。
オンライン上でのエチケットに従ってください。例えば、質問文を過度に強調したり過大な要求をしたりしないでください。
https://
全面的に改訂して更新したこの第3版では、新しいプログラミングプロジェクトを16個追加したので、学習したスキルをしっかりと練習できます。Pythonのsqlite3モジュールを使ったSQLiteリレーショナルデータベースの導入も加筆しました。PythonのスクリプトをWindows、macOS、Linuxでの実行ファイルにコンパイルする方法も書き加えました。コマンドラインプログラムの作成と実行も扱いました。PyPDFとPdfMineを使ったPDFの操作、Seleniumに加えてPlaywrightを利用したウェブブラウザの制御、文字認識、OpenAIのWhisperライブラリを利用した音声ファイルや動画ファイルからの音声認識、PyTesseractによる画像中の文字認識、Matplotlibによるグラフ作成など、新しい内容がてんこ盛りです。
ほとんどの人にとって、コンピュータはツールではなくただの家電製品です。しかしプログラミングを学ぶと、現代の最も強力なツールにアクセスできるようになり、楽しいです。プログラミングは脳外科手術ではありません。素人が実験して間違えても問題ありません。
本書を読むのに事前のプログラミング知識は必要ありません。かなりたくさんの内容を説明しますが、本書の範囲を超えた疑問が生じるかもしれません。効果的に質問して回答を得る方法を知ることは、プログラミング人生において計り知れないほどの価値があります。
それでは始めましょう。