简介Python版本选择

开发 后端
上面的示例已经显示出函数在 Python 中所处的第一类的地位,但以很微妙的方式。在使用 lambda 操作创建函数对象时,我们有一些完全常规的事物。

本文对Python的版本选择,IDE选择及编码的解决方案进行了一番详细的描述,实为Python初学者必读的Python学习经验心得,一种方式是主程序使用一门高级语言,比如C++进行编写,然后对其嵌入一个脚本解释器,在运行时动态执行一些脚本函数;

但正如我们可以使用数字 23 而无需将它与任何名称绑定一样(换句话说,象函数自变量一样),我们可以使用用 lambda 创建的函数对象而不用将它与任何名称绑定。一个函数只是我们在 Python 中对其执行某些操作的另一个值。

我们对第一类对象所执行的主要操作是将它们传递给 FP 内置函数 map()、reduce() 和 filter()。这些函数中的每一个都接受函数对象作为其第一个自变量。 map() 对指定列表中每个对应的项执行传递的函数,并返回结果列表。

 reduce() 对每个后续项执行传递的函数,返回的是最终结果的内部累加;例如 reduce(lambda n,m:n*m, range(1,10)) 意味着“10 的阶乘”(换句话说,用每一项乘上前一次相乘的乘积)。 #t#

filter() 使用传递的函数对列表中的每一项“求值”,然后返回经过甄别的,通过了传递函数测试的项的列表。 我们还经常将函数对象传递给自己的定制函数,但它们通常等同于上述内置函数的组合。

通过将这三种 FP 内置函数进行组合,可以执行惊人的一系列“流”操作(都不使用语句,而只使用表达式)。 Python 中的函数循环 替换循环与替换条件块一样简单。

for 可以直接转换成 map()。对于我们的条件执行,我们需要将语句块简化成单一函数调用(我们正逐步接近通常的做法):while 的转换仍需要 while_block() 函数,它本身包含语句而不仅仅是表达式。但我们需要对该函数做进一步的消除(例如对模板中的 if/else 进行短路)。

另外,因为循环主体(按设计)无法更改任何变量值,所以 <cond> 很难用在一般的测试中,例如 while myvar==7(那么,将在 while_block() 中修改全部内容)。添加更有用条件的一个方法是让 while_block() 返回一个更有趣的值,然后将这个返回值与终止条件进行比较。有必要看一下这些消除语句的具体示例:

  1. # imperative version of "echo()"   
  2. def echo_IMP():   
  3. while 1:   
  4. x = raw_input("IMP -- ")   
  5. if x == 'quit':   
  6. break   
  7. else   
  8. print x   
  9. echo_IMP()   
  10.  
  11. # utility function for "identity with side-effect"   
  12. def monadic_print(x):   
  13. print x   
  14. return x   
  15.  
  16. # FP version of "echo()"   
  17. echo_FP = lambda: monadic_print(raw_input("FP -- "))=='quit' or echo_FP()   
  18. echo_FP()  

我们所完成的是设法将涉及 I/O、循环和条件语句的小程序表示成一个带有递归的纯表达式(实际上,如果需要,可以表示成能传递到任何其它地方的函数对象)。我们的确仍然利用了实用程序函数 monadic_print(),但这个函数是完全一般性的,可以在我们以后创建的每个函数程序表达式中重用(它是一次性成本)。

请注意,任何包含 monadic_print(x) 的表达式所求值的结果都是相同的,就象它只包含 x 一样。FP(特别是 Haskell)对于“不执行任何操作,在进程中有副作用”的函数具有“单一体”意思。

【编辑推荐】

  1. 如何使Python嵌入C++应用程序?
  2. 深入探讨Ruby与Python语法比较
  3. Python学习资料介绍分享
  4. Python学习经验谈:版本、IDE选择及编码解决方案
  5. 浅析Python的GIL和线程安全
责任编辑:chenqingxiang 来源: 博客园
相关推荐

2009-04-01 17:58:28

MercurialPython版本控制

2010-02-24 17:38:45

Python 3.1版

2009-12-17 16:02:58

红旗Linux

2010-05-31 14:56:59

SVN版本管理软件

2009-02-06 09:08:04

Scala函数语言轻量级

2010-08-06 13:56:40

思科路由器IOS软件版本

2009-08-17 15:07:18

Python学习经验

2016-08-10 17:23:36

PythonUrllibURL

2010-03-18 13:53:34

2012-08-08 10:31:41

IBMdW

2009-02-25 10:34:57

异常处理体系Python

2010-02-01 10:04:25

Python模板函数

2011-08-17 10:11:34

MySQL数据库MVCC

2010-03-01 17:02:16

Fedora scim

2021-07-08 06:30:03

Linux CPULinux 系统

2013-01-17 15:53:48

Windows 8

2012-11-16 09:50:32

Windbg

2009-05-22 09:35:41

SQL Server版本区别版本比较

2011-06-13 09:04:50

小型企业Windows

2021-02-16 23:43:53

深度学习人工智能IT
点赞
收藏

51CTO技术栈公众号