Python -mオプションの仕組み

コマンドラインで-mオプションでモジュールを指定することで、モジュールを実行することができます。

実行例

たとえば、Pythonで変数の代入にどの程度時間がかかるかを調べたいとします。

Pythonインタプリタを起動することなくコマンドライン上で計測が可能です。

timeitは時間を計測するPythonモジュール)

1
2
>>> python -m timeit 'a=1'
100000000 loops, best of 3: 0.0124 usec per loop

解説

ドキュメントには以下のような記述があります。

sys.pathから指定されたモジュール名のモジュールを探し、その内容をmainモジュールとして実行します。

つまり、モジュールを直接実行することで、-mオプションと等価な処理を実行できそうです。

timeitモジュールを例に確認してみましょう。

まずtimeitを探します。(コマンドは適宜、読み替えてください)

1
sudo find / -name timeit.py

仮想環境の構築等で、複数ヒットするかもしれません。

その場合は、下記のようにして-mオプション実行時に実際に検索しているパスも参考にしてください。

1
python -c 'import sys;print(sys.path)'

適切なtimeit.pyが見つかったとしましょう。以降、フルパスを以下のように表現します。

[YOUR_PATH]/timeit.py

では、いよいよ二つのコマンドが等価であることを確認してみましょう。

1
python -m timeit 'a=1'
1
[YOUR_PATH]/timeit.py 'a=1'

等価であることが確認できたと思います。

-mオプションとともによく使うモジュール

http.server

1
python -m http.Server

Webサーバを簡単に立てることが出来る。
(Python2.xではSimpleHTTPServer

http.server(旧SimpleHTTPServer)の使い方で詳しい使い方を紹介しています。

unittest

1
python -m unittest test_test_module1

base64

base64エンコードが出来る。

1
python3 -m base64 a.png

比較用コマンド

1
base64 -i a.png

json

jsonを整形することが出来る。

1
python -m json.tool sample.json

記事情報

  • 投稿日:2020年3月20日
  • 最終更新日:2020年5月16日

Python osモジュールの使い方

osとは

Pythonの標準ライブラリの一つで、OSに依存する機能を利用するためのモジュールです。

以下のようにインポートすることができます。

1
import os

以後は、osモジュールがインポート済みであるとします。

osモジュールの便利な機能を紹介

osモジュールの全てを紹介することはできませんが、よく使う便利な機能についてまとめました。

詳細は公式ドキュメントを参考にしてください。
(https://docs.python.org/ja/3/library/os.html)

os.name

OS情報を取得します。
MacやLinuxの場合posix、Windowsの場合ntとなります。

1
2
>>> os.name
'posix'

os.environ

環境変数を取得します。

os.getcwd()

カレントディレクトリを取得します

os.chdir()

ディレクトリを移動します。

os.getpid()

実行環境のプロセスIDを取得します。

os.uname()

OSを識別する情報を取得します。

os.mkdir()

ディレクトリを作成します。

os.makedirs()

再帰的に中間のディレクトリも含めて、ディレクトリを作成します。

os.remove()

ファイルを削除します

os.removedirs()

再帰的に中間のディレクトリも含めて、ディレクトリを削除します。

os.rename()

ファイルやディレクトリの名前を変更します。

1
os.rename('before.txt', 'after.txt')

os.repalce()でも同じことができます。

os.renames()

再帰的に中間のディレクトリも含めて、ディレクトリ名を変更します。

os.walk()

指定したディレクトリ以下のファイルツリーをジェネレータ形式で作成します。

1
2
for f in os.walk('.'):
print(f)

os.cpu_count()

システムのCPU数を取得します。

os.sep

パス名を表すために用いられている分割文字を取得します。

記事情報

  • 投稿日:2020年3月19日
  • 最終更新日:2020年5月4日

Python heapqの使い方

heapqとは

Pythonの標準ライブラリの一つで、優先度付きキュー(priority queue)の実装です。

本記事では、heapqという表現で統一します。

heapqの特徴

最小値の取得が高速

heapqを用いた最小値の取得を計算量O(1)で行えます。これはとても高速です。

なぜなら、組み込み関数min()は計算量O(N)だからです。

これだけ聞くと、heapqを用いるのが常に最適に思えますが、そうではありません。

heapqにはいくつか前提条件があります。

heapqの前提条件

あるリストが与えられたとしましょう。

1
A = [3,5,1,2,0]

このリストの最小値を求めるために、まずはheapの構築を行う必要があります。

1
heapq.heapify(A)

Aの中身を確認しましょう。

1
2
>>> A
[0, 2, 1, 3, 5]

順番が入れ替わっていますね。

リストAはヒープと呼ばれるデータ構造(正確には、Pythonではある規則に従って並び替えられたリスト)となっています。

ただし、ソートされているわけではありません。

この時

1
heap[0]

で最小値を取得することができます。
Pythonのリストは、計算量O(1)で要素へアクセスできます。

そして、先ほどのヒープの構築heapq.heapifyには計算量O(N)を要します。

従って、ここまで合計すると計算量O(N)で最小値を取得できたことになります。

そのため、heapqでは最小値を取得するために計算量O(1)のコストで済むが、
その前提として、ヒープの構築(コストはO(N))が必要ということです。

つまり、ただ最小値を得たいだけであれば

組み込み関数min()を使っても、heapqを使っても計算量は変わらないですし、

(恐らく、オーバーヘッドがある分、heapqが遅い)

記述量も多くなるため、メリットはありません。

heapqを活用すべき場面

heapqが威力を発揮するのは小さい方から順に複数の値を取得したい場合です。

heapqでリストから小さい順にK個の値を取り出したい場合

heapq.heappopを使って、最小値を削除していく必要があります。

実装例は以下の通りです。

1
2
3
4
5
A = [3,5,1,2,0]
heapq.heapify(A)
K = 2
for k in range(K):
print (heapq.heappop(A))

のように

heappopの計算量はO(logN)であるため、計算量はheapqの構築も含めてO(N+KlogN)となります。

取り出す回数が小さければheapifyの計算量O(N)が支配的と理解しましょう。

ソートとの比較

比較手法として、ソートを使う実装が考えられます。

例えば、リストから小さい順に2つの値を取り出したい場合、以下のように実装すれば良いです。

1
2
A = [3,5,1,2,0]
sorted(A)[:2]

sorted()の計算量はO(NlogN)です。

heapqを使うべき場面 まとめ

ソートされていないリストから小さい順にK個の値を取り出したい場合の計算量は

  • sort: O(NlogN)
  • heapq: O(N+KlogN)

となるので、Kの数(取り出したい数)に応じて使い分けるべきです。

  • K=1の場合: min
  • KがNより十分小さいの場合: heapq
  • KとNがほぼ等しい場合: sort

ただし、後述するように、数を取り出す途中で挿入も発生する場合はheapqを使うべきです。

最大値を取得したい場合

これを実現するヒープを最大ヒープと言います。

heapqの実装では最小値を取得するような仕様となっています。(最小ヒープ)
ですので、heapify前のリストやheappushする際の変数に、-1をかけることで最大ヒープを実現できます。

最小ヒープ・最大ヒープを、一つのヒープで実現することはできないので注意してください。
(無理矢理やるのであれば、切り替えの都度リスト全体に-1をかけheapifyをコールすることになると思います。)

数を取り出す途中で挿入が発生する場合

hepaqは計算量O(logN)で挿入を行うこともできます。

1
heapq.heappush(A, 5)

ソート済みのリストへの挿入は、標準ライブラリbisectで実装されています。二分探索自体はO(logN)で実現できますが挿入の計算量がO(N)
です。そのためこのような場合もheapqを用いると良いでしょう。

最後に

Pythonでのstackqueueの使い方については以下の記事も参考にしてください。

Pythonでstackとqueueを使う

記事情報

  • 投稿日:2020年3月18日
  • 最終更新日:2020年5月16日

Pythonの高階関数(map, filter, reduce)

はじめに

みなさん

  • map
  • filter
  • reduce
    といった高階関数を使いこなせていますか?

これらは最初は少し難しく感じますが、使いこなせるようになるとても便利です。

ぜひ習得しましょう。

高階関数とは

よく高階関数の代表として

  • map
  • filter
  • reduce
    が紹介されますが、これらは高階関数の一部にすぎません。

高階関数とは、関数を引数や返り値に取ることができる関数のことで、
Pythonでは高階関数を扱うことができます。

例を見てみましょう。

1
2
3
4
5
6
7
8
9
def func():
print (1)

def high_func(func):
def return_func(func):
print (0)
func()
print (2)
return return_func(func)

関数func()を宣言します。
1を出力するだけの関数です。

次に高階関数high_func()をみてみましょう。

まず、関数内で関数return_func()を宣言し、それを返却していることがわかります。

また、high_func()が引数として受け取っているfuncは、関数であることがわかりますね。

(さらにreturn_func()も関数funcを受け取っていますね)

結果を見て見ましょう。

1
2
3
4
>>> high_func(func)
0
1
2

このように元の関数func()の処理に加工を加えることができました。

高階関数はとても便利だと感じていただけたでしょう。

では、ここからはタイトルの通り

  • map
  • filter
  • reduce

を見ていきましょう。

これらは組み込み関数や標準ライブラリとして実装されています

map

mapはシーケンスの各要素に対して関数を適用し、シーケンスを得る関数です。
最も代表的なシーケンスと言えるリストで動作を確認してみましょう。

コードの全体像

1
2
3
4
def square(x):
return x*x
A = [2, 3, 5]
list(map(square, A))

解説

mapは関数を引数に取るので、まずは関数を作りましょう。

ここでは、数の二乗を計算する関数を考えます。

1
2
def square(x):
return x*x

mapはさらにシーケンスを引数に取るので、リストを作成しましょう。

1
list(map(square, A))

そしてmapの第一引数に関数を、第二引数にリストを与えれば、OKです。

やや複雑ですが、mapmapを返却するため、それをリストに変換する必要があります。

1
[4, 9, 25]

この結果が得られれば成功です。

filter

filterはシーケンスの各要素に対して関数を適用し、真である要素のシーケンスを得る関数です。

コードの全体像

1
2
3
4
def is_odd(x):
return bool(x % 2)
A = [2, 3, 5]
list(filter, A)

解説

1
2
def is_odd(x):
return bool(x % 2)

is_oddは奇数であればTrue、そうでなければFalseを返す関数です。

これは2の剰余を用いることで実装することができますね。

最後に明示的にbool型に変換をし、返却しています。

1
list(filter(is_odd, A))

filtermapと同じく、最後にリストに変換する必要があります。

reduce

これは組み込み関数ではなく、標準ライブラリfunctoolsに実装されている。
reduceは、二つの要素に対して関数を適用し一つの要素にする操作を繰り返すことで、シーケンスを単一の値に変換する関数です。

これを使って、リストの和を計算する関数を実装してみましょう。

色々な方法でリストの総和を求めるのコードを参考にしていますので、合わせてどうぞ。

コードの全体像

1
2
3
4
5
6
from functools import reduce
def my_sum(lst):
def add(a, b):
return a+b
return reduce(add, lst)
my_sum(A)

解説

標準ライブラリfunctoolsにあるreduceをインポートする。

1
from functools import reduce

和を計算する関数my_sumを宣言している。この関数は引数として、リストを受け取る。

関数内部で足し算を行う関数addを宣言している。

addを第一引数に、リストを第二引数にしてreduceを行い、得られた単一の値を返却している。

``

1
2
3
4
def my_sum(lst):
def add(a, b):
return a+b
return reduce(add, lst)

最後に完成した関数を呼び出す。

1
my_sum(A)

まとめ

高階関数について、また有名な高階関数である

  • map
  • filter
  • reduce

について説明をした。

記事情報

  • 投稿日:2020年3月17日
  • 最終更新日:2020年3月17日

色々な方法でリストの総和を求める

はじめに

今回はPythonでリストの総和を求める

なに?組み込み関数のsum()を使えば良いって?

確かにそうだが、せっかくなので勉強のために自前で実装してみよう

実装

準備

以下のようなリストを考える。今回はこの総和を求めたい。

1
A = [2, 3, 5]

組み込み関数sum

これが正しい方法

1
sum(A)

方法1. for文

これが最も愚直な方法。

sumが存在しない言語であればこれが良い実装だろう。

1
2
3
4
5
6
def my_sum1(lst):
sm = 0
for e in lst:
sm += e
return sm
my_sum1(A)

方法2. reduce

かなり無駄な感じがしてきた。

高階関数reduceと自作の足し算をする関数addを使う。

reduceは第一引数に関数、第二引数にリストを与えることで、

リストに対して、関数の処理を繰り返して適用することができる。

1
2
3
4
5
from functools import reduce
def my_sum2(lst):
def add(a, b):
return a+b
return reduce(add, lst)

方法3. reduce + lambda

勝手に実装にしておいて何だが、わざわざ関数addを宣言したくない。

そんな時はlambdaの出番だ。

1
2
3
from functools import reduce
def my_sum3(lst):
return reduce(lambda a, b: a+b, lst)

方法4. 再帰

再帰を使っても表現が可能だ。

先頭の要素と、残りの要素の輪を求めていく。

1
2
3
4
5
def my_sum4(lst):
if len(lst)==0:
return 0
else:
return lst[0] + my_sum4(lst[1:])

まとめ

sumだと極端かもしれないが、標準で実装済みの処理を自分でも書いてみると良い勉強になる。

記事情報

  • 投稿日:2020年3月16日
  • 最終更新日:2020年3月16日

ブール値以外をif文で判定した時の挙動

はじめに

今回はPythonのif文の動きについて少し掘り下げてみよう。

以下のコードはTrueFalseどちらを出力するだろうか。

1
2
3
4
if 0:
print ('True')
else:
print ('False')

また、以下のコードだとどうだろうか。

1
2
3
4
if 1:
print ('True')
else:
print ('False')

上記の例はプログラミングに慣れた人だと知っているかもしれない。

では、

1
if 2:
1
if ['A']:
1
if []:
1
if 'apple':

だとどうなるだろうか。エラーは発生するだろうか。

結論から言うと、エラーは発生しない。

何らかの形で、オブジェクトは真理値として判定できるからだ。

真理値判定

どのようなオブジェクトでも真理値として判定でき、ifやwhileの条件あるいは以下のブール演算の被演算子として使えます。オブジェクトは、デフォルトでは真と判定されます。ただしそのクラスが __bool__()メソッドを定義していて、それがFalseを返す場合、または__len__()メソッドを定義していて、それが0を返す場合は偽と判定されます。
(https://docs.python.org/ja/3/library/stdtypes.html#truth)

つまり、はじめにで示した例だと、

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
>>> bool(0)
False

>>> bool(1)
True

>>> bool(2)
True

>>> bool(['A'])
True

>>> bool([])
False

>>> bool('apple')
True

が、__bool__()の値であり、かつ問題の答え(標準出力される文字列)となる。

(数値型のbool()は0のみがFalseとなる)

ここでふと疑問が浮かぶ。

__bool__()__len__()はどちらが優先度が高いのだろう。

クラスを作って、実験してみよう。

__bool__()__len__()

__bool__()がTrue、__len__()が0の場合

だとどうなるのだろうか。

1
2
3
4
5
6
7
8
9
10
11
12
class MyClass:
def __init__(self):
pass
def __bool__(self):
return True
def __len__(self):
return 0
m = MyClass()
if m:
print ('True')
else:
print ('False')

__bool__()が優先されている。

1
True

__bool__()がFalse、__len__()が非0の場合

1
2
3
4
5
6
7
8
9
10
11
12
class MyClass:
def __init__(self):
pass
def __bool__(self):
return True
def __len__(self):
return 0
m = MyClass()
if m:
print ('True')
else:
print ('False')
1
False

こちらも__bool__()が優先されている。

つまり、__bool__()の優先順位が高いと言える。

実は、答えはドキュメントからも読み取れる。

object.bool(self)真理値テストや組み込み演算bool()を実装するために呼び出されます。このメソッドが定義されていないとき、__len__()が定義されていれば呼び出され、その結果が非0であれば真とみなされます。

(https://docs.python.org/ja/3/reference/datamodel.html#object.__bool__)

__bool__()__len__()も定義されていない場合

ドキュメントにあったように、オブジェクトはデフォルトではTrueとなる。

1
2
3
4
5
6
7
8
class MyClass:
def __init__(self):
pass
m = MyClass()
if m:
print ('True')
else:
print ('False')
1
True

まとめ

  1. __bool__()を評価する。
  2. __bool__()が定義されていない場合、__len__()を評価する。
  3. __len__()が定義されていない場合、Trueを返却する。

記事情報

  • 投稿日:2020年3月15日
  • 最終更新日:2020年3月15日

Dockerでよく使うコマンド10選

Dockerでよく使うコマンドをまとめてみました。

これらをマスターすれば、最低限の用途では使えるはずです。

  1. イメージのリストを表示

    1
    docker image ls
  2. リポジトリからイメージをプル

    1
    docker image pull IMAGE_NAME
  3. コンテナのリストを表示

    1
    docker container ps

    -aで停止中のコンテナも表示

  4. イメージからコンテナを生成して起動する

    1
    docker container run IMAGE_NAME

    -itでインタラクティブに操作が可能

    --name NAMEでコンテナに名前をつける事が可能

  5. コンテナからデタッチ

    1
    Ctrl+P Ctrl+Q
  6. コンテナにアタッチ

    1
    docker container attach CONTAINER_NAME

    コンテナの名前はdocker container psで調べる事ができます。

  7. コンテナの停止

    1
    docker container stop CONTAINER_NAME
  8. コンテナの起動

    1
    docker container stop CONTAINER_NAME
  9. コンテナの削除

    1
    docker container rm CONTAINER_NAME
  10. イメージの削除

    1
    docker image rm IMAGE_NAME

記事情報

  • 投稿日:2020年3月14日
  • 最終更新日:2020年3月14日

Python デコレータ入門

はじめに

今回は初学者がつまずきやすいとされている、Pythonのデコレータについてまとめます。

デコレータとは

デコレータとは、あるオブジェクトに対し、その構造を変更せずに新しい機能を追加するようなデザインパターンと言えるでしょう。

自分でも何を言っているのか、よくわからないので具体例をみていきましょう。

先にソースコード全体を貼り付けておきます。

ソースコード

1
2
3
4
5
6
7
8
9
10
11
12
13
def my_decorator(my_func):
def decorator_func():
print('処理0')
my_func()
print('処理2')
return decorator_func

@my_decorator
def my_func():
print('処理1')

if __name__=='__main__':
my_func()

関数を修飾する

いま、以下のような関数funcが存在するとしましょう。

1
2
def my_func():
print('処理1')

あなたは、この関数が呼び出される前に、処理0を追加したいとします。
その場合、以下のようにするのが良いでしょう。

1
2
3
if __name__=='__main__':
print('処理0')
my_func()

では、関数my_funcがプログラムの中で複数回呼び出され、かつその全ての呼び出し前に処理0を追加したい場合はどうしますか。

全ての関数my_funcの前に処理0を追加するのは面倒ですし、追加漏れが発生してバグの温床にもなりそうです。

であれば、関数my_func自体に処理0を追加してしまえば良いでしょう。

1
2
3
def my_func():
print('処理0')
print('処理1')

これで問題ありません。

しかし、関数my_funcがあなたがプログラムで定義している関数ではなく、ライブラリで定義されている関数の場合はどうでしょうか。

その場合は、関数を編集することはできません。

そういった時は、
関数を引数として受け取り、関数を返却する関数
を考えれば良いのです。

そんな事ができるのかと思れるかもしれませんが、実際にコードをみてみましょう。

1
2
3
4
5
def my_decorator(my_func):
def decorator_func():
print('処理0')
my_func()
return decorator_func

関数my_decoratorは関数my_funcを引数にとり、関数decorator_funcを返却します。

関数my_decoratorを見ればわかるように、処理0の後に関数my_funcを呼び出しています。

これを応用すると、関数my_funcの後に処理を行うこともできます。

1
2
3
4
5
6
def my_decorator(my_func):
def decorator_func():
print('処理0')
my_func()
print('処理2')
return decorator_func

さて、関数my_decoratorを作る事ができたので、関数my_funcを更新してみましょう。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def my_decorator(my_func):
def decorator_func():
print('処理0')
my_func()
print('処理2')
return decorator_func

def my_func():
print('処理1')

my_func = my_decorator(my_func)

if __name__=='__main__':
my_func()

実行結果は、

1
2
3
処理0
処理1
処理2

となり上手くいったようです。

シンタックスシュガー

さて、実は以下のコードですが、

1
2
3
4
def my_func():
print('処理1')

my_func = my_decorator(my_func)

以下のコードでも等価となります。

1
2
3
@my_decorator
def my_func():
print('処理1')

若干、記述が簡潔になりました。

これがデコレータとして出てくる@の正体でした。

なお、プログラミングの世界では、ある構文をより簡単に記述できるようにした構文をシンタックスシュガーと呼んだりします。

まとめ

これで、コードが完成しました。

1
2
3
4
5
6
7
8
9
10
11
12
13
def my_decorator(my_func):
def decorator_func():
print('処理0')
my_func()
print('処理2')
return decorator_func

@my_decorator
def my_func():
print('処理1')

if __name__=='__main__':
my_func()

最初に述べたとおり、デコレータとは、あるオブジェクトに対し、その構造を変更せずに新しい機能を追加するようなデザインパターンです。

そのため厳密には、関数に関数を修飾させる処理だけがデコレータではないので、その点には注意してください。

記事情報

  • 投稿日:2020年3月13日
  • 最終更新日:2020年3月13日

Djangoの使い方

Djangoとは

PythonのWebアプリケーションフレームワークの一つです。

他に有名なフレームワークとしてFlaskがあります。

Djangoは(Flaskも)、http.serverのように検証用途の簡易なものではなく、サービスとして利用実績も豊富なフレームワークです。

http.serverFlaskの使い方については以前記事を書きましたので、気になる方は下記のリンクからご参照ください。

http.server(旧SimpleHTTPServer)の使い方

Flaskの使い方

Flaskに比べると、Djangoは大規模な開発に向いています。

DjangoはInstagramやUdemyなどのサービスで使われています。

Flaskと迷ったら

あなたがどちらでWebアプリケーションを作ればいいのか迷うなら(違いがあまりわかっていないのなら)、Flaskを選択すれば良いでしょう。おそらく、Flaskで十分です。

コードを動かしてみよう

インストール

Djangoは標準ライブラリではありません。

pipを使っている場合は、以下のようにしてインストールしてください。

1
pip install django

手順

プロジェクトの作成

  1. 下記のコマンドを実行します。

    1
    2
    3
    mkdir hello
    cd hellp
    django-admin startproject hello_pj .

    hello以下にmanage.pyというファイルが生成されていればOKです。

    アプリケーションの作成

  2. 下記のコマンドを実行します。

    1
    python manage.py startapp hello_app
  3. hello_pj/settings.pyにあるINSTALLED_APPSに、hello_appを追加します。

  4. 引き続きhello_pj/settings.pyを編集します。リストDIRSBASE_DIR, 'templates'を追加します。

    1
    'DIRS': [BASE_DIR, 'templates']

    hello worldの準備

  5. hello_pj/urls.pyにあるリストurlpatternspath('', include('hello_app.urls'))を追加します。

    1
    2
    3
    4
    urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('hello_app.urls'))
    ]
  6. hello_app/urls.pyを新規作成し、下記のコードを貼り付けます。

    1
    2
    3
    4
    5
    6
    from django.urls import path
    from . import views

    urlpatterns = [
    path('hello/', views.helloworldfunction),
    ]
  7. hello_app/views.pyを編集し、下記のように編集します。

    1
    2
    3
    4
    from django.shortcuts import render

    def helloworldfunction(request):
    return render(request, 'index.html')
  8. ディレクトリtemplatesを作成し、templates/index.htmlを新規作成し、下記のコードを貼り付けます。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <!DOCTYPE html>
    <html lang="ja">
    <head>
    <meta charset="utf-8">
    <title>hello</title>
    </head>
    <body>
    <h1>hello</h1>
    </body>
    </html>

    サーバの立ち上げ

  9. 下記のコマンドを実行します。

    1
    2
    python manage.py migrate
    python manage.py runserver

    モデルをデータベースに反映した後、ローカルホストにサーバを立ち上げています。

  10. http://localhost:8000/helloにアクセスし、helloと表示されれば成功です!

まとめ

http.serverFlaskに比べると、若干複雑でしたね。

その分、Djangoは使いこなす事ができれば大規模なアプリケーションの構築ができます。

記事情報

  • 投稿日:2020年3月11日
  • 最終更新日:2020年3月22日

Flaskの使い方

Flaskとは

PythonのWebアプリケーションフレームワークの一つです。

他に有名なフレームワークとしてDjangoがあります。

Djangoに比べると、Flaskは軽量なWebアプリケーションを作るのに適しています。

軽量と言っても、http.serverのように検証用途の簡易なものではなく、サービスとして利用実績も豊富なフレームワークです。

http.serverの使い方については以前記事を書きましたので、気になる方は下記のリンクからご参照ください。

http.server(旧SimpleHTTPServer)の使い方

Djangoと迷ったら

あなたがどちらでWebアプリケーションを作ればいいのか迷うなら(違いがあまりわかっていないのなら)、Flaskを選択すれば良いでしょう。

コードを動かしてみよう

インストール

Flaskは標準ライブラリではありません。

pipを使っている場合は、以下のようにしてインストールしてください。

1
pip install flask

サンプルコード

1
2
3
4
5
6
7
8
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
return 'hello'
app.run()

動作確認

  1. サンプルコードを保存する(例えばscript.pyとする。flask.pyはNG!)
  2. python script.pyを実行する
  3. ブラウザでhttp://127.0.0.1:5000/にアクセスする
  4. helloと表示されれば成功です!

ソースコードの簡単な解説

Flaskのインポート

1
from flask import Flask

Flaskアプリケーションををappという名前で生成

1
app = Flask(__name__)

hello関数の作成

1
2
3
@app.route('/')
def hello():
return 'hello'

@app.route('/')はデコレータと呼ばれます。

1
2
@app.route('/') # パス
def func(): # パスごとに行いたい処理

と思っておけばOKです。

アプリケーションの実行

1
app.run()

まとめ

Flaskhello worldはとても簡単だったのではないでしょうか。

興味を持った方は、Flaskをより深く勉強してみてください。

また、DjangoについてもDjangoの使い方で紹介していますので合わせてご覧ください。

記事情報

  • 投稿日:2020年3月11日
  • 最終更新日:2020年3月12日