他の言語とちょっと違う・・・・というのを中心に個人用のメモとして残そうと思います
オライリーの入門 Python 3を参照しています
Python3 公式ドキュメント
データ型
Pythonでは、ブール値、整数、浮動小数点数、文字列、データ構造(※1)、関数、プログラムもすべてオブジェクトとして扱われる
プリミティブ型が存在しないので、全て値の参照を保持する
複製したいときには注意が必要である
種類 | データ型 |
---|---|
数値型 | int |
数値型 | float |
複素数型 | complex |
文字列 | string |
真偽値 | boolean |
複素数型という型が存在する
各ビルトインオブジェクトには、__len__()
のような、前後を__
で囲まれた、予約済みのマジックメソッドが存在する
アンダースコアを利用した命名規則 については、こちらを参照する
データ構造
- リスト、タプル、辞書、集合という4種類のデータ構造を作成できる
データ構造 | データ型 | ミュータブル | 初期化 | 関数 | サンプル | 内包表記 |
---|---|---|---|---|---|---|
リスト | シーケンス | Y | [] | list() | [1,2] | [expression for item in iterable] |
タプル | シーケンス | N | () | tuple() | ("a","b") | |
辞書 | 辞書 | Y | {} | dict() | {"k1":"v1","k2":"v2"} | {key_item: value_item for item in iterable} |
集合 | 集合 | Y | {} | set() | {"a","b"} | {ite for item in iterable} |
セット型とは別にタプルというのが用意されている
リスト操作
データ構造 | 取り出し | 追加 | 結合 | 削除 | 有無 |
---|---|---|---|---|---|
リスト | [start:end:step] |
append() insert() |
extend() += |
remove() del |
in |
タプル | --- | --- | --- | --- | --- |
辞書 | キーを利用 | キーを利用 | キーを利用 | キーを利用 | in |
集合 | --- | --- | --- | --- | in |
集合の演算
タイプ | 演算子 | 関数 | サンプル |
---|---|---|---|
積集合 | & | intersection() | a & b |
和集合 | | | union() | a | b |
差集合 | - | difference() | a - b |
排他的OR | ^ | symmetric_difference() | a ^ b |
部分集合(サブセット) | <= | issubset() | a <= b |
上位集合(スーパーセット) | >= | issuperset() | a >= b |
関数
引数の分解
-
*
を使って、引数のタプル化
def print_args(*args):
-
**
使ってキーワード引数の辞書化
def pring_arges(**args)
docstringを使ったコメント付与
def echo(str):
'文字列を出力する関数です'
return str
def echo(str):
'''
文字列を出力する関数です
1. 文字列型出ない場合には文字列に変換します
'''
echo string(str)
従来はJDOCやRDocなどといった外部モジュールでコメント形式でドキュメントを記載していたが、メソッドの標準仕様になっている
高階関数と関数渡し
def echo(str):
print(str)
def do_something(func,arg1):
func(arg1)
do_something(echo, "message")
> message
関数内関数とクロージャー
def outer(str)
def innter():
return "%s" % str
return inner()
外側の関数に渡されたstrという変数のスコープは内側の関数から見えている状態
ラムダ関数
muliply_6 = lambda i: i * 6
print(muliply_6(10))
lambda
を使った無名関数はRubyでも馴染みの深い仕様
ジェネレーター
def get_default_value_list(length, default_value):
for x in range(0, length):
yield default_value
print(get_default_value_list(12, 0))
> <generator object get_default_value_list at 0x10c55a1b0>
yield
を使った無名関数はRubyでも馴染みの深い仕様
Pythonではすべてがオブジェクトとして扱われるので、コピーなどで活用の機会が多そう
デコレーター
def unvail(func):
def new_function(*args, **kwargs):
print("FuncName:", func.__name__)
print("Arguments: ", args)
print("Keyword Arguments:", kwargs)
return func(*args, **kwargs)
return new_function
@unvail
def test(str, p1=0):
print(str, p1)
test("test", p1=2)
@
を使ったデコレーターはJava界隈(javax/spring)やTypeScriptなどで見たことがあります
関数内再代入の禁止
animal = 'cat'
def change_and_print_global():
animal = 'dog'
print(animal)
def change_and_print_global2():
global animal
animal = 'bird'
print(animal)
animal => change_and_print_global() => animalの実行結果は、cat,dog,cat
animal => change_and_print_global2() => animalの実行結果は、cat bird bird
関数内からローカル変数ではなく、グローバル変数にアクセスしようとする場合には、global
キーワードを利用しないといけません
PHPが同じ仕様でしたので馴染みがあります
変数の一覧を取得するには、ローカル変数の場合はlocals()
、グローバル変数の場合にはglobals()