LL系言語の世界観に戻るPythonの世界観Pythonによるプログラミングに関する世界観(基本)です。Pythonとは最初はPythonから入るべきプログラマになりたいのであれば、Pythonから始めましょう。Pythonが「標準的言語」として言われています。その中でも、初心者向けでかつさまざまなユースケースで使われるのがPythonです。最近では、ちまたでもAIや機械学習のような技術のマスコミ報道が増えていますが、AIで使われる言語はPythonであることが多いのです。昔から、スーパーハッカーの間ではPythonを推す声が強いです。オープンソースの伽藍とバザールを書いたことで有名なエリック・レイモンドも、Pythonをすすめています。cruel.orgPythonはWindowsでも使えますし、Linuxを使えばまさにハッカーの仲間入りです。ハッカーの標準言語であると同時にGoogleのお墨付き言語であり、Webでもデスクトップでも、あるいはシステム開発や人工知能にも対応できます。PythonにはITの最先端技術がつまっています。Linuxハッカーを目指すものは、間違いなくPythonをやるべきです。Pythonの文法はとてもシンプルで、習得しやすい簡素なものです。そんなにたくさんの時間をかけなくても習得できます。これがC++だったとしたら、きっと初心者はすぐに迷宮から抜け出せなくなって諦めてしまいます。Perlも同様にシンプルですが、クセが強いです。Perlハッカーになるならばそれで良いですが、変な記法や書き方を学んでしまって、おかしなコードを書くようになります。そもそも、Perlは明らかにおかしな言語です。引数を$_[0]で書くようになると、人類は終わりだと思います。Pythonをはじめる上で何から知れば良いかは永遠の課題だと思いますが、とりあえず公式のドキュメントを参照すると良いでしょう。Progateなどの初心者向けのサイトもあり、プログラミングのことを本当に何も知らない人には有益でしょう。WebフレームワークのDjangoを使えば、Webサービスの開発をいとも簡単に実現できるでしょう。GUIの開発はLinuxのGTKで行うことをおすすめします。チュートリアルProgateシンプルで何でも楽にできるPythonを一言で言えば、文法が簡素・シンプルで、何でも簡単で楽にできる言語だと言えます。覚えるべき言語要素が少ないです。簡単に短時間に習得することができます。その代わり、できることは多いです。簡単に記述し、簡単に何でもできます。科学技術計算やAI・人工知能(ニューラルネットワーク・ディープラーニング・機械学習)に使われることが多いPythonですが、Webのサービスを作ったりGUIアプリケーションを作ったりする用途でもとても簡単にアプリケーションを作れます。ライバルのRubyと比べると、面白みの少ない言語です。Rubyは「楽しさ」を強調しており、プログラミングをすることの楽しさや面白さがありますが、Pythonは簡単なだけで、とてもつまらない言語です。Apple)関係で良く使われます。PythonはGoogleやFacebookなどの「アメリカの一流プラットフォーム」で使われることの多い、かっこいい言語です。人工知能やAIにおいて良く使われるのは、昔はLispでした(リスト構造のS式がプログラムとデータで共通に使われるため、「プログラムを操作するプログラム」を作りやすかった)が、最近はライブラリの整備状況などが考慮され、LispよりもPythonを使うことが増えました。Pythonは決して、つまらないだけの言語ではありません。言語仕様が簡素でシンプルなため、言語処理系の挙動や機能を把握することがしやすく、「Pythonのことを全て分かった一流ハッカー」になりやすい言語だと言えます。C++やJavaに比べても、覚えるべきことが少なく、誰でも当たり前に考えるように動いてくれます。Pythonで我慢しなさい初心者は、永遠の言語論争などを無視して、Pythonで我慢してコードを書きましょう。Pythonで書いていれば、そのうちプログラミングはできるようになります。おすすめなのは、Pythonならやはり人工知能・AIの開発です。僕の書いたロボットも参考にしてください。最初は、オブジェクト指向は「用意されているクラスを利用する」ものだと考えて、変数を定義し、変数に値を格納し、条件分岐をするところから始めましょう。そのうち、繰り返しや関数定義も覚えられると良いでしょう。Pythonの練習にはUNIXのコマンドの再実装がおすすめPythonの練習には、UNIXのコマンドの再実装がおすすめです。grepコマンドやsortコマンドなどを、自分で作ってみましょう。楽しいし、勉強にも練習にもなると思います。その次は、具体的なデータベースのデータを用意し、そのデータを分析するAIを作ってみましょう。データは、自分で自動作成しても良いですし、郵便局からダウンロードできる郵便番号のデータなどを使うと良いでしょう。それ以降は、Webフレームワークの習得がおすすめです。Djangoを使ってミニブログ(ツイッターのようなサービス)を作ってみましょう。投稿機能やフォロー機能を一通り実装しましょう。GTK+やQtを使うことでX11によるGUIプログラミングもできます。僕はWebKitGTKを使ったタブブラウザや、Lispを実行できるテキストエディタ(もちろんLisp処理系もPythonで書く)を作ると良いと思います。ほかの分野として挙げられるのは、ネットワークサーバーです。HTTPのマルチスレッドサーバーを書いてみましょう。それくらいで、あとは応用が利きます。それぐらいができるようであれば、どんなプログラムでも開発できるようになるでしょう。動的なくせに遅いPythonやRubyのいいところは、動的なところです。型宣言をつけなくても、実行時に適当に解釈してくれます。Pythonは動的なインタープリタ言語で、何でも簡単ですが遅いです。スピードや性能を考えていないのでしょう。速さが必要な時にだけC言語を使う必要がありますが、あとはPythonで全て事が足ります。今日知ったこととして、僕は作業所で仕事の合間にPythonチュートリアルを読んでいた。そこで、コーディングスタイルの話が出てきた。なんでも、Pythonでは「タブではなく空白4つでインデントを行う」ことが推奨されているとのこと。これに反して、僕のロボットのコードは、空白2つでインデントを行っている。これは、ひとえに、僕の勉強不足である。チュートリアルすら読んでいないことが分かって恥ずかしい限りである。空白2つでも問題なく動作はするが、新しいコードを書く時は空白4つを使おうと思う。Pythonチュートリアルは、簡単に読めてPythonの実際のやり方が分かる素晴らしい文書である。RustのBookなどにも「エンパワーメント」という概念が出てくるが、「概念を知ることで自由な能力をつける」という意味では最適であり、プログラマの最初に読むべきであると同時に熟練したプログラマにとっても最適な文書である。僕のように、「全てを順番通りに読むことが苦手」な人は、Pythonのチュートリアルをいきなり順番通り読むのではなく、まずどのような内容が書かれているかをざっと見て確認しながら、詳細を読み深めると良いと思う。PythonチュートリアルPythonの良いところ無料でオープンソースかつ、Windowsに簡単にインストールできるPythonの良いところは複数ありますが、まず、余計な費用もかからず、必要なプラットフォーム条件も少なく、無料でオープンソース、そしてWindowsに簡単にインストールできるほか、Linuxにはほとんどの場合標準でインストールされている、ということがあります。Studioのように、高価な代金を払って専門のソフトウェアを購入する必要もなく、全部無料です。Perl/CGIやPHPのように、サーバーを構築して自宅サーバーを運営する必要もなく、Windowsでプログラミングを行い、ローカルな環境で実行することが多いため、Linuxの知識もサーバーの運営責任も必要ありません。言語仕様がシンプルかつ、超高級言語Pythonのもう一つの良いところは、言語仕様がシンプルで覚えやすく、また、Rubyと同じ動的オブジェクト指向スクリプト言語であり、「ほとんどの処理がとても短く簡単に実現できる」ということが言えます。C/C++のような冗長な記述は必要なく、Javaのように覚えるべきことがたくさんあるわけでもないため、簡単に習得できます。機械学習という目的がはっきりしているまた、一番初心者にとっていい点が、「人工知能・AIや機械学習の用途に使う」という「プログラミングの目的」がはっきりしているところです。C/C++やJavaなどは、汎用的過ぎて目的がなく、結果「言語仕様を学ぶだけで、実際にモノを作らない」という結果になってしまいます。PHPやRubyには比較的はっきりとした「Webサービスを作る」という目的がありますが、いきなりWebサービスを外部に公開するのは、セキュリティや運営責任の観点から言って問題があります。Pythonは、機械学習というはっきりとした目標があるため、プログラミングの勉強を楽しく行うことができます。後日注記:しかしながら、僕はプログラミング初心者が人工知能から始めるのはおすすめしません。人工知能や機械学習は、プログラミングの中でも特殊な分野で、難しく、まったくプログラミングとは異なる数学的な考え方が必要だからです。初心者にはDjangoやRailsからWebサービスを構築することをおすすめします。仕事にも趣味にも使えるPythonの最後のメリットは、仕事にも趣味にも使える、ということです。エンジニアになることを将来的に目指すのであれば、PythonはJavaの次の新しいIT業界の主役言語です。世界シェアもJavaを抜いてNo.1になったはずです。Pythonができる人間は、日本国内でも活躍できるほか、海外や世界においても活躍できます。日本ローカルのRubyとはこの点が異なります。趣味でオープンソースソフトウェアを作るのであれば、PythonはLinux界でもっとも流行りの言語です。ペイントソフトのMyPaintやパッケージ管理システムのPortageなど多くのソフトウェアがPythonを使って作られています。遅いところはC言語でカバーPythonは超高級言語であるため、なんでも簡単にできますが、その代わりパフォーマンスが悪いです。C/C++と比べるとそこまで遅いと言われています。した点は、コア部分をC言語で書いてそれをPythonからインターフェースで利用する形でプログラムを書くと、C/C++に近い速度でプログラムを実行できます。インタプリタの拡張と埋め込みデータサイエンティストになれるまた、Pythonの優れた点は、最近流行りの「データサイエンティスト」という職業になれる、ということがあります。このためには、統計・解析の知識や、R言語やSQLなどの知識も必要になります。統計を勉強している数学部や社会学部の学生であれば、その学んだことをPythonで活かすことができると同時に、データサイエンティストになることで、高収入かつキャリアアップが実現できるでしょう。チュートリアルを最後まで読もうまずは、公式のチュートリアルを最後まで読むことです。やる気を高めて頑張りましょう。チュートリアル主な用途UNIX/Linuxでの中規模なシステムの開発UNIXやLinuxでの、例えばPortageやYumなどのパッケージマネージャのような、中規模の基盤システムを開発するために良く使われる。学習用途プログラミングの学習用途や教育目的として良く使われる。アメリカでは日本でのRubyがそのままアメリカでのPythonになっている。機械学習・AIの最先端技術が豊富また、最近になって増えてきた分野として、機械学習やAIの分野がある。Pythonはこれらの技術が豊富で、ライブラリなども多い。Pythonの機械学習はアメリカなどのネットでとても流行っていて、たとえば日本ローカルだが技術系SNSのQiitaでは「Python」のタグがトップになっている。(2位はJavaScript、3位はRuby、4位はRails。C/C++などははるかに下。Qiitaのプチ良記事を集めたサービスなどにランキングがあるので参照のこと。Qiita(注記:良く見ていなかったのですが、公式のQiitaにもタグのランキングがありました。AWSなどのタグも上位に入っています。)機械学習のトピックについてはQiitaの機械学習のタグを参照すると良いかもしれない。Pythonの制御フローif~else文(タブとインデントでブロックを記述する)Pythonでは、タブと空白のインデントでブロックを記述する。if~else文は以下のようになる。"more"print(test(5))字下げが文法に含まれるのは賛否両論があるが、必ずある程度美しいコードになる、ということで、Linux界でPythonはとても流行っている。if文やfor文、def文やclass文などで、どこからがコードブロックや関数やクラスの続きであり、どこが終わりであるかは必ずインデントで指定する。慣習として、インデントは多くの場合半角スペース4つにすることになっている。if文で複数の条件を分岐する時にはelifを使う。反復可能オブジェクト:となる。print(ch)となる。ここでは反復可能オブジェクトは文字列で、文字のひとつひとつ全てに対して処理を行う。文字列以外にも、リストなどからも反復できる。print(name)このように、Pythonでは他の言語におけるforeach文と同じことをfor文で行える。他の言語と同じように、回数を指定して繰り返すのであれば、range()関数を使う。Hello')ちなみに、C言語などでも使われるwhile文も使える。条件が満たされる間、繰り返しをし続ける。繰り返しを途中で抜けるのはbreak文、途中で処理を中断して次の繰り返しに行くにはcontinue文を使う。else節を使うことで繰り返し後に行いたい処理を書ける。詳しくは以下を参照のこと。@IT関数Pythonではdefで関数オブジェクトを作成できる。y呼び出す時は以下のようにする。入門を参考に執筆・引用しました。"__main__":の意味これは、そのスクリプトがコマンドラインで単独で実行された場合、__name__変数に__main__が代入されるので、その時に実行されることを意味している。要は、ライブラリとしてインポートされた場合ではなく、C言語のコマンドのようにコマンドラインから実行される時に実行される処理をここに書く。ん雑記オブジェクト指向オブジェクト指向とはPythonでいうオブジェクト指向は、オブジェクトを「自分自身」とし、メソッドを「自分自身を対象とする関数」とする。どんなメソッドを使うのであっても、そのメソッドは自分自身に対して行われる。クラスクラスを定義する時は、classキーワードを使う。・コンストラクタは__init__、デストラクタは__del__メソッドになる。・メソッドの第一引数はselfで、それぞれのインスタンスを指す(Java/C++のthisのようなもの)。第二引数からユーザー定義のパラメータが来る。・インスタンスの属性はself.nameのように「self.属性名」という形で表す。importでインポートして使う。・インスタンスを生成するのは、クラス名と同じ名前のメソッドで、newは使わない。self.age))上の内容をhuman.pyに保存して次のようにインポートする。入門を参考に執筆・引用しました。(親クラス名)と指定する。型変換とinput関数Pythonは動的だからといって、型を意識する必要が全くないわけではない。文字列の中身を数値に変換して計算したり、入力したメッセージを数値に戻して演算し、その後に文字列と結合して出力したいような場合、必ず型変換が必要となる。'だよ'print(output_msg)リストとタプルリストとタプルは良く似ていて、どちらもC言語でいう配列のように使うことができる。さまざまなオブジェクトを混ぜて入れることが出来るのが特徴。リストとタプルの違いは、記法が違い、タプルはイミュータブル(変更できない=オブジェクトidを変えずに、要素を追加・変更・削除することができない)という特性を持つ。Pythonを参考に執筆しました。)リストは[]を用いて記述するが、タプルは()を用いて記述する。値が変更できる変数のことを「ミュータブル」、変更できない変数のことを「イミュータブル」という。イミュータブルな変数束縛でも、値の参照自体は変えることが出来る。Rustや関数型言語などでも出てくる考え方なので注意しておこう。後日注記:たとえばPythonでは文字列の一部を変更することはできない。辞書Pythonでは、キーと値から成るハッシュテーブルのことを辞書と呼ぶ。')文字列の関数と機能format関数Pythonで変数の中身を表示するためには、フォーマット整形関数であるformatを使用する。x+y))以下のサイトを参考に執筆・引用しました。Qiitaformat関数の詳細format関数は、色んなことができる。これに対して、数値を指定することもできる。x+y))同じ変数を使いまわすような場合は、数値を同じにする。x-y))変数に名前をつけることもできる。'猫'}print('dogは{dog}で、catは{cat}ですよ。cat=animals['cat']))辞書を使う場合は、数値0に対してキーを設定するような使い方もできる。'猫'}print('dogは{0[dog]}で、catは{0[cat]}ですよ。'.format(animals))また、左揃え・中央揃え・右揃えとか、最低の文字幅を指定して空いたスペースを空白で埋めるなどといった使い方もできる。+や-をつけて+の場合はひとつの空白で表現するなどといったこともできる。result=x+y))ここでは、最低文字数が8で、右揃え(>が右揃え、<が左揃えを意味する)にしている。format関数で書式指定するのは比較的新しいやり方である。以前のやり方である%を使った書式指定を目にすることもある。詳しくは以下を参照のこと。@ITf文字列とr文字列また、上のformatと同じ用途に使えるものとして、f文字列がある。f文字列では、{}の中の変数が展開される。10print(f'{x}+{y}={x+y}')また、'(シングルクォート)の中では"(ダブルクォート)をそのまま書け、ダブルクォートの中ではシングルクォートをそのまま書けるが、シングルクォートの中で、シングルクォートを使ったり、ダブルクォートの中でダブルクォートを使ったりするためには、\(バックスラッシュ)をつける。Windowsのディレクトリパスなどで、バックスラッシュをそのまま使いたい場合は、raw文字列(r文字列)を使うと便利である。r'C:\python'print(path_windows)r文字列の中では、エスケープされた文字が付加的な意味を持たず、ただの文字として扱われる。トリプルクォートとdocstringまた、ヒアドキュメントのように改行を含めた文字列を表現したい場合は、トリプルクォートと呼ばれる機能が使える。'''print(help_msg)Pythonで自分以外のたくさんのユーザーが使うような関数を定義する場合、関数に説明をつける時に、docstringと呼ばれるドキュメントを作ることもある。この時、トリプルクォートを使う。文字列を置換するなどがある。Pythonでは文字列を変更することはできないため、「元の文字列をベースにして新しい文字列を作成する」といった動作になる。詳しくは以下を参照のこと。@IT日本語文字コードを使うPythonスクリプトでUTF-8を使うためには、行頭の部分を以下のように記述する。無名関数(ラムダ式)Pythonでは、無名関数(ラムダ式)を使うことで、簡単なコードブロックであれば名前をつけなくてもブロックを変数に代入して実行すべきところで実行することができる。無名関数は以下のように記述する。以下は各要素に同じ処理を施して、同じ長さのリストに全ての結果を格納してくれる、map()関数と無名関数を組み合わせた例。Pythonより引用。)ラムダ式は他の言語にもあるし、無名関数はC#では昔デリゲートと呼ばれていた。Rubyのブロックに近い。C言語でも関数ポインタを関数の引数に与えることはできる。map/filter関数map関数は、リストの各要素に処理を実行して、同じ長さのリストを返す。filter関数は、リストから条件に満たないものを削除する(フィルター)。リストの各要素を二倍します。Pythonより引用。3では以下のように書く。objectを返すように仕様が変更されたため。どこかに向かうらしい話を参考に記述・引用しました。)yield(ジェネレータ)yieldは、for文のような繰り返し処理と組み合わせて使うことが多い機能で、returnがその場で関数の実行を終了して返り値を渡すのに対して、yieldは関数の途中で一時停止して、1つずつ値を返し続けることができる。for文で使う場合は、一度の繰り返しを行う時に、次のyieldの実行までを処理し、yieldで返された値をfor文のカウントごとに代入される変数に代入する。次の繰り返しに進んだ時に、次のyieldまでを処理する。言葉で説明すると難しいが、繰り返しの中でさまざまな処理を行いたい場合に、知っておくと便利である。for文を使わずに、自分でnext()メソッドを実行することもできる。yieldはジェネレータと呼ばれる機能で、yieldがある関数はジェネレータ関数と呼ばれる。これをイテレータ(反復子)とともに用いることで、一回の繰り返しの呼び出しに対して、yieldまでを一回行うことができる。詳しくは以下のリンクが参考になる。PythonだけではなくC#でも使える。3には後方互換性がない。x」のような文は使えず、「print(x)」と書く必要がある。3で書き直したDNFなどがLinux業界でも作られている。応用Pythonでスクレイピングに挑戦スクレイピングとは、Webページの情報を取得して自動で処理を実行する技術のこと。Pythonの練習にはスクレイピングが有効である。以下のページが参考になる。侍エンジニア塾ブログ人工知能とAI人工知能・AIを参照のこと。Python標準PythonPythonについて。Wikipediaソースコードgit公式ドキュメント公式のドキュメント。ドキュメント何も分からない方は公式のチュートリアルを読みましょう。できれば本気で最後まで読みましょう。チュートリアルPythonの良いサイト@ITの連載Pythonの良いサイトはたくさんありますが、@ITの以下の連載は50回以上連載記事が続いており、入門者におすすめです。Python以外にもAI・人工知能などの記事がたくさんあります。@ITlearnpython.orgWebのチュートリアルとしては、learnpython.orgがおすすめ。コードを見ながらすぐにWeb上で実行することができ、コードを書きかえれば即座に反映され、また各章の最後に問題があって、分からない時は正解を表示しながら、気楽にPythonの基本を学ぶことができる。Progateに近い感じ。説明は英文だが逆に簡単な英語の勉強になる。TutorialPythonだけではなくJavaやHTMLなどのコースもあり、とても内容が多い。以下のQiitaのPython入門がおすすめ。簡単にPythonの全トピックが分かる。QiitaQiitaのPython/機械学習タグPythonや機械学習の記事については、ネットには膨大な情報がありますが、それを大雑把に概観するためにはQiitaがおすすめです。僕のまったく知らないような「機械学習の広大な専門領域」については、Qiitaに良い記事があるので、参考にしてください。Qiitaサンプルコードロボット以下は自分の作ったロボットのコード。ここでパターン認識(viewは見た景色の情報を返す。rb.mainloop()簡単な計算プログラム自分で作った簡単なプログラムです。攻撃力が10のキャラと、攻撃力が1だが「1ターンごとに攻撃力が1上がっていく」キャラが戦って、いつ上がっていく方のキャラが上回るか、を計算する。正確にいうと、「いつ上回るかを計算する」というより、その「上回っていく過程」を表示する。Rustで書いたコードをPythonに移植しました。3PythonでGTK+アプリケーションを作る。日本語訳もありますが、僕は英語で読むのをお勧めします。チュートリアルさまざまな実装JythonJavaによるPythonの実装。Javaコンポーネントを利用可能なため、Swing、AWT、SWTを使ったプログラムを書いたり出来る。FrameworkにおけるPythonの実装。WikipediaPythonの高速化PyPyPythonはPythonによって実装されたセルフホスティングなコンパイラ。正確にはPythonの低レベル向けのサブセットであるRPythonで実装されている。PyPyのメリットは、公式のCPythonよりもパフォーマンスが良いこと。JITコンパイル機能を主な開発目標としており、JITコンパイルによってCPythonよりも高速に動作する。場合によっては数十倍以上。QiitaCythonCythonはPythonのコードをC/C++に変換することで高速化する。静的な型を明示するなどのコードの修正が必要になることもある。数十倍以上の高速化が期待できる。CythonやNumbaに言えることとして、プログラム全体をコンパイルするよりも、ボトルネックとなっている一部の処理だけにコンパイルをかけた方がはるかに高速化のメリットが高い。PyPyなども含め、場合によっては低速化することもあるため、重要な部分だけを高速化し、また静的コンパイルだけに頼るのではなくアルゴリズムの改善も行うことが必須条件。CPUではなくメモリやI/Oのアクセスには高速化のメリットを享受できないことがある。QiitaNumbaNumbaは、Pythonの関数ごとにJITコンパイルをかけることができる。コードの修正は最低限で、数十倍以上の高速化が期待できる。QiitaRails風フレームワークDjangoPythonによる、MVCのWebアプリケーションフレームワーク。Djangoを参照のこと。FlaskPythonによる「マイクロフレームワーク」と呼ばれる軽量なフレームワーク。WikipediaBottlePythonによるマイクロフレームワーク。QiitaWebアプリケーションサーバZope古くから存在するPythonによるWebアプリケーションサーバ。Wikipediaマイクロコントローラ向けMicroPythonデスクトップ向けのCPythonよりも制限の厳しいマイクロコントローラで動くPython。Wikipediaパッケージ管理システムpippipはPythonのパッケージ管理ツール。パッケージのインストールが簡単にできる。Linuxのパッケージ管理システム。DNF/YumDNF/Yumは、Fedoraのパッケージ管理システム。MyPaintMyPaintは、オープンソースのペイントソフトウェア。PythonPythonチュートリアルPythonのチュートリアル。GTK+PythonでGTK+3を使う。ドキュメント余談Pythonはヘビが好きPythonと言う単語は、英語では「ニシキヘビ」を意味する。Pythonの科学技術計算用のライブラリを含むディストリビューションには、Anaconda(アナコンダ)という名前がつけられている。これには、Pythonの作者がヘビが好きだったわけではなく、「空飛ぶモンティ・パイソン」と呼ばれるコメディ番組が元になっている。現在ではPythonの公式マスコットはヘビになっている。Pythonのタブとインデントによるブロックの構文(オフサイドルール)には批判もあるが、元々はABCと呼ばれる教育用言語が元になっている。Pythonの作者グイド・ヴァンロッサムもABC言語の開発にかかわっていた。