Pythonに関して新しく学んだことについてまとめる。その4

11.enumerate()
リストの要素とともにインデックスを取り出す。

list_alphabet = ["Alpha", "Bravo", "Charlie"]

for i, l in enumerate(list_alphabet):
    print(i, l)  # i=インデックス、l=要素
# 0 Alpha
# 1 Bravo
# 2 Charlie

12.継承
「あるクラスを元に、新たな機能を加えた新しいクラスを作ることができる。」(廣瀬、2019)

class Person:  # 親クラス
    def __init__(self, name):
        self.name = name

    def print_name(self):
        print("私、" + self.name + "。たぶん高校生。")


class Job(Person):  # 子クラス
    def __init__(self, name, job):
        super().__init__(name)  # 親クラスのコンストラクタを呼び出す
        self.job = job

    def print_name(self):
        print("こっちはクラスメイトの" + self.name + "ちゃん。")  # print1()メソッドをオーバーライド

    def print_job(self):
        print(self.job + "、らしいんです。")


yasuna = Person("折部やすな")
yasuna.print_name()
# 私、折部やすな。たぶん高校生。

sonia = Job("ソーニャ", "殺し屋")
sonia.print_name()
sonia.print_job()
# こっちはクラスメイトのソーニャちゃん。
# 殺し屋、らしいんです。

参考文献
廣瀬豪(2019)『Pythonでつくるゲーム開発入門講座――敏腕クリエイターが教える明解ゲームプログラミング』ソーテック社

Pythonに関して新しく学んだことについてまとめる。その3

7. リスト内包表記
多次元配列を初期化する際に用いられる。

# 内包表記を使う場合
val_list = [[None] * 2 for i in range(3)]
print(val_list)
# [[None, None], [None, None], [None, None]]

# 内包表記を使わずに同じ処理をする場合
val_list = []
for i in range(3):
    val_list.append([None] * 2)
print(val_list)
# [[None, None], [None, None], [None, None]]

8. ビットマスク
以下の例はビットマスクによって下三桁を取り出す。7は二進数で111。

val = 22
print(bin(val))
# 0b10110

print(bin(val & 7))
# 0b110

9. TODOコメント
todoとfixmeが用いられる。

#todo: 
#fixme: 

10. リストを展開して引数に渡す
リストやタプルには*、辞書には**をつける。

def calc_sum(a, b, c):
    return a + b + c


list_sum = [1, 2, 3]
print(calc_sum(*list_sum))
# 6

Pythonに関して新しく学んだことについてまとめる。その2

4. exec()
文字列を実行する。動的に変数を定義することもできる。

exec("print('Hello, world!')")
# Hello, world!

number = "pie"
exec("{} = {}".format(number, 3.14))
print(pie)
# 3.14

5. 変数名に関して
 Pythonの組み込み関数と同名の変数は避ける。例えば、listという変数名はlist関数を上書きしてしまう。やってしまいがちなミス。

list_abc = list("abc")
print(list_abc)
# ['a', 'b', 'c']

list = [0, 1, 2]
list_xyz = list("xyz")
print(list_xyz)
# TypeError

6. map()
リストのすべての要素に関数を適用する。関数にlambda式を用いることもある。

val_list = [0, 1, 2]

# map()を使う場合
print(list(map(lambda x: x**2, val_list)))
# [0, 1, 4]

# map()を使わずに同じ処理をする場合
print([i**2 for i in val_list])
# [0, 1, 4]

参考記事
Pythonで識別子(変数名など)として有効・無効な名前、命名規則 | note.nkmk.me

Pythonに関して新しく学んだことについてまとめる。その1

1. //
 四則演算の除算。ただし答えを切り捨てる。/との違いは以下の通り。

print(22/7)
# 3.142857142857143

print(22//7)
# 3

2. itertools()
 直積を求める関数を応用して多重ループを解消する。以下の例は二次元配列list_valの要素をひとつずつ表示する。

for i, j in itertools.product(range(a), range(b)):
    val = list_val[i][j]
    print(val)

3. all()
 すべての要素がTrueであればTrueを返す。

list_bool = [True, True, False]
print(all(list_bool))
# False

参考記事
Pythonで複数のリストの直積(デカルト積)を生成するitertools.product | note.nkmk.me
Pythonの組み込み関数all(), any()の使い方 | note.nkmk.me

Google Drive APIとPythonで検索条件に合致するファイルにスターを付ける。

 表題の件について成功したので端的に紹介する。Google Drive APIに関しては日本語の情報が少ないので少しでも参考になればと思う。以下本題である。

 以下のコードでは検索条件(q)に合致するファイルにスターを付ける。

def star(q):
    service = build('drive', 'v3', credentials=creds)

    # クエリは文字列で表記する。
    response = service.files().list(q=q,
                                    spaces='drive',
                                    fields='nextPageToken, files(id)').execute()
    for i in response.get('files', []):
        file_id = i.get('id')

        # APIからファイルを取得する。
        file = service.files().get(fileId=file_id, fields='starred').execute()

        # 新しいメタデータを作成する。
        file['starred'] = True

        # APIにリクエストを送信する。
        updated_file = service.files().update(fileId=file_id, body=file,).execute()

 fieldsに何も指定しない場合、getはデフォルトでkindを受け取るが、kindは書き込み可能なフィールドではない*1。書き込み可能でないフィールドがあるとupdateでエラーになるので、提示したソースコードのように必要なフィールドだけを指定すること。筆者はこれに気付かずに一日中頭を抱えていたので同じ罠にはまらないように。