技術のメモ箱

Python/基礎

基礎

言語の特徴

インタプリタ言語。
変数や引数の宣言が不要。動的型付け言語。
ブロックはインデントで表現する。行末にセミコロン等は不要


実行

pythonインタプリタを起動して対話的に実行するか、スクリプトファイルを読み込んで実行する。
$ python script.py              # スクリプトファイル名を引数に指定する方法
$ python < script.py            # スクリプトファイルを標準入力ファイルとして指定する方法
$ python -i script.py           # スクリプトファイル実行後にそのまま対話モードに入る方法
$ python -m module [arg] ...    # pythonモジュールにはスクリプトとして実行できるものがある
$ python -c 'command [arg] ...' # ワンライナーとして実行
pythonインタプリタでは、一次プロンプトが>>>、二次プロンプトが...であり、
ファイル終端文字 (Unixでは Control-D 、DOS や Windows では Control-Z) を入力すると終了する。
最後に表示された結果は変数 _ に代入される。

コメント

# コメントはハッシュ文字#から行の終わりまで
# 複数行のコメントを表すものはない

標準出力

print('Hello World!')
print(r'C:\some\name') # エスケープしない
print('value is ', i)
print('出力の末尾変更', end=',')
print(f'format pi is {math.pi:.3f}') # 3.142

変数

コマンドライン引数

import sys
print(sys.argv[0]) # C:\Data\script.py
スクリプト名やスクリプト名以後に指定した引数は、文字列のリストに変換されてsysモジュールのargv変数に格納される。
スクリプト名も引数も指定しなければ、 sys.argv[0] は空の文字列になる。
-c command を使うと、sys.argv[0]は'-c'になる。
-m module を使った場合、sys.argv[0]はモジュールのフルパスになる。

宣言と型

宣言が必要。型の明示は不要。
1文字を表す型はなく、1文字でも文字列。文字列は不変のリスト。
i = 1
a, b = 0, 1 # a is 0, b is 1 複数同時代入が可能
tuple = 1, 'hi' # (1, 'hi')
un, pack = tuple # un is 1, pack is 'hi'

配列

リストは可変。リストには複数の型もリストのリストも格納できる。
list = [1, 4, 9, 16, 25]
list[0]   # 1
list[-1]  # 25
list[-3:] # [9, 16, 25]
list[:]   # [1, 4, 9, 16, 25] リストの新しい (浅い) コピーを返す
list + [36, 49]       # [1, 4, 9, 16, 25, 36, 49] リストの連結(代入ではない)
list[3] = 64          # [1, 4, 9, 64, 25]
list.append(216)      # [1, 4, 9, 64, 25, 216] 末尾に追加
list[2:5] = [5, 6, 7] # [1, 4, 5, 6, 7, 216] 代入も可能
list[2:5] = []        # [1, 4, 216] 削除も可能
list[:] = []          # [] 全て削除
a = ['a', 'b', 'c']
n = [1, 2, 3]
x = [a, n] # [['a', 'b', 'c'], [1, 2, 3]]
x[0]       # ['a', 'b', 'c']
x[0][1]    # 'b'

辞書・マップ

static

型変換

制御構文

ゼロでない整数値は真となり、ゼロは偽となる

if文

if x < 0:
  x = 0
elif x == 0:
  print('zero')
else:
  print('more')

ok = input(prompt)
if ok in ('y', 'ye', 'yes'):
  return True

for文

for i in range(5): # 0 1 2 3 4
  print(i)

for w in words: # 参照を渡す
  print(w, len(w))

for w in words[:]: # コピーを渡す。シーケンスを修正する場合はこっちを推奨
  if len(w) > 6:
    words.insert(0, w)

break文、continue文、else節

for n in range(2, 10):
  for x in range(2, n):
    if n & x == 0:
      break # breakするとelse節は実行されない
  else: # ループしきった場合、繰り返し条件が偽になった場合に実行される
    print(n, ' is a prime number')

for num in range(2, 10):
  if num % 2 == 0:
    print("Found an even number", num)
    continue

シーケンスのループ

enumrate()関数はインデックスを取り出せる

for i, v in enumerate(['tic', 'tac', 'toe']):
  print(i, v) # 0 tic
              # 1 tac
              # 2 toe

zip()関数を使って各要素をひと組みにする

questions = ['name', 'quest', 'favorite color']
answers = ['lancelot', 'the holy grail', 'blue']
for q, a in zip(questions, answers):
  print('What is your {0}?  It is {1}.'.format(q, a)) # What is your name?  It is lancelot.
                                                      # What is your quest?  It is the holy grail.
                                                      # What is your favorite color?  It is blue.

辞書のループ

knights = {'gallahad': 'the pure', 'robin': 'the brave'}
for k, v in knights.items():
  print(k, v) # gallahad the pure
              # robin the brave

while文

while b < 10:
        b = b -1

pass文

class MyEmptyClass:
  pass # 何もしない

関数

基本

def addtwo(n):
  """ドキュメンテーション文字列"""
  return n + 2 # returnなしも作れる

addtwo(10) # 12

引数のデフォルト値

デフォルト値は1度だけしか評価されない。リストや辞書のような変更可能なオブジェクトの場合初期化されない

def usedefault(a, b=2, c=1):
  return a * b + c

usedefault(5) # 11
usedefault(5, c=4) # 14

可変引数

def printkeywords(**keywords):    # キーワード引数が入った辞書
  for k, v in keywords.items():
    print(k, v)

printkeywords(cat='ねこ', dog='いぬ')

def printkeywords(*args):    # 可変引数、タプルに格納される
  for arg in args:
    print(arg)

printkeywords('ねこ', 'いぬ')

引数リストのアンパック

args = [3, 6]
list(range(*args))

アノテーション

def f(ham: str, eggs: str = 'eggs') -> str:  # 引数、戻り値の型を明記
  print("Annotations:", f.__annotations__)  # Annotations: {'ham': <class 'str'>, 'return': <class 'str'>, 'eggs': <class 'str'>}
  return ham + ' and ' + eggs

ラムダ

ラムダは、単一の式で構成される無名関数

def make_incrementor(n):
  return lambda x: x + n

f = make_incrementor(42)
f(1) # 43

数値

1 + 2 - (3 * 4 / 5)
17 / 3   # 5.666666666666667
17 // 3 # 5 切り捨て
12 % 5  # 2 余り
5 ** 2  # 25 冪乗

文字列

'シングルでもダブルでもよい。\'円マーク\'でエスケープ'
"""複数文字列
改行されたくない場合は行末に\
シングルでもダブルでもよい"""
'str' + 'concat' # 文字列結合
'もふ' * 2 + 3 * 'にゃん' # 'もふもふにゃんにゃんにゃん' 反復が可能

文字列は不変

word = 'Python'
len(word) # 6
word[0]   # P    左から指定位置の文字
word[-1]  # n    右から指定位置の文字
word[2:5] # tho  開始位置(0ベース)から終了位置(含まず)まで
word[:2]  # Py   一番左から指定位置まで
word[2:]  # thon 指定位置から一番右まで
word[-2:] # on   右から指定位置を始めとして一番右まで

配列・リスト・コレクション

ary = [3, 6]
print(list(range(*ary))) # 配列自体ではなく、配列の要素をそれぞれ引数に渡したい場合、変数名の前に*を入れる
list(range(5))       # [0, 1, 2, 3, 4]
list(range(2, 5))    # [2, 3, 4]
list(range(0, 3, 2)) # [0, 2] 開始値、終了閾値(絶対値)、増加量

クラス

例外

入出力

input('Please push any key')
関数説明使用例
Path.cwdカレントディレクトリを返す>>>Path.cwd()
WindowsPath('C:/Project/HTML/braintree/tech')
pagetop