【脱初心者】Pythonで覚えておくと便利な基本文法
- 基本的な構文はマスターしたので、もう少し高度な構文を書きたい
- もっと簡潔でわかりやすいコードを書けるようになりたい
この悩みを本記事で解決していきます。
Pythonの基本文法をある程度習得した方々が、より簡潔なコードを書くために便利な文法を紹介します。
本記事で紹介する文法を習得すれば、初心者から脱却して、よりPythonらしいコードが書けるようになります。
print関数と合わせて使う便利な構文
print
関数を使用する際に、覚えておくと便利な文法を紹介していきます。
format : 文字列に値を代入
format
を用いて文字列に値を代入することができます。
具体例を以下に示します。
animal = 'cat'
print('This is {}.'.format(animal))
<output>
This is cat.
代入したい箇所を{…}
で指定して、format
で代入するものを指定してください。
さらに、柔軟に名前を使って埋め込む引数を指定することができます。
print('These are {a}, {b} and {c}.'.format(a="cat", b='dog', c='rabbit'))
<output>
These are cat, dog and rabbit.
f文字列の基本的な機能は、formatと変わりませんが、よりコンパクトに記述することができます。
特別な理由がない限り、f文字列を使用することをすすめます!
具体例を以下に示します。
animal = 'cat'
print(f'This is {animal}.')
<output>
These are cat, dog and rabbit.
f文字列の場合は、先頭に『f
』をつけるだけで値を代入することができます。
代入する値の書式設定
『{値:書式}
』で代入する値の書式を設定できます。
よく使用する書式は、以下の二つです。
{値:,}
: 位取り{値:.1f}
: 少数第一位まで表示(数字は任意に変更可)
formatとf文字列の具体例を紹介します。
a1 = 120000000
a2 = 1.234567
# formatの場合
print('{:,} : {:.2f}'.format(a1, a2))
# f文字列の場合
print(f'{a1:,} : {a2:.1f}')
<output>
120,000,000 : 1.23
120,000,000 : 1.2
出力結果をよりわかりやすく表示するために、頻繁に使用されます!
for文の機能をさらに拡張した構文
for文をより簡潔に書くための文法を紹介します。
ここで紹介する文法を覚えることで、余計なダミー変数を導入する必要がなくなり、コードが簡潔になります!
itemメソッド: 辞書型のkeyとvalueを同時に利用
for文を使用して、以下のように辞書型のkeyとvalueを同時に利用することができます。
dict = {'a1':1, 'a2':2 }
for key, value in dict.items():
print(key, ':', value)
<output>
a1 : 1
a2 : 2
keyとvalue単体を取り出し、for文のイテラブルに使用することもできます。
dict = {'a1':1, 'a2':2}
for key in dict.keys():
print('key:', key)
for value in dict.values():
print('value:', value)
<output>
key: a1
key: a2
value: 1
value: 2
enumerate関数 : インデックス番号を同時に利用する
enumerate
関数を使用することで、インデックス番号を同時に利用することができます。
具体例を以下に示します。
list1 = ['a1', 'a2', 'a3']
for index, lis in enumerate(list1):
print(index,':', lis)
<output>
0 : a1
1 : a2
2 : a3
enumerate関数を使用しないで上記のコードを書くと以下のようになります。
list1 = ['a1', 'a2', 'a3']
index = 0
for lis in list1:
print(index,':', lis)
index += 1
enumerate関数を使用するとindexをカウントする用の変数(インクリメント変数)を準備する必要がなくなり、コードが簡潔になります。
zip関数 : 複数の要素を同時に利用する
zip関数を利用することで、複数の要素を同時に利用することができるようになります。
list1 = ['a1', 'a2', 'a3']
list2 = ['b1', 'b2', 'b3']
list3 = ['c1', 'c2', 'c3']
for lis1, lis2, lis3 in zip(list1, list2, list3):
print(lis1, ':', lis2, ':', lis3)
<output>
a1 : b1 : c1
a2 : b2 : c2
a3 : b3 : c3
内包表記
ここからは、内包表記という書き方を紹介していきます。内包表記を利用することでコードは驚くくらい簡潔になるので積極的に利用しましょう。
リスト内包表記
リスト内包表記の書き方は、リスト内に『処理 for 変数 in イテラブル』順番で記述します。
具体例を以下に示します。
list1 = [1, 2, 3]
list2 = [lis1**2 for lis1 in list1]
print(list2)
<output>
[1, 4, 9]
さらに、条件にあった変数に絞り込むことも可能です。
その場合『処理 for 変数 in イテラブル if 条件文』の順番で記述します。
具体例を以下に示します。
list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# list1の中で偶数値のみ使用する
list2 = [lis1 for lis1 in list1 if lis1%2 == 0]
print(list2)
<output>
[2, 4, 6, 8, 10]
辞書内包表記
先ほど学んだzip関数を用いて、辞書内包表記を書くことができます。
具体例を以下に示します。
list1 = ['a1', 'a2', 'a3']
list2 = [100, 200, 300]
dict = {lis1:lis2 for lis1, lis2 in zip(list1, list2)}
print(dict)
<output>
{'a1': 100, 'a2': 200, 'a3': 300}
また、辞書を用いて次のように内包表記を書くことができます。
dict1 = {'a1': 100, 'a2': 200}
dict2 = {key: value*value for (key, value) in dict1.items()}
print(dict2)
<output>
{'a1': 10000, 'a2': 40000}
この内包表記を応用することで、keyとvalueを入れ替えるコードも簡潔に書くことができます。
dict1 = {"a1": 100, "a2": 200, "a3": 300}
reversed_dict1 = {value: key for (key, value) in dict1.items()}
print(reversed_dict1)
<output>
{100: 'a1', 200: 'a2', 300: 'a3'}
関数定義で便利な機能
ここからは、関数に関する便利な文法を紹介していきます。
引数をタプル化(*args)
引数に『*args
』を設定することで、任意の数の引数を指定することができます。
関数の中では、複数の引数はまとめてタプルとして表されます。
具体例を以下に示します。
def args_sum(*args):
return sum(args)
print(args_sum(1, 2, 3))
<output>
6
引数が何個入ってくるかわからない場合に使用します。
また、*arg
とfor文を併用することも多いので覚えておきましょう。
# 関数内でfor文を使用
def animal(*args):
for arg in args:
print(arg)
animal('cat', 'dog', 'rabbit')
<output>
cat
dog
rabbit
リストやタプルの全ての要素を引数として入力
*args
と相性が良いのが、リストやタプルの全ての要素を展開して引数として入力する方法です。
具体例を以下に示します。
def args_sum(*args):
return sum(args)
arg_list = [1, 2, 3]
print(args_sum(*arg_list))
arg_tuple = (1, 2, 3)
print(args_sum(*arg_tuple))
<output>
6
6
キーワード引数を辞書化(**kwargs)
引数に『**kwargs
』を設定することで、任意の数のキーワード引数を指定することができます。
*args
と異なり、関数内では複数のキーワード引数は、辞書として表されます。
具体例を異界に示します。
def animal(**kwargs):
print(kwargs)
animal(animal1='cat', animal2='dog', animal3='rabbit' )
<output>
{'animal1': 'cat', 'animal2': 'dog', 'animal3': 'rabbit'}
同様に、for文と併用することが多いです。
def animal(**kwargs):
for key, value in kwargs.items():
print(key,':', value)
animal(animal1='cat', animal2='dog', animal3='rabbit' )
<output>
animal1 : cat
animal2 : dog
animal3 : rabbit
辞書の全ての要素をキーワード引数として入力
リストやタプルの時と同様に次のように辞書を複数のキーワード引数として展開することができます。
def kwargs_sum(**kwargs):
print(list(kwargs.keys()))
return sum(kwargs.values())
print(kwargs_sum(a1=1, a2=2, a3=3))
kwargs_dict={'a1':1, 'a2':2, 'a3':3}
print(kwargs_sum(**kwargs_dict))
<output>
['a1', 'a2', 'a3']
6
['a1', 'a2', 'a3']
6
名前付きパラメータの使用
実は、キーワード引数として設定していない変数もキーワード付きで代入することが可能です。
def name_args(a, b):
return a%b
print(name_args(a=3, b=4))
print(name_args(b=4, a=3))
<output>
3
3
ラムダ式(無名関数)
わざわざ定義までもないような短い関数を手短に記述する場合、『ラムダ式』という文法が使用されます。
実際、ラムダ式を使用することでコードが簡潔になり可読性があがります。
使用方法は、『lambda 引数 : 実行したい内容
』のように書きます。
duble = lambda x : 2 * x
duble(3)
<output>
6
さらに簡潔に以下のように書くことができます。
(lambda x : 2 * x)(3)
<output>
6
map : リストの要素をまとめて処理
map関数を利用することで、リストの要素を順番に取り出し、その要素に指定の処理を実行することができます(numpyと同様に各要素ごと所望の処理を行うことができます!)
使用方法は、『map(関数, イテラブル)』
として使用します。
*mapを実行したものは、『map型(イテラブル)』の値になるので、『list()』使用してリストに戻してください
list1 = ['1', '2', '3', '4']
# mapはmap型になっているのでlist()を実行
list2 = list(map(int, list1))
print(list2)
<output>
[1, 2, 3, 4]
ここで、ラムダ型が有効活用されます。
list1 = [1, 2, 3, 4]
list2 = list(map(lambda x : x**2, list1))
print(list2)
<output>
[1, 4, 9, 16]
文字列の具体例も紹介します。
list1 = ['い', 'ろ', 'は', 'に']
list(map(lambda x: f'~~~{x}~~~', list1))
<output>
['~~~い~~~', '~~~ろ~~~', '~~~は~~~', '~~~に~~~']
イテレータについて
イテレータについて解説していきますが、まずは用語の意味を復習しておきましょう。
- イテラブル : 要素を順に取り出せるオブジェクト(リスト, 辞書など)
- イテレータ : ある値の要素を順番に1つずつ取り出すオブジェクト
- ジェネレータ : イテレータを作る関数
少し抽象的なので、イテレータとイテラブルの違いは以下のコードを動かしてみて理解しましょう。
iter : イテラブルからイテレータを作成
iter()の引数にイテラブルを設定することで、イテレータを作成することができます。
list1 = ['a1', 'a2', 'a3']
iterator1 = iter(list1)
これで、イテレータが作成できました。
next : イテレータから要素を取り出す
next(イテレータ)とすることで、イテレータから要素を1つ取り出すことができます。
list1 = ['a1', 'a2', 'a3']
iterator1 = iter(list1)
print(next(iterator1))
print(next(iterator1))
print(next(iterator1))
<output>
a1
a2
a3
このように、nextを利用することでイテレータから要素を一つ取り出すことができます。
ジェネレータでイテレータを作成する
次は、ジェネレータ関数でイテレータを作成することができます。
使用方法は、簡単で関数定義の『return』の代わりに『yield』に変換すれば作成できます。
具体例を以下に示します。
def gen():
yield 'a1'
yield 'a2'
yield 'a3'
generator1 = gen()
これで、イテレータを作成できました。
同様に、nextを使用して要素を取り出すことができます。
def gen():
yield 'a1'
yield 'a2'
yield 'a3'
generator1 = gen()
print(next(generator1))
print(next(generator1))
print(next(generator1))
<output>
a1
a2
a3
for文を利用して、要素を取り出すことができます。
*全ての要素が取り出し終わるとforループは終了します。
def gen():
yield 'a1'
yield 'a2'
yield 'a3'
generator1 = gen()
for i in generator1:
print(i)
<output>
a1
a2
a3
まとめ
本記事では、Pythonで覚えておくと便利な構文をまとめました!
今回紹介したコードは、機械学習や競プロの現場では、当たり前のように出てくる文法ばかりです。
そのため、本記事で紹介したコードにある程度慣れておくと、現場で使用されているコードの理解スピードが格段に上がります。
また、チームで共同作業する際も、本記事で紹介した文法はコードの可読性を上げるため有益です。
本記事の具体例をいじりながら、ぜひ習得を目指してください!
Pythonを学習するのに効率的なサービスを紹介していきます。
まず最初におすすめするのは、Udemyです。
Udemyは、Pythonに特化した授業がたくさんあり、どの授業も良質です。
また、セール中は1500円定義で利用することができ、コスパも最強です。
下記の記事では、実際に私が15個以上の講義を受講して特におすすめだった講義を紹介しています。
他のPythonに特化したオンライン・オフラインスクールも下記の記事でまとめています。
自分の学習スタイルに合わせて最適なものを選びましょう。
また、私がPythonを学ぶ際に使用した本を全て暴露しているので参考にしてください。