機械学習のときはpythonを使います。
理由はライブラリが充実しているから。行列計算が楽で助かります。
画面を作ることはあまり無いです。
出来ないわけではないですが、他の物で作った方が簡単なので、わざわざpythonで作ることは無いです。
質問には無いことですが、Linuxでちょっとしたプログラムを作るときはpythonで書きます。
- Linuxに大抵インストールされている
- コメントがシェルスクリプトと同じ#(シャープ)なので組み合わせて使うときに楽
機械学習・データサイエンスの分野で主に分析をする方にとって、Pythonがスタンダードになりつつあるようです。企業のデータサイエンティスト募集要項にはかなりの割合でPythonが含まれます。なぜかというとnumpy, pandas, scikit-learn, TensorFlowのような優秀なライブラリ群が揃っているからです。
正確には、これらのライブラリ自体すべてがPythonで書かれているわけではありません。実は下位の実装はC++等、別のより高速な言語で書かれています。
出来ることとしてはその他にもたくさんあり全ての列挙は出来ませんが、 科学技術系の一部 (scipyスタック等を幅広く使う) 、サーバサイドのバッチ処理プログラム(bashやperl相当として使いやすい他、Linux, Windows 双方いけます)、Ruby on RailsのようなWebアプリケーションのサーバサイド (DjangoやFlask等を使います)、GUIプログラム (kivy等を使います)、画像処理 (OpenCV) やCSV・Excelの処理 (『退屈なことはPythonにやらせよう』という書籍がこのあたりに強いです)、ラズパイ等の上で動かすプログラムを書く、etc.
「出来ないこと」というのは難しいですが、Webアプリ (HTML5とかそういう領域) ではブラウザで直接Pythonが動作しませんので使えません。モバイルフロントエンドの領域でも勢いがあるとは言えません (確か、kivyからアプリに変換できますがメジャーではありません)。
また、Pythonのみでメモリ効率や速度を意識する領域 (「組み込み」など) のプログラムを書くのはC/C++/Rust等と比べると著しく不得手です。Pythonはそれらの高速な言語を「呼び出す」というときにちょうどよいバランスで使える言語として採用される傾向にあり、冒頭の機械学習系、科学技術系のライブラリの実際の下位実装はC++等が多いのかな、という印象です。
「できる」という概念からすれば、そもそもチューリング完全な言語であれば「できる」(計算可能な問題)ことは同じです。プログラミング言語のほとんどはチューリング完全なのでできることは同じと言えます。
Pythonはいわゆるグルー言語なので、プロトタイピングやライブラリを応用(接着)するというのは得意分野と言える。現に、データサイエンスや機械学習などでは、ライブラリそのものを開発するわけではなく、予めCやC++で作られたライブラリを組み立てて使うのが大半なので、Pythonには向いています。
なんでもできます。
Pythonで書かれたソフトウェアは数え切れませんが、Wikipediaにある程度は載ってます。
List of Python software - Wikipedia
ちなみにQuoraもPythonで書かれています。
DjangoというWEBフレームワークを使えばデータベースがあるWEBアプリを作れますし、標準ライブラリのTkinter や外部ライブラリのkivyなどを使えばデスクトップアプリも作れますし、化学計算にも適していて、その上ライブラリが豊富なので人工知能も作れます。できないことはOSを作るとかぐらいだと思います。Pythonが最適というものはWEBアプリ、分析、人工知能のあたりじゃないですかね?なんせ GUIの場合処理が遅いので
得意なこと、不得意なことはどの言語でもあるが、
どのプログラム言語からもOS(オペレーティングシステム)の機能を使うライブラリーにはアクセス出来る。そのライブラリー自体に出来不出来は多少ありますが、基本的にはOSが認めてる操作は全部出来るんですよ。
先ず、プログラム言語が先行して開発されて、OSを操作するライブラリーが整えられます。これはどの言語でも同じです。そのライブラリーが網羅する機能によって出来ること出来ないことがあるけど、これもサードパーティもライブラリーを開発していたりするんで、全部把握することは不可能です。
だから何が得意で何が不得意かという問いにはお答え出来ます。
Pythonが得意とするのは柔軟な開発環境の提供です。
文法が簡単明瞭で初心者に優しいのに、熟練ハッカーたちの琴線にも触れる様な特徴を持った言語です。
何が出来るかではなく、Pythonを使って何がしたいか?ですよ。
したいことが決まればGoogleの検索窓に
- 「Python」「WEB開発」とか
- 「Python」「機械学習」とか
- 「Python」「ゲーム開発」とか
で検索すれば良いのです。あとは検索結果からやりたいことに近い記事をクリックするだけです。
私見ですが、
言語はぶっちゃけ何でもいい、と思ってる人は多いかと(慣れはありますが)
使えるライブラリの数でしょう。
Pythonは正直遅いんで、業務用なアプリに使う気はしません。ただ、ライブラリが強力。
なので、C++で書かないと処理がヤバイかな、、と思うものでなければPythonでいいと思います。
WebもまぁOKなんで、PHP、JavaでやるんならPythonにします。
Railsやら今更、だし。みたいな。
ただ、簡単な機能でほんとにさく、っと動かしたい時には、DOSバッチやらBASHで作ったほうがいい場合もありますし、Excelでやりたい事があるなら、VBAも正直すてたもんではない、と思います。
TPOはそれぞれかと。
少し発想を転換した方が良いかも知れません。先に進むには全てを理解している必要はないのだ、と。
プログラミング言語で構文や文法を学ぶというのは、英語で言えば単語を覚えただけのような状態って言えばいいですかね。英会話でも辞書を丸暗記するような勢いで単語を覚える必要がないのと一緒で、プログラミング言語でも一番基本的なよく使う、ifだのforの書き方や使い方を確実に押さえる方に時間を使いたいです。いつ使うかわからないようなものは、使う機会が巡って来た時に調べれば間に合います。
先日自分用に書いた測定基板を動かすPythonのコードで使ったPythonの標準命令は、10個以下だと思います。あとは外部モジュールの関数たちがいろいろ登場しますが、それは使う機会が巡って来たら系のものなので、学習目標としてはスルーされるでしょう。そんな程度でも実用になるプログラムが書けます。
それにプログラムっていうのは結局、コンピュータにやらせたい処理をコンピュータに分かる形で表記したものです。もちろんそれは各プログラミング言語の文法なり構文に則って記述しなければ即エラーになるわけですが、文法・構文の理解は書き間違い系のエラーを出さない方法を理解したに過ぎません。処理の記述方法の理解は全くもって別物であり、文法・構文をいくら勉強したところで理解できません。
処理の記述方法の理解は、いろんなプログラムを見て、簡単なものからパクってきて動かして…という積み重ねで覚えるしかないです。
Pythonの構文を完全に理解する定義は何でしょうね? 言語だけではなく、Pythonを使っていろんな事を実現する事が大事です。例えば、顔認識、顔識別、ドローンを使って配達するとか、そういった事をプログラミングできるかと言うことが重要で、完全に理解したとしても、実際にアルゴリズムだったり、よりスマートな設計だったり、やることが極めて広いので、言語とその周辺を大局な観点がないとただの学者でしかない。
プログラミングが不慣れな方はどうしてもプログラミング言語の文法を理解しないとソフトウェアの開発は難しい、と思い込みがちな方が多いように見受けられます。
でも考えてみて下さい。英単語を全て覚えないと英語が喋れないわけではないですよね?日本語だって、日本人が全ての漢字を知っているわけではありません。
なので、さすがにHello worldだけでは厳しいですが、基本的な構文(代入、条件比較、繰り返し)を理解したら次のStepに進みましょう。わからないことはその時に調べる方が効率的です。
・人工知能開発
・デスクトップアプリの製作
・WEBアプリの製作
・ネットから情報の自動取り寄せ
・Androidのアプリの開発というのを聞いたことはあるが経験がないのでわからない
・ローカルサーバー構築
・ゲーム作成(しかしこれは Pygameというゲーム作成するためのライブラリを使っても2Dのファミコンのようなゲームしか作れないためオススメできない。だが、 PythonはC言語系と連携できるので、描画や動作処理はC#などにしてイベント処理等を Pythonで行うのは良いかもしれない)
「プログラミング経験が皆無の人」が一番最初に学ぶ言語には最も良いと思います。
未経験者にとって初めてのプログラミングは衝撃の連続です。
- 馴染みのある言語と一線を画する「プログラム言語」
- 人間が無意識にできるような計算さえも厳密なロジックとして書き込まないといけない一種の面倒臭さ
- 人間と違って融通の効かないコンピュータは些細なタイプミスも許されない厳密さ
こういった他に類を見ないプログラミングそのものの基本的な概念を学ぶ必要があります。
これに加えてさらに言語自体の構文まで複雑だとどうでしょう。
例えばJava。
- public class HelloWorld{
- public static void main(String[] args){
- System.out.println("Hello World!!");
- }
- }
Hello World!!
という1文を出力するだけのプログラムでこの分量。はっきり言って3行目以外要らないと思いませんか?
こういった「ノイズ」に気を取られながら基礎概念をも学ぶのは非常に非効率的です。
Pythonのシンプルで可読性に長けた構文は初心者からこうした言語特有問題の学習コストを取り除き、「プログラミングそのものの基礎」に集中させてくれます。
基礎を習得しロジックを組み上げられるようになれば、あとは各言語でどう記述するか。構文や記法の学習に注力するステップです。
まとまったスクリプトを書くこともある身からすると、基本的には
- 対話的に処理する場合:クイックにパッケージなどを使って所定の希望の分析を逐次行う
- スクリプトを書いて回す場合:システムとしての一貫した処理を行う
という切り分け方かなと思っています。なお、僕はRユーザーでもある(というかそちらの方がメイン)なので、Pythonの対話モードを見るとRを思い出します。PythonでRのような使い方が出来るようにしたのがJuPyter Notebookという認識です。
私見ですが、
とりあえず、パッケージ使わず、def classも使わず、適当に分岐のある十数行を書いて動くのを作れればOKかと。
IFとかFORとかなんとなく使えてればいいかと思います。
IFとか、FORとか何?ってのは、Pythonの基本文法というより、プログラミング全体に通底する基礎なので、そこは学んだほうがいいかとは思います。
A2A。
Pythonistaとしては複雑ですが、結論、学ぶべきであるとは言えません。
AIや機械学習、数値計算を手軽にやりたい人はPythonを学ぶべき(他にも選択肢はありますが)と言えるでしょうが、需要のない人は学ばなくていいでしょう。あくまでも言語ですしね。
Pythonは完全にオブジェクト指向で設計されていることを知らないプログラマーが多いんです。
例えば
- a = 1
というコードを書いたとします。
一般的なスクリプト言語では a という整数型変数を用意して、整数値 1 を代入する。という処理を行います。
Pythonでは 1 という整数型(クラス)のオブジェクトを作り、 a というリファレンスで紐づけするという、関数型ではなく完全にオブジェクト指向型の処理を行うのです。
だからリスト型のオブジェクトの中に複数の型を混在させたり、階層化するのも容易でとても柔軟性が高い設計が可能なのですが、こういうオブジェクトを介したデータのやり取りではキチンとしたドキュメントをプログラム内に書いておかないと混乱が生じると思います。
だけど、普段からPythonを使っている人達は、このドキュメントを作ることが当たり前化しているPython環境でコードを書く人が多いのでそんなに困ったことにはなりません。
Pythonについて、世間の評判は知りませんが、クラスやオブジェクトがカンタンにできること、インデントで構造が作れるところは簡潔でいいなあーと思うのですが、私が難しいなあーと思うことがあります。
x_wage = 150000 # xさんの給料、15万円
y_wage = x_wage # yさんの給料、xさんと同じ
x_wage += 30000 # xさんの給料が3万円上がった
print (y_wage) # yさんの給料、15万円のママ(当たり前)
a_spec = [180, 150000] # aさんのスペック、身長180センチ、給料15万円
b_spec = a_spec # bさんのスペック、aさんと一緒だった
a_spec[1] += 30000 # aさんの給料が3万円上がった
print (b_spec[1]) # bさんの給料(なぜか一緒に上がっている!?)
あと、リストはミュータブルなのに対して、タプルはイミュータブルだが、タプルの要素にリストを入れるとタプルもミュータブルになるところも難しいです。
異端児みたいな実装が多いからではないでしょうか。インデント問題とかうんざりします。
試しにPOSシステム的なもの作成してみてはどうでしょうか? GUI ソケット通信 計算 変数 関数 全て学べますよ
ひたすらプログラムを書くことではないですか。あとは調べて試してみる。
このようなオンライン学習システムがあります。
PyQ - 本気でプログラミングを学びたい人の、Pythonオンライン学習サービス
Aidemy | 10秒で始めるAIプログラミング学習サービスAidemy[アイデミー]
PythonでKaggleに挑戦するのも面白いでしょう。
競技プログラミングで腕を競って磨くのも面白いと思います。
Design & Build High-Quality Software with Crowdsourcing | Topcoder
- ドキュメントを読みましょう。これは言語に関する知識をふくらませる上で最も過小評価されていることです。よく文書化されている問題について何人が私に質問してくるか数え切れません。
- 最も人気のあるライブラリを学びましょう、なぜそれが作られたのか、どのように動作するのか。(例: Flask、Django、requests)
- 並行コードを書いてみましょう、スレッド、プロセス、それらがどのように動作するか、それらのPythonにおける弱点について学びましょう。
- ソケット、ネットワークライブラリ、非同期機能について学びましょう。
- scipyとnumpyについて少し学んでみましょう。
- インタプリタについて、それらがどのように動作するのか、なぜPythonには多くの異なる実装があるのかを学んでみましょう。(PythonそのものはC言語ではなく英語で書かれています、最も一般的な実装としてははC言語ベースのインタプリタですが)。これは非常に重要な概念です。
- Pythonのエコシステムについて学びましょう。少なくともまだメモ帳でコードを書くような通にならないでください。PyCharmを学んでみましょう。PEP8について学び、PIP、setuptools、virtualenvについて学びましょう。
- Pythonと共に欠かせない存在について学びましょう。Dockerコンテナや、UWSGI、Gunicorn、NGINXといったあらゆるものです。
- Googleからヒントを学びましょう。ラムダ関数やデコレータ、ディスクリプタ、イテレータ、ジェネレータ、メタクラスについてです(Adrian Carpenter に感謝しましょう!)。こんな感じのワンライナーについてもです。"python -m http.server"。
- バグだらけのコードをたくさん書いてみましょう。
これで準備は完了です。幸運をいのります :)
沢山の実用的なライブラリがあることが、Python の特徴の一つかと思います。
そして、インタプリタならではの「トライ・アンド・エラー」のサイクルの速さが、ちょっとしたツールの開発を加速します。
昔で言えば、perl や awk, sed が受け持っていた領域を、パワフルに実現してますね。
モダンなインタプリタはかくあるべし、という事を知ることが出来て良かったです。
#昔、仕事でインタプリタを作っていたので、特にその思いは強いですね。
基本的には、LISPからマクロ機能を取り除き、他のオブジェクト指向言語に似た構文を採用し、ブロックをインデントで表現する言語と考えればよいかと。
最初に習うべきかと言われると、疑問がある点が多いが、便利な言語ではあるね。
自由度が高い。これはある意味リスクを抱える。変数の概念がなく、値に型があってラベルを付けて管理するあたりは、昔の機械語ニーモニックのコーディングスタイルに近いものがある。
新旧の要素が混ざった様な面白いプログラム言語
プログラム言語自体の研究の素材としては最高です。目的は無いけどなんとなくプログラム言語に触ってみようという目的ならPythonはベストチョイスになる。
日本にある多くの開発現場でやってる様な仕様を先にガチガチに固めて、確実に動くプログラムを作るのならPythonじゃなくJavaの方が良い。業務システムならJavaだね。
Pythonはどちらかというとプログラマーのアイデアをそのまま形にするという使い方に向いている。研究者やベンチャー企業によく使われる。
Googleも設立当初はPythonの少ないコードで動くプログラムを作れる点に着目して急速にサービスを増やした会社として有名ですね。
どの言語を押さえるべきかは、プログラミングスキルをどの方向に生かすつもりかを確定した後で考えるべきことです。
どのプログラミング言語にも向き不向きがあり、どのようなソフトウェアを開発する必要があるかによって使うべき言語は変わります。そして、ひとつプログラミング言語をマスターすれば、他の言語の習得はそれほど難しい話ではありません。
pythonをそれなりに理解したという自信が得られたのなら、次は、プログラミング言語自体の勉強よりも、アルゴリズムとか数学とか論理学とか、そういうのの理解を深める勉強をした方がいいと思います。
Pythonで代表的なWebアプリケーションフレームワークであるFlaskで、Webアプリをデバッグモードで開発サーバで起動すると、例外時にブラウザ画面にスタックトレースが表示されます。
そこまでは普通です。
驚くのはここからです。
ブラウザで表示されているスタックトレースの各行の右端に、ちいさなターミナルのアイコンが表示されています。何の気なしにクリックすると、起動時にコンソール側に表示されるDEBUG PIN値というものの入力プロンプトが表示されるので、入力してみると。
あれ不思議、ブラウザに表示されているその例外行の直ぐ下が、REPLとして入力可能になって、スタックトレースのその段階でのスコープでの、各変数の値や、式の計算やメソッド呼び出しができます。
初めに知らずにやって見たときはびっくりしました。
理想のデバッグ方法ぢゃないか。
たぶん、JupyterでもやっているようなPythonインタプリタとブラウザの接続をデバッガインターフェイスでやってるんでしょうが、これはすごい便利。デバッグ効率が格段に高まります。
日常的に Pythonを使ってソフトウェア開発を行っているものです。自分が一番クールだと思っているのはC言語のように変数宣言や関数宣言がなく関数を作りまくったり使いまくったりできるのでC言語やJavaで作るような複雑なソフトウェアでも簡単に作ることができるという事とC/C++が使えるというとこです。
Pythonには内包表記というループをまとめる機能があります。
通常のlistは次のように表現できます
- extension_1 = []
- for i in range(10):
- extension_1.append(i)
- extension_1
- #>>> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
これを内包表記に変換すると2行でかけます
- comprehension_1= [i for i in range(10)]
- comprehension_1
- #>>> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Bioinformaticsと言う分野をご存知でしょうか?
名前の通り生命現象を情報科学的に扱う分野です。代表的なものとして類似DNA配列の検索ですとか、遺伝子の機能予測ですとか、タンパク質の立体構造予測ですとか、あるいはタンパク質ータンパク質相互作用解析など様々なテーマがあります。私が10年前に生命科学分野の学生であったときからすでに非常にメジャーな分野でした。
同様にChemoinformaticsというより化学よりの分野もあります。
ですのでPythonを用いた統計分析や機械学習の技術は生命科学にも多いに役に立ちます。いちどBioinformaticsのジャーナルなどを読んで雰囲気を知っておくといいでしょう。
「パイソンらしさ」といえば, やはり破壊的な力でしょう。
特に, インドネシアに生息するパイソン (アミメニシキヘビ python reticulatus) は, 最大で約10mにも及ぶ個体がいたそうです。パイソンの手口は, 獲物にかみついた直後に長い身体で巻きつき, 締め付けるのです。かつては, 巻きつくことで獲物を窒息死させると考えられていました。
「冷血動物に比べると哺乳類のほうが持久力があるから, 3分間を耐えれば大丈夫」と考える人がいたかもしれませんが, それは間違いです。2015年あたりから, 新たな説が出てきました。破壊的な力で締めつけることによって心臓を止めてしまうというのです。うまく締め付ければ数秒で死に至ってしまうらしいので, 持久力もなにもありません。殺された獲物は丸呑みされてしまうのです。実に恐ろしいです。
大型のパイソンが, 人やヒョウを捕食したとの例もあるそうです。
丸呑みですよ... 恐怖ですね...
やはりアホ歩き、にトドメを刺します。
Python プログラミングの基本ルール (The Zen of Python)
を読んでみて下さい。
Python を完璧に学ぶことは不可能です。日本語だって漢字を完璧に書けますか?無理でしょう。必要になったら調べたらいいのです。プログラム言語だってそれと同じで基本的なことを学んで、あとは必要になった時に勉強すればいいのです。
Python の基本的なことは、人にもよりますが、3ヶ月もあれば学習できると思います。でも、それを本当に使えるようになるためには、年単位の訓練が必要です。サッカーのようなスポーツでは、一流選手であっても、常にトレーニングをしています。プログラミングだってそれと同じで、変化の多い分野なので常に新しいことへのトレーニングが必要です。トレーニングができなくなった時が辞める時です。
どの程度習得したいのかとあなたのレベルと努力によります。
基本的な言語仕様だけなら1日1時間で一週間あれば習得できると思います。
次の1週間でやりたいこと(GUIやWebスクレイピングなど)を習得すれば最短半月でPythonを習得できます。
その後は使っていくうちにどんどん上達していくはずです。
三日でも余裕。
言語の習得だけの話なので、別途プログラミングが出来ると言う前提ですが。
0 コメント:
コメントを投稿