- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Python良好编程习惯
如果进行的是简单的处理,请使用字符串方法,这样可避免复杂的正则表达式所带来的错误,并保证程序的可读性。
在原始字符串末尾使用反斜杠是语法错误。正则表达式的模式字符串中常常包含反斜杠字符。使用原始字符串来创建模式,可以避免对其中每个反斜杠进行转义的必要,使模式字符串更容易理解。[说明:原始字符串(Raw?String),也就是在字符串之前加上字符前缀r后创建的一个字符串。通常,如果在字符串中出现\,Python会把它视为转义字符,并试图用正确的转义序列替换元字符\及其后续字符。但是,如果元字符\出现在一个原始字符串中,Python不会把它解释成转义字符,而是将其视为字面意义的反斜杠字符。例如,Python会将\n解释成换行符,但将r\n解释成两个字符---一个反斜杠和一个n。]
用函数式编程语言(比如说Scheme)写的程序可以反映出数学表达式的结构;数学表达式是由若干函数字符串组成的,其中的每一个都能计算出一个结果并且不产生任何副作用。同样的函数用同样的参数去调用就会产生同样的结果,这和调用时的上下文是无关的。用这样的方法可以将我们的代码优雅地结构化(并且一定程度上也起到了简化的效果)。Python编程语言拥有所有让它在函数式编程(FP)上有优势的特性。在这篇文章中,我们将从“Pythonic”的角度来看一下FP中的一些有趣的思想如高阶函数、闭包、lambda以及柯里化等等。
什么是函数式编程?
作为程序的一部分,我们所写的函数只是在表面上和数学函数类似。比方说我们写这么一个函数:
int current_balance = 100;
int withdraw(int w)
{
??current_balance = current_balance - w;
??return current_balance;
}
我们调用一次“withdraw(10)”之后90这个值将会被返回。再调用一次“withdraw(10)”则返回80。如果“withdraw”是一个“纯”数学函数的话,那么两次调用应该返回同样的值,因为我们传给它的参数值是一样的。而我们的程序则“记住”了前次的调用(它有“状态”)然后每次都返回一个新的值 。一个如下的数学方程:
y = f(a) + g(b) + f(a)
有一个很好的属性就是它可以被化简为:
y = 2*f(a) + g(b)
事实上如果有一个计算机程序是由一组会修改全面变量的函数构成的话,我们是无法对它进行这样化简的。相比于生成一个数学证明,验证一个计算机程序的正确性更像是一个探索各种假设分析的情境的过程。
“赋值”操作符也带来了些问题。让我们简单地看一个计算阶乘的循环:
# Compute factorial of n
int f = 1, n = 5;
while (n 0) {
??f = f * n;
??n = n - 1;
}
return f;
我们会犯的一个常见的错误就是在循环体内交换两个语句的顺序。因为赋值操作符改变了它左边的符号的值,所以这让我们在考虑在我们的程序中每一个动作的顺序时需要格外的小心。
函数式编程的范式鼓励我们把程序结构化成一系列“纯”的函数,这些函数没有全局的状态也不使用赋值操作符(注意这并不是所有情况下都可行的,很显然一个银行的系统就需要“记住”很多东西)。函数式编程人员使用递归的函数调用(循环可以当成一种特殊的递归,于是特定的循环结构“while”和“for”也就不需要了)来产生重复性的行为。函数则成为了我们的“一等公民”,比方说,它们可以被当成参数传给另一个函数,也可以被别的函数返回,这就促成了我们称之为“高阶函数”的产生。当和“闭包”这个思想结合在一起的时候,这就成为了一个很强大的思想,它可以很简单地捕获很多复杂的可计算模式。
递归表示
Python中定义一个递归函数没什么了不起的。这里是一个用Python写的经典阶乘函数:
def fact(n):
??if (n == 0): return 1
??return n * fact(n - 1)
作为一等公民对象的函数
让我们在Python的命令行中定义两个函数,然后来做些实验:
def sqr(x): return x*x
...
def cube(x): return x*x*x
...
sqr
function sqr at 0x402ba10c
a = [sqr, cube]
a[0](2)
def compose(f, g): return f(g(x))
...
compose(sqr, cube, 2)
64
我们先将两个函数存到数组中,然后用“a[0][2]”的方式来调用“sqr”。接着我们又定义一个叫“compose”的函数,然后将“sqr”和“cub
原创力文档


文档评论(0)