Python核心编程学习日记之函数式编程
/*** * 在写笔记之前,首先吐槽一下,感觉Python核心编程这本书不是太适合对Python入门的人使用。 *读这本书让我有种大一刚学C语言读 <The C Programming Language>的感觉。 *可能因为我的学习能力不是很强吧,但是一本入门级的书本最好是有个顺序的使用一门语言的语法。 *在前面尽量不要使用太多的后面的语法,否则很容易让学习者迷乱。就我个人阅读习惯,我不是很喜 *欢在书本中看见一句“如果对这段代码了解更多,请先阅读第N章。”。 * 再者,这几天过的太懒了,除了玩,什么都没干。本来计划的今天应该是看到第13章的,现在才 *刚把第10章异常看完。而且除了挑几个书上的例题做做,没有进行正儿八经的编程实践。学习一门语 *言,不运用和没学没什么不同吧。 * 然后,和同学聊天,发现自己的算法简直太弱了。好的算法能力比会这些七七八八的语言重要多 *了。好好调整作息,这个寒假能把Python学习一下,复习一下算法导论我就满足了。。。 ***/
函数和函数式编程
过程是简单,特殊,没有返回值的函数。Python的过程就是函数,因为解释器会隐式地返回默认值None,类似于C中的void
- 返回多个值时,要把这些值放在容器中。多个值用,并列会被放在元组中,因为元组的语法定义并不一定需要圆括号
- 关键字参数:在函数调用时,让调用者通过函数调用中的参数名字来区分参数。这样允许参数缺失或者不按顺序,因为解释器能通过给出的关键字来匹配参数的值。
- 执行一个没有显示定义参数的函数:通过把元组(非关键字参数)或字典(关键字参数)作为参数组传给函数。形式:func(*tuple_grp_nonkw_args, **dict_grp_kw_args)。所以python中允许的函数调用的完整语法为:func(positional_args, keyword_args, *tuple_nonkw_args, **dict_grp_kw__args)
- def语句创建函数:
def function_name(arguments): "function_documentation_string" function_body_suite
- 前向引用:和其他高级语言类似,Python不允许在函数未声明之前,对其进行引用或者调用。注意是在引用或调用之前,只要没有访问函数,函数的声明顺序无影响。
- 内部/嵌套函数:在函数体内创建另外一个函数,Python支持静态地嵌套域。方法1:在外部函数的定义内部定义函数;方法2:使用lamda语句
- 函数(与方法)装饰器:仅是当声明一个函数或者方法的时候,才会应用的额外调用。语法:@decorator(dec_opt_args) \ def funcDecorated(func_opt_args)
@g \ @f \def foo(): \ pass 等价于 foo= g(f(foo))
带参数的装饰器就是装饰器调用这些参数。并用自己的返回值代替自己的位置:@g(arg) \ @f \def foo(): \ pass 等价于 foo= g(arg)(f(foo))
- 装饰器实际上就是函数,他们接受函数对象,进行处理。用装饰器来:引入日志;增加计时逻辑来检测性能;给函数加入事务的能力
- 在Python中函数对象和普通对象一样,可以被引用,访问,作为参数,作为容器元素。函数名就是对一个函数对象的引用。其独一无二的特征是可以被调用。
-
形式参数
声明函数时所创建的局部命名空间为各个参数值创建一个名字。一旦函数开始执行,既能访问这个名字
- 可变长度的参数:
(1)非关键字可变长参数(元组):def function_name([formal_args,] *vargs_tuple): \ "function_documentation_string" \ function_body_suite
(2)关键字变量参数(Dictionary):有不定数目或者额外集合的关键字的情况下,参数被放在一个字典中。字典中键为参数名,值为相应的参数值。 def function_name([formal_args,][*vargst,]**vargsd): \ function_documentation_string function_body_suite
关键字和非关键字可变长参数都有可能在同一个函数中,只要关键字字典是最后一个参数并且非关键字元组先于它之前出现。
- python 允许用lambda 关键字创造匿名函数。语法:lambda [arg1[, arg2, ... argN]]: expression 参数是可选的,如果使用的参数话,参数通常也是表达式的一部分。
- 可变长度的参数:
- 变量作用域:全局变量,局部变量。
搜索标识符:先从局部作用域开始搜索。如果在局部作用域内没找到,再去全局域寻找,仍未找到,抛出NameError异常。python以前不支持多层嵌套,现在可以。
global语法:global var1[, var2[, ... varN]] 在局部域中明确引用一个已命名的全局变量。
- 定义在外部函数内的但由内部函数引用或者使用的变量被称为自由变量。如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是closure
- 从语法上讲,生成器是一个带yield语句的函数。一个函数或者子程序只返回一次,但一个生成器能暂停执行并返回一个中间的结果--那就是yield语句的功能,返回一个值给调用者并暂停执行。当生成器的next()方法被调用的时候,他会准确的从离开地方继续。