こんにちはヤク学長です。
データサイエンティスト兼ファーマシストで、アルゴリズムやBI開発を行っています。
本記事の目的は、「pythonの基本操作を知る」ことを目的としています。
【本記事のもくじ】
まず、「Python」に真剣に取り組むための概要を解説します。
下記の方法で、簡単に概要を抑えることができます。
- 1.モジュール、パッケージ
それでは、上から順番に見ていきます。
なお、本上記の方法を抑えれば成果が出ます。
記事の内容は「転載 & 引用OK」問題ありません。
1.モジュール、パッケージ
コマンドライン引数
コマンドライン引数とは、コマンドラインからスクリプトに渡される引数のことです。
これらは、スクリプト内で sys.argv というリストからアクセスすることができます。コマンドライン引数は、スクリプトを実行する際に、スクリプト名の後に続けて渡すことができます。
以下は、コマンドライン引数を使った例です。
# sample_script.py
import sys
print("Number of arguments:", len(sys.argv))
print("Argument List:", str(sys.argv))
このスクリプトを実行するために、ターミナルで次のように入力します。
$ python sample_script.py arg1 arg2 arg3
実行結果は次のようになります。
Number of arguments: 4
Argument List: ['sample_script.py', 'arg1', 'arg2', 'arg3']
この例では、sys.argv リストにはスクリプト名と引数が含まれています。
Import文とAS
import
文は、Pythonで他のモジュールをインポートするために使用されます。
以下は、標準ライブラリのmath
モジュールをインポートする例です。
import math
このモジュール内の関数や変数は、次のように使用することができます。
x = math.pi
y = math.cos(x)
また、import
文のas
キーワードを使用することで、モジュール名を別名に変更することができます。これは、モジュール名が長い場合や名前が他のモジュールと重複する場合に有用です。
以下は、math
モジュールを別名m
としてインポートする例です。
import math as m
このモジュール内の関数や変数は、次のように使用することができます。
x = m.pi
y = m.cos(x)
絶対パスと相対パスのImport
Pythonでは、モジュールをインポートする際に絶対パスと相対パスの両方を使用することができます。
絶対パスは、モジュールが存在する絶対的なファイルシステムパスを指します。これは、他のパソコンや環境で同じモジュールを参照することができます。
以下は、絶対パスを使用してモジュールをインポートする例です。
import /path/to/module
相対パスは、現在のスクリプトから見た相対的なファイルシステムパスを指します。これは、現在のパソコンや環境に固有の設定を必要とします。
以下は、相対パスを使用してモジュールをインポートする例です。
import ./module
また、以下は、現在のパッケージからの相対パスを使用してモジュールをインポートする例です。
import .module
注意:モジュールが見つからない場合は、ImportError
が発生する可能性があります。
アスタリスクのインポートと__init__.pyと__all__の意味
- アスタリスクのインポート:
from module import *
で、モジュール内のすべてのグローバル変数と関数をインポートすることができます。しかし、慣用的には避けられるべきであり、明示的なインポートの方が好ましいとされています。 __init__.py
: これはモジュールに含まれる Python ファイルです。このファイルは、モジュールが初めてインポートされたときに実行されます。このファイルによって、モジュール内で定義される変数や関数、サブモジュールなどが定義されます。__all__
: これはモジュール内にある変数です。これを使用すると、from module import *
のときにインポートされるものを制御することができます。__all__
にリストとして定義された名前のみがインポートされます。
以下は、 __init__.py
の使用例です。
# my_module/__init__.py
def greeting(name):
return "Hello, " + name
message = "Welcome to my module"
# my_module/sub_module.py
def func1():
return "This is function 1"
def func2():
return "This is function 2"
このモジュールは以下のようにインポートされます。
import my_module
print(my_module.greeting("User"))
# Output: Hello, User
print(my_module.message)
# Output: Welcome to my module
from my_module import sub_module
print(sub_module.func1())
# Output: This is function 1
print(sub_module.func2())
# Output: This is function 2
以下は、 __all__
の使用例です。
# my_module/__init__.py
def greeting(name):
return "Hello, " + name
def say_goodbye(name):
return "Goodbye, " + name
__all__ = ["greeting"]
このモジュールは以下のようにインポートされます。
from my_module import *
print(greeting("User"))
# Output: Hello, User
try:
print(say_goodbye("User"))
except NameError:
print("say_goodbye is not defined")
# Output: say_goodbye is not defined
ImportErrorが発生したときの対処法
PythonのImportError
は、インポートしようとしたモジュールが見つからない場合に発生します。以下は、ImportError
が発生した場合に試すべきいくつかの対処法です。
- モジュール名を確認する:インポートしようとしているモジュール名が正しいかどうか確認してください。モジュール名のタイプミスや誤ったパスを指定すると、
ImportError
が発生することがあります。 - パスを確認する:インポートするモジュールがPythonパスに含まれていることを確認してください。Pythonパスに含まれていない場合は、以下のいずれかを行う必要があります。
- モジュールが含まれているディレクトリをPythonパスに追加する。
- モジュールが含まれているディレクトリに移動し、相対インポートを使用する。
- 依存関係を確認する:インポートしようとしているモジュールが依存しているモジュールがすべてインストールされているかどうか確認してください。必要な依存関係が欠落している場合は、それらをインストールする必要があります。
- Pythonのバージョンを確認する:Pythonのバージョンが古い場合、一部のモジュールが使用できないことがあります。Pythonの最新バージョンにアップグレードすることを検討してください。
これらの対処法のうち、多くの場合、モジュール名やパスを確認することで問題が解決することがあります。しかし、依存関係が問題の原因である場合、解決するのは難しい場合があります。その場合は、該当する依存関係を解決する方法を調べる必要があります。
Setup.pyでパッケージ化して配布する
setup.py
は Python パッケージを作成、配布するために使用されるスクリプトです。このスクリプトには、パッケージのメタデータ(名前、バージョン、説明など)、依存関係、インストールスクリプトなどが含まれます。
以下は、簡単な setup.py
の例です。
from setuptools import setup, find_packages
setup(
name="my_package",
version="0.1",
description="My package description",
packages=find_packages(),
install_requires=["numpy", "matplotlib"],
classifiers=[
"Development Status :: 3 - Alpha",
"Intended Audience :: Science/Research",
"License :: OSI Approved :: MIT License",
"Programming Language :: Python :: 3",
],
)
このスクリプトを使用して、以下のようにパッケージを作成、配布することができます。
$ python setup.py sdist
$ pip install dist/my_package-0.1.tar.gz
このように作成されたパッケージは、PyPI(Python Package Index)などで配布することができます。
【Pycharm】
PyCharmでsetup.py
を使用してPythonパッケージを作成し、配布する手順は以下の通りです。
- プロジェクトを作成する:PyCharmで新しいプロジェクトを作成し、必要なファイルやコードを追加します。
setup.py
ファイルを作成する:プロジェクトのルートディレクトリにsetup.py
ファイルを作成し、以下のようにファイルを編集します。
from setuptools import setup, find_packages
setup(
name="your_package_name",
version="1.0.0",
packages=find_packages(),
install_requires=[],
author="your_name",
author_email="your_email",
description="description of your package",
classifiers=[
"Programming Language :: Python :: 3",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
],
)
setup()
関数の引数には、パッケージ名、バージョン、依存関係などの情報を含めることができます。これらの情報は、パッケージを配布する際に重要な役割を果たします。
- パッケージをビルドする:PyCharmのターミナルで、
setup.py
ファイルがあるディレクトリに移動し、以下のコマンドを実行します。
python setup.py sdist bdist_wheel
これにより、dist
フォルダにパッケージのソースディストリビューション(.tar.gz
ファイル)とバイナリディストリビューション(.whl
ファイル)が生成されます。
- パッケージを配布する:パッケージを配布する場合、
dist
フォルダから適切なディストリビューションファイルを選択し、配布先にアップロードします。
これらの手順を実行することで、PyCharmでPythonパッケージを作成し、配布することができます。
組み込み関数
Pythonには標準で組み込まれている、いくつかの関数があります。これらの関数は、組み込み関数と呼ばれます。
いくつかの例を示します:
print()
:文字列や変数の値を出力します。len()
:リストや文字列などの要素数を返します。min()
:リストやタプルなどの中で最小の値を返します。max()
:リストやタプルなどの中で最大の値を返します。abs()
:数値の絶対値を返します。sum()
:リストやタプルなどの数値の要素を合計します。type()
:変数や値の型を返します。
これらは標準ライブラリとして用意されていますので、特別なインストールなどは必要ありません。
よく使われるPythonの組み込み関数sort()
とsorted()
、get()
について、それぞれの使い方と具体例を以下に示します。
sort()
sort()
は、リストをソートするための組み込み関数です。sort()
はリスト自体を変更し、ソートされたリストを返します。sort()
にはいくつかのオプションがあり、ソート順やキーの指定が可能です。
例えば、以下のようにリストをソートすることができます。
fruits = ["banana", "apple", "orange", "grape"]
fruits.sort()
print(fruits)
出力結果:
['apple', 'banana', 'grape', 'orange']
また、sort()
にはreverse
オプションを指定することで、逆順にソートすることもできます。
fruits = ["banana", "apple", "orange", "grape"]
fruits.sort(reverse=True)
print(fruits)
出力結果:
['orange', 'grape', 'banana', 'apple']
sorted()
sorted()
は、リストやイテラブルオブジェクトをソートした新しいリストを返すための組み込み関数です。sorted()
にはいくつかのオプションがあり、ソート順やキーの指定が可能です。
例えば、以下のようにリストをソートすることができます。
fruits = ["banana", "apple", "orange", "grape"]
sorted_fruits = sorted(fruits)
print(sorted_fruits)
出力結果:
['apple', 'banana', 'grape', 'orange']
sorted()
にはreverse
オプションを指定することで、逆順にソートすることもできます。
fruits = ["banana", "apple", "orange", "grape"]
sorted_fruits = sorted(fruits, reverse=True)
print(sorted_fruits)
出力結果:
['orange', 'grape', 'banana', 'apple']
get()
get()
は、辞書から指定されたキーの値を取得するためのメソッドです。もしキーが存在しない場合、指定されたデフォルト値を返します。
例えば、以下のように辞書から値を取得することができます。
fruits = {"banana": 300, "apple": 200, "orange": 150}
print(fruits.get("banana"))
出力結果:
300
また、以下のように存在しないキーを指定した場合、デフォルト値を返します。
fruits = {"banana": 300, "apple": 200, "orange": 150}
print(fruits.get("grape", 0))
出力結果:
0
ここでは、辞書に存在しない”grape”というキーを指定していますが、get()
メソッドは、第2引数で指定されたデフォルト値である0を返します。
標準ライブラリ
Pythonには標準で提供されているライブラリがあります。これらのライブラリは、Pythonインストール時に含まれています。
標準ライブラリは、様々なタスクを実行するための機能を提供します。例えば、文字列操作、データ構造、ファイル操作、HTTP通信など。
標準ライブラリを使用することで、多くのタスクを簡単かつ高速に実行することができます。また、標準ライブラリは安定しているため、問題がなく動作することが保証されています。
いくつかの例を示します:
os
:OSに関連する機能を提供します。sys
:Pythonインタープリタに関連する機能を提供します。math
:数学関数を提供します。json
:JSON形式のデータの読み込みと書き込みを提供します。re
:正規表現を使用した文字列操作を提供します。
標準ライブラリは、以下のようにインポートすることができます。
import os
import sys
import math
import json
import re
サードパーティのライブラリ
Pythonには標準で提供されていないが、独自に作られた外部ライブラリがあります。これらのライブラリは、サードパーティのライブラリと呼ばれます。
サードパーティのライブラリは、標準ライブラリではないが、多くのタスクを簡単に実行するための機能を提供します。
いくつかの例を示します:
numpy
:数学と科学計算に関連する機能を提供します。pandas
:データ解析に関連する機能を提供します。matplotlib
:グラフ描画に関連する機能を提供します。scikit-learn
:機械学習に関連する機能を提供します。
サードパーティのライブラリは、pipやcondaなどのパッケージマネージャを使用してインストールすることができます。インストール後、以下のようにインポートすることができます。
import numpy
import pandas
import matplotlib
import sklearn
Pythonには、標準ライブラリのcollections
モジュールに含まれるdefaultdict
というクラスがあります。defaultdict
は、辞書型のサブクラスで、指定されたキーが存在しない場合にデフォルト値を返す辞書を作成することができます。
以下に、collections
モジュールとdefaultdict
クラスの使い方について説明します。
collectionsモジュールのインポート
collections
モジュールをインポートするには、以下のようにimport
文を書きます。
import collections
defaultdictの使い方
defaultdict
を使うには、まずcollections
モジュールからdefaultdict
クラスをインポートします。その後、以下のようにdefaultdict
を作成します。
from collections import defaultdict
# デフォルト値を指定する場合
d = defaultdict(int) # int型のデフォルト値0が設定される
# ラムダ式を使ってデフォルト値を指定する場合
d = defaultdict(lambda: "unknown")
defaultdict
は、通常の辞書と同じように、[]
演算子を使って値を格納・取得することができます。ただし、存在しないキーを指定した場合にデフォルト値が返されます。
# int型の場合
d = defaultdict(int)
d["key1"] = 10
d["key2"] = 20
print(d["key1"]) # 10
print(d["key2"]) # 20
print(d["key3"]) # デフォルト値の0が返る
# ラムダ式を使って指定する場合
d = defaultdict(lambda: "unknown")
d["key1"] = "value1"
d["key2"] = "value2"
print(d["key1"]) # "value1"
print(d["key2"]) # "value2"
print(d["key3"]) # デフォルト値の"unknown"が返る
defaultdict
を使うことで、存在しないキーにアクセスする際にKeyErrorを回避することができます。また、ラムダ式を使うことで、値の型に応じたデフォルト値を指定することもできます。
importする際の記述の仕方
Pythonでライブラリをインポートする際の記述方法は以下の2つあります。
- ①全てのエレメントをインポートする:
import library_name
この方法では、library_nameライブラリのすべてのエレメント(関数、クラス、変数など)をインポートすることができます。
- ②選択的にエレメントをインポートする:
from library_name import element1, element2, ...
この方法では、library_nameライブラリからelement1、element2などの選択されたエレメントをインポートすることができます。
以下は例を示します:
# numpyライブラリから全てのエレメントをインポート
import numpy
# pandasライブラリからDataFrameとSeriesをインポート
from pandas import DataFrame, Series
# matplotlibライブラリからpyplotをインポート
from matplotlib import pyplot
# sklearnライブラリからsvmをインポート
from sklearn import svm
スクリプトが読み込まれるときの注意点
__name__と__main__
__name__
はPythonの変数で、モジュールに割り当てられている名前を表します。特別な場合として、特別な変数__name__
には、プログラムが実行されたときに自動的に”main“が割り当てられます。
__main__
は、Pythonのスクリプトが直接実行されたときに実行されるスクリプト内の一部として使用されます。スクリプト内の他の部分からインポートされた場合、__name__
はモジュール名に設定されますが、スクリプト内で実行されると、__name__
は”main“に設定されます。
以下は例を示します:
# example.py
def some_function():
print("Function has been called.")
print("The name is:", __name__)
if __name__ == "__main__":
print("The script is being run directly.")
some_function()
else:
print("The script has been imported.")
実行すると次のようになります:
$ python example.py
The name is: __main__
The script is being run directly.
Function has been called.
別のスクリプトでexample.pyをインポートすると、次のようになります:
# other_script.py
import example
print("The name is:", __name__)
実行すると次のようになります:
$ python other_script.py
The name is: __main__
The name is: example
The script has been imported.
というわけで、今回は以上です。大変大変お疲れ様でした。
引き続きで、徐々に発信していきます。
コメントや感想を受け付けています。ちょっとした感想でもいいので嬉しいです。
それでは、以上です。