Python
Pythonの仕組み
Pythonの歴史
Pythonが最初にお目見えしたのは1991年、作者であるグイド=ヴァンロッサムがソースコードを公開した0.9です。その後、3年の期間を経て、1994年1月にPython 1.0がリリースされました。基本的な型の概念やオブジェクト指向など、Pythonの基礎となる構文は、このバージョンですでに実装されています。
よく名前が聞かれるようになったのは2000年10月にPython 2がリリースされてからです。Unicode(1.5.1項)、ガベージコレクション(オブジェクトを解放するための仕組み)などが導入され、Google、Yahoo!、InstagramなどのサービスがPythonを採用したのも、この時期
Python利用用途
- 機械学習を使った人工知能の開発 → Pythonがライブラリが充実しているため
- 自動データ処理や分析などの業務効率化 → 自動データ処理に関しては別でもできる。分析はPythonが強いか
- スクレイピングによるWEB上の画像データ・テキストデータの自動収集 → スクレイピングは結局WebDriverを使うためどれでもいい
- WEBサービス・WEBアプリケーション制作 → 日本だとRubyやPHPが強い。わざわざPythonでやるのであればAIなどの活用がしたいなど
- スマホアプリ(Android)制作 → できるのか、Kotlinが強いけど
- デスクトップアプリ制作 → これはWindows?
- 組み込みアプリケーション制作 → C++が強いはず
メルカリでの利用用途 機械学習を用いたマイクロサービスでは研究・実験段階で用いたPythonのライブラリをそのままプロダクションでも使用したいなどといった理由でPythonをメインの言語に採用することが増えています。使用したいライブラリにはデータの前処理パイプラインを記述するもの、自然言語処理や画像処理を行うもの、C++などで記述されたライブラリのPythonラッパー、場合によってはモデルのサービングを行うものなどが挙げられるかと思います。
Python コードスタイル
- Pythonインデント インデントはタブまたはスペースで行うが、スペース何文字分というルールは決まっていない。 コーディング規約では4つが推奨されている。
Pythonのサードパーティ事情
一般的なプログラミング言語は、アプリを開発するための便利な道具と共に提供されている。 このような道具のことをライブラリと指す
Pythonをインストールするだけで、それこそファイルの読み書きからデータベース操作、ネットワーク通信、GUIアプリ開発など、さまざまな機能を即座に実現できるのです。
PyPl(Python Package Index)とは
サードパーティ製の拡張ライブラリに至っては、標準ライブラリの比ではありません。たとえばPythonには、サードパーティによる拡張ライブラリの集積場とも言うべきサービスとして、PyPI(Python Package Index)があります Pythonを導入すれば、これらを無償で利用できるわけです。
中でも、機械学 習、ディープラーニング(深層学習)などの分野のライブラリが潤沢である点はPythonの強み
Pythonのversion管理
asdfやpyenvがある
参考URL asdfが有名っぽい
pyenvがanyenvから使えるため、それを使用する またnodeのようにlocalでversion分けができる。
Pythonの環境構築
Python自体がanacondaなど、構築自体がめんどくさい。そのためDocker構築がいいと言われている。 あとは仮想環境でやるとか言っていた気がする...。
Pythonのパッケージ管理ツールとは
pipが代表格 pipはPythonで書かれたパッケージソフトウェアをインストール・管理するためのパッケージ管理システム 多くのPythonパッケージは、Python Package Index上にある。
またパッケージには
- 公式が配布しているもの
- サードパーティが配布しているものがある。
サードパーティのパッケージはPyPIというサイトで配布されている。 PyPl
Pythonのライブラリ(pipについて)
Pythonのライブラリは主に以下の3種類となる。 site-packagesはJSでいうnode_moduleと一緒
- 標準ライブラリ
- site-packagesディレクトリ(pip installでインストール)
- ユーザ別site-packageディレクトリ(pip install --userでインストール)
Pythonが読み込むライブラリの場所を知りたい場合
$ python
Python 3.9.10 (main, Feb 24 2022, 22:46:36)
[Clang 13.0.0 (clang-1300.0.29.30)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path
['', '/Users/tanakanaohitoshi/.anyenv/envs/pyenv/versions/3.9.10/lib/python39.zip', '/Users/tanakanaohitoshi/.anyenv/envs/pyenv/versions/3.9.10/lib/python3.9', '/Users/tanakanaohitoshi/.anyenv/envs/pyenv/versions/3.9.10/lib/python3.9/lib-dynload', '/Users/tanakanaohitoshi/.anyenv/envs/pyenv/versions/3.9.10/lib/python3.9/site-packages']
>>>
site-packages ローカルインストール
site-package インストール確認
$ pip show flake8
グローバルインストール
$ pip install xxx # グローバルインストールされる
# /Library/Python/2.7/site-packages
# 全アカウント共通で使用する、所謂グローバルな場所にインストールされてしまう。
ローカルインストール
AWS Lambdaでpythonランタイムを選択した際に、lamdaに標準インストールされていないモジュールを追加インストールする場合もローカルインストールする事になるので、この辺は覚えておくと色々と便利そうです。lambdaの件は以前以下の記事を書いたので、合わせてご覧下さい。
pythonの型付け
Pythonに型ヒントが入った。 VSCodeではPylanceという拡張機能で対応する(MicroSoft製)
pythonの型付け歴史
Python 3.7で採択されたPEP 561 Distributing and Packaging Type Information EP 561以前は主にtypeshedを通じて,標準ライブラリ・サードパーティーの型情報が配布されていました
各型について
3.8と3.9での書き方 listなどについてはPython3.8までと3.9で変わっている 従来のtypingを使う方法が非推奨になり、組み込み型を利用する方法が推奨になっています。
Python3.8の書き方
from typing import Dict, List, Tuple
val_e: Dict[str, int] = {'size': 12, 'age': 24}
val_f: List[str] = ['taro', 'jiro']
val_g: Tuple[str, int] = ('name', 12)
Python3.9の場合
val_e: dict[str, int] = {'size': 12, 'age': 24}
val_f: list[str] = ['taro', 'jiro']
val_g: tuple[str, int] = ('name', 12)
- 定数 Python3.8からFinalがデフォルトで使用できるようになってます。定数(再代入不可)を定義することで、再代入されないようにできる。
from typing import Final
TABLE_NAME: Final[str] = 'sample'
- 定数にはtupleを積極的に使う listとtupleは同じような機能があるので、ついついlistを使いがちですが、tupleの方がメリットが多い場合があるので紹介します。 listの場合、内部の情報を書き換えることが可能ですが、定数として定義するものは、内部の情報を書き換えられることを望まないことがほとんどです。そのような場合はtupleで定義すると内部情報が変更される心配がありません。
Python3.8の場合
from typing import Final, Tuple, List
# tupleなので変更不可
NAME_TUPLE: Final[Tuple[str, str]] = ('taro', 'jiro')
# listは変更可能
NAME_LIST: Final[List[str]] = ['taro', 'jiro']
NAME_LIST[0] = 'saburo'
Python3.9の場合
from typing import Final
# tupleなので変更不可
NAME_TUPLE: Final[tuple[str, str]] = ('taro', 'jiro')
# listは変更可能
NAME_LIST: Final[list[str]] = ['taro', 'jiro']
NAME_LIST[0] = 'saburo'