クモのようにコツコツと

フロントエンドエンジニア イイダリョウのブログ。略称「クモコツ」

Pythonの基本を理解するためにJSと比較する

Qiitaアドベントカレンダー「Pythonその2」19日目の記事です。以前「PHPの基本を理解するためにJSと比較する」という記事を書きました*1。本記事はその「Python版」です!ちなみに私のPython歴は「Hello World」までです。Webデザイナーが新たなプログラミング言語を始めるときは「JS」と比較すると理解がしやすいと思います。よっしゃ、来年こそはPythonでデータ分析や機械学習に取り組むぞ〜〜(抱負)

【目次】

※参考:初めてのPython(インストール〜Hello world)と初めての黒い画面 - クモのようにコツコツと
※参考:PHPの基本を理解するためにJSと比較する - クモのようにコツコツと
※参考:【HTML、CSS、JSの書式】これを読めばコードが読める!書ける!まとめ!(基本5+応用1記事) - クモのようにコツコツと

コメント

Python書式の基本、最初はコメントです*2。Pythonのコメントはハッシュ#一つです。

# 一行コメントです

JSの一行コメントはスラッシュ2つ//でしたね*3

なお、Pythonには複数行のコメントはないらしく一つ一つにハッシュを付けなければならないようです。

代替機能としてシングルコーテーション' 'またはダブルコーテーション" "を3つ続けると、中身を無視してくれるようです。

※参考:コメントアウト | Python-izm

このように書きます。

'''
複数行に渡る
コメントみたいな機能1です。
シングルコーテーション3つ
'''

"""
複数行に渡る
コメントみたいな機能2です。
ダブルコーテーション3つ
"""

JSの複数行のコメントは/* */でしたね*4

以下、前回のPHPの記事と比較してもらうとよりわかりやすいと思います。(なるべく同じ事例で書きます)

※参考:PHPの基本を理解するためにJSと比較する - クモのようにコツコツと

変数

Pythonの変数はこのような書式です。

変数名 = 値
  • まずJSと大きく違うのは、変数名の頭に何も付きません!(JSはvarcontsletなどの宣言が付きます)*5
  • もう一つ、地味な違いですが行末に何も付きません!(JSはセミコロン;が付きました)*6

このようになります。

# 文字列
name = "イイダリョウ"

# 数値
num = 2018

関数

組み込み関数

さて、PythonにもJSと同様に組み込み関数があらかじめ用意されています。

関数名(引数)
  • JSと同様に関数名のあとにカッコ()で引数が入ります。
  • 変数と同様、行末には何も付きません
# 文字列の出力
print("日本語でおk")

# 出力結果:日本語でおk

print()関数は文字出力によく使われます。(前回の「Hello World」でも使いましたね)*7

文字列をシングルクォーテーション' 'またはダブルクォーテーション" "で囲うのはJSと同じです*8

文字列の連結

文字列に変数を埋め込むこともできます。

# 文字列に変数を埋め込む
lang = "日本語"
print( lang + "でおk")

# 出力結果:日本語でおk

変数と文字列をプラス+でつなぐのはJSと同じです。*9

整数型→文字列型変換(str()関数)

なお、Pythonの文字列は文字列型strと整数型intがあります。文字列型と整数型は厳密で、連結できずエラーになります。*10

連結するためには整数型を文字列型に変換する必要があります。文字列型への変換はstr()関数です。

# 整数型の文字列
age = 16

# 文字列型に変換
age_str = str(age)

# 連結
print("伊代はまだ" + age_str + "だから")

# 出力結果:伊代はまだ16だから

str()関数は引数の中に入れ子にもできます。

# 整数型の文字列
age = 16

# 連結(引数の中で文字列型に変換)
print("伊代はまだ" + str(age) + "だから")

# 出力結果:伊代はまだ16だから

こっちの方が記述量は少ないですね!

文字列のテンプレート書式(format())

format()関数を使うとテンプレート書式が作れます。

# 文字列のテンプレート書式
変数名 = "書式{0}書式{1}…".format(値1, 値2…)
  • 文字列の中に波括弧{}で0からカウントがあります。
  • 文字列の後ろにピリオドでformat()関数が続きます。
  • format()関数の中の引数が文字列の波括弧{}に順番に代入されます。
name = "伊代"
age = 16

# 文字列のテンプレート書式
kashi = "{0}はまだ{1}だから".format(name, age)
print(kashi)

# 出力結果:伊代はまだ16だから
  • 変数nameは文字数伊代
  • 変数ageは数値16
  • 変数kashi{0}format()関数の引数1(変数name
  • 変数kashi{1}format()関数の引数2(変数age
  • print()関数で変数kashiが「伊代はまだ16だから」と出力されます

「名前付き引数」を使うと冒頭の変数部分が引数の中にキーとして入ります。

# 文字列のテンプレート書式
変数名 = "書式{キー1}書式{キー2}…".format(キー1 = 値1, キー2 = 値2…)

波括弧{}の中はカウントではなくキー名になります。

# 文字列のテンプレート書式
kashi = "{name}はまだ{age}だから".format(name = "伊代", age = 16)
print(kashi)

# 出力結果:伊代はまだ16だから
  • 変数kashiのキー{name}format()関数の引数1(キー{name}の値伊代
  • 変数kashiのキー{age}format()関数の引数2(キー{age}の値16
  • print()関数で変数kashiが「伊代はまだ16だから」と出力されます

キーの有無はCSSでいうoldl 、JSでいう配列と連想配列みたいな位置付けになりますね。 どちらが書きやすいかはケースバイケースになると思います。

ユーザー定義関数

PythonもJSと同様にユーザーが独自で関数を作れます。複数の処理をひとまとめにしたりします。

# ユーザー定義関数
def 関数名(引数) :
    処理
    return 戻り値 #省略可能

# 関数の実行
print(関数名(引数)) 
  • JSは関数名の前にfunctionをつけるがのが関数宣言でしたが、Pythonはdefになります。
  • JSは関数ブロックを波括弧{}で囲いましたがPythonは不要です。関数名のあとにコロン:を付けます*11
  • 2行目以降にインデント(半角スペース4つ、またはタブ)を入れることでブロックを意味します。
  • 戻り値reteunはJSと同様に省略が可能です。
  • ブロックの最後にはなんの印もありません*12。次の行のインデントがなくなることでブロックの終わりを意味します。
# ユーザー定義関数
def shokai(name) :
   print( "私の名前は" + name +  "です。")

# 関数呼び出し
shokai("イイダ")
# 実行結果:私の名前はイイダです。

shokai()メソッドの引数イイダが代入された状態で文字が出力されます。

無名関数

Pythonも無名関数があります。変数の中で一度きりの処理を実行したりします。こんな書式です。

# 無名関数
変数名 = lambda 引数1, 引数2… :  
    処理

# 無名関数の実行
変数名(引数1, 引数2…)
  • 無名関数はラムダlambdaで宣言します。
  • lambdaのすぐあとに引数を書きます。括弧( )は不要です。
  • 引数のあとにコロン:でそのあとに処理を書きます。
  • 処理が長い場合は改行してインデントを入れることでブロックになります。
  • ブロックの最後はdefと同様何の印もありません。

Pythonの無名関数は宣言もlambdaだし引数は括弧がいらないし、ユーザー定義関数とは違う印象ですね。

# 無名関数
zeikomi = lambda price : 
     print(price * 1.08)

# 無名関数の実行
zeikomi(300) 

# 出力結果 324.0

引数300に1.08を掛けて消費税込みの金額が出力されます。

式には文字列を入れることもできます。先ほどのユーザー定義関数を当てはめると…

# 無名関数
profile = lambda  name :  
    print( "私の名前は" + name +  "です。")

# 無名関数の実行
profile("イイダ")

# 実行結果 私の名前はイイダです。

式の中で文字列と連結するときは整数値をstr()で文字列に変換します。

# 無名関数
zeikomi = lambda price : 
    print("合計は" + str(price * 1.08) + "円です。")

# 無名関数の実行
zeikomi(300) 

# 出力結果 合計は324.0円です。

以上が無名関数です。

リスト(配列)

次はPythonの「リスト」です。リストとはJS*13でいう「配列」のことです。

リスト

リストは下記のような書式です。

# リスト
変数名 = [ 値1, 値2, 値3 ]

# リストの呼び出し(0からカウント)
print(変数名[1])
# 実行結果 値2
  • 変数にリストの値を代入。
  • 値は角括弧[]でくくる。
  • 変数名に角括弧[]をつけて中にカウント番号を入れる
  • カウントは0から始まるので例えば1と入れると2番目が呼び出される

値を角括弧でくくるのはJSと同じですね*14

実例はこのようになります。

# リスト
name = [ "イイダリョウ", "ヤマダタロウ", "カワタジロウ"]

# リストの出力
print(name[1])

# 実行結果 ヤマダタロウ

タプル

タプルはリストの親戚です。一度入れた値を上書きできない、という特徴があります。

# タプル
変数名 = ( 値1, 値2, 値3 )
  • タプルは値を角括弧ではなく括弧()でくくる。

リストは上書きが可能ですがタプルは上書きができません。

下記はリストの上書きです。

# リスト
name = [ "イイダリョウ", "ヤマダタロウ", "カワタジロウ"]

# リストの上書き
name[1] = "ヤマダサブロウ"

# リストの出力
print(name[1])

# 実行結果 ヤマダサブロウ

タプルの上書きはエラーになります。

# タプル
name = ( "イイダリョウ", "ヤマダタロウ", "カワタジロウ")

# タプルの上書き
name[1] = "ヤマダサブロウ"

# タプルの出力
print(name[1])

# 実行結果 TypeError → ヤマダタロウが呼び出される

集合型

「集合型」もリストの親戚。重複した値を入れられないという特徴があります。

# 集合型
変数名 = { 値1, 値2, 値3 }
  • 集合型は値を角括弧ではなく波括弧{}でくくる。

リストは重複した値を入れられます。

# リスト(1番目と2番目が同じ値)
name = [ "イイダリョウ", "イイダリョウ", "カワタジロウ"]

# リストの出力
print(name[1])

# 実行結果 イイダリョウ

集合型は重複した値を入れられません

# 集合型(1番目と2番目が同じ値)
name = { "イイダリョウ", "イイダリョウ", "カワタジロウ"}

# 集合型の出力
print(name[1])

# 実行結果 TypeError

辞書型

「辞書型」はJSでいうところの「連想配列」です。キーと値でヒモ付きます。

# 辞書型
変数名 = {
    キー : 値,
    キー : 値,
    キー : 値
}

# 辞書型の出力
print(変数名[キー])
  • 波括弧{}で囲ってキーと値をコロン:でつなぐ

波括弧{}もコロン:もJSと同じですね*15

実例は下記のようになります。

# 辞書型
spec = { 
    "名前" : "イイダリョウ",
    "サイト名" : "クモのようにコツコツと",
    "職業" : "Webデザイナー"
}

# 辞書型の出力
print(spec["職業"])
# 実行結果 Webデザイナー

制御構造

ここからはPythonの制御構造を見ていきましょう。分岐や反復ですね。

if文(分岐)

まずはif文の分岐です。このような書式になります。

if 条件式1 :
    処理1
elif 条件式2 :
    処理2
elif 条件式3 :
    処理3
else :
    処理4
  • ifのあとに条件式を書き、コロン:を付ける
  • 処理はインデントを入れて書く
  • 別の条件はelifで条件式を書くきコロン:を付ける
  • それ以外全ての処理を書きたい場合はelseですぐあとにコロン:

JSとの違いは条件式を括弧()に入れない部分。あと、処理を波括弧{}ブロックに入れずコロン:をつけること*16

特徴的なのは他の条件elifです。JSではelse ifでした。*17

インデントがブロックを意味するので最後に閉じ括弧はありません*18

実例はこの下記のようになります。

age = 37

if age >= 55 :
    print("あなたは年配です")
elif age >= 45 :
    print( "あなたはアラフィフです")
elif age >= 35 :
    print( "あなたはアラフォーです")
elif if age >= 25 :
    print( "あなたはアラサーです")
else:
    print ("あなたは若者です")

# 結果 あなたはアラフォーです

※yag1さんからコメントでご指摘をいただき条件の記載順を年配→若者に修正しました。ご指摘ありがとうございました。(2019/09/01)

while文(反復)

次はwhile文の反復です。

while  条件式 :
    処理
  • whileのあとに括弧()なしで条件式を書きコロン:で繋げる
  • インデントを入れて処理を書く

条件に括弧()がないのもブロックの波括弧{}がないのも先ほどのif文と同じです。

実例は下記のようになります。

# 配列
soup = ["醤油", "味噌", "塩"]

# 初期化式
i=0;

# while文
while i < 3 :
    print(soup[i] + "ラーメンいかがっすかー?") 
    i += 1

# 結果1 醤油ラーメンいかがっすかー?
# 結果2 味噌ラーメンいかがっすかー?
# 結果3 塩ラーメンいかがっすかー?
  • 変数soupに配列を入れる
  • 変数iに初期化式の値0を入れる
  • 条件式は「変数iが3になるまで繰り返す」
  • 変数soupの値んi番目と文字列ラーメンいかがっすかー?を連結して出力
  • 変数iの数値に1を加算して最初の処理に戻る

最後の加算+=のところ注意!JSと異なります。JSは++でした。*19

for文(反復)

反復をもう一つ、お馴染みのfor文を見てみましょう。下記のような書式です。

# Pythonのfor文
for ループ変数 in 範囲 :
    処理

むむっ?*20これはいつものJSのfor文と違いますね…。JSのfor文はこんなです。

//JSのfor文
for (初期化式; 条件式; 増減式) {
    処理
}

JSにはもう一つ、for...in文というものがあります。オブジェクト(連想配列)の値を取得して反復します。

//JSのfor...in文
for( var 変数 in オブジェクト ) {
   処理
}

むしろこっちの方が近い書式ですね!

Pythonのfor文の実例を見ていきましょう。

name = [ "イイダリョウ", "ヤマダタロウ", "カワタジロウ" ]

for kime in name :
    print ( "私の名前は" + kime + "!" )

# 結果1 私の名前はイイダリョウ!
# 結果2 私の名前はヤマダタロウ!
# 結果3 私の名前はカワタジロウ!
  • リストnameに値を3つ入れてます
  • for文ループ変数kimeの範囲はリストnameの値
  • kimeにリストnameの値を入れて出力。最初の処理に戻る。

また、range()関数を使うと数値を範囲にできます。

for sara in range(3) :
    print ( "お皿が" + str(sara + 1) + "ま〜い…" )

# 結果1 お皿が1ま〜い…
# 結果2 お皿が2ま〜い…
# 結果3 お皿が3ま〜い…
  • for文ループ変数saraの範囲はrange()関数の数値3
  • 文字列とsaraの数値をstr()関数で連結して出力
  • saraの数値は0から始まるので1を足して1, 2, 3とする。

最後に

PythonをJS(およびPHP)と比較しました。書式がことなる部分もあるけど全体的な構造は似ていることがわかりました。

行末にセミコロン;がなく、ブロックの波括弧{}などもなく、随分スッキリした書式だな、という感想を持ちました。

インデントだけでブロックの区切りがわかるのだろうか?と半信半疑だったのですが、むしろ余計な記号がないことでインデントが目立って判別しやすいですね。

さて、先日Pythonと同様にRubyも「Hello world」しました。次はRubyの基本書式をJSと比較した記事も書きたいと思います。

※参考:初めてのRuby:インストール確認、REPL、Hello worldまで - クモのようにコツコツと

そして2019年は個人的にはPython元年にしていきたい所存です。Pythonで分析したデータをJSでグラフにしたりね。それではまた!!

※参考:Pythonの学習にオススメ書籍
実践力を身につける Pythonの教科書
(大変わかりやすかったです)

*1:WordPressのテーマ作成のために

*2:PHPは「開始タグと終了タグ」から始めたが、HTML書式との併記が前提のため。Pythonはファイル全体がPython書式。

*3:ちなみにPHPの非推奨の一行コメントにPythonと同様のハッシュ(#)がありました

*4:PHPもJSと同様です

*5:PHPは変数名の前にドル$を付けます

*6:PHPもJSと同様です

*7:PHPのechoみたいな位置付け

*8:PHPも同様

*9:PHPはピリオド(.)でつなぎました

*10:JSやPHPは連結可能

*11:PHPも波括弧をつけずにコロンをつける書式がありました

*12:PHPはさいごにend○○:が入った

*13:およびPHP

*14:PHPの場合はarray()関数の引数として値を入れた

*15:PHPはarray()関数の中でキーと値をアロー(=>)でつなぎました

*16:PHPも波括弧{}なしでコロンを付ける書式がありました

*17:PHPではelseifでした

*18:PHPのコロン付き書式はendifで閉じましたがPythonはそれも不要です

*19:PHPも++です

*20:カビラさん