Python
初心者
コーディング規約
python3
備忘録

【随時追記】今夜寿命を迎えても良いようにPythonの基礎学習内容をメモしとく。

概要

Java脳だった私も遂にPythonデビューしたので、小さいことからお便利テクニックまで、個人的にこれはメモだ!と思ったことを独断と偏見で世間に発信していくだけの記事を作りました。

殴り書きレベルにまとめて行きますのでご了承ください。orz

コーディング関連

import関連

import文は基本的にはファイルの最初にまとめておきましょう。
Pythonにもいくつかのimport文が存在しています。

通常

以下のようにモジュールをimportする事が出来ます。

通常
import math

print('円周率 -> {}'.format(math.pi))  # 円周率 -> 3.141592653589793

別名(as)

importしたモジュールに別名をつけて使う事が出来ます。

別名
import math as mathUtil

print('円周率 -> {}'.format(mathUtil.pi))  # 円周率 -> 3.141592653589793

From(as)

importしたいモジュールの中からメソッドクラス単位で読み込む

以下のようなモジュールがあった場合、

myModule.py
class Hello():
    def world(self):
        return 'Hello,World!!'

def hoge():
    return 'fuga'

以下のように記述が出来ます。
記述時の冗長化を取り除く事が出来ます(特にクラス利用時)。

From
import myModule
print(myModule.Hello().world())  # Hello,World!!

import myModule
print(myModule.hoge())  # fuga

from myModule import Hello
print(Hello().world())  # Hello,World!!

from myModule import hoge
print(hoge())  # fuga

print関連

通常通常出力

単純に文字列を出力したい場合はprint関数を利用します。

通常出力
print("通常出力")

インスタンス出力

ただ、インスタンスの状態を出力したい場合、単純にprint関数に渡すと、

インスタンス出力(ダメな方法)
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def myNameIs(self):
        return self.name

person = Person("Taro", 20)
print(person)  # <__main__.Person object at 0x101172588>

のように、インスタンスオブジェクトの情報しか表示されません。

なので、vars関数をかませることでインスタンス内の値を表示することが出来ます。

インスタンス出力(正しい方法)
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def myNameIs(self):
        return self.name

person = Person("Taro", 20)
print(vars(person))  # {'name': 'Taro', 'age': 20}

クラス関連

定義方法

クラスを作る場合は以下のように定義することが出来ます。

クラス定義
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def myNameIs(self):
        return self.name

person = Person("Taro", 20)
print(person.myNameIs())  # Taro

変数関連

変数の型

Pythonは動的型付けなので、Javaのように変数定義時に型を指定する必要がありません
また、JavaScriptのようにvar等すらも不要です。

Python
name = '太郎'
Java
String name = "太郎";
JavaScript
var name = "太郎";

大文字と小文字の区別

Pythonは変数名の小文字大文字区別します。

var
hoge = "fuga"
print(Hoge)
# NameError: name 'Hoge' is not defined

インデント

Pythonでは行頭スペースのラインでブロックが決まります。
一般的にはスペース4個単位でインデントを取るのが基本らしいです。

他の言語と同様にタブも使えるようですが、同じインデントを表す際に、スペースとタブの差異があるとエラーが出てしまいます。
ちなみに、タブは内部的にスペース8個分と同じラインになってしまうので、あまり推奨されていないそうです。

エラー
for element in {1,2,3}:
    print ("タブx1") 
        print ("スペースx8")  # inconsistent use of tabs and spaces in indentation

for element in {1,2,3}:
    print ("スペースx4") 
    print ("スペースx4")
    if element == 2:  # タブx1
     print ("タブx1 + スペースx1")  # inconsistent use of tabs and spaces in indentation
正常
for element in {1,2,3}:
    print ("タブx1") 
    print ("タブx1")
    if element == 2:  # タブx1
         print ("スペースx9")  # インデント上はタブ = スペース8個分なので合計スペース9個以上ならOK

for element in {1,2,3}:
    print ("タブx1") 
    print ("タブx1")
    if element == 2:  # タブx1
     print ("タブx1 + スペースx1")  # インデント上はタブ = スペース8個分なので合計スペース9個以上ならOK

for element in {1,2,3}:
    print ("スペースx4") 
    print ("スペースx4")
    if element == 2:  # スペースx4
        print ("スペースx4 + タブx1")  # 合計スペース5個以上ならOK

※Qiita上ではズレてますが、処理上はスペース8個とタブ1個でラインは揃いますorz

要するに、Pythonではタブインデントはやめましょうw

セミコロン

Pythonではセミコロンがない場合、その行全てが一つの処理とみなされます。
もちろん、セミコロンをつけても良いですが別につけなくてもエラーにはなりません。だいたい皆付けていません。

Python
print ("Hello")   # どちらも同じ
print ("Hello");  # どちらも同じ

また、意図的にセミコロンを入れることで複数の処理を一行にまとめることも出来ます。
ただ、この記述方法はあまり推奨されていないので、特別な利用がなければ、1処理1行にまとめた方が良いでしょう。

Python
print ("Hello."); 
print ("World!");  # どちらも同じ
print ("Hello."); print ("World!");  # どちらも同じ

複数行記述

長い処理の場合、一行にすると横に長くなってしまい非常に見にくいです。
そんな時は「\」を使って複数行に渡って記述をすることが可能です。

ただし、 丸/波/角括弧の中は常に継続と判断されるので 「\」 は不要とのことです。
(@shiracamus さんご指摘ありがとうございます!)

複数行
result = 1 + \
 2
print(result)  # 3

print(1 + 2)  # 3
print(1 +
                  2)  # 3

シングルクウォートとダブルクウォート

Pythonではシングルクウォートでもダブルクウォートでも基本的にはどちらでも良いです。
お好きな方を使いましょう。

引用符
single = 'single'  # 同じ
double = "double"  # 同じ
print(single)
print(double)

文字列中に引用符を入れる場合は、囲んでない引用符を使う場合とエスケープする2つの方法があります。

引用符2
single1 = 'this is "single1."'  # 同じ
double1 = "this is 'double1.'"  # 同じ
print(sinble1)
print(double1)

single2 = 'this is \'single2.\''  # 同じ
double2 = "this is \"double2.\""  # 同じ
print(single2)
print(double2)

コメント関連

単一行

単一行は、#を使うことで以降の記述をコメントアウトすることが可能になります。

単一行コメント
# これはコメント
print("Hello, world!") # これもコメント

複数行

厳密には、複数行文字列(ヒアドキュメント)との事です。
複数行にわたるコメントを記述する際に利用されています。

複数行コメントはシングルクウォートまたはダブルクウォート3つで記述可能です。
(@shiracamus さんご指摘ありがとうございます!)

複数行コメント
'''
print(hoge)
print(hoge)
'''
"""
print(fuga)
print(fuga)
"""

if文

Pythonのif文の書き方はちょっと特殊です。

Python
if value == 1:
    print('valueの値は1です')
elif value == 2:
    print('valueの値は2です')
elif value == 3:
    print('valueの値は3です')
else:
    print('該当する値はありません')
Java/JavaScript
if( value == 1 )
    System.out.println("valueの値は1です");
else if( value == 2 )
    System.out.println("valueの値は2です");
else if( value == 3 )
    System.out.println("valueの値は3です");
else
    System.out.println("該当する値はありません");

また、複合条件and/orを使うことで簡単に指定することが出来ます。

複合条件
if value == 1 and value == 2 - 1:  # どちらも満たす場合
    print('valueの値は1です')
elif value == 1 or value == 2:  # いずれかを満たす場合
    print('valueの値は1か2です')
else:
    print('該当する値はありません')

条件によって何もしたくない場合はpassでスキップすることも出来ます。

スキップ
if value == 0:
    pass  # 何もしない
elif value == 1 and value == 2 - 1:
    print('valueの値は1です')
elif value == 1 or value == 2:
    print('valueの値は1か2です')
else:
    print('該当する値はありません')

for文

for文もif文と似ています。
もちろん、break/continueも使えます。

for文
for element in array:
    print(element)

またfor-elseという構文も使えます。

for-else文
for element in array:
    print(element)
    if element == 2 :
        break
else:
  print("End")  # for文が終了した際に一度だけ実行されるが、breakの際には実行されない

@wakamezake さんご指摘ありがとうございます!

enumerate関数

ループの中でindex番号を取得したいケースは少なからずあります。
その場合は、enumerate関数を使うことで実現可能です。
※indexは0スタートです。

indexの取得
for index, element in enumerate(array):
    print(element)
    if index > 3 :
        break

コレクション関連

リスト(list)

複数のデータをまとめて管理する事が出来ます。
リストを定義するには角括弧([])を使って表し、要素をカンマ(,)で区切ります。

リスト
list = ["yamada","tanaka","takahashi"]
print(list)  # ['yamada', 'tanaka', 'takahashi']

タプル(tuple)

タプルを定義するには括弧(())を使い、要素をカンマ(,)で区切りで並べます。
また、括弧を使わなくても定義することは可能です。
が、可読性を上げるために括弧で囲むようにしましょう。

リストとタプルの違いは

  • イミュータブル(不変)
  • 実行速度がリストよりちょっとだけ早い

です。

タプル
tuple = ("yamada","tanaka","takahashi")
print(tuple)  # ('yamada', 'tanaka', 'takahashi')

tuple = "yamada","tanaka","takahashi"
print(tuple)  # ('yamada', 'tanaka', 'takahashi')

辞書(dictionary)

ディクショナリ型とは、「{}」の中にkey/valueの組み合わせで表すデータのことです。
基本的にはJSON形式と同じですが、Pythonではディクショナリ型として取り扱います。

Keyが存在しない値を指定するとエラーになるので気をつけてください。

test.json
{
  "yamada":{
    "age":20,
    "sex": "male"
  },
  "tanaka":{
   "age": 19,
   "sex": "female",
   "mailAddress": "XXXX@XXXX"
  }
}
dic.py
import json

testJson = open('test.json', 'r')
jsonDict = json.load(testJson)
print(jsonDict)  # {'tanaka': {'age': 19, 'mailAddress': 'XXXX@XXXX', 'sex': 'female'}, 'yamada': {'age': 20, 'sex': 'male'}}


print(jsonDict['yamada'])  # {'sex': 'male', 'age': 20}
print(jsonDict['yamada']['age'])  # 20

print(jsonDict['yamada']['mailAddress'])  # KeyError: 'mailAddress'

print('jsonDict:{}'.format(type(jsonDict)))  # jsonDict:<class 'dict'>

jsonStr = json.dumps(jsonDict)
print('jsonStr:{}'.format(type(jsonStr)))  # jsonStr:<class 'str'>

集合(set)

リストやタプルのようにしか持ちませんが、順序も持たず1つの集合内には同じ値が1つしか持てません。
なので、一意な値を管理する際に非常に便利です。

集合を定義するには、波括弧({ })で囲んだ中に、要素をカンマ(,)で区切って指定して定義します

リスト
set = ["yamada","tanaka","takahashi"]
print(set)  # {'yamada', 'tanaka', 'takahashi'}

内包表記

Pythonには「内包表記」という概念があります。
これは、リストディクショナリシンプルに記述する方法の事を指しています。

内包表記を用いると、複数行に渡す記述まとめて1行で書く事が可能になり非常に便利です。

慣れるまでは大変ですが、Pythonを覚えれるのであれば頑張って使いこなせるようになりましょう!

リスト内包表記

以下は同じです。

リスト内包表記
result = []
for element in range(1,5):
    result.append(element)
print(result)  # [1, 2, 3, 4]

result = [element for element in range(1,5)] 
print(result)  # [1, 2, 3, 4]

また、if文を入れることで条件にマッチした要素のみ収集する事が可能です。

条件有りリスト内包表記
result = [element for element in range(1,5) if element % 2 == 0] 
print(result)  # [2, 4]

集合内包表記

以下は同じです。

集合内包表記
result = set()  # {}だと辞書型だと思われるのでエラーが発生する
for element in range(1,5):
    result.add(element)
print(result)  # {1, 2, 3, 4}

result = {element for element in range(1,5)}
print(result)  # {1, 2, 3, 4}

(@shiracamus さんご指摘ありがとうございます!)

辞書内包表記

以下は同じです。

辞書内包表記
result = {}
for element in range(1,5):
    result[str(element)] = element * element
print(result)  # {'4': 16, '3': 9, '1': 1, '2': 4}

result = {str(element): element * element for element in range(1,5)}
print(result)  # {'4': 16, '3': 9, '1': 1, '2': 4}

関数関連

定義の仕方

関数定義
def add(x, y):
    result = x + y
    return(result)

print(add(1,3))  # 実行結果 -> 4

ビルドイン関数

map

リストの全ての要素同様の処理を行います。
ただ、Python3系ではmap関数はmapオブジェクトで返ってくるので、リストにする場合はlist関数をかませる必要があります。

Python
def sample(value):
    return value * value

print (resultList)
resultMap = map(sample, range(1,5))
print (resultMap)  # <map object at 0x101463518>

resultMap = map(sample, range(1,5))
resultList = list(resultMap)
print (resultList)  # [1, 4, 9, 16]
Java
int [] result = IntStream.range(1, 5)
    .map( element -> element * element)
    .toArray();
String resultStr = Arrays.toString(result);
System.out.println(resultStr);  // [1, 4, 9, 16]

ラムダ式

もちろん、Pythonでもlambda式を使うことは出来ます。
前述のmap関数をlambda式にすると以下のようになります。

Python
resultMap = map(lambda element: element * element, range(1,5))
resultList = list(resultMap)
print (resultList)  # [1, 4, 9, 16]

文字列関連

結合

結合は「+」で可能です。
または、「+=」でも可能です。
*」を使うことで指定回数結合を繰り返すことが出来ます。

結合
name = "yamada"
kana = "ヤマダ"

print( name + ":" + kana )  # yamada:ヤマダ

name = "yamada"
name += ":"
name += "ヤマダ"

print( name )  # yamada:ヤマダ

name = "yamada" * 3
print( name )  # yamadayamadayamada

配列の場合

配列を結合して一つの文字列にしたい場合は、join関数を使って

persons = ["Taro", "Jiro", "Hanako"]
personsStr = ' #'.join(persons)  # Taro,Jiro,Hanako

とすることが出来ます。

数値 →  文字列

数値を文字列化するには「str関数」を使います。
そのまま実行してしまうとエラーが出てしまいます。

エラー
name = "yamada"
age = 20

print( name + ":" + age )  # Can't convert 'int' object to str implicitly
正常
name = "yamada"
age = 20

print( name + ":" + str(age) )  # yamada:20

置換

文字列の一部を置換するには「replace関数」を使います。

置換
name = "yamada"

print( name.replace("yama", "umi") )  # umida

分割

文字列の分割には「split関数」を使います。

分割
name = "yamada:20"

print( name.split(":") )  # ['yamada', '20']

検索

文字列検索をする方法は複数あります。

文頭

文字列が指定の文字で始まっているかを求めるには「startswith関数」を使います。

文頭
name = "yamada"

print( name.startswith("yama") )  # True
print( name.startswith("umi") )  # False

文中

文字列の中に指定の文字が含まれているかを求めるに「in構文」を使います。

文中
name = "yamada"

print( "ya" in name  )  # True
print( "ma" in name  )  # True
print( "da" in name  )  # True
print( "umi" in name  )  # False

文末

文字列が指定の文字で終わっているかを求めるには「endswith関数」を使います。

文末
name = "yamada"

print( name.endswith("yama") )  # True
print( name.endswith("mada") )  # False