関数型プログラミング
先学期、私は「人工知能」という授業を受講しました。 うわー、それまで習っていたものと考え方が全く違っていて、とても違和感がありました。私はそれをハノイの塔のように考え、長い間、インターネット上でコードを見つけて、(先生に盗作が見つかることを恐れて)修正してから、投稿しました。感覚をつかんでください:
hanoi(N) :- dohanoi(N, 'a', 'b', 'c'). dohanoi(0, _ , _ , _ ) :- !. dohanoi(N, A, B, C) :- N1 is N-1, dohanoi(N1, A, C, B), writeln([move, N, A-->C]), dohanoi(N1, B, A, C).
当時はほとんど理解できましたが、主に情報が少なすぎて、デバッグが不可能でした。バグに遭遇すると、今でも少しめまいを感じます。自分で見てる。しかし、当時は prolog が Lisp に対抗できると言われていたので、最近は Lisp に少し興味を持ち始めました。これらを終えた後、この種の関数型言語に敬意を表したいと思います。
関数型プログラミングとは何ですか? Liao Da はここにこう書きました:
関数型プログラミングは、高度な抽象度を備えたプログラミング パラダイムです。純粋な関数型プログラミング言語で記述された関数には変数がありません。したがって、入力が確実である限り、どの関数でも出力が決まります。確実であるため、この種の副作用のない純粋な関数を呼び出します。変数を使用できるプログラミング言語では、関数内の変数の状態が不定であるため、同じ入力でも異なる出力が得られる可能性があるため、この種の関数には副作用があります。
読んでもまだ理解できないかもしれませんが、心配しないで、最初にこれらのセクションを読んでください。
高次関数
数学とコンピューターサイエンスでは、高次関数とは、次の条件の少なくとも 1 つを満たす関数です:
1 つ以上の関数を入力として受け入れる
関数を出力する
また、関数自体をパラメーターとして渡すか、関数を返します。
たとえば、通常の割り当てと同じように関数を変数に割り当てることができます:
>>> min(1, 2) 1 >>> f = min >>> f(1, 2) 1 >>> f <built-in> >>> min <built-in></built-in></built-in>
関数に値を割り当てることもできます (コードは続きます):
>>> min = 10 >>> min(1, 2) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'int' object is not callable >>> f(1, 2) 1 >>> min = f >>> min(1, 2) 1</module></stdin>
また、パラメータを渡すこともできます。たとえば、すべての数値の合計を計算します:
>>> def add(a, b): ... return a+b ... >>> def mysum(f, *l): ... a = 0 ... for i in l: ... a = f(a, i) ... return a ... >>> mysum(add, 1, 2, 3) 6 >>> mysum(add, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10) 55
もちろん、この f を乗算に置き換えることは、すべての数値の積を計算することを意味します。
頻繁に使用される、Python に組み込まれている高階関数のいくつかを見てみましょう。
map/reduce
この言葉は先学期にクラウドコンピューティングの授業を受講していた時になんとなく聞いた記憶がありましたが、授業がとても退屈だったのであまり聞いていませんでしたが、ここで見たときはそう思いました。何か違うものを見つけましたか? ?
しかし、言うことはあまりありません。各機能の役割について簡単に説明しましょう。
mapの場合、計算式は次のようになります:
map(f, [x1, x2, ..., xn]) = [f(x1), f(x2), ..., f(xn)]
reduceの場合、計算式は次のようになります:
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
廖達ははっきりと言いました。
filter
filterは関数を受け取り反復可能でリストを返すというmap関数と似ていますが、その機能は関数の戻り値がTrueかどうかで値を保持するかどうかを判断することです。例:
def is_odd(n): return n % 2 == 1 list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15])) # 结果: [1, 5, 9, 15]
sorted
sorted 関数も高階関数です。この関数をパラメーター key に渡すと、key 関数を通じて並べ替えられるシーケンスを並べ替えることができますが、シーケンスの値は変更されません。例:
>>> sorted([36, 5, -12, 9, -21], key=abs) [5, 9, -12, -21, 36]
Decorator (デコレータ)
匿名関数については、後で使用するときに詳しく説明します。フラスコを見ていて、デコレータについて長い間勉強したことを思い出します。この時。
シンプルなデコレーター
1 つ目はシンプルなデコレーターで、各関数呼び出しの前にログを出力します:
import logging def log(func): def wrapper(*args, **kw): logging.warn("%s is running" % func.__name__) func(*args, **kw) return wrapper
これは非常にシンプルなデコレーターですが、どうやって使用しますか?私が最初に見た使い方は、装飾が必要な関数の前に @ を追加するものでしたが、実際には、これは Python の糖衣構文であり、最初に関数 f:
def f(): print("in function f") f = log(f)
を定義する方がわかりやすいです。この後、再度 f 関数を呼び出します:
>>> f() WARNING:root:f is running in function f
@log を使用した結果は同じです。実際、@ 記号はデコレーターの構文糖として機能し、前の代入ステートメントと同じ機能を持ちます。コードがより簡潔かつ明確になり、次のような別の代入操作が不要になります:
@log def f(): print("in function f")
パラメータ付きデコレータ
場合によっては、ステータス、レベル、その他の情報などのパラメータをデコレータに渡す必要があることもあります。ラッパー関数の外側でそれを「ラップ」するだけです。レイヤー関数は次のとおりです:
import logging def log(level): def decorator(func): def wrapper(*args, **kw): logging.warn("%s is running at level %d" % (func.__name__, level)) return func(*args, **kw) return wrapper return decorator @log(2) def f(): print("in function f") >>> f() WARNING:root:f is running at level 2 in function f
さらなる理解
デコレーターをさらに理解するために、関数 f:
#对于不加装饰器的 f,其 name 不变 >>> def f(): ... print("in function f") ... >>> f.__name__ 'f' #对于添加装饰器的函数,其 name 改变了 >>> @log ... def f(): ... print("in function f") ... >>> f.__name__ 'wrapper'
Contact の name 属性を出力できます。最初のデコレータ代入ステートメントでは、何が起こったのか大まかに理解できます。 内容: f = log(f)
f が log(f) として変更された戻り値、つまりラッパー関数を指すようにします。元の関数 f が実行されるたびに、ラッパー関数が呼び出されます。この例では、最初にログが出力されてから、元の関数 f が実行されます。
ただし、これには問題があります。これにより、元の関数 f のメタ情報が置き換えられ、f に関する多くの情報が失われます。しかし、幸いなことに、変更された functools モジュールがあります。関数は次のとおりです:
import functools import logging def log(func): functools.wraps(func) def wrapper(*args, **kw): logging.warn("%s is running" % func.__name__) func(*args, **kw) return wrapper >>> @log ... def f(): ... print("in function f") ... >>> f.__name__ 'f'
さらに、同じ関数に複数のデコレータを追加することもできます:
@a @b @c def f (): # 等价于 f = a(b(c(f)))
概要
私は関数型プログラミングについてはあまり知りませんが、その概念については一般的に理解しています。日常生活における必須のプログラミング。しかし、HaskellやLispのように純粋に関数型の言語もあり、それらを学ぶことで新たな考え方が開けます。
「関数型プログラミング」に関連するその他の [Python] 記事については、PHP 中国語 Web サイトに注目してください。

ThedifferencebetweenaforloopandawhileloopinPythonisthataforloopisusedwhenthenumberofiterationsisknowninadvance,whileawhileloopisusedwhenaconditionneedstobecheckedrepeatedlywithoutknowingthenumberofiterations.1)Forloopsareidealforiteratingoversequence

Pythonでは、ループの場合は、反復の数がわかっている場合に適していますが、ループは反復の数が不明で、より多くの制御が必要な場合に適しています。 1)ループの場合は、簡潔なコードとPythonicコードを使用して、リスト、文字列などのトラバーシーケンスに適しています。 2)条件に応じてループを制御する必要がある場合やユーザーの入力を待つ必要がある場合、ループがより適切ですが、無限のループを避けるために注意を払う必要があります。 3)パフォーマンスに関しては、FORループはわずかに高速ですが、通常、違いは大きくありません。適切なループタイプを選択すると、コードの効率と読みやすさが向上します。

Pythonでは、リストを5つの方法でマージできます。1)シンプルで直感的なオペレーターを使用して、小さなリストに適しています。 2)extend()メソッドを使用して、頻繁に更新する必要があるリストに適した元のリストを直接変更します。 3)要素上でリストの分析式、簡潔、動作を使用する。 4)itertools.chain()関数を使用して効率的なメモリになり、大規模なデータセットに適しています。 5)要素をペアにする必要があるシーンに適しているように、 *演算子とzip()関数を使用します。各方法には特定の用途と利点と短所があり、選択する際にはプロジェクトの要件とパフォーマンスを考慮する必要があります。

forlopseused whenthentheNumberofiterationsiskが、whileloopsareuseduntiLaconditionismet.1)forloopsareideal for sequenceslikelists、usingsintaxlike'forfruitinfruits:print(fruit) '.2)

toconcatenatealistoflistsinpython、useextend、listcomprehensions、itertools.chain、またはrecursivefunctions.1)extendistraighttraightrawardbutverbose.2)listcomprehesionsionsionsionsionsionsionsionsionsionsionsionsionsionsionsised effective forlargerdatasets.3)itertools.chainmerymery-emery-efforience-forforladatas

Tomergelistsinpython、あなたはオペレーター、extendmethod、listcomfulting、olitertools.chain、それぞれの特異的advantages:1)operatorissimplebutlessforlargelist;

Python 3では、2つのリストをさまざまな方法で接続できます。1)小さなリストに適したオペレーターを使用しますが、大きなリストには非効率的です。 2)メモリ効率が高い大規模なリストに適した拡張方法を使用しますが、元のリストは変更されます。 3)元のリストを変更せずに、複数のリストをマージするのに適した *オペレーターを使用します。 4)Itertools.chainを使用します。これは、メモリ効率が高い大きなデータセットに適しています。

Join()メソッドを使用することは、Pythonのリストから文字列を接続する最も効率的な方法です。 1)join()メソッドを使用して、効率的で読みやすくなります。 2)サイクルは、大きなリストに演算子を非効率的に使用します。 3)リスト理解とJoin()の組み合わせは、変換が必要なシナリオに適しています。 4)redoce()メソッドは、他のタイプの削減に適していますが、文字列の連結には非効率的です。完全な文は終了します。


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

WebStorm Mac版
便利なJavaScript開発ツール

SublimeText3 Linux 新バージョン
SublimeText3 Linux 最新バージョン

MinGW - Minimalist GNU for Windows
このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

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

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