【Python文法】難しい(デコレーター,ラムダ,ジェネレーター)をできるだけ簡単に解説

プログラミング
スポンサーリンク

スポンサーリンク

はじめに

Pythonの文法を手っ取り早く習得できたらなんて思っている方はいませんか?

今回はPythonを始めたいと思っているプログラミング初心者の方に向けてとても簡単に基礎文法を紹介しました。

大事なポイントだけなので効率的に勉強することができると思います。

意外と、慣れている方でも知らない細かい部分もあるかもしれません。

またPythonは人工知能、機械学習、ディープラーニング、データ解析などに特化しており、2020年プログラミング言語人気ランキング1位になっています。

Pythonについて詳しく知りたい方はこちらのウェブサイトをどうぞ。

Pythonを勉強したい方は是非読み進めていってみてくださいね。

読み進めていく上でわからないところがあればこちらの記事を参考にしてみてください。

デコレーター

それではまずはデコレーターについての解説です。

デコレーターで扱う関数は二重構造になっています。

まだ意味がわからないと思いますがとりあえず全体のコードを載せます。

def outer(func):
    def inner(*args,**kwargs):
        print('start')
        f = func(*args,**kwargs)
        print('end')
        return f
    return inner

@outer
def add_num(a,b):
    return a + b

x = add_num(10,30)
print(x)

それでは解説していきます。

まずデコレーターは関数を処理する前に、何か処理を行いたいときに用います。

今回はadd_numという関数に処理を付け足していきたいと思います。

今回付け足したい処理はstartとendを表示させるという処理です。

def add_num(a,b):
    return a + b

足し算した結果を返すというだけの関数です。

この関数に処理を付け足したい場合にデコレーターを使います。

def outer(func):
    def inner(*args,**kwargs):
        print('start')
        f = func(*args,**kwargs)
        print('end')
        return f
    return inner

x = add_num(10,30)

これがデコレータの二重構造です。

今回はどのような引数を渡してもいいように(*args,**kwargs)を用いました。

本来はouter関数が処理された後にinner関数が変数に格納されるのですが、@outerをつけることでadd_num関数が呼び出された時に即座にinner関数にadd_num関数が引数として渡されます。

そしてstartがprintされる→変数に足し算された40が格納される→endがprintされる→40がreturnされるという順に実行されます。

print(x)

そして最後にreturnされた40がprintされます。

このデコレーターが何故便利なのかというと一度の記述で複数の関数に同様の処理を行うことができます。

今回の簡単な例だと関数を記述するだけでstart,endを表示させる処理を省くことができます。

たくさんの異なる関数に同様な処理を付け足す場合にデコレーターを用いてあげましょう。

ラムダ

ラムダはデコレーターよりは簡単なので安心してください。

ラムダは簡単な関数、中身の処理が少ない関数に対して使います。

例えば

def capital_lower(word):
    return word.lower()

という与えられた文字列の小文字を返すといった関数などです。

実はこちらの関数はラムダを使えば一行で済ませることができます。

capital_lower = lambda word:word.lower()

何故一行で終わらせたいのかというと関数の引数に関数を渡したい時にラムダを直接書き込むことができるからです。

例えば

def change_word(word, func):
    print(func(word))

というような関数がある場合に

change_word('YUKI',lambda word:word.lower())
#実行結果 yuki

と宣言して終了となります。

関数の宣言を減らしたい時にラムダを使っていきましょう。

ジェネレーター

ジェネレーターはforループでリストの中の要素を一つずつprintしていきたい時に有効です。

こちらがforループでリストを回す時のコードです。

l = [1,2,3]

for n in l:
    print(n)

#実行結果 1 2 3

こちらを1と2と3で一つずつ分けたい時にジェネレーターを用います。

まずは上記のforループと同様な処理をジェネレーターで作ります。

def number():
    yield 1
    yield 2 
    yield 3

for g in number():
   print(g)
#実行結果 1 2 3 

となります。

これだとさっきのforループと処理は変わりません。

そこで一つずつ処理を分けるためにnextを用います。

def number():
    yield 1
    yield 2 
    yield 3

g = number()
print(next(g))
print('#########')
print(next(g))
print('#########')
print(next(g))

#実行結果
1
#########
2
#########
3

このようにnextを用いるとforループでは実現できなかった処理を要素ごとに止めるという処理をすることができます。

今回はシャープで区切るという処理を追加しました。

ジェネレーターはforループの一つずつの処理を実装できるようになったものとでも覚えておくと良いかと思います。

Pythonの勉強方法【おまけ】

Pythonの基礎文法を勉強するにはUdemyというオンラインプログラミング学習プラットフォームがおすすめです。

具体的に言うとこちらの講座です。

この講座だけで基礎文法だけでなく実践的な応用スキルまで身につけることができます。

めちゃくちゃわかりやすい講座なので気になる方は是非みてみてください。

私が受けたPythonの講座の中では最も良かったですし、この講座だけで案件を獲得できるようになるレベルまでプログラミングを上達できることができると思います。

実際多くの人がWeb上で高評価をしていてUdemyのPython講座といえばこの講座と言われているほどです。

今回紹介したデコレーター、ラムダ、ジェネレーターもより詳しくこの講座の中で述べられています。

気になる方はこちらのリンクから。

Udemy

その他のPythonの記事

おわりに

今回はPythonの文法の中でも難しいデコレーター、ラムダ、ジェネレーターについて解説しました。

わからなかった人はぜひUdemyの講座を受けてみることをおすすめします。

他にも基礎文法についての記事を挙げているのでそちらもみてみてくださいね。

コメント

タイトルとURLをコピーしました