Python


基本事項

キーワード

  • _
  • and
  • as
  • assert
  • async
  • await
  • break
  • case
  • class
  • continue
  • def
  • del
  • elif
  • else
  • except
  • False
  • finally
  • for
  • from
  • global
  • if
  • import
  • in
  • is
  • lambda
  • match
  • None
  • nonlocal
  • not
  • or
  • pass
  • raise
  • return
  • True
  • try
  • while
  • with
  • yield

構文

Hello World!

print('Hello, world!')

文・式

改行が文の区切りとなり、セミコロンなどの句読点は必須ではない。 しかし、あえて区切るときにセミコロンを使うことができる。

a = 5; b = 3; c = a + b print(c)

文を数行に分けて記述する場合、行末にバックスラッシュ(\)が必要。

total = 123 \ + 456 \ + 789

任意のカッコ内のカンマ(,)後には必要ない。

months = [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ]

コメントアウト

print("Hello") # Helloと表示します

改行エスケープには注意。

total = 123 \ # ここにコメントは記述できない + 456 # ここには記述できる months = [ 'Jan', 'Feb', 'Mar', 'Apr', # ここにはコメントを記述できる 'May', 'Jun', 'Jul', 'Aug', # ここにはコメントを記述できる 'Sep', 'Oct', 'Nov', 'Dec' ]

print文

print("ABC") print("AAA", "BBB") #=> AAA BBB print("AAA", end="") # 改行しない print("BBB") # 改行する

ファイルに出力する場合:

f = open("test.txt", "w") print("Hello world!", file=f) f.close()

数値・文字列・型

整数(int)

num = 1234 # 正の整数 (10進数) num = 0b11000100 # 2進数 (0b/0Bで始まる数値は 2進数とみなされる) num = 0o777 # 8進数 (0o/0Oで始まる数値は 8進数とみなされる) num = 0xffff # 16進数 (0x/0Xで始まる数値は16進数とみなされる)

浮動小数点数(float)

末尾にeまたはEを付けて指数表記することもできる。

num = 1.234 # 浮動小数点数 num = 1.2e3 # 浮動小数点数(指数表記) 1.2 × 10^3 num = 1.2E-3 # 浮動小数点数(指数表記) 1.2 × 10^(-3)

虚数(complex)

末尾にjまたはJをつけて虚数型になる。

num = 3.14j

真偽値(bool)

頭文字が大文字であることに注意。

bool = True bool = False

Falseと見なされる値:

これ以外はTrueになる。

値無し(None)

x = None

文字列(str)

str = "Hello world" str = 'Hello world'

生文字列

rまたはRを各クォーテーションの前につけると、文字列内のエスケープシーケンスを無視する。

str = 'aaa\nbbb' # \n は改行とみなされる str = r'aaa\nbbb' # \n はバックスラッシュ文字(\)と小文字nとみなされる

フォーマット文字列

fまたはFを各クォーテーションの前につけると、文字列中の{}に式を埋め込むことができる。

name = "Yamada" age = 26 print(f"My name is {name}. I'm {age} years old.") a = 5 b = 3 print(f"{a + b}") #=> 8

{}を二重にしてエスケープ:

print(f"{{n}}") # {n}

カンマ(,)で数値の桁区切りをする。

n = 12345 print(f"{n:,}") # 12,345

進数表記に変換できる。

n = 123 print(f"{n}") # 123 ... 10進数 print(f"{n:b}") # 1111011 ... 2進数 print(f"{n:o}") # 173 ... 8進数 print(f"{n:x}") # 7b ... 16進数(小文字) print(f"{n:X}") # 7B ... 16進数(大文字) print(f"{n:#}") # 123 print(f"{n:#b}") # 0b1111011 print(f"{n:#o}") # 0o173 print(f"{n:#x}") # 0x7b print(f"{n:#X}") # 0X7B print(f"{n:08}") # 00000123 print(f"{n:08b}") # 01111011 print(f"{n:08o}") # 00000173 print(f"{n:08x}") # 0000007b print(f"{n:08X}") # 0000007B

小数の表示のフォーマット

n = 12.3456 print(f"{n:.2f}") # 12.35 print(f"{n:8.2f}") # 12.35 print(f"{n:.2e}") # 1.23e+01 print(f"{n:.2E}") # 1.23E+01 print(f"{n:.2g}") # 1.23 print(f"{n:.2%}") # 1234.56%

複数行文字列

str = """A simple example module This module is ... """

改行エスケープでもいい。

str = "Hello \ world!"

文字列の連結

print("Hello " "world!")

文字列のフォーマット

errmsg = "Can't open file" errcode = 19042 msg = "ERROR: %s (%d)" % (errmsg, errcode) print(msg) #=> ERROR: Can't open file (19042) print("%s" % "ABC") #=> ABC print("%d" % 123) #=> 123 print("%f" % 1.23) #=> 1.230000 print("%x" % 255) #=> ff print("%o" % 255) #=> 377 print("%%%d" % 80) #=> %80

その他の処理

詳細

間に挟んで連結

li = ['a', 'b', 'c'] print(','.join(li)) # 'a,b,c'

置換

s = 'abcde, abcde' print(s.replace('bcd', 'XXX')) # 'aXXXe, aXXXe' print(s.replace('e', 'X', 1)) # 'abcdX, abcde'

検索

s = 'abcabcabc' print('初めて現れるbは' + str(s.find('b') + 1) + '文字目') # '初めて現れるbは2文字目' print('3文字目以降に初めて現れるbは' + str(s.find('b', 2) + 1) + '文字目') # '3文字目以降に初めて現れるbは4文字目'

出現回数

s = 'aaabbc' print(s.count('b')) # 2

スペースで分割

a = 'Nice to meet you' print(a.split()) # ['Nice', 'to', 'meet', 'you']

繰り返し

s = 'abc' print(s*2) # 'abcabc'

変数・定数

変数

変数名は英数字とアンダーバー(_)で構成する。頭文字に数字は使えない。 正規表現では[a-zA-Z_][a-zA-Z0-9_]*

value1 = 123 _value1 = 123 test_value = 123 TEST_VALUE = 123

リスト・タプル・辞書

リスト(list)

a = [10, 20, 30, 40]

[]を使って要素を参照する。

a = ['A', 'B', 'C', 'D', 'E', 'F', 'G'] a1 = a[0] # 0番目: 'A' a2 = a[2] # 2番目: 'C' a1 = a[-1] # 最後の文字 'G' a2 = a[-3:-1] # 最後から3番目の文字から最後から1番目の前の文字: ['E', 'F'] a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] a1 = a[2:4] # 2番目から3番目: [2, 3] a2 = a[2:] # 2番目から最後: [2, 3, 4, 5, 6, 7, 8, 9] a3 = a[:4] # 最初から3番目: [0, 1, 2, 3] a1 = a[1:8:2] # 1番目から7番目まで2個とばし: [1, 3, 5, 7]

+でリストを結合できる。

print([1, 2, 3] + [4, 5, 6]) #=> [1, 2, 3, 4, 5, 6]

リストの長さ

print(len([1, 2, 3])) #=> 3

タプル(tuple)

リストと違って中身を変更できない。

a = (10, 20, 30, 40)

要素が1つのときは注意が必要。

a = (10) # タプルではなく数値の10となる a = (10,) # タプルの(10,)となる

タプルを戻り値にする場合

def get_date(): return 2022, 10, 9 year, month, day = get_date() print("%04d/%02d/%02d" % (year, month, day)) # 2022/10/09

辞書(dict)

d = {'Yamada': 30, 'Suzuki': 40, 'Tanaka': 80}

[]を使って要素にアクセスする。

d1 = d['Yamada'] d2 = d['Suzuki'] d3 = d['Tanaka']

リスト関数

map()はリストの各要素に処理をしたものを返す。

a = [1, 2, 3] def double(x): return x * 2 print(list(map(double, a))) #=> [2, 4, 6] : 関数方式 print(list(map(lambda x: x * 2, a))) #=> [2, 4, 6] : lambda方式 print([x * 2 for x in a]) #=> [2, 4, 6] : 内包表記(後述)

filter()は元のリストから条件を満たす要素だけを残したリストを返す。

a = [1, 2, 3] def isodd(x): return x % 2 print(list(filter(isodd, a))) #=> [1, 3] : 関数方式 print(list(filter(lambda x: x % 2, a))) #=> [1, 3] : lambda方式 print([x for x in a if x % 2]) #=> [1, 3] : 内包表記(後述)

reduce()は総和を計算するときなどに使う。

from functools import reduce a = [1, 2, 3, 4, 5] def add(x, y): return x + y print(reduce(add, a)) #=> 15 : 関数方式 print(reduce(lambda x, y: x + y, a)) #=> 15 : lambda方式

リストの内包表記

a = [1, 2, 3] print([2*x for x in a]) #=> [2, 4, 6] print([2*x for x in a if x == 3]) #=> [6] print([[x, 2*x] for x in a]) #=> [[1, 2], [2, 4], [3, 6]] print([(x, 2*x) for x in a]) #=> [(1, 2), (2, 4), (3, 6)] b = [4, 5, 6] print([x * y for x in a for y in b]) #=> [4, 5, 6, 8, 10, 12, 12, 15, 18] print([a[i] * b[i] for i in range(len(a))]) #=> [4, 10, 18]

セット(set)

重複のないリスト。いくつかの論理演算ができる。

a = set(['red', 'blue', 'green']) b = set(['green', 'yellow', 'white']) print(a) #=> set(['red', 'blue', 'green']) print(b) #=> set(['green', 'yellow', 'white']) print(a - b) #=> set(['red', 'blue']) print(a | b) #=> set(['red', 'blue', 'green', 'yellow', 'white']) print(a & b) #=> set(['green']) print(a ^ b) #=> set(['red', 'blue', 'yellow', 'white']) print('green' in a) #=> True a.add('black') print(a) #=> set(['red', 'blue', 'green', 'black'])

その他の処理

詳細

要素追加・拡張・結合

li = [1, 2, 3, 4] li.append(5) print(li) # [1, 2, 3, 4, 5] li = [1, 2, 3] li.extend([4, 5]) print(li) # [1, 2, 3, 4, 5] tpl = 1, 2, 3 tpl2 = 4, 5, 6 print(tpl + tpl2) # (1, 2, 3, 4, 5, 6) dict = {'a': 1, 'b': 'Hi', 'c': True} dict['d'] = 123 dict.setdefault('e', 'default') dict = {'a': 1, 'b': 2, 'c': 3} dict2 = {'c': 4, 'd': 5, 'e': 6} print(dict.update(dict2)) # {'a': 1, 'b': 2, 'c': 4, 'd': 5, 'e': 6}

末尾の要素を消す

li = [1, 2, 3, 2] li.remove(2) print(li) # [1, 3, 2]

挿入

li = [1, 3] li.insert(1, 2) print(li) # [1, 2, 3]

含まれている個数

li = [1, 2, 3, 2, 2] print(li.count(2)) # 3 tpl = 1, 2, 3 print(tpl.count(3)) # 1

検索

li = [1, 2, 3] print('初めて現れる2は' + str(li.index(2)+1) + '文字目') tpl = 1,2,3 print(tpl.index(1)) # 0

最大・最小

li = [1, 2, 3] print(max(li)) # 3 print(min(li)) # 1 tpl = 1, 2, 3 print(max(tpl)) # 3 print(min(tpl)) # 1

ソート

li = [2, 1, 3] print(li.sort()) # [1, 2, 3] tpl = 2, 1, 3 print(surted(tpl)) # (1, 2, 3)

辞書のリスト化

dict = {'a': 1, 'b': 'Hi', 'c': True} print(list(dict.keys())) # ['a', 'b', 'c'] dict = {'a': 1, 'b': 'Hi', 'c': True} print(list(dict.values())) # [1, 'Hi', True]

演算子

算術演算子

+a # 正数 -a # 負数 a + b # 加算 a - b # 減算 a * b # 乗算 a / b # 除算 a % b # a を b で割った余り a ** b # a の b 乗 a // b # 切り捨て除算

ビット演算子

~a # ビット反転 a & b # AND:論理積(aもbも1のビットが1) a | b # OR:論理和(aまたはbが1のビットが1) a ^ b # XOR:排他的論理和(aまたはbが1のビットが1) a << b # b ビット左シフト a >> b # b ビット右シフト

代入演算子

a = b # a に b を代入する a += b # a = a + b に同じ a -= b # a = a - b に同じ a *= b # a = a * b に同じ a /= b # a = a / b に同じ a %= b # a = a % b に同じ a **= b # a = a ** b に同じ a //= b # a = a // b に同じ a &= b # a = a & b に同じ a |= b # a = a | b に同じ a ^= b # a = a ^ b に同じ a <<= b # a = a << b に同じ a >>= b # a = a >> b に同じ

比較演算子

a == b # a が b と等しい a != b # a が b と異なる a < b # a が b よりも小さい a > b # a が b よりも大きい a <= b # a が b 以下である a >= b # a が b 以上である a is b # a が b と等しい a is not b # a が b と異なる a in b # a が b に含まれる (a, b は共に文字列、または、b はリストやタプル) a not in b # a が b に含まれない (a, b は共に文字列、または、b はリストやタプル)

ブール演算子

a and b # a も b も真であれば真 a or b # a または b が真であれば真 not a # a が偽であれば真

条件演算

x if c else y

文字列演算

a + b # 文字列 a と 文字列 b を連結します a * n # 文字列 a を n 回繰り返します a[n] # 文字列 a の中の n 番目の文字を取り出します a[n:m] # 文字列 a の中の n 番目から m 番目までの文字列を取り出します a[n:] # 文字列 a の中の n 番目から最後までの文字列を取り出します a[:m] # 文字列 a の中の 0 番目から m 番目までの文字列を取り出します a[n:m:s] # 文字列 a の中の n 番目から m 番目までの文字列を s個とばしで取り出します

条件式(三項演算子)

err = 0 print("OK" if err == 0 else "NG")

代入式

代入の文が値を返すようになる。

s = "ABCDEF" if (len := len(s)) > 5: print("LONG") else: print("SHORT")

行列積

import numpy as np A = np.array([[1, 2], [3, 4]]) B = np.array([[5, 6], [7, 8]]) # [[1*5+2*7=19, 1*6+2*8=22], [3*5+4*7=43, 3*6+4*8=50]] print(np.dot(A, B)) # [[19, 22], [43, 50]] print(A @ B) # [[19, 22], [43, 50]]

制御構文

条件式(if, else, elsif)

num = 12 if num > 10: print("BIG") print("BIG") print("BIG") if num > 10: print("BIG") else: print("SMALL") if num > 10: print("BIG") elif num == 10: print("NORMAL") else: print("SMALL")

繰り返し(while, else)

n = 0 while n < 10: print(n) n += 1 n = 0 while n < 10: print(n) n += 1 else: print('END')

繰り返し(for, in)

for n in [1, 2, 3]: # 配列 print(n) #=> 1, 2, 3 for n in (1, 2, 3): # タプル print(n) #=> 1, 2, 3 for c in "ABC": # 文字列 print(c) #=> A, B, C for k in {'one': 1, 'two': 2, 'three': 3}: # 辞書 print(k) #=> one, two, three for line in open("sample.txt"): # ファイルの中身 print(line) # 1行ずつ表示

elseを使う例

for n in [1, 2, 3]: print(n) else: print('END')

単に指定回数分繰り返す場合

for n in range(10): print(n)

ループを抜ける(break)

for n in range(10): if n == 5: break print(n) # 0, 1, 2, 3, 4

ループを繰り返す(continue)

for n in range(10): if n == 5: continue print(n) # 0, 1, 2, 3, 4, 6, 7, 8, 9

例外処理(try, except, else, finally, as, raise)

str = 'ABC' try: c = str[5] # 5番目の文字が無いので、IndexError例外が発生します except IOError: print('IOError') # IOError例外の場合、このブロックが実行されます except IndexError: print('IndexError') # IndexError例外の場合、このブロックが実行されます except: print('Unknown') # 上記以外の例外の場合、このブロックが実行されます else: print('Other') # 例外が発生しなかった場合、このブロックが実行されます finally: print('Finally') # 常に、このブロックが実行されます

asで例外情報を変数に格納する。

try: xxx except SystemError as e: print("SystemError") print(e)

raiseは例外を発生させる。

# 元の例外をそのまま投げる except Exception as e: raise e # 新たな例外を生成して投げる except Exception: raise MyError() # 元の例外情報をつけて、新たな例外を投げる except Exception as e: raise MyError() from e # 元の例外を無視して、新たな例外を投げる except Exception: raise MyError() from None

with構文

例えばfileオブジェクトはopen()するとclose()しないといけないが、withは自動で呼び出してくれる。

# withを用いない書き方 f = open("test.txt") print(f.read()) f.close() # withを用いた書き方1 with open("test.txt") as f: print(f.read()) # withを用いた書き方2 f = open("test.txt") with f: print(f.read())

デリート文(del)

オブジェクトを削除する。

x = 5 y = [1, 2, 3] z = MyClass() del x, y, z

マッチ文(match)

他の言語のswitch文。

c = 3 match c: case 1: print("One") case 2: print("Two") case 3: print("Three") case _: print("Other")

コルーチン(async, await)

import asyncio import requests urls = [ "https://www.yahoo.co.jp", "https://www.google.com", "https://www.wikipedia.com" ] async def getsize(url): print(f"getsize({url}) START") loop = asyncio.get_event_loop() r = await loop.run_in_executor(None, requests.get, url) print(f"getsize({url}) END {len(r.text)} bytes") async def main(): print('main() START') tasks = [asyncio.create_task(getsize(url)) for url in urls] await asyncio.gather(*tasks) print('main() END') if __name__ == "__main__": loop = asyncio.get_event_loop() loop.run_until_complete(main())

関数

関数

def add(x, y): print(x + y) add(3, 5) #=> 8 def add(x, y): ans = x + y return ans n = add(3, 5) print(n) #=> 8 def func(): return 3, "ABC" n, s = func() print(n, s) #=> 3 ABC

キーワード引数

def repeat_msg(msg, repeat=3): for i in range(repeat): print(msg) repeat_msg('Hello') # Hello, Hello, Hello repeat_msg('Yahho', repeat=5) # Yahho, Yahho, Yahho, Yahho, Yahho

可変引数

def func(a1, a2, *args, **kwargs): print(a1) #=> A print(a2) #=> B print(args) #=> ('C', 'D') print(kwargs) #=> {'k1': 'K1', 'k2': 'K2'} func('A', 'B', 'C', 'D', k1='K1', k2='K2')

変数を渡す場合は***を付ける必要がある。

def func(a1, a2, *args, **kwargs): print(a1) #=> A print(a2) #=> B print(args) #=> ('C', 'D') print(kwargs) #=> {'k1': 'K1', 'k2': 'K2'} args = ('C', 'D') kwargs = {'k1': 'K1', 'k2': 'K2'} func('A', 'B', *args, **kwargs) #=> A, B, ('C', 'D'), {'k1': 'K1', 'k2': 'K2'}

グローバル変数(global)

関数の中でグローバル変数に代入できないので、globalを使って関数内で定義した変数をグローバル化して扱う必要がある。

count = 0 # グローバル変数 def func1(): print(count) # 参照することはできる def func2(): global count # global宣言してやれば count += 1 # 代入することもできる

ラムダ式(lambda)

myfunc = lambda x, y: x + y print(myfunc(3, 5)) #=> 8

イテレータ(iterator)

class MyRange: def __init__(self, max): self._max = max def __iter__(self): self._count = 0 return self def __next__(self): result = self._count if result >= self._max: raise StopIteration self._count += 1 return result for n in MyRange(5): print(n) #=> 0, 1, 2, 3, 4

ジェネレータ(yield)

def funcA(list): ret = [] for n in list: ret.append(n * 2) return ret for n in funcA([1, 2, 3, 4, 5]): print(n) #=> 2, 4, 6, 8, 10

上記は下記と同値

def funcB(list): for n in list: yield n * 2 for n in funcB([1, 2, 3, 4, 5]): print(n) #=> 2, 4, 6, 8, 10

デコレータ(@)

指定した関数の前後に処理を行う。

def mydecolater(func): # デコレータを定義する def wrapper(): print("start") # 前処理を実行する func() # デコレート対象の関数を実行する print("end") # 後処理を実行する return wrapper @mydecolater def hello(): print("hello") hello() #=> start, hello, end

クラス

クラス(class)

class MyClass: """A simple example class""" # 三重クォートによるコメント def __init__(self): # コンストラクタ self.name = "" def getName(self): # getName()メソッド return self.name def setName(self, name): # setName()メソッド self.name = name a = MyClass() # クラスのインスタンスを生成 a.setName("Tanaka") # setName()メソッドをコール print(a.getName()) # getName()メソッドをコール

クラス変数・インスタンス変数(attribute)

class MyClass: def __init__(self): self.name = "" # インスタンス変数 a1 = MyClass() a1.name = "Tanaka" a2 = MyClass() a2.name = "Suzuki" print(a1.name) #=> Tanaka print(a2.name) #=> Suzuki

メソッド(method)

class MyClass: name = "" def setName(self, name): # 第一引数は自インスタンス(self) self.name = name a = MyClass() a.setName("Tanaka")

コンストラクタ(__init__)

class MyClass: def __init__(self, name): self.name = name def getName(self): return self.name a = MyClass("Tanaka") print(a.getName()) #=> Tanaka

デストラクタ(__del__)

class MyClass: def __init__(self): print("INIT!") def __del__(self): print("DEL!") a = MyClass() #=> INIT! del a #=> DEL!

文字列化(__str__)

class MyClass: def __init__(self, name): self.name = name def __str__(self): return "My name is " + self.name a = MyClass("Yamada") print(a) #=> My name is Yamada

継承(inheritance)

class MyClass: def hello(self): print("Hello") class MyClass2(MyClass): def world(self): print("World") a = MyClass2() a.hello() #=> Hello a.world() #=> World

親クラス(super())

class MyClass1(object): def __init__(self): self.val1 = 123 class MyClass2(MyClass1): def __init__(self): super(MyClass2, self).__init__() self.val2 = 456 a = MyClass2() print(a.val1) #=> 123 print(a.val2) #=> 456

パッケージとモジュール

モジュール(module)

「mymod.py」の中身が以下であるとする:

def myfunc(): print("Hello!")

このとき、

import mymod mymod.myfunc() #=> Hello!

その他

型の取得

type('10') == str # true

ファイル生成

f = open('○○.txt', 'w') f.write('Hi') f.close()

現在時刻

import datetime now = datetime.datetime.now(datetime.timezone(datetime.timedelta(hours=9))) print(now.hour) # (現在の時間)

ランダム

import random rand = random.random() # [0.0, 1.0) からランダムな実数 rand_int = random.randint(a, b) # [a, b] からランダムな整数 li = [ 'a', 'b', 'c', 'd' ] rand_choice = random.choice(li) # リストからランダムに1つ選択

重複なしランダム抽出

import random print(random.sample(list_, 10)

ディレクトリのファイル一覧

import os path = "./○○" files = os.listdir(path) files_file = [i for i in files if os.path.isfile(os.path.join(path, i))]

JSON

開く

import json a = json.load(open('○○.json'), encoding="utf-8")

書き換える

import json dict = { 'a': 'Hi' } with open('○○.json', 'w') as changed_file: json.dump(dict, changed_file, indent=2)

tkinter

ウィンドウを開く

import tkinter import tkinter.font as font frm = tkinter.Tk() geo = '600x400' # ウィンドウのサイズ frm.geometry(geo) frm.title(config.window.name) fontC = font.Font(family='Helvetica', size=20, weight='bold') tkinter.Label( frm, text='Text', # テキスト fg='#64ec86', # 文字色 bg='#ffff00', # 文字の背景色 font=fontC ).pack(side='top') button = tkinter.Button(frm) # ボタン作成 button["text"] = 'Click here!' # ボタンのテキスト設定 button.pack(side='top') # ボタンの設置位置変更 frm.mainloop()

メッセージボックス

from tkinter import messagebox messagebox.showinfo('タイトル', '内容') messagebox.showerror('タイトル', '内容')

参考

もくじ

ページのトップへ