こんにちはー、ニアです。
最近、業務で使用しているサーバープログラムのデプロイを自動化しようとfabric(Python製のデプロイツール)を利用してみようと企んでいます。
今回はPythonを使って、色々プログラミングしてみました。
1. 使用環境
- Python 3.7.0
fabricの公式はPython2.xのみの対応ですが、これがforkされてPython3.xで利用できるfabric3もあったので、私はPython 3.xの方をインストールしました。
Macであれば、Homebrewから最近リリースされたばかりのPython 3.7をインストールできます。
brew install python3
2. 早速プログラミング
2.1. コンソール出力とコンソール入力
コンソールへの出力(標準出力)はprint関数、コンソールからの入力(標準入力)はinput関数でできます。
print( "Hello Python3!" )
x = int( input() )
y = int( input() )
print( f"{x} + {y} = {x + y}" )
1
2
Hello Python3!
1 + 2 = 3
input関数は標準入力から1行読み込み、それを文字列として返します。従って、整数や浮動小数点数として扱いたい時は、int関数やfloat関数などで変換しておきます。
int型の範囲は、なんとメモリが許す限り無限にとれてしまいます。128ビットはもちろんのこと、暗号化処理でよく使用する256ビットでもRSA等で使う2048ビットや4096ビットでも何でもござれです。
float型の範囲は、C#のdouble型(倍精度浮動小数点型)と同じでした。
# こんな巨大な数値も扱えてしまうのだ。(**演算子はあとで紹介しますね)
x = 2 ** 4096
print( x )
1044388881413152506691752710716624382579964249047383780384233483283953907971557456848826811934997558340890106714439262837987573438185793607263236087851365277945956976543709998340361590134383718314428070011855946226376318839397712745672334684344586617496807908705803704071284048740118609114467977783598029006686938976881787785946905630190260940599579453432823469303026696443059025015972399867714215541693835559885291486318237914434496734087811872639496475100189041349008417061675093668333850551032972088269550769983616369411933015213796825837188091833656751221318492846368125550225998300412344784862595674492194617023806505913245610825731835380087608622102834270197698202313169017678006675195485079921636419370285375124784014907159135459982790513399611551794271106831134090584272884279791554849782954323534517065223269061394905987693002122963395687782878948440616007412945674919823050571642377154816321380631045902916136926708342856440730447899971901781465763473223850267253059899795996090799469201774624817718449867455659250178329070473119433165550807568221846571746373296884912819520317457002440926616910874148385078411929804522981857338977648103126085903001302413467189726673216491511131602920781738033436090243804708340403154190336
また文字列リテラルの前にfを付けると、{}の中に変数や値を入れて書式指定して文字列に変換することができます。これはPyhton 3.6で追加された機能です。
Pythonでは書式指定文字列への変換の仕方はいくつかあるのですが、C# 6.0の文字列補完に慣れている私にとってこの機能はとても便利だなと思いました。
using System;
class Program {
static void Main( string[] args ) {
Console.WriteLine( "Hello Python!" );
int x = int.Parse( Console.ReadLine() );
int y = int.Parse( Console.ReadLine() );
Console.WriteLine( $"{x} + {y} = {x + y}" );
}
}
2.2. 算術計算
四則演算は+、–、*、/ の演算子で行います。余剰は%を使用して求めます。
またPythonでは、**でべき乗、//で商を求めることができます。特にべき乗ではCやC#の場合、数学系ライブラリを呼び出して行う必要があるので、Pythonではコードがより簡素になりますね(なお、べき乗を求めるpow関数も用意されています)。
x = 5
y = 2
# 加算
print( f"{x} + {y} = {x + y}" )
# 減算
print( f"{x} - {y} = {x - y}" )
# 乗算
print( f"{x} * {y} = {x * y}" )
# 除算
print( f"{x} / {y} = {x / y} ({type( x / y )})" )
# べき乗
print( f"{x} ** {y} = {x ** y}" )
# 除算(商)
print( f"{x} // {y} = {x // y}" )
# 余剰
print( f"{x} % {y} = {x % y}" )
5 + 2 = 7
5 - 2 = 3
5 * 2 = 10
5 / 2 = 2.5 (<class 'float'>)
5 ** 2 = 25
5 // 2 = 2
5 % 2 = 1
Python2とPython3では整数同士の除算で小数点以下が出る時の挙動が異なり、Python2ではC#のように小数点以下は切り捨てとなるのに対し、Python3ではfloat型に変換されて小数点以下も保持されます。
# coding: utf-8
x = 5
y = 2
# 加算
print "{} + {} = {}".format( x, y, x + y )
# 減算
print "{} - {} = {}".format( x, y, x - y )
# 乗算
print "{} * {} = {}".format( x, y, x * y )
# 除算
print "{} / {} = {} ({})".format( x, y, x / y, type( x / y ) )
# べき乗
print "{} ** {} = {}".format( x, y, x ** y )
# 除算(商)
print "{} // {} = {}".format( x, y, x // y )
# 余剰
print "{} % {} = {}".format( x, y, x % y )
5 + 2 = 7
5 - 2 = 3
5 * 2 = 10
5 / 2 = 2 (<type 'int'>)
5 ** 2 = 25
5 // 2 = 2
5 % 2 = 1
2.3. 配列
Pythonには、要素のみを格納する配列と、キーと値のペアで格納する連想配列があります。・・・てか連想配列の方はそのまんまJSONですね。
x = [1, 2, 3, 4, 5]
print( x[1] )
y = { 'foo': 2, 'bar': 5 }
print( y['foo'] )
2
2
2.4. 条件分岐
x = int( input() )
if x % 2 == 0:
print( f"{x} is even." )
else:
print( f"{x} is odd." )
if x > 0:
print( f"{x} is positive" )
elif x < 0:
print( f"{x} is negative" )
else:
print( f"{x} is zero." )
# Case 1
5
# Case 2
-2
# Case 3
0
# Case 1
5 is odd.
5 is positive.
# Case 2
-2 is even.
-2 is negative.
# Case 3
0 is even.
0 is zero.
Pythonの特徴として、インデントの深さで条件分岐などの制御をするルールがあります。このルールによってインデントが綺麗にまとまるので、読みやすくなるメリットがあります。Pyhton以外では、F#(Light syntaxモード)やCoffee Scriptが該当します。
まあ、F#ではカレンダープログラムでミョウガさんが書いたF#コードのように、文同士をコロンで繋げて1行に収めてしまうことができますけどね。
なお、C#のswitch文やF#のmatch文に相当する文はないので、if〜elif〜elseで代用します。
month = int( input() )
# 「値 in 配列」は、値が配列に含まれるかどうかを表します。
if month in [3, 4, 5]:
print( "Spring" )
elif month in [6, 7, 8]:
print( "Summer" )
elif month in [9, 10, 11]:
print( "Autumn" )
elif month in [12, 1, 2]:
print( "Winter" )
else:
print( f"{month} is invalid value." )
# Case 1
7
# Case 2
12
# Case 3
0
# Case 1
Summer
# Case 2
Winter
# Case 3
0 is invalid value.
Pythonで繰り返しの処理をする時は、for文もしくはwhile文を使用します。for文の方はF#のfor-in文やC#でいうforeach文にあたり、inの後に配列やコレクションを指定します。range( 5 )は [0, 1, 2, 3, 4] の範囲を持つRangeオブジェクトを返します。
for i in range( 5 ):
print( i )
n = 0
while n < 5:
print( n )
# n++のような、インクリメント・デクリメントはPythonでは使えません。
n += 1
0
1
2
3
4
0
1
2
3
4
なお、do-while文に相当する文はないので、while文とif文とbreak文などで代用します。
n = 1
while True:
print( n )
n += 1
if n > 3:
break
print( "ダァーッ!" )
1
2
3
ダァーッ!
2.5. 関数
defキーワードで関数を宣言し、呼び出し元から受け取るパラメーターや関数本体を定義します。
def sum( a, b ):
return a + b
x = int( input() )
y = int( input() )
print( f"{x} + {y} = {sum( x, y )}" )
2.6. クラス
classキーワードでクラスを宣言し、メンバーとなる変数や関数などを定義します。今回はシンプルに複素数のクラスを作ってみます。
class Complex:
# クラス変数(C#でいうstaticメンバー)
imag_character = "j"
# __init__はコンストラクターです。selfはクラスのインスタンス自身を表します(C#で例えればthis)
def __init__( self, re, im ):
# メンバー変数はここで定義できます。
self.real = re
self.imag = im
# クラス関数
def Sum( a, b ):
return Complex( a.real + b.real, a.imag + b.imag )
def Diff( a, b ):
return Complex( a.real - b.real, a.imag - b.imag )
def Mul( a, b ):
return Complex( a.real * b.real - a.imag * b.imag, a.real * b.imag + a.imag * b.real )
def Div( a, b ):
dividend = Complex.Mul( a, Complex( b.real, -b.imag ) )
divisor = b.real * b.real + b.imag * b.imag
return Complex( dividend.real / divisor, dividend.imag / divisor )
# メンバー関数
def ToString( self ):
result = ""
if self.real != 0:
result += str( self.real )
if self.imag != 0:
if self.real != 0 and self.imag > 0:
result += "+"
result += f"{self.imag}{Complex.imag_character}"
return result
x = Complex( 4, 1 )
y = Complex( 1, 2 )
print( Complex.Sum( x, y ).ToString() )
print( Complex.Diff( x, y ).ToString() )
print( Complex.Mul( x, y ).ToString() )
print( Complex.Div( x, y ).ToString() )
5+3j
3-1j
2+9j
1.2-1.4j
実はというとPythonでの複素数は標準で定義されており、complexクラスがあります。四則演算用の演算子も定義されているので、自然な記述で計算できますね(もちろん、int型やdouble型との計算もOK)。
5+3j
3-1j
2+9j
1.2-1.4j
2.7. ライブラリを利用
Pythonには便利なライブラリがたくさんあります。今回はNumPyというライブラリを使って行列計算してみます。
import numpy
# 行列の計算
a = numpy.matrix( [[1, 2], [3, 4]] )
b = numpy.matrix( [[2, 4], [6, 8]] )
print( a + b )
print( a - b )
print( a * b )
# 逆行列
c = numpy.matrix( [[5, 16, 7, 9], [13, 5, 18, 6], [14, 13, 14, 18], [10, 19, 13, 6]] )
ci = c ** -1
print( ci )
print( c * ci )
[ 3 6]
[ 9 12]]
[[14 20]
[30 44]]
[[ 5 16 7 9]
[13 5 18 6]
[14 13 14 18]
[10 19 13 6]]
[[-0.48 -0.2 0.2 0.32 ]
[ 0.00421053 -0.04210526 -0.01052632 0.06736842]
[ 0.29978947 0.20210526 -0.14947368 -0.20336842]
[ 0.13712281 0.02877193 0.02385965 -0.13936842]]
[[ 1.00000000e+00 -2.22044605e-16 1.11022302e-16 0.00000000e+00]
[ 1.77635684e-15 1.00000000e+00 -4.44089210e-16 -8.88178420e-16]
[ 8.88178420e-16 0.00000000e+00 1.00000000e+00 0.00000000e+00]
[ 8.88178420e-16 0.00000000e+00 -2.22044605e-16 1.00000000e+00]]
3. おわりに
今まで使った言語(C#やC++、PHPなど)と比べて、Pythonはソースコードをシンプルに書けるのが魅力的だなと感じました。今までサッとプログラムを書く時はC#やC++(コンソールアプリ)を使っていたのですが、一々main関数を記述するのが煩わしく、それ専用のプロジェクトを作って保存していました。Pythonならテキストエディタを開いて、いきなり処理が書けるから素早く始められます。
あと驚いたのは、int型の範囲ですね。始めた当初は、他のプログラミング言語と同じように64ビット分まで格納できるのかなと思っていたのですが、まさかそれよりもずっと巨大な数値が格納できるとは思いませんでした。しかも追加インストールなしで!
さて、学んだ知識でfabricによるデプロイ作業の効率化にチャレンジしてみよう。
コメント