ホームページ > バックエンド開発 > Python チュートリアル > Python関数プログラミング入門チュートリアル

Python関数プログラミング入門チュートリアル

黄舟
リリース: 2017-02-04 16:42:27
オリジナル
1540 人が閲覧しました

引用

機能 プログラミング (関数型プログラミング) の概念は、1958 年にジョン マッカーシーによって設立され、自動ガベージ コレクションの概念を最初に提案した LISP に由来します。この概念は現在、Python/Java/Ruby などの多くの言語でも使用されています。 。現在、LISP は多くの方言を生み出しています。オブジェクト指向プログラミングと比較した場合、関数型プログラミングの利点の 1 つは不変です。 データ (データは不変) は、外部データに依存せず、外部データの値を変更しないことを意味します。この考え方により、コード内のバグを大幅に減らすことができ、関数型プログラミングは変数などの関数の使用もサポートします。オブジェクト指向言語として、Python は関数型プログラミングのサポートも提供しますが、それほど純粋ではなく、末尾再帰の最適化はサポートしていません。

lambda の使用

lambda を適切に使用すると、コードの量が減るだけでなく、コードのロジックをより適切に記述することができます。たとえば、次のような関数があります。

>>> def f(x):
...    return x + x
# 
调用这个函数
>>> f(2)
4
ログイン後にコピー

この関数を lamda を使用して書き直すと、コードは 1 行だけで十分です。

# 
lambda后面的x表示lambda函数要接收的参数,x + x表示lambda函数所要返回的值
>>> f = lambda x: x + x
# 
可以看到f现在也是一个函数对象
>>> f
<function __main__.<lambda>>
# 
调用lambda函数
>>> f(2)
4
ログイン後にコピー

マップの使用

map(関数, iterable) は 2 つのパラメーターを受け取ります。最初のパラメーターは関数の受け取りを表し、2 番目のパラメーターはリストなどの iteralbe 型オブジェクトの受け取りを表します。

マップ関数の原理は次のとおりです。 1. 毎回 iterable からパラメーターを取り出します。 2. このパラメーターを関数に渡します。 3. 次に、関数から返された値をリストに追加します (このステートメントは正確ではありません。誰もが理解できるようにするため、説明します)後で) 。すべての反復可能なオブジェクトが走査された後、map は呼び出し元にリストを返します。例を通してマップを直接使用する方法を学びましょう。

example1

# 
还是用我们上面那个lambda的例子
>>> function = lambda x: x + x
# 
定义一个iterable对象list(列表)
>>> iterable = [1, 2, 3, 4, 5, 6, 7, 8, 9]
# 
函数fucntion每次从iterable中取出一个参数x,然后function返回x + x的值,
# 
并将返回值加入一个新建的list,等将iterable遍历完,map就将这个新建的list返回。
>>> v = map(function, iterable)
# 
注意上面的说法并不准确,只是为了帮助大家理解,其实map返回的是一个map对象,并不是list
>>> v
<map at 0x7fcb56231588>
# 
但是我们可以调用内建的list函数将map转换成一个list来得到我们想要的结果
>>> list(v)
[2, 4, 6, 8, 10, 12, 14, 16, 18]
ログイン後にコピー

example2

map の 2 番目のパラメーターには、関数リストのセットを渡すこともできます。これは、リストに複数の関数オブジェクトが含まれていることを意味します。

>>> multiply = lambda x: x * x
>>> add = lambda x: x + x
>>> funcs = [multiply, add]
>>> list(map(lambda f: f(1), funcs))
[1, 2]
ログイン後にコピー

reduce

の使い方はmap,reduce(function, iterable) は 2 つのパラメーターも受け取ります。最初のパラメーターは関数の受け取りを表し、2 番目のパラメーターはリストなどの iteralbe タイプのオブジェクトの受け取りを表します。ただし、reduce 関数は 2 つのパラメーターを受け取る必要があるという点が異なります。リストの累積和を求める例を通じて、reduce の使用方法を学びましょう。

from functools import reduce
# 
使用lambda定义一个函数,函数的作用是接收两个参数,然后返回两个参数之和
>>> function = lambda x, y: x+y
>>> iterable = [1, 2, 3, 4, 5, 6, 7, 8, 9]
# 
函数function每次接收两个参数,除第一次外每次从iterable中取一个元素作为一个参数
# 
另外一个参数取自上一次function返回的值
>>> reduce(function,  iterable)
45
ログイン後にコピー

filter

の使用法は、map/reduce、filter(function, iterable) は、一度に 2 つのパラメーターも受け取ります。1 つのパラメーターは関数で、もう 1 つのパラメーターは反復可能なオブジェクトです。名前からわかるように、フィルターはリスト (リスト) などの反復可能なオブジェクトをフィルターするために使用されます。

その原理は、反復可能なオブジェクトから要素を取り出し、それを関数に適用することです。関数が True を返した場合、要素は保持されます。関数が False を返した場合、要素は削除されます。例を通してフィルターの使用法を見てみましょう。

# 
定义一个函数,如果接收的字符s为空,那么返回False,如果为非空,那么返回True
>>> function = lambda s : s and s.strip()
>>> iterable = [&#39;AJ&#39;, &#39; &#39;, &#39;Stussy&#39;, &#39;&#39;, &#39;CLOT&#39;, &#39;FCB&#39;, None]
>>> filter(function, iterable)
<filter at 0x7fcb562319b0>
>>> list(filter(function, iterable))
[&#39;AJ&#39;, &#39;Stussy&#39;, &#39;CLOT&#39;, &#39;FCB&#39;]
ログイン後にコピー

Decorator

Decorator (デコレーター) は、高度な Python 構文です。デコレーターは関数、メソッド、またはクラスを処理できます。デコレータを適切に使用すると、コードの量が減り、プログラムの可読性が向上します。Django などの多くの Python フレームワークでは、多数のデコレータが使用されています。

>>> def add(x, y):
...     return x + y
... 
>>> def multiply(x, y):
...     return x * y
...
ログイン後にコピー

これで、それぞれ加算と乗算の計算に使用される上記 2 つの関数ができました。しかし、関数だけでは十分ではないと感じ、結果を返す前にいくつかの出力ステートメントを追加する必要があります。 2 つの関数なので、次の手順に進んでください。

>>> def add(x, y):
...     print("input:", x, y)
...     return x + y
... 
>>> def multiply(x, y):
...     print("input:", x, y)
...     return x * y
...
ログイン後にコピー

デコレータを使用する場合、現状ではデコレータを使用するメリットはないようですが、加算/乗算に加えて複数の印刷関数を追加したい場合は、次のようにすることができます。マイナス /divide やその他の関数もあり、この時点では 1 つのコードを変更するだけで済みます。これにより、プログラムの読みやすさが向上するだけでなく、プログラムを再構築する際の作業も大幅に節約されます。将来のコード。

def decorator(F):
    def new_function(x, y):
        print("input:", x, y)
        return F(x, y)
    return new_function
@decorator
def add(x, y):
    return x + y
@decorator
def multiply(x, y):
    return x * y
ログイン後にコピー

上記は Python 関数プログラミング入門チュートリアルの内容です。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) をご覧ください。


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート