普通的数学运算用这个纯抽象的符号演算来定义,计算结果只能在脑子里存在。所以写了点代码,来验证文章中介绍的演算规则。
我们来验证文章里介绍的自然数及自然数运算规则。说到自然数,今天还百度了一下,据度娘说,1993年后国家规定0是属于自然数。先定义自然数及自然数的运算规则:
用lambda表达式定义自然数(邱齐数)
0 := λf.λx.x 1 := λf.λx.f x 2 := λf.λx.f (f x) 3 := λf.λx.f (f (f x)) ...
上面定义直观的意思就是数字n, 是f(x)的n阶函数。1就是f(x), 2就是f(f(x))....,严格来说,这样表述并不准确。其实每个邱奇数都是一个二阶函数,它有两个变量f和x。用二元命名函数来表达就是:
0 -> num0(f,x)=x 1 -> num1(f, x)=f(x) 2 -> num2(f,x)=f(f(x)) 3 -> num3(f,x)=f(f(f(x))) ...
其中参数f是一个函数。这一段有点绕,但是不能理解这个,对后面的lambda演算理解会比较困难。
首先用递归法,定义邱齐数(自然数)
0是自然数, 度娘说1993年后,国家规定0是属于自然数。
每个自然数,都有一个后续。
用代码表达就是:
NUM0=lambda f: lambda x:x SUCC=lambda n: lambda f: lambda x: f(n(f)(x))
后面则是定义运算符,包括加法,乘法,减法和幂。维基文章里没有介绍除法,估摸着除法定义比较复杂,一时讲不清楚。那我们也不验证了。
################################################ #define number calculus rules ################################################ #define Church numeral inductively. #0 := λf.λx.x #1 := λf.λx.f x #2 := λf.λx.f (f x) #3 := λf.λx.f (f (f x)) #... NUM0=lambda f: lambda x:x SUCC=lambda n: lambda f: lambda x: f(n(f)(x)) #define Operator PLUS=lambda m: lambda n: m(SUCC)(n) MULT= lambda m: lambda n: m(PLUS(n))(NUM0) #define predecessor to obtain the previous number. PRED= lambda n: lambda f: lambda x: n(lambda g: lambda h: h(g(f)))(lambda u:x)(lambda u:u) SUB=lambda m: lambda n: n(PRED)(m) POW=lambda b: lambda e: e(b)
定义完了什么是自然数和自然数的运算子。那么自然数的运算,就可以用lambda演算的方式计算了。
问题是上面的定义都是抽象的符号演算,我们需要有一个编码器来把上面的抽象的Church numeral符号编码成可以人来阅读的形式,还需把人输入的数字解码成抽象符号。
################################################ #create encoder to input/output Church numeral ################################################ class LambdaEncoding: @staticmethod def encoding(exp,encoder): return encoder().encoding(exp) @staticmethod def decoding(s, decoder): return decoder().decoding(s) class NumEncoder: def encoding(self,num): f=lambda x:x+1 return str(num(f)(0)) def decoding(self,s): n=int(s) num=NUM0 for i in range(n): num=SUCC(num) return num
嗯,有了编码器,就可以方便的来验证了。
################################################ #calculus demo ################################################ print("demo number calculus.\n" "don't input large number," "it will cause to exceed maximum recursion depth!\n") n1=input('input a number: ') n2=input('input anohter number: ') #decode string to Church numeral num1=LambdaEncoding.decoding(n1,NumEncoder) num2=LambdaEncoding.decoding(n2,NumEncoder) #add result=PLUS(num1)(num2) print('{0} + {1} = {2}'.format( n1, n2, LambdaEncoding.encoding(result, NumEncoder))) #mult result=MULT(num1)(num2) print('{0} X {1} = {2}'.format( n1, n2, LambdaEncoding.encoding(result, NumEncoder))) #sub result=SUB(num1)(num2) print('{0} - {1} = {2}'.format( n1, n2, LambdaEncoding.encoding(result, NumEncoder))) #POW result=POW(num1)(num2) print('{0} ^ {1} = {2}'.format( n1, n2, LambdaEncoding.encoding(result, NumEncoder)))
测试结果如下:
>>> demo number calculus. don't input large number,it will cause to exceed maximum recursion depth! input a number: 4 input anohter number: 3 4 + 3 = 7 4 X 3 = 12 4 - 3 = 1 4 ^ 3 = 64 >>>
神奇吧。
lambda和def的区别
python lambda是在python中使用lambda来创建匿名函数,而用def创建的方法是有名称的,除了从表面上的方法名不一样外,python lambda还有哪些和def不一样呢?
1 python lambda会创建一个函数对象,但不会把这个函数对象赋给一个标识符,而def则会把函数对象赋值给一个变量。
2 python lambda它只是一个表达式,而def则是一个语句。
下面是python lambda的格式,看起来好精简阿。
lambda x: print x
如果你在python 列表解析里用到python lambda,我感觉意义不是很大,因为python lambda它会创建一个函数对象,但马上又给丢弃了,因为你没有使用它的返回值,即那个函数对象。也正是由于lambda只是一个表达式,它可以直接作为python 列表或python 字典的成员,比如:
info = [lamba a: a**3, lambda b: b**3]
在这个地方没有办法用def语句直接代替。因为def是语句,不是表达式不能嵌套在里面,lambda表达式在“:”后只能有一个表达式。也就是说,在def中,用return可以返回的也可以放在lambda后面,不能用return返回的也不能定义在python lambda后面。因此,像if或for或print这种语句就不能用于lambda中,lambda一般只用来定义简单的函数。
下面举几个python lambda的例子吧
1单个参数的:
g = lambda x:x*2 print g(3)
结果是6
多个参数的:
m = lambda x,y,z: (x-y)*z print m(3,1,2)
结果是4

Pythonは、データサイエンス、Web開発、自動化タスクに適していますが、Cはシステムプログラミング、ゲーム開発、組み込みシステムに適しています。 Pythonは、そのシンプルさと強力なエコシステムで知られていますが、Cは高性能および基礎となる制御機能で知られています。

2時間以内にPythonの基本的なプログラミングの概念とスキルを学ぶことができます。 1.変数とデータ型、2。マスターコントロールフロー(条件付きステートメントとループ)、3。機能の定義と使用を理解する4。

Pythonは、Web開発、データサイエンス、機械学習、自動化、スクリプトの分野で広く使用されています。 1)Web開発では、DjangoおよびFlask Frameworksが開発プロセスを簡素化します。 2)データサイエンスと機械学習の分野では、Numpy、Pandas、Scikit-Learn、Tensorflowライブラリが強力なサポートを提供します。 3)自動化とスクリプトの観点から、Pythonは自動テストやシステム管理などのタスクに適しています。

2時間以内にPythonの基本を学ぶことができます。 1。変数とデータ型を学習します。2。ステートメントやループの場合などのマスター制御構造、3。関数の定義と使用を理解します。これらは、簡単なPythonプログラムの作成を開始するのに役立ちます。

10時間以内にコンピューター初心者プログラミングの基本を教える方法は?コンピューター初心者にプログラミングの知識を教えるのに10時間しかない場合、何を教えることを選びますか...

fiddlereveryversings for the-middleの測定値を使用するときに検出されないようにする方法

Python 3.6のピクルスファイルのロードレポートエラー:modulenotFounderror:nomodulenamed ...

風光明媚なスポットコメント分析におけるJieba Wordセグメンテーションの問題を解決する方法は?風光明媚なスポットコメントと分析を行っているとき、私たちはしばしばJieba Wordセグメンテーションツールを使用してテキストを処理します...


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SecLists
SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

PhpStorm Mac バージョン
最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

ZendStudio 13.5.1 Mac
強力な PHP 統合開発環境

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