Pythonの開発環境を作っていろいろ試してみました。
結論から述べると、非常に開発環境づくりも簡単(数分)だったし、特に設定もなく始められたのはびっくりしました。
「開発始めるには環境づくりも含めてjavascriptが一番簡単じゃね?」と思っていましたが、改めて比べてみて面白い事実に気づかされることとなりました。
まとめると
- 数行実行させる程度ならどちらも大差ない
- ちゃんと学ぼうと思うと実はjavascriptのほうが環境構築って大変?
という感触でした。
異論はもちろんあるとおもいっていますので、それも含めて参考にどうぞ。
まずは"Helloworld"まででざっくり比較
Python
ダウンロード
https://www.python.org/downloads/からダウンロード
インストール
ダウンロードしたインストーラ(※2021/6現在 python-3.9.5-amd64.exe)を実行。
設定
不要
編集ツール
Python実行(Python IDLE実行でも可)
実行
「Run」をクリック or F5
javascript
ダウンロード
不要(Edge)
インストール
不要
設定
不要
編集ツール
Edgeの「開発者ツール]にあるコンソールに直書き!(Ctrl + Shift + I)
実行
Enter
ダウンロード~インストール
Python
Pythonはダウンロードとインストールの手間がありますが、特にデフォルトのままでOKなので困ることはないはず。
javascript
javascriptはブラウザで動きますので、通常WindowsならEdgeやchromeが入っているだろうということでダウンロードもインストールも不要です。
設定
どちらも特に必要ないので引き分け。
実行!
Python
Pythonはインストールされたこれを起動します。
※ここではjavascriptとの比較のため(javascript操作=コンソール)コレを起動しましたが、すぐ下で紹介しているPythonインストール時に一緒にインストールされたIDLEを使っても構いません。
print("hello world.")
javascript
実はEdgeやChromeの開発者ツール(Ctrl+Shift+i)を出し、そのコンソールでjavascriptを記述し実行できるようです。知りませんでした!
”html中にJSを書いてブラウザで開く・・”とやりたくなりますが、これでいけるんですね。
console.log("hello world.")
複数行の実行は?
どちらも複数行のコードを実行する場合は、Shift+Enterで改行され、次の行のコードが記述できます。
"Helloworld"程度の確認じゃ優位性はほとんど感じられない?
Pythonのほうがインストールの手間がありますが、"HelloWorld!"の表示や簡単な処理の確認、関数の実行など、どちらも非常に簡単にできるため優位性は無いように思いました。
それだけPythonを始めるのは非常に簡単!
と感じられました。
さらに、上記にあったようにPythonにはIDLEというIDE(統合開発環境=開発ツール)も一緒にインストールされるので、さらに色々試すのも簡単にできます。
PythonIDLE?開発環境?
IDLEはPython用の統合開発環境であり、マルチウィンドウ型のテキストエディタである。バージョン1.5.2b1以降のPythonに標準で付属している。
ウィキペディア
コレを起動します。
この通り、「Python」で起動したコマンド画面と同じことができ、さらに.pyファイルの生成したりデバッグ実行もできます。素晴らしい。
ちゃんと色々書いてみたい!
「HelloWorld!」を出すのはもちろん
- 変数や関数ってどうやるの?
- if文やfor文などの制御文ってどう書くの?
- 自分でクラスとか作りたいんだけど。
- ファイル操作は?
- 他のライブラリとかどうやって使えるようにできるの?
と、いろいろ試す必要性が出てきます。
ではやっていってみましょう。
pythonのコーディングについて
先に、javaやjavascriptなど携わっている方は書き方の作法について特に違和感があるかと思います。まだ網羅できていませんが、今の段階でコレだけはつかんでおけば大丈夫・・・だろう、というのを残しておきます。
java等 | python | |
ブロック({}) | {}の範囲 | インデント(tab文字ではなく、半角空白4文字) ※PythonIDLEや通常のエディタはtabキーを押せばOKなので特に意識しなくて大丈夫。 |
ifやforの行 | ブロックを同じ行(次の行でもいい)につける。 ない場合は省略として、次行が範囲となる。 | コロン(:)をつける 複数行の場合はかっこ(())でくくれば、カッコ内は改行可能 |
booleanのtrue(真) | true | True |
まずは簡単な使い方
Windowsの場合、起動するには
さっきと同様にすぐ試せます。
print("hello world.")
複数行も
Shift+Enterで実行せずに次の行の入力ができるようになります。
Enterを押せば実行されます。
コード補完も
入力途中でTabを押せばこのようにコードを提案してくれます。
pyファイルを作ろう
このままコンソールで書いて試すのもできるんですが効率が悪いので、pyファイルを作ってこれに書き込んで実行していきます。
右上のFile->New Fileをクリックすると、untitledという空のpythonファイルができます。
このままここに記述して「Run」を押せば実行できます。
これでコンソールで書いていくよりずいぶん楽になったはずです。
保存
個人的にはこの時点で名前を付けて保存しておくことをお勧めします。
名前や保存先がどこでもいいというのもうれしいところですね。
「Save As」を押して保存先が聞かれますので、保存しておきます。
保存先は、Cドライブ直下にWorksフォルダを作り、そこにプロジェクト別(今回は"python")フォルダを作るようにしています。その中にsample.pyという名前で保存します。
こんな具合に.pyファイルができて開かれたことがわかります。
実行
書き込んだら保存して「Run」もしくは「F5」を押せばすぐ実行できます。
コンソール側に「このファイルが実行され、こんな結果(出力)があった」ことが表示されます。
================== RESTART: C:/Works/Project/python/sample.py ==================
HelloWorld!
>>>
以降、このsample.pyに書き込んで実行していきます。
ちなみにコンソールで書き続けるのはお勧めしない
関数を記述する際はインデントを空けて実装を書くのですが、よく見ると>>>がなく”今引数内部の実装をしているよ”ということが分かるようになっています。
インデントがなくせば実行可能だろう、と思って下記のように実行させるとエラーになります。
エラーはシンタックスエラー。つまり記述ミス。
さらにShift+Enterを行うと、>>>が現れるので、ここで定義した関数を記述します。
>>> def hoge01():
print("hoge01")
hoge01()
SyntaxError: invalid syntax
うーん、やっぱり.pyファイルを作ってやるのがいいですよ。
基本編
HelloWorld!
さて定番をやってみましょう。
さっき作成したsample.pyに書き込んで実行(F5)していきます。
print("HelloWorld!")
================== RESTART: C:/Works/Project/python/sample.py ==================
HelloWorld!
>>>
変数
型の指定もなく、PHPのように「$」も不要でシンプルに書くだけです。
a = 1
print(a)
================== RESTART: C:/Works/Project/python/sample.py ==================
1
>>>
ちなみに
数値型を入れて、文字列を入れ直してもいけました。
a = 1
print(a)
a = "hoge"
print(a)
================== RESTART: C:/Works/Project/python/sample.py ==================
1
hoge
>>>
型について
型の概念が緩いのは個人的にエラーの温床にもつながるので注意が必要です。
このように組み込み型というもので定義できますので、開発環境によっては宣言された型以外のものを入れると警告が表示されるようになるようです。(調査中)
a: bool = True
print(a)
================== RESTART: C:/Works/Project/python/sample.py ==================
True
こんなこともできちゃいます
最初はbooleanを変数aに入れていましたが、"hoge"という文字列が入りました。
a: bool = True
print(a)
a = "hoge"
print(a)
================== RESTART: C:/Works/Project/python/sample.py ==================
True
hoge
>>>
関数
"def"キーワードをつけ、半角スペースを空けて 関数名() です。
引数があれば()内にカンマで分けて入力( 例(arg1,arg2))は。型の指定や戻り値の指定がないのでjavascriptと同じようにシンプルですね。
あれ?ブロック({})は?
インデント(半角スペース4つ分)で段下げした区間がブロック内を示します。
IDLE上でタブキーを押しても正しいインデントが挿入されました。
def hoge01():
print("hoge01")
hoge01()
=================== RESTART: C:/Works/Project/python/main.py ===================
1
>>>
クラスのメソッドの場合は要注意
python特有のルール:クラスのメソッドはselfを第一引数に書く必要があります。クラスのところで詳しく書きますね。
戻り値
特に気にせず、return するだけです。これも戻り値の型を書くことはありません。
def hoge():
return "hogehoge"
a = hoge()
print(a)
================== RESTART: C:/Works/Project/python/sample.py ==================
hogehoge
>>>
コンソールの場合の戻り値とprintについて
コンソールで戻り値がある関数を引き受ける引数無しで実行した場合、こんな風にした場合、戻り値が結果として表示されます。
>>> hoge()
'hogehoge'
if文やfor文
いわゆる制御文たちはこのように書きます。色々便利な書き方もあるようです。
if
丸かっこ()は基本不要です。複数行に分けて(Andでつなぐ場合など)はかっこをつけます。
a = 1
if a > 0:
print("over")
================== RESTART: C:/Works/Project/python/sample.py ==================
over
>>>
elif(else if) や else
elifと書き、else if と書くわけではないので要注意!
a = -1
if a == 0:
print("is 0")
elif a > 10:
print("over 10.")
else:
print("other")
a < x < b (比較演算子)
Pythonにはこれができます。
x = 3
if 0 < x < 10:
print("between.")
for
"for(var i=0; i<10; i++)"のように書くことが多かったかと思いますが、range関数を使ってfor文で展開します。
for num in range(5):
print(num)
================== RESTART: C:/Works/Project/python/sample.py ==================
0
1
2
3
4
>>>
そのほかのrange
この書き方は、3以上7未満の範囲で展開されます。
for num in range(3, 7):
print(num)
================== RESTART: C:/Works/Project/python/sample.py ==================
3
4
5
6
>>>
この書き方は、0以上8未満の範囲で3つ毎で展開されます。
for num in range(0, 8, 3):
print(num)
================== RESTART: C:/Works/Project/python/sample.py ==================
0
3
6
>>>
配列をfor
いわゆるforeachとして、for文で要素を展開することもできます。javaみたいですね。
values = ['val1', 'val2', True,4]
for value in values:
print (value)
================== RESTART: C:/Works/Project/python/sample.py ==================
val1
val2
True
4
>>>
Dictionaryをfor
キー配列を展開すると、展開された値をprintするとキーが表示されるようです。
values = {"key1":1, "key2":2, "key3":3}
for value in values:
print (value)
================== RESTART: C:/Works/Project/python/sample.py ==================
key1
key2
key3
>>>
Dictionaryはkeys()という関数を持っていますので、これを使うとキーを配列で返されます。
for文でキーを展開する方法はこういう形。
values = {"key1":1, "key2":2, "key3":3}
for value in values.keys():
print (value)
================== RESTART: C:/Works/Project/python/sample.py ==================
key1
key2
key3
>>>
values()という関数も持っていて、これは値を配列で返すのでfor文で展開するとこういう形になります。
values = {"key1":1, "key2":2, "key3":3}
for value in values.values():
print (value)
================== RESTART: C:/Works/Project/python/sample.py ==================
1
2
3
>>>
switch
Python3.x時点では無いようです。
とはいえ、pythonにブロック記号がない分、if文でswitchライクに完結に書けますので無くても何ともなります。
while
評価がTrueならループを繰り返すのがwhile。これも記述のルールに馴染めれば特に問題ありませんね。
num = 0
while num < 10:
print(num)
num+=1
================== RESTART: C:/Works/Project/python/sample.py ==================
0
1
2
3
4
5
6
7
8
9
>>>
++ -- のインクリメント、デクリメントは使えない
こうなるので、num+=1 や num-=1 と書く。
continue、breakは?
10未満の中でループするwhile中にbreakとcontinueを試してみました。
num = 0
while num < 10:
print(num)
num+=1
================== RESTART: C:/Works/Project/python/sample.py ==================
0
1
2
3
4
5
6
7
8
9
>>>
break
5でブレイクさせ止めるように書くとこのようになります。
num = 0
while num < 10:
print(num)
if num == 5:
break
num+=1
================== RESTART: C:/Works/Project/python/sample.py ==================
0
1
2
3
4
5
>>>
continue
5の時にcontinue以下の処理をでスキップさせ、次のループに続かせます。
つまり、5の時はprint(num)が実行されないので、結果から5が抜けているのがわかります。
num = 0
while num < 10:
num+=1
if num == 5:
continue
print(num)
================== RESTART: C:/Works/Project/python/sample.py ==================
1
2
3
4
6
7
8
9
10
>>>
無限ループになったら
コンソール画面でCtrl+Cを押すと、こんな具合に止められます。
C#のLinqやJavaのstreamみたいな処理は?
LINQと同じ処理をPythonのリストで行うを参考させてもらいました。
ここでは「使える」ということだけ知ってください!
モジュール、クラスを使おう(あとパッケージも!)
モジュール
これまで作ってきた「.py」ファイルがモジュールと呼ばれます。この中に変数やクラスなどを書き込んでいきます。
javaを例にするとクラスというとファイル:クラスは1:1(クラス名を付けたファイルを作成し、中には1つのクラス)というイメージがありますが、モジュール内に幾つも定義してかまいません。
クラス
pythonにもクラスはあり、継承など一般的なことができます。
定義
class MyClass:
# メンバ変数定義
name = ""
# 引数なしメソッド
def getName(self):
return self.name
# 引数ありメソッド
def setName(self, name):
self.name = name
a = MyClass()
a.setName("hogehoge")
print(a.getName())
================== RESTART: C:/Works/Project/python/sample.py ==================
hogehoge
>>>
メンバ変数
クラス内に変数定義すれば完了です。(メソッド内に変数定義したものはローカル変数なのでメンバ変数とは違います)
メンバ関数(メソッド)
第一引数に必ず"self"という引数を定義させるのが特徴です。
javaやC#でメソッド内で使われるthisを明示的に引数で引き受けるよう記述させて使用させるというイメージです。
使用箇所ではselfについて意識せず、上の例のように使用します。
パッケージ
javaのパッケージやC#の名前空間のように、pythonにもパッケージというものがあり、複数のモジュールをまとめ、使用できるようにする仕組みがあります。
要は、フォルダを作りその中に__init__.pyというファイルを置く だけです。
__init__.pyの中身は空でも大丈夫。
そのフォルダの中にモジュールの.pyファイルを置けば、ひとまとめのパッケージとして提供できるようになります。
使う側はこんな具合。
モジュールが一つの場合はこのように省略してimportできるように、__init__.pyに記載することができます。
ファイル操作してみる
ここでは簡単に「フォルダの中のファイルを一覧する」やり方を説明します。
こちら(Python3入門 フォルダ内のファイル一覧を取得する方法)から参考させていただき、少しこのサイト用に変えてみました。
現在のファイルのある階層(フォルダ)内にあるファイルをすべて取得する。
import glob
files = glob.glob("./*")
for file in files:
print(file)
このように取得できました。
================== RESTART: C:/Works/Project/python/sample.py ==================
.\sample.py
>>>
このやり方を発展させていけば
- 特定の名前のファイルをXXXしたい。
- ファイルを開いて、中に書かれているものを分析したい
等々、できるようになっていきますね。
ライブラリのインポート
初期状態でも一般的なものはほとんど必要なものが入っているので困ることはないと思います。
Pythonには機械学習など便利なライブラリが非常に豊富にあるのが特徴です。
これを利用できるようにするには、まずPythonに目当てのライブラリをインストールする必要があります。それにはpip("Pip Installs Packages" または "Pip Installs Python"の略)を使います。
こちらのサイトを参考させていただきました。
pipの確認
この通り、WindowsではPythonをインストールしただけではコマンド(PowerShell)で”pip”と入力して実行してもこの通り実行できません。パスを通せばできるようなのですが、別の方法でできるのでそちらを試します。
PS C:\Works\Project\python> pip
pip : 用語 'pip' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません。
名前が正しく記述されていることを確認し、パスが含まれている場合はそのパスが正しいことを確認してから、再試行してください
。
発生場所 行:1 文字:1
+ pip
+ ~~~
+ CategoryInfo : ObjectNotFound: (pip:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
PS C:\Works\Project\python>
そのため、このようにやります。
pyコマンド
PowerShellを立ち上げて"py"コマンドを使います。
py --version
なぜ"python"ではなく"py"コマンドなのかは、こちら(WindowsユーザーはPythonランチャーの存在を意識しましょう)に詳しく書いてありました。
自分のPythonがどこに入っているのか確かめるには?
"py"コマンドでも特に通常不都合ありませんが、もし"python"コマンドを使えるようにするには"python.exe"をパスに登録します。"python.exe"の場所はPythonIDLEで探せるので、これをやりましょう。
"import sys"を入力したら、Shift+Enterで"sys.exec_prefix"を入力してEnterです
>>> import sys
>>> sys.exec_prefix
'C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\Python37_64'
>>>
pyコマンドでバージョン確認
pyの後に半角スペースをいれ"--version"と入力し、Enterでこのように確認できます。
PS C:\Users\user> py --version
Python 3.9.5
pipのバージョン確認
で、本題のpip。
pyの後に半角スペースをいれ"-m"と入力し、さらに半角スペースを入力後"pip"と入れます。
上記と同じように後に半角スペースをいれ"--version"と入力し、Enterでこのように確認できます。
py -m pip --version
pip 21.1.1 from C:\Users\user\AppData\Local\Programs\Python\Python39\lib\site-packages\pip (python 3.9)
pip をアップグレード
では以下のコマンドを同じ要領で実行し、pipをアップグレードしておきます。
py -m pip install --upgrade pip
古いバージョンを使っていると、このようなメッセージが表示されるようです。
これは次のインストール済みライブラリ一覧取得のコマンドを実行させた際に出たメッセージです。
PS C:\Users\user> py -m pip list
Package Version
---------- -------
pip 21.1.1
setuptools 56.0.0
WARNING: You are using pip version 21.1.1; however, version 21.1.2 is available.
You should consider upgrading via the 'C:\Users\user\AppData\Local\Programs\Python\Python39\python.exe -m pip install --upgrade pip' command.
21.1.1を使っているけど、21.1.2があるよ
と、いうことみたいですね。
インストール済みライブラリ一覧
インストールされているライブラリの一覧が表示されます。
py -m pip list
PS C:\Users\user> py -m pip list
Package Version
---------- -------
pip 21.1.2
setuptools 56.0.0
ライブラリのインストール
新しいライブラリのインストールはこのコマンドでできます。
py -m pip install ライブラリ名
pythonといえば機械学習なので有名どころのNumPyを入れてみます。
numpyをインストール
py -m pip install numpy
PS C:\Users\user> py -m pip install numpy
Collecting numpy
Downloading numpy-1.20.3-cp39-cp39-win_amd64.whl (13.7 MB)
|████████████████████████████████| 13.7 MB 181 kB/s
Installing collected packages: numpy
WARNING: The script f2py.exe is installed in 'C:\Users\user\AppData\Local\Programs\Python\Python39\Scripts' which is not on PATH.
Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
Successfully installed numpy-1.20.3
改めて確認
py -m pip list
入っているライブラリを確認してみると”numpy 1.20.3”が入ったのが確認できました。
PS C:\Users\user> py -m pip list
Package Version
---------- -------
numpy 1.20.3
pip 21.1.2
setuptools 56.0.0
もっとちゃんと書いてみよう
エントリーポイントを使う
エントリーポイント(プログラムの開始点)が分かったほうがわかりやすいかと思います。
cやjavaなどの慣習を例にとり、main.pyというエントリーポイント用のファイルを作り、その中にmainメソッドを作り、そのメソッドが実行時のすべての起点として実行させるようにします。
main.pyファイルを作成
main.pyという名前で保存します。
"if __name__ == "__main__":" 内でmainを実行させる理由は、こちらを参照させていただきました。
Pythonファイルは、必ずnameという属性を持ちます。そのファイルがプログラムとして起動されると'main'が値として代入されます。つまり、name == 'main'が成立する時は、プログラムとして起動しているので、main()を実行します。
Pythonスクリプトの書き方(4パターン)
なお、以下のようにif name == 'main':のブロックに実行部分を入れるパターンもよく用いられますが、前述の危険性もあるので、main()関数を用いる方が好ましいです。
def main():
print("my program was started!")
if __name__ == "__main__":
main()
=================== RESTART: C:/Works/Project/python/main.py ===================
my program was started!
>>>
よくある間違い
実行(F5)したらこのメソッドが実行されるよ、だからこのメソッド内に実行したい処理を書こうというと、単純に考えても差し支えはありません。
なので、
- mainというメソッドを定義する
- そのメソッドを実行できるようにする
- 今まで書いてきたような実装(HelloWorldのような)をmainの中に書く
と考えて実装します。
ただ、定義(先)と実行(後)の順番を間違えることはよくありますので気を付けて。
例1:何も起きない(宣言だけだから)
def main():
print("my program was started!")
Run->Run Module F5 をクリックします。
※保存していない場合はダイアログが出ますので、保存しましょう。
何も出ない・・・。「mainっていう関数があって、実行すると文字列を返すよ」と定義しただけだから、使っているわけではありません。
だから何も出ないのです。
例2:実行が定義より先
上記に続いて、「定義だけしかなかったので実行を書いた。」わけですが、これは以下のようにエラーが起こります。
main()
def main():
print("my program was started!")
=================== RESTART: C:/Works/Project/python/main.py ===================
Traceback (most recent call last):
File "C:/Works/Project/python/main.py", line 1, in <module>
main()
NameError: name 'main' is not defined
上から順に実行されるので、実行された時点で"main"メソッドが定義されていないため、"not define = 未定義"と表示されます。そのため、以下のように定義後に、"main"を実行させるようにします。
def main():
print("my program was started!")
main()
================== RESTART: C:/Works/Project/python/sample.py ==================
my program was started!
>>>
※ちなみにクラスの場合はメソッドの定義箇所と実行箇所の順番は関係ありません。
pythonに限った話ではなく、クラスは設計書なので、設計書の上や下のどの位置にクラスのメソッドがに書いてあっても、お互い同じ設計書上に書かれているから別に問題ないからです。
まとめ
Pythonはインストールするだけで、IDEも入ってこれらのことがサクサク試せます。
直ぐに実行できる環境も整っているので、ちょっとしたことならサクッと書いて、サクッと解決できるほど。ライブラリも豊富なのでその幅も非常に広いから発掘しがいもありますね。
ずいぶん出遅れましたが、Pythonを楽しんでいこうと思います!
一家のパパです。ものづくりが好きでいつも何か作っています。
コメント