目次
第一級関数
単一式関数 (ラムダ式)
Map、Filter 和 Reduce
ホームページ バックエンド開発 Python チュートリアル Python 関数プログラミングについては、この記事を読んでください。

Python 関数プログラミングについては、この記事を読んでください。

Apr 18, 2023 pm 07:22 PM
python 関数型プログラミング

Python 関数プログラミングについては、この記事を読んでください。

この記事では、Python の関数プログラミング テクノロジについて簡単に紹介します。

Python 関数プログラミングについては、この記事を読んでください。

第一級関数

Python では、関数は「第一級市民」です。つまり、関数は int などの他のデータ型と同等の立場にあります。

したがって、関数を変数に割り当て、それらを引数として他の関数に渡し、他のデータ構造 (辞書など) に格納し、他の関数の戻り値として使用することができます。

関数をオブジェクトとして扱う

他のデータ型 (string、list、int など) はオブジェクトであるため、Python では関数もオブジェクトです。独自の名前を出力する関数 foo の例を見てみましょう。

def foo():
print("foo")
ログイン後にコピー

関数はオブジェクトであるため、関数 foo を任意の変数に割り当てて、その変数を呼び出すことができます。たとえば、変数 bar に関数を割り当てることができます。

bar = foo
bar()
#will print "foo" to the console
ログイン後にコピー

ステートメント bar = foo は、関数 foo によって参照されるオブジェクトを変数 bar に割り当てます。

オブジェクトを関数として扱う

オブジェクトが呼び出し可能である場合、それらは object() などの関数と同じです。これは __call__ メソッドを通じて実現されます。

例は次のとおりです:

class Greeter:
def __init__(self, greeting):
 self.greeting = greeting
def __call__(self, name):
 return self.greeting + " " + name
ログイン後にコピー

Greeter クラスのオブジェクトを構成するたびに、新しいオブジェクトを作成します。これは、挨拶するときに叫ぶことができる新しい名前です。以下に示すように:

morning = Greeter("good morning") #creates the callable object
morning("john") # calling the object
#prints "good morning john" to the console
ログイン後にコピー

朝のオブジェクトを呼び出すことができる理由は、クラス定義で __call__ メソッドを使用しているためです。オブジェクトが呼び出し可能かどうかを確認するには、組み込み関数 callable を使用します。

callable(morning) #true
callable(145) #false. int is not callable.
ログイン後にコピー

データ構造内の関数

関数は、他のオブジェクトと同様に、内部に格納できます。データ構造。たとえば、int から func までの辞書を作成できます。これは、int が実行されるステップの短縮表現である場合に便利です。

# store in dictionary
mapping = {
0 : foo,
1 : bar
}
x = input() #get integer value from user
mapping[x]() #call the func returned by dictionary access
ログイン後にコピー

同様に、関数は他のさまざまなデータ構造に格納できます。

関数をパラメータおよび戻り値として使用する

関数は、他の関数のパラメータおよび戻り値としても使用できます。関数を入力または返す関数として受け入れる関数は高階関数と呼ばれ、関数プログラミングの重要な部分です。

高階関数には強力な機能があります。 「Eloquent JavaScript」で説明されているように:

  • 「高階関数を使用すると、抽象的な値だけでなくアクションを抽象化できます。」

1 つの例を見てみましょう。項目のリストを反復処理し、それらを順番に出力したいとします。反復関数は簡単に構築できます。

def iterate(list_of_items):
 for item in list_of_items:
 print(item)
ログイン後にコピー

見た目はクールですが、これは単なる第 1 レベルの抽象化です。リストを反復処理するときに印刷以外のことをしたい場合はどうすればよいでしょうか?

これが高階関数の存在の意味です。関数 iterate_custom を作成できます。この関数では、反復されるリストと各項目に適用される関数が iterate_custom 関数への入力となります。

def iterate_custom(list_of_items, custom_func):
for item in list_of_items:
 custom_func(item)
ログイン後にコピー

これは簡単なことのように思えるかもしれませんが、実際には非常に強力です。

コードをより再利用しやすくするために、抽象化レベルを上げました。これで、リストを出力するときにこの関数を呼び出すことができるだけでなく、シーケンスの反復を含むリストに対して任意の操作を実行することもできます。

関数を返すこともできるので、さらに簡単になります。関数を dict に保存するのと同じように、関数を制御ステートメントとして使用して、適切な関数を決定することもできます。例:

def add(x, y):
 return x + y
def sub(x, y):
 return x - y
def mult(x, y):
 return x * y
def calculator(opcode):
 if opcode == 1:
return add
 elif opcode == 2:
return sub
 else:
 return mult
my_calc = calculator(2) #my calc is a subtractor
my_calc(5, 4) #returns 5 - 4 = 1
my_calc = calculator(9) #my calc is now a multiplier
my_calc(5, 4) #returns 5 x 4 = 20.
ログイン後にコピー

ネストされた関数

関数は他の関数の中に入れることもできます。これは「内部関数」です。組み込み関数は、メイン関数をサポートするサブモジュールとして機能する小さな再利用可能な関数であるヘルパー関数を作成する場合に役立ちます。

問題で特定の関数定義 (パラメーターの種類または順序) が必要な場合は、補助関数を使用できます。この非伝統的なアプローチにより、問題解決がはるかに簡単になります。たとえば、http://www-inst.eecs.berkeley.edu/~cs61a/sp12/lectures/lect4-2x3.pdf を参照してください。

フィボナッチ関数 fib(n) を定義するとします。この関数にはパラメーター n が 1 つだけあり、n 番目のフィボナッチ数を返さなければなりません。

このような関数を定義する方法の 1 つは、ヘルパー関数を使用してフィボナッチ数列の最初の 2 つの項を追跡することです (フィボナッチ数は最初の 2 つの数値の合計であるため)。

def fib(n):
 def fib_helper(fk1, fk, k):
 if n == k:
return fk
 else:
return fib_helper(fk, fk1+fk, k+1)
 if n <= 1:
return n
 else:
return fib_helper(0, 1, 1)
ログイン後にコピー

計算を関数本体から関数パラメーターに移動します。これは非常に強力です。再帰的メソッドで発生する可能性のある冗長な計算が削減されるためです。

単一式関数 (ラムダ式)

関数に名前を付ける前に関数を作成したい場合はどうすればよいでしょうか?短い 1 行の関数 (上記の例の関数 foo や mult など) を書きたい場合はどうすればよいでしょうか?

Python では lambda キーワードを使用して、このような関数を定義できます。例は次のとおりです。

mult = lambda x, y: x * y
mult(1, 2) #returns 2
ログイン後にコピー

mult 関数は、従来の def キーワードを使用して定義された関数と同じように動作します。

注: ラムダ関数は 1 行である必要があり、プログラマが作成した return ステートメントを含めることはできません。

事实上,它们通常具备隐式的返回语句(在上面的示例中,函数想表达 return x * y,不过我们省略了 lambda 函数中的显式返回语句)。

lambda 函数更加强大和精准,因为我们还可以构建匿名函数(即没有名称的函数):

(lambda x, y: x * y)(9, 10) #returns 90
ログイン後にコピー

当我们只需要一次性使用某函数时,这种方法非常方便。例如,当我们想填充字典时:

import collections
pre_fill = collections.defaultdict(lambda: (0, 0))
#all dictionary keys and values are set to 0
ログイン後にコピー

接下来我们来看 Map、Filter 和 Reduce,以更多地了解 lambda。

Map、Filter 和 Reduce

Map

map 函数基于指定过程(函数)将输入集转换为另一个集合。这类似于上文提到的 iterate_custom 函数。例如:

def multiply_by_four(x):
 return x * 4
scores = [3, 6, 8, 3, 5, 7]
modified_scores = list(map(multiply_by_four, scores))
#modified scores is now [12, 24, 32, 12, 20, 28]
ログイン後にコピー

在 Python 3 中,map 函数返回的 map 对象可被类型转换为 list,以方便使用。现在,我们无需显式地定义 multiply_by_four 函数,而是定义 lambda 表达式:

modified_scores = list(map(lambda x: 4 * x, scores))
ログイン後にコピー

当我们想对集合内的所有值执行某项操作时,map 函数很有用。

Filter

就像名称所显示的那样,filter 函数可以帮助筛除不想要的项。例如,我们想要去除 scores 中的奇数,那么我们可以使用 filter:

even_scores = list(filter(lambda x: True if (x % 2 == 0) else False, scores))
#even_scores = [6, 8]
ログイン後にコピー

由于提供给 filter 的函数是逐个决定是否接受每一个项的,因此该函数必须返回 bool 值,且该函数必须是一元函数(即只使用一个输入参数)。

Reduce

reduce 函数用于「总结」或「概述」数据集。例如,如果我们想要计算所有分数的总和,就可以使用 reduce:

sum_scores = reduce((lambda x, y: x + y), scores)
#sum_scores = 32
ログイン後にコピー

这要比写循环语句简单多了。注意:提供给 reduce 的函数需要两个参数:一个表示正在接受检查的项,另一个表示所用运算的累积结果。

本文是关于函数式编程的一篇入门文章,虽然尽量完备地介绍了相关的知识,但并不是那么深入。如想了解更多,大家可以阅读以下资源:

  • Best Practices for Using Functional Programming in Python:https://kite.com/blog/python/functional-programming/
  • Functional Programming Tutorials and Notes:https://www.hackerearth.com/zh/practice/python/functional-programming/functional-programming-1/tutorial/

以上がPython 関数プログラミングについては、この記事を読んでください。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Debian Apacheログを使用してWebサイトのパフォーマンスを向上させる方法 Debian Apacheログを使用してWebサイトのパフォーマンスを向上させる方法 Apr 12, 2025 pm 11:36 PM

この記事では、Debianシステムの下でApacheログを分析することにより、Webサイトのパフォーマンスを改善する方法について説明します。 1.ログ分析の基本Apacheログは、IPアドレス、タイムスタンプ、リクエストURL、HTTPメソッド、応答コードなど、すべてのHTTP要求の詳細情報を記録します。 Debian Systemsでは、これらのログは通常、/var/log/apache2/access.logおよび/var/log/apache2/error.logディレクトリにあります。ログ構造を理解することは、効果的な分析の最初のステップです。 2。ログ分析ツールさまざまなツールを使用してApacheログを分析できます。コマンドラインツール:GREP、AWK、SED、およびその他のコマンドラインツール。

Python:ゲーム、GUIなど Python:ゲーム、GUIなど Apr 13, 2025 am 12:14 AM

PythonはゲームとGUI開発に優れています。 1)ゲーム開発は、2Dゲームの作成に適した図面、オーディオ、その他の機能を提供し、Pygameを使用します。 2)GUI開発は、TKINTERまたはPYQTを選択できます。 TKINTERはシンプルで使いやすく、PYQTは豊富な機能を備えており、専門能力開発に適しています。

PHPとPython:2つの一般的なプログラミング言語を比較します PHPとPython:2つの一般的なプログラミング言語を比較します Apr 14, 2025 am 12:13 AM

PHPとPythonにはそれぞれ独自の利点があり、プロジェクトの要件に従って選択します。 1.PHPは、特にWebサイトの迅速な開発とメンテナンスに適しています。 2。Pythonは、データサイエンス、機械学習、人工知能に適しており、簡潔な構文を備えており、初心者に適しています。

DDOS攻撃検出におけるDebianスニファーの役割 DDOS攻撃検出におけるDebianスニファーの役割 Apr 12, 2025 pm 10:42 PM

この記事では、DDOS攻撃検出方法について説明します。 「DebiansNiffer」の直接的なアプリケーションのケースは見つかりませんでしたが、次の方法はDDOS攻撃検出に使用できます:効果的なDDOS攻撃検出技術:トラフィック分析に基づく検出:突然のトラフィックの成長、特定のポートの接続の急増などのネットワークトラフィックの異常なパターンの識別。たとえば、PysharkライブラリとColoramaライブラリと組み合わせたPythonスクリプトは、ネットワークトラフィックをリアルタイムで監視し、アラートを発行できます。統計分析に基づく検出:データなどのネットワークトラフィックの統計的特性を分析することにより

Debian Readdirが他のツールと統合する方法 Debian Readdirが他のツールと統合する方法 Apr 13, 2025 am 09:42 AM

DebianシステムのReadDir関数は、ディレクトリコンテンツの読み取りに使用されるシステムコールであり、Cプログラミングでよく使用されます。この記事では、ReadDirを他のツールと統合して機能を強化する方法について説明します。方法1:C言語プログラムを最初にパイプラインと組み合わせて、cプログラムを作成してreaddir関数を呼び出して結果をinclude#include#include inctargc、char*argv []){dir*dir; structdireant*entry; if(argc!= 2){(argc!= 2){

Pythonと時間:勉強時間を最大限に活用する Pythonと時間:勉強時間を最大限に活用する Apr 14, 2025 am 12:02 AM

限られた時間でPythonの学習効率を最大化するには、PythonのDateTime、時間、およびスケジュールモジュールを使用できます。 1. DateTimeモジュールは、学習時間を記録および計画するために使用されます。 2。時間モジュールは、勉強と休息の時間を設定するのに役立ちます。 3.スケジュールモジュールは、毎週の学習タスクを自動的に配置します。

Nginx SSL証明書更新Debianチュートリアル Nginx SSL証明書更新Debianチュートリアル Apr 13, 2025 am 07:21 AM

この記事では、DebianシステムでNGINXSSL証明書を更新する方法について説明します。ステップ1:最初にCERTBOTをインストールして、システムがCERTBOTおよびPython3-Certbot-Nginxパッケージがインストールされていることを確認してください。インストールされていない場合は、次のコマンドを実行してください。sudoapt-getupdatesudoapt-getinstolcallcertbotthon3-certbot-nginxステップ2:certbotコマンドを取得して構成してlet'sencrypt証明書を取得し、let'sencryptコマンドを取得し、nginx:sudocertbot - nginxを構成します。

debian opensslでHTTPSサーバーを構成する方法 debian opensslでHTTPSサーバーを構成する方法 Apr 13, 2025 am 11:03 AM

DebianシステムでHTTPSサーバーの構成には、必要なソフトウェアのインストール、SSL証明書の生成、SSL証明書を使用するWebサーバー(ApacheやNginxなど)の構成など、いくつかのステップが含まれます。 Apachewebサーバーを使用していると仮定して、基本的なガイドです。 1.最初に必要なソフトウェアをインストールし、システムが最新であることを確認し、ApacheとOpenSSL:sudoaptupdatesudoaptupgraysudoaptinstaをインストールしてください

See all articles