私的AI研究会 > Python基礎文法
#!/usr/bin/env python import sys # 関数の定義 def func(param): print(param) return param * 2 # メイン if __name__ == '__main__': print(sys.argv) # コマンドライン引数 func(sys.argv[1])
# クラスの定義 class SampleClass(object): CONST_VALUE = 10 class_field = 'abcde' def __init__(self, param): self.instance_field = param def instance_method(self, param): pass @classmehtod def class_method(cls, param): pass @staticmethod def static_method(param): pass # グローバルな関数 def common_func(param): passプライベートなフィールドやメソッドにする場合には、名前の前にアンダースコアを1個付ける。 アンダースコアを付けても外部からアクセスできてしまうが、約束事として外部からアクセスしないようにする。
# パッケージ全体のロード import os # パッケージの中から特定のモジュールをロード from datetime import date # エイリアスを付ける from datetime import datetime dt
MY_PROJECT │ main.py │ └─sub_modules │ test_lib.py │ __init__.pymain.py
#!usr/bin/env python # test_lib.pyをlibという名前で取り込む import sub_modules.test_lib as lib # test_lib.py内のcommon_funcを取り込む from sub_modules.test_lib import common_func if __name__ == '__main__': lib.common_func() common_func()sub_modules/test_lib.py
def common_func(): pass
# これはコメントです print('hoge') # この形もOK
"""コメント開始 あいうえお かきくえこ """
# 普通に print('abcde') # 複数を同時に a = 'A' b = 'B' c = 'C' print(a, b, c) # A B C print(a, b, c, sep='|') # A|B|C # 改行を除きたい print('abcdef', end='')
# 文字列 # python2系は`u'abcde'`みたいにしないとunicodeにならなかったが、 # python3は全部unicode str = 'abcde' # 文字列はダブルクォートでもシングルクォートでもOK。 # 真偽値 ok = True ng = False # 整数(python3からはintとlongの差はなくなった。(メモリが許す限りの桁数が入る)) int_num = 10 # 浮動小数点(floatとdoubleみたいな違いはない) float_num = 1.234 # 小数を含む演算するときはDecimalを使う(浮動小数点問題があるから) from decimal import Decimal print(0.1*0.2) # => 0.020000000000000004 val1 = Decimal("0.1") # なんでか引数は文字列でなければいけない val2 = Decimal("0.2") result = val1 * val2 print(float(result)) # => 0.02 # リスト(配列) list = [1,2,3,4,5] list.append(6) print(list) # 辞書(dict) dic = { "str": "string", "num": 10, "arr": [1,2,3,4,5] } dic['add_prop'] = 'Additional' print(dic) # タプル(一言でいえば、イミュータブル(変更不可能)なリスト) arr1 = (1, 2, 3) # arr1.append(4) => エラーになる print(arr1) # 要素が1つしかない場合はカンマで終わる arr2 = (1,) print(arr2) arr3 = (1) print(arr3) # => 数字の1とみなされる。 # 日時 from datetime import datetime, date today = date.today() now = datetime.now() # 書式変換 today.strftime('%Y/%m/%d') now.strftime('%Y/%m/%d %H:%M:%S.%f')
a = 5 b = 3 # 和 print(a + b) # 8 # 差 print(a - b) # 2 # 積 print(a * b) # 15 # 商 print(a / b) # 1.6666666666666667 # 商の整数部のみ print(a // b) # 1 # 商の整数部分 print(a % b) # 2 # タブルでまとめて取得 q, r = divmod(a, b) # q=1, r=2 # a += bは可能だが、`++`などのインクリメント演算子は無し a += b print(a) # 8
import random random_val = random.randint(1,10) remainder = random_val % 3 if remainder == 0: print(f'0:{random_val}') elif remainder == 1: print(f'1:{random_val}') else: print(f'2:{random_val}')
# forループ for i in range(10): # => 0-9 print(i) # 辞書(dict)のループ sample_dict = {'a': 'A', 'b': 'B', 'c': 'C'} # keyのみ for key in sample_dict: # sample_dict.keys()でも可 value = sample_dict[key] print(f'{key}={value}') # valueのみ for value in sample_dict.values(): print(value) # keyとvalueのセット for key, value in sample_dict.items(): print(f'{key}={value}') # while i = 10 while True: print(i) if i < 1: break i += -1
try: val = 1 / 0 except: print('!!!Exception!!!') # 例外を指定(ちなみにJavaのように複数の例外を並べて発生する例外毎に処理を定義可) try: val = 1 / 0 except ZeroDivisionError as e: print(e) finally: print('finally') # スタックトレースを得る import sys import traceback try: val = 1 / 0 except Exception as e: exception_type, message, _trace = sys.exc_info() print(f'exception_type={exception_type.__name__}, message={message}') print(traceback.format_tb(_trace)) print('================================') # 通常表示されるトレースを文字列にするなら以下の方法 except_str = traceback.format_exc() print(except_str)
def func(param1, param2='default', *args, **kwargs): # pythonはIndentでブロック管理する。(スペース4が標準) print(f'param1={param1}, param2={param2}') print(f'可変長引数={args}') print(f'名前付き引数={kwargs}') return 'result'
ret = func(1, 'abcde', True, foo='FOO', bar='BAR') print(ret) """ param1=1, param2=abcde 可変長引数=(True,) 名前付き引数={'foo': 'FOO', 'bar': 'BAR'} result """
def SampleClass(): """クラス定義の例です。 pythonは1ファイル1クラスとしない方がよく見ますが、 Java出身者が規約を決めたせいでそうなっているプロジェクトはあったりする。 """ # クラス変数(インスタンス化しなくてもアクセス可) class_variable = 10 # コンストラクタ def __init__(self, param): """コンストラクタ。 selfはインスタンス化された自身を指す 第一引数がそうなるだけで"self"という名前でないといけないわけではないが、 慣例的に"self"とする。 """ # インスタンス変数 self.param = param # 疑似プライベートなインスタンス変数 self.__pseudo_private = 'aaa' """↑が何で疑似というかというと、`インスタンス.__pseudo_private`では アクセスできないけど、`インスタンス._SampleClass__param`と書くと アクセスできるため。 pythonにはアクセス修飾子は無いのでこんな使い分けをするのが慣例。 (アンスコ1つをprivate的に扱われていることもあるが、アンスコ1つだと 普通にアクセスできるのでアンスコ2つが原則) """ # __init__の他にも__new__とか__call__というのも存在する。 # https://qiita.com/FGtatsuro/items/49f907a809e53b874b18 def method(self, param): """インスタンスメソッド """ pass @classmethod def class_method(cls, param): """クラスメソッド 第一引数がクラス自身の参照となる。 """ print('class method') @staticmethod def static_method(param): """スタティックメソッド """ print('static method') # クラスメソッドとスタティックメソッドの使い分けは正直わからん。 # (クラスメソッドの必要性を感じることがあまりない) def __str__(self): """javaのtoString()みたいなもの 人が見たときにわかりやすい内容で返す。 str(object) と組み込み関数 format(), print() によって呼ばれる """ return self.param def __repr__(self): """こっちも似たようなものだが、こちらは 再び元のオブジェクトに戻せる文字列で返す. 組み込み関数`repr(オブジェクト)`の実行で呼ばれる __repr__しか定義していないと、str(オブジェクト)でもreprが呼ばれる """ return self.__class__.__name__ + "(" + self.param + ")"
def Parent1(object): def __init__(self): print('Parent1') def Parent2(object): def __init__(self): print('Parent2') def Child(Parent1, Parent2): """pythonではこんな感じに多重継承ができる。 """ def __init__(self): print('Child')
str = 'abcde' # left print(str[:3]) # => abc # mid print(str[2:4]) # => cd # mid(末尾まで) print(str[3:]) # => de # right print(str[-3:]) # => cde # split print(str.split('c')) # => ['ab', 'de'] # join(listのメソッドじゃなくて、strのメソッドなので注意) print('@'.join(['abc', 'def', 'ghi'])) # => abc@def@ghi
# 左詰め/右詰め print('|%5s|%-5s|' % ('A', 'B')) # 整数 print('|%d|%05d|' % (123, 456)) # 浮動小数点 print('|%f|%5.3f|' % (123.456, 456.78)) # 他にもhex(16進数)とか8進数とかもあるが割愛
# format関数 print('{}={}'.format('key', 'value')) # => key=value # 位置Index付き print('{1}={0}'.format('key', 'value')) # => `value=key`と出力される # python3.6からこんなことができるようになった(便利) key = 'key' value = 'value' print(f'{key}={value}') # => key=vallue