Tech Racho エンジニアの「?」を「!」に。
  • ライフ

未経験大学生によるPython入門日誌-第3話

第三回

やっぱりPython!片山です。
なにも思いつきませんので特に前口上はありません。

ぱいそん!

無精なので二週間に一度位しか触っていませんが、なんとなーくPythonの作法がわかったところで(わかってない)今回も少しずつ進めていきます。

defとかいうオシャレなヤツを使う

私のような素人にしてみるとなんとなく、var〜だとモサいイメージなのですがdef〜だと妙にかっこよく感じてしまいます。例えば「ゔぁーするよ」ではなく「デフするよ」のほうが響きがカッチリしていますし、そもそも「ゔぁー」のいやに呑気な感じがマジメ青年の私としては気に入りません。
そんなことはさておき、早速デフっていきます。

x = 1

def func1():
    print(x)

func1()

xに1入れて、xをprintする関数つくってそれを呼び出して〜みたいな超簡単なやつですね。実行すると当然のごとく1が出力されます。

オシャレなヤツを呼び出して使いまくる

先程のめちゃ簡単なコードをtest.pyなど適当な名前で保存してあげます。
そしたらターミナルでこいつが保存されたディレクトリに行ってpython3の対話モードを起動します。

$ cd ~/Desktop/PYworks
$ python3
Python 3.5.1 (v3.5.1:3うんたらかんたら鼻毛カッター
>>>

的な。ちなみに僕はエンジョイ勢なので、フォルダ名やファイル名、変数名から関数名に至るまで一切の苦情は受け付けません。

さて、ここまできたら準備万端です。先程のtest.pyに作ったfunc1をここから呼び出してやります。
「えっ、そんな便利なことができるの?」と思われた方、いないと思いますが僕は思いました。
モジュールには、イチイチPYTHONPATHなるものを通さなければ使えない不便なもの、というイメージがあったためです。

他所の関数を連行・労働させるのはとても簡単です。
まずは連行の方法です。

>>> import test
1

これで終わりです。「1」と出力されたのはご愛嬌です。test.pyでfunc1()が実行されてるんだからそりゃそうだよねっていう。
要は拡張子除いたファイル名部分をimport [ファイル名]とやってあげればいいわけです。いやぁ便利便利。

連行したら強制労働!ということで、その方法を紹介します。

>>> test.func1()
1

どうでしょう。僕は素人なので最初はちょっと感動しました。
test.func1()test部分が面倒くさいという方。パソコンの大先生たちにとっては常識レベルらしいですが

>>> import test
1
>>> t = test
>>> t.func1()

こんな方法があるようです。この短さだと逆に面倒ですが。
あとはそもそも、

>>> from test import func1
1
>>> func1()
1

とやってあげるテクニックがあるようです。from ファイル名 import 関数名みたいな感じですかね。たとえばfrom turtle import *なんてしますけれども、このときは*でturtleに定義された全部の関数を持ってきてね〜ということらしいです。

これらの技、対話モードじゃなくてももちろん使えますので夢が広がりますね。

しかし

importしたときに実行されるやつ邪魔なんだけど

キングオブ素人の僕は真っ先にそう思いました。いちいちimportしただけで1とか2とか言わんくてええわ!となる場面はこの先少なくないでしょう。

問題となるのはもちろん

x = 1

def func1():
    print(x)

func1()

ラストのfunc1ですね。

「ラストのfunc1()消せばいいじゃん」

そんな心の声が聞こえてきましたが、それをしないのはお約束です。ではどうするか。

x = 1

def func1():
    print(x)

if __name__ == "__main__":
    func1()

正直__name__というアンダーバー祭りからの"__main__"というアンダーバー祭りでもう頭がクラクラきてしまいそうですが、これはおまじないなのです。

こいつ自体がやってくれるのはごく単純なこと、言ってしまえば、

  • ファイル自体がスクリプトとして実行されるときにはif __nameうんたらかんたらがTrueになってif __nameうんたらかんたらが実行されるけれども、
  • そのファイルがモジュールとして呼び出されたときにはif __nameうんたらかんたらはFalseになってif __nameうんたらかんたら以下のブロックは実行しないよ!

っていうことをやってくれるわけです。

こいつの細かいアレとかはアレしてもらえればすぐにわかると思うので端折りますが要はそういうことなのです。兎にも角にもこれでさっきからimportするたびに1と表示されていた厄介なアレが排除できたわけですね。

if __name__ == "__main__":以下のブロックにはモジュールとして利用するときにしてほしくない処理を書いておく、ということです。テスト用の処理とかを書くのにちょうどいいんでしょうか。エンジョイ勢なので想像もつきませんが。

今日はここまで

アンダーバーの見すぎで疲れてしまったので今日はここまでということにします。

関連記事


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。