[Work/Class/Python3の基礎とデータ処理/1_PythonBasic]

Pythonの基本と配列(list)の取り扱い

ソースコードの文字コード,拡張子

基本的にはutf-8を使用する.ソースコードファイルの一番上の行に,

# -*- coding: utf-8 -*-

と書いて文字コードを指定する.

ソースコードファイルの拡張子は一般的に「.py」である.

インデント

Pythonはインデント(字下げ)の量で,ブロック(C言語やJavaでいうところの中括弧{}で囲まれた部分)を決める.

if a == 1:
    print(a)
else:
    print('それ以外の時')

のようにする.

変数

変数宣言や変数の型宣言は要らない

Pythonの変数を宣言する時に,整数型や文字列型等の型宣言は要らない.また変数であることを宣言するキーワードもない.

a = 1

だけでaという名前の整数型の変数が宣言され,1が代入される.

b = 'bの中に入れる文字列'

だとbという名前の文字列型の変数が宣言され,代入される.

Boolean

Boolean型の指定はTrue, Falseである.頭が大文字になることに注意.

ifブロックやforブロックの中の変数(スコープ)

C言語やJavaとは違い,ifやforの中で新たに変数を宣言しても,その外側に変数が作られたのと同じ意味になる.つまりifやforの中の変数はそのまま保持され,外側からそのまま参照,変更することが可能である.

この変数(変数の名前)が影響を及ぼす範囲を「スコープ」と呼び,C言語やJava, PythonやRubyでは異なることに注意.

つまりPythonの変数の影響の範囲スコープは関数内が最小である.

Pythonの影響範囲スコープは,グローバルで定義した変数(プログラム全体で有効)→クラス内変数の影響(オブジェクトインスタンス内で有効)→関数内変数(関数の中で有効),の3段階である.

C言語やJavaはさらにfor文if文などのブロック内で有効,というスコープがある.

標準配列list

Pythonの標準配列はlistというクラスのオブジェクトインスタンスである.

宣言

my_list1 = [] #listの宣言と初期化(空)
my_list2 = [1, 3, 8, 20] #listの宣言と同時に配列の中身を入れて初期化

listクラスのオブジェクトインスタンスなので,

my_list = list([1, 3, 5, 7])

のようにコンストラクタ呼び出しで生成することもできる.

というか,コンストラクタ呼び出しで生成する方がオブジェクト志向プログラミング的なので,なるべくこちらを使うように癖をつけておくこと.特にPython3ではこちらの記法を必ず使うこと.(後述のrange関数などで使われる)

listの連結

my_list = list([1, 3, 5])
my_list = list(my_list + list([7, 9, 11]))

で連結される.(結果が[1, 3, 5, 7, 9, 11]のリストになる)

非破壊的なので,自分自身に再代入しないと連結されない.

listへの追加 append関数

append関数を使うと末尾に要素が追加される.

my_list = list([1, 3, 5])
my_list.append(7)
my_list.append(9)
my_list.append(11)

の結果は[1, 3, 5, 7, 9, 11]になる.

listへの挿入 insert関数

my_list = list([1, 3, 5])
my_list.insert(2, 7) #insert(挿入したい場所のインデックス, 挿入したい要素)

の結果は[1, 3, 7, 5]になる.

つまりに先頭に要素を追加したい場合は

my_list.insert(0, 挿入したい要素)

となる.

listの長さを取得

len(my_list)

となる.lenはlistクラスオブジェクトの関数ではないことに注意.

range()関数で範囲指定で単調増加する整数listを生成

例えば[0, 1, 2, 3, 4]というlistを生成したい時,

my_list = list(range(5))

とすると,my_listの中には[0, 1, 2, 3, 4]というlistが入る.

my_list = list(range(3, 8))

の結果は,[3, 4, 5, 6, 7]となる.つまり「3から8未満の間に1ずつ増加させながら追加していく」のような意味となる.

2ずつ増加する整数リストを作る場合には,

my_list = list(range(3, 10, 2))

とする.結果は,[3, 5, 7, 9]である.(「10未満の場合は2ずつ増加させて追加していく」なので)

ちなみにrange()関数そのものは,listのコンストラクタに突っ込んで回すと(勝手に回ってくれる)整数の集合を生成してlistオブジェクトを作ることができる,「イテレータオブジェクト」(もしくはジェネレータオブジェクト)を返す,という仕様になっている.後述するmap()関数やfilter()関数と同じである.(Python2系はrange()関数はlistを返すので,2系と3系で一番互換性が問題となる違いである)

タプルtuple

タプル tupleという「宣言時に初期化したら変更できない」リストも存在する.

tupleの宣言には,

my_tuple = (123, 456, 789)

という形でカンマで区切った小括弧を用いる.

もしくはコンストラクタ呼び出しで,

my_tuple = tuple((123, 456, 789))

と宣言する.

my_tuple = (123, 456, 789)
my_list = list(my_tuple)
my_tuple = tuple(my_list)

という形で相互に変換することも可能である.

ハッシュテーブル 辞書 dict

「キーと値をセットにして,キーで値を取り出せる」いわゆるハッシュテーブルはdictというクラスを使う.

my_dict = {'apple': 4, 'pine': 8, 'pen': 6}

というように,文字列と値を「:」でペアにし,間まで区切り,中括弧で囲んで宣言する.

同じくコンストラクタ呼び出しで,

my_dict = dict({'apple': 4, 'pine': 8, 'pen': 6})

とも宣言できる.

キーを与えて値を取り出すには,

value_from_dict = my_dict['apple']

と大括弧でキーを囲む.(取り出し時は中括弧ではなく大括弧であることに注意)

その他にitems()関数でキーと値のペアをイテレータオブジェクトとして取り出す,keys()関数で全てのキーをイテレータオブジェクトとして取り出す,values()関数で全ての値をイテレータオブジェクトとして取り出す,等の関数がある.

制御構造

中括弧によるブロック指定がないので,空のブロックを作ることができない.処理内容がないけど分岐させたい(空のブロックを作りたい)場合にはpassキーワードを必ず入れること.

if文

if a == 1:
    # Trueの時の処理内容
    pass
    # これだとTrueの時は何もしない.
else:
    # それ以外の処理内容

のように記述する.ブロックを始めるためには,コロン「:」が必要であることに注意.

for文

Pythonに通常のfor文はない.他言語でいう所の拡張for文(for_each文)のみ存在する.

my_list1 = list([1, 3, 5, 7, 9])
my_list2 = list([])
for item in my_list:
    my_list2.append(item + 1)

の結果,my_list2の中身は,[2, 4, 6, 8, 10]となる.

普通にfor文を実行したい場合,前述のlist(range(0, 10, 1))でlistのオブジェクトを生成して,それをfor文に食わせることになる.

my_list = list([])
for item in list(range(0, 10, 1)):
    my_list.append(item)

の結果のmy_listの中身は[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]となる.

ちなみに食わせるのはlistだけではなく,listにする前のイテレータ(もしくはジェネレータ)オブジェクトでも構わないので

for item in range(0, 10, 1)

と書くこともできる.

ついでに,range関数の引数が一つだけの場合,前述のように「0からその数字未満まで1ずつ増加させた整数の集合」を出力してくれるので,C言語系の言語で書く所の

for(int i=0; i<10; i++){}

は,

for i in range(10):

と省略して書くことができる.

比較演算子,論理和・論理積

if文の中で普通に==!=>=>などの通常の比較演算子を使うことができる.

C系言語の論理和(もしくは)||and,論理積(かつ)&&orと直接書く.

not a == 1と書くと,aが1以外の時にTrueを返し,aが1の時にFalseを返す,と!=を使わなくても比較演算子を逆転させることも可能である.