とまと あんらいぷ…

エンジニアの活動記録とかつぶやきとか

GitHub
スポンサードリンク

Python 実践的なimportの書き方

WindowsでPython シリーズ その22



Python モジュール定義の基礎の基礎でimport処理の基礎をやったけど、多分実践では使えない。

というわけで、今日はモジュールのimport処理についてまとめます。

別ディレクトリのimport方法


main.py を作って、そこから子ディレクトリのモジュールを呼び出します。
階層は以下の通り。
main.py

└─【util】
   │ custom_print.py
   │
   └─【calc】
        math.py

【】でくくられているのがディレクトリです。
main.pyから、utilのcustom_print.pyと、さらに子改装にあるmath.pyを呼び出します。

それぞれのファイルは以下の通り
math.py


custom_print.py


main.py


実行結果
Python 別ディレクトリのimport方法
解説
import キーワードで別階層のモジュールを呼び出したい場合は「.」(ドット)で区切ります。
さらに子階層の場合は同じように「.」(ドット)をつなぎます。
importしたモジュールを呼び出したい場合も同じようにimportした名前をドットでつなぎます。
うん。使いにくい。

実際に使えるimport宣言


importの書き方を試してみたけど、いちいち
util.custom_print.write_line(util.calc.math.add(1,2))
なんて書いてられない。
長すぎる。

というわけで、Pythonにはimport宣言方法が色々あるんだけれども
コレだなという書き方をメモしておきます。

import処理の書き方


実行結果
Python 使えるimportの書き方

多分この2つの書き方が一番いい。
解説
2つの書き方をしたので解説します。
from (モジュール名『ファイル名』) import (関数名) as (別名)

from util.custom_print import write_line as printline


このように書くと、特定のファイルから、どの関数を、こんな名前で呼び出す宣言ができる。
対して

import (モジュール名『ファイル名』) as (別名)

import util.calc.math as math

と書くと、特定のファイルを別名で呼び出すことができるという指定になる。

前者の方は、モジュールの中の特定の関数を宣言する。
後者の方は、モジュールをのものを別名で宣言する。

という挙動になっている。

モジュール(ファイル名)の位置が、fromの後ろかimportの後ろかで異なっていることは注意したい。

このように定義することで

util.custom_print.write_line モジュールのwrite_lineを printline として呼び出しているし
util.calc.math モジュールをmathの別名で指定し、その中の関数を呼び出すことができる。

まとめてimportする方法


ちなみに、import文はカンマで続けて書くことができる。
import file1, file2, file3
こんな感じ。
個人的には明確に何をimportしているかひと目で分かるようにしたいのでimport文は改行して全部書いた方が良い気がします。

importの大切さ


同じファイルに処理を書きすぎると人間の脳味噌がついていかないから、
それなりの規模のプログラムをする場合にファイルを分ける。
その場合、import無しというのは考えられない。

というわけでこの処理は非常に大切です。

今回はmain.pyが最も上流階層に存在する場合の例を書いたけど、それもそんなわけには行かない場合がありますね。
次回は親階層に存在するモジュールのimportを記載します。
では!

Python モジュール定義の基礎の基礎

WindowsでPython シリーズ その21


前回の例外処理で、一通りPythonのヨチヨチ歩きは終了したと思う。

今回はモジュール定義について記載する。
モジュール定義と呼び出し方には様々あるが、色々使いすぎるとよくないので
今回は基礎中の基礎だけを記載します。
諸々の書き方は次回。

モジュール定義


クラス定義ファイルみたいなもんです。
Pythonではモジュールのまとまりをファイルにして、別ファイルでそれを呼び出すことができます。
まずはモジュール定義

Pythonのラムダ式 sorted関数でタプルや辞書型を並べ替える で作った、printと同時に改行を出力する関数を
print.pyというファイルに作成し保存しました。


この関数は、他のファイルで呼び出すことができます。
importキーワード

キーワードはimport


import文には、ファイル名を記載します。「py」は必要ありません。
importした「print」に対して「.」(ドット)を入力すると、importしたファイルの関数を呼び出すことができます。

Python モジュール定義の基礎の基礎

モジュール定義「print.py」には2つの関数が定義されていて、それをモジュールとして呼び出し
実行している結果が確認できるかと思います。

それにしてもprintというのは、Pythonデフォルトの予約後なので、
できれば他の言葉を使う事をおすすめします。

ではでは。

Pythonの例外処理を知る

WindowsでPython シリーズ その20


Pythonの例外処理について学びます。
Pythonは予期せぬエラーが発生するとそこで処理が止まります。
それでは都合が悪いので、例外処理の定義をしていきます。

もちろん詳しくはマニュアルのエラーと例外を参考に!

例外の基本形




実行結果
Pythonの例外処理を知る

Pythonにおける例外の基本構文は「try: ~ except:」です。
whileで無限ループさせて、正しい入力が合った場合にbreakしてます。
サンプルコードでは3回処理をしました。

1回目は0除算
2回めは値を入れない
3回目でやっと答えを出しています。

これが例外の基本形。
ただ実際にはこんなコードは使えない。

例外の内容や詳細を知る


「try: ~ except:」は例外処理の基本形ですが、例外の内容が分からないし、何が悪いのかサッパリ。
というわけで、実用的なコードは例外処理の内容を知ることから始まります。



実行結果
Pythonの例外処理を知る

解説します。
except Exception as err:

例外を処理する時、except Exception as err: としています。
as err のerr部分は好きに定義できます。
この例では err に例外情報がセットされ、どんな例外タイプなのか、どのような例外内容なのかを知ることができます。

例外のelse: 句

try: 句のbreakを削除し、else:に breakと書いています。
else:は、try:で例外が発生しなかった時のみに実行されます。
よって、このコードでは例外が発生しない入力があった場合のみ、ループ処理を抜けるようにしています。

esle;句は正直いらないかもしれない。
だってtry:の最後に処理を書けば、実質例外が起こっていない証拠だから。

例外のfinally: 句

finally: は、例外があろうが無かろうが必ず実行されます。
よくある構文です。

実行結果の通り

1回目は0除算   → 0除算例外で再入力を促す
2回めは値を入れない → タイプ相違例外で再入力を促す
3回目でやっと答え

となってますね。

例外の種類ごとに処理を変える


例外機構のあるプログラム言語なので、当然ながら例外の種類によって後続の処理を変えることができます。
次の例では、発生した例外タイプ毎に処理を分けています。



実行結果
Pythonの例外処理を知る

例外の種類はコチラの組み込み例外を参考にしています。

捕まえている例外は以下の3通り。
ZeroDivisionError
ValueError
Exception

Exceptionだけは、全ての例外の基底のため、何があっても例外を補足します。
この例ではArithmeticErrorとなっています。

強制的に例外を発生させる raise キーワード

このコードで注目するべきは例外を発生させている
raise ArithmeticError("\r\n2はダメ\r\n")
です。
入力値「2」の場合、強制的に例外を発生させるコードを書いています。

またraiseキーワードで発生させる例外に引数を与えており、
引数で与えられた例外メッセージが、補足部分で出力されています。

例外処理のマスターは必須


例外処理が最も活躍するのは、PythonがPythonに関係ない何かを操作する時です。

例えばファイルを操作する時とか、インターネットから情報を取ってくる時とか。
ファイルが無かったらエラーになるし、インターネット接続が突然切れてもエラーになります。

そんな時にいちいち処理を止めるのではなく、例外を正しく処理できればより安定したアプリを作ることができます。

例外処理とセットで覚えるキーワードにwithがありますがこれはまた今度で。
Pythonの構文はこの第20回でおしまいです。

あとは実例とともにちょこちょこ紹介していければいいなと考えています。
それでは!

テーマ:プログラミング - ジャンル:コンピュータ

Pythonのイテレーターを理解する

WindowsでPython シリーズ その19


Pythonのイテレーターとジェネレーターについて学んでおきます。
最近のオブジェクト指向言語であればだいたい備えてる機能。

イテレーターは知らず知らずのうちに使ってるけど、ジェネレーターを自分で実装することなんて・・・殆どない。
それに説明を読んでもサッパリわからん。
安心してください!
演算子(オペレーター)のオーバーロードぐらい、意識して使うことは殆どありません。

※ブログ主は、C#言語で誰ぞが自己満足か技術確認のために組んだであろう
クラスのオペレーターのオーバーロード及び意味のないジェネレーターが多数宣言されたコードを泣きながらメンテナンスしたことがあります。
その時に習得したC#言語での知識を元に本記事を記載しています。
Python使いの方が本エントリを読んで誤ったであると判断した場合は、コメント欄でご指摘いただければ幸いです。



なので、とりあえずこの回はこんなもんなんだなという程度で流します。

イテレーターとは


繰り返し処理の元データとして利用できるデータの塊のこと。
代表例はリスト型
strs = ["とまと","りんご","みかん"]
for s in strs:
print(s)
--------------
結果
とまと
りんご
みかん
こんな感じで、for ~~ in の後ろに指定できるものです。

このイテレーターの説明を古いプログラミング言語に当てはめるとフェッチというものに代用できます。
要するに、「連続したデータを順番に送り出すよ。なくなったらエラーになるよ」という概念です。

元になる概念がある以上、その概念を具現化できる命令も存在します。
それが
iter()

イテレーターはオブジェクトです。
iter()はイテレーターのオブジェクトを返します。
んで、その返ってきたオブジェクトを next()によってフェッチできます。

ではコードを。


実行結果
Pythonのイテレーターを理解する

iter()によって取り出したイテレーターオブジェクトを変数に代入し、
next()によって一つ一つ取り出しています。
これはfor文が内部的に行っている挙動です。
4回目のnext()でStopIteration 例外が返ってきてます。
リストが3つしかないので、4回目でエラーが出ているわけですね。

ジェネレーターとは


ジェネレーターはイテレーターを自分で実装する時に使う概念です。
マニュアルを見てもサッパリですね。
この辺の概念って、始めてプログラム学ぶ人にとってどうやって説明すればいいんでしょうね。ほんと吐きそう。

とにもかくにも、キーワードはyield です。

yieldとは

自分で作った関数を for 文で使いたいな。
そんな風に思った時に使います。
巨大なパッケージソフトを作ってて、独自に作ったフレームワークを利用した方が効率的だと判断された時ぐらいにしか使います。
よって、基本的には使いません。
既に実装されている機能で殆ど代用できます。

文句言ってても仕方ないので書いてみます。


実行結果
Pythonのイテレーターを理解する

最初に、関数を定義しています。
この関数は、3で割り切れる数の場合、yieldと書いています。
関数はreturn で返すのが通例ですが、yieldは、処理結果の全てを保持します。
具体的には、3の倍数だからreturnしても、その続きから処理が繰り返し行われる感じです。

戻り値はイテレーターオブジェクトとなり、iter()で取得できるようになります。
その結果for文のデータ元として利用できるようになり、実行結果は見ての通り、指定した引数に対して3で割り切れる値のみを返すようになります。

ジェネレーターをもっと分かりやすく


yieldがわかりにくい?

yieldはその場所で処理が中断されて、また再開する。
そんな感じで覚えてもOK。



実行結果
Pythonのイテレーターを理解する

適当にyieldばっかり書いてる関数を使って呼び出してみました。
yield 1
yield 2 ... と結果が返ってきています。

正直いってこんなの使わないので、「へ~」ぐらいで覚えておけばいいです。

が、、、自分で実装をしないだけで、コーディング中にfor を使う場合は必ずイテレーターという概念が裏で動いています。
それだけは意識しておけば、プログラムを組むことがさらに楽しくなると思います。

ではでは、このエントリが日の目を見ることを祈って。
楽しきPythonライフを!

Pythonのラムダ式 sorted関数でタプルや辞書型を並べ替える

WindowsでPython シリーズ その18


前回に引き続きラムダ式をやっていきます。
最近の言語における無名関数の書き方と理解はほぼ必須と言っていいんか無いだろうか。

ラムダ式を3回も取り上げてるのは、pythonを触ってみてこの構文は大事だと思ったからです。
ぜひ書き方をマスターするべし。

sorted関数


sortedはリストを並べ替える関数です。
例えばこんなコード


実行結果
Pythonのラムダ式 sorted関数でタプルや辞書型を並べ替える

鬼シンプルですね。

最も簡単な使い方をすると、指定した引数を昇順に並べ替えます。

並べ替えることが多いのは、リストやタプルや辞書型


さて実際のコーディングで必要となってくるのはリストもそうですが
タプルとか辞書型だと思います。
要するに、「なんかデータの集まりを並べ替えたい。」
そんな時ですね。

というわけで備忘録として色々とコードを書いてみます。


実行結果
Pythonのラムダ式 sorted関数でタプルや辞書型を並べ替える

これまでの集大成


順番に見ていきます。

関数定義

まずは、テストの出力を楽にするために、defを使ってprint文を改造した関数を定義しています。

シンプルなリストの並べ替え

sorted関数のおさらい。リストが昇順に並んでます。

タプルの並べ替え

このあたりからラムダ式の登場です。
sorted関数の細かな説明はマニュアルを見るのが一番いいです。
このエントリでは、最も単純な使い方を記載しています。

まずはテストコードとして、タプルのややこしいを宣言します。
タプルというのは、融通の聞かないリストのことでした。
んで、そのタプルのリストを宣言しています。
fruits = [
("とまとM", 30)
,("とまとL", 50)
,("りんご", 100)
,("オレンジ",40)
]
こんな感じです。
このタプルのリストは、フルーツの種類と金額を羅列したリストを表してます。
これを、金額が高い順に並び替えます。

printLine(sorted(fruits
,key = lambda fruit : fruit[1]
,reverse = True))
こう。
key 引数を見ると、ラムダ式を記載しています。この表現はもうお決まりとして覚えておくほうがよさそう。

sorted関数の第一引数にリストを、第二引数にリストの中のタプルのどのキーかを指定しています。
[1]と書いてるので、[0]:フルーツの種類 [1]:金額 このような指定ですね。

実行結果は見ての通りです。

辞書型(dict)の並べ替え

次に辞書型の並べ替えを見てみます。
fruitsDict = {
"4.とまとM" : 30
,"2.とまとL" : 50
,"1.りんご" : 100
,"3.オレンジ" : 40
}

で、辞書型の宣言。
後のテストコードを分かりやすくするために、フルーツの種類に数字を打ってます。

辞書型に対して、辞書型.items()とすると、タプルを返します。
具体的には 
fruitsDict.items()
を見てください。

で、結果は記載の通り。
sortedのkeyには、"リストの何"を指定するためにラムダ式を指定するというのはお決まりで、
「考えるな感じるんだ!」の精神でひたすら身につけましょう。

おまけとして、sortedのkeyに何も指定しない場合のコードも書いてみました。
結果としては
key = lambda fruit : fruit[0]
と指定したのと同じような結果になります。
デフォルトでタプルの0番目を選択するようです。

とにかくラムダの書き方は慣れよう


今日はこれにて終わり。

ラムダ式は書けるととても便利。
でも書けなかったり読めなかったりすると、非常にストレスになります。
とにかく書いて慣れましょう。

言語仕様を理解するなら、Iteratorとかのキーワードで言語を理解すればいいんだけど、
まずはそんなもんなんかなと覚えるほうが上達への近道です。

頑張りましょう!
次のページ

FC2Ad