XInCheng
一万年太久,只争朝夕
XInCheng
Python初学笔记_02

高级特性

迭代

在python中,迭代是通过for…in循环来完成的,python中的for循环的抽象程度比其他语言都要高。只要是迭代对象,无论是否有下标,都可以用for循环来迭代:

要想输出key对应的value,可以用for ivalue in d.values()来实现

列表生成式

生成器

高阶函数

变量是可以指向函数的,就想用这个变量去完成函数的事,那么一个函数的参数也是可以接受另一个函数的,这种函数就命名为高阶函数:

map()函数:

map()函数接受两个参数,第一个是函数,第二个是序列,它将传入的函数依次作用于序列中的元素上,并返回作用后的list,有点类似于for循环:

map()类似,filter()也接收一个函数和一个序列。和map() 不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True 还是False 决定保留还是丢弃该元素:

下面节选自廖雪峰的python教程:

排序算法
排序也是在程序中经常用到的算法。无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小。如果是数字,我们可以直接比较,但如果是字符串或者两个dict呢?直接比较数学上的大小是没有意义的,因此,比较的过程必须通过函数抽象出来。通常规定,对于两个元素x 和y ,如果认为x < y ,则返回‐1,如果认为x == y ,则返回0 ,如果认为x > y ,则返回1 ,这样,排序算法就用关心具体的比较过程,而是根据比较结果直接排序。
Python内置的sorted() 函数就可以对list进行排序:

此外,sorted() 函数也是一个高阶函数,它还可以接收一个比较函数来实现自定义的排序。比如,如果要倒序排序,我们就可以自定义一个reversed_cmp 函数:

传入自定义的比较函数reversed_cmp ,就可以实现倒序排序:

默认情况下,对字符串排序,是按照ASCII的大小比较的,由于’Z’ < ‘a’ ,结果,大写字母Z 会排在小写字母a的前面。
现在,我们提出排序应该忽略大小写,按照字母序排序。要实现这个算法,不必对现有代码大加改动,只要我们能定义出忽略大小写的比较算法就可以:

返回函数

匿名函数

有时候,在传入一个函数时,不需要另外的定义一个函数,我们可以直接定义一个lambda函数:

这个lambda函数实际上就是:

装饰器

作用域

在一个模块中,我们可能会定义很多函数和变量,但有的函数和变量我们希望给别人使用,有的函数和变量我们希望仅仅在模块内部使用。在Python中,是通过_前缀来实现的。正常的函数和变量名是公开的(public),可以被直接引用,比如:abcx123PI等;类似__xxx__这样的变量是特殊变量,可以被直接引用,但是有特殊用途,比如上面的__author____name__就是特殊变量,hello模块定义的文档注释也可以用特殊变量__doc__访问,我们自己的变量一般不要用这种变量名;类似_xxx__xxx这样的函数或变量就是非公开的(private),不应该被直接引用,比如_abc__abc等;之所以我们说,private函数和变量“不应该”被直接引用,而不是“不能”被直接引用,是因为Python并没有一种方法可以完全限制访问private函数或变量,但是,从编程习惯上不应该引用private函数或变量。private函数或变量不应该被别人引用,那它们有什么用呢?请看例子:

我们在模块里公开greeting()函数,而把内部逻辑用private函数隐藏起来了,这样,调用greeting()函数不用关心内部的private函数细节,这也是一种非常有用的代码封装和抽象的方法,即:

外部不需要引用的函数全部定义成private,只有外部需要引用的函数才定义为public

面向对象编程

 

赞赏

发表评论

textsms
account_circle
email

XInCheng

Python初学笔记_02
高级特性 迭代 在python中,迭代是通过for...in循环来完成的,python中的for循环的抽象程度比其他语言都要高。只要是迭代对象,无论是否有下标,都可以用for循环来迭代: [crayon-5b…
扫描二维码继续阅读
2018-04-29