Python高阶函数之map和reduce

[TOC] Python内建了map()和reduce()函数。 如果你读过Google的那篇大名鼎鼎的论文“MapReduce: Simplified Data Processing on Large Clusters”,你就能大概明白map/reduce的概念。 map map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。 map(fun, Iteratble) 举例说明,比如我们有一个函数f(x) = x * x,要把这个函数作用在一个list [1, 2, 3, 4, 5, 6, 7, 8, 9]上,就可以用map()实现如下: f(x) = x * x │ │ ┌───┬───┬───┬───┼───┬───┬───┬───┐ │ │ │ │ │ │ │ │ │ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ [ 1 2 3 4 5 6 7 8 9 ] │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ [ 1 4 9 16 25 36 49 64 81 ] 现在,我们用Python代码实现: ...

April 19, 2016

Python高阶函数

[TOC] 高阶函数 高阶函数英文叫Higher-order function。把函数作为参数传入,这样的函数称为高阶函数,编写高阶函数,就是让函数的参数能够接收别的函数。 变量可以指向函数 以Python内置的求绝对值的函数abs()为例,调用该函数用以下代码: >>> abs(-10) 10 但是,如果只写abs呢? >>> abs <built-in function abs> 可见,abs(-10)是函数调用,而abs是函数本身。 要获得函数调用结果,我们可以把结果赋值给变量: >>> x = abs(-10) >>> x 10 但是,如果把函数本身赋值给变量呢? >>> f = abs >>> f <built-in function abs> 结论:函数本身也可以赋值给变量,即:变量可以指向函数。 如果一个变量指向了一个函数,那么,可否通过该变量来调用这个函数?用代码验证一下: >>> f = abs >>> f(-10) 10 成功!说明变量f现在已经指向了abs函数本身。直接调用abs()函数和调用变量f()完全相同。 函数名也是变量 那么函数名是什么呢?函数名其实就是指向函数的变量!对于abs()这个函数,完全可以把函数名abs看成变量,它指向一个可以计算绝对值的函数! 如果把abs指向其他对象,会有什么情况发生? >>> abs = 10 >>> abs(-10) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'int' object is not callable 把abs指向10后,就无法通过abs(-10)调用该函数了!因为abs这个变量已经不指向求绝对值函数而是指向一个整数10! 当然实际代码绝对不能这么写,这里是为了说明函数名也是变量。要恢复abs函数,请重启Python交互环境。 注:由于abs函数实际上是定义在import builtins模块中的,所以要让修改abs变量的指向在其它模块也生效,要用import builtins; builtins.abs = 10。 ...

April 18, 2016

Python常见问题总结

[TOC] 1.lambda Python 内置函数 描述 python 使用 lambda 来创建匿名函数。 语法 lambda 函数的语法只包含一个语句,如下: lambda [arg1 [,arg2,.....argn]]:expression 注意 lambda (x, y): x + y # tuple parameter unpacking is not supported in python3 这样的使用在python3中已经被废弃了,会提示上面注释中的错误 那么元组tuple如何作为参数呢,will be translated into: lambda x_y: x_y[0] + x_y[1] # 即在传入参数的时候,整个变量作为元组的参数,使用的时候,引用整个元组的位置参数 2.map() Python 内置函数 描述 map() 会根据提供的函数对指定序列做映射。 第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。 语法 map() 函数语法: map(function, iterable, ...) 参数 function – 函数,有两个参数 iterable – 一个或多个序列 返回值 Python 2.x 返回列表。 ...

April 16, 2016

Python sdk打包

[TOC] setuptools setuptools 是一个优秀的,可靠的 Pthon 包安装与分发工具。 包格式 Python 库打包的格式包括 Wheel 和 Egg。Egg 格式是由 setuptools 在 2004 年引入,而 Wheel 格式是由 PEP427 在 2012 年定义。使用 Wheel 和 Egg 安装都不需要重新构建和编译,其在发布之前就应该完成测试和构建。 Egg 和 Wheel 本质上都是一个 zip 格式包,Egg 文件使用 .egg 扩展名,Wheel 使用 .whl 扩展名。Wheel 的出现是为了替代 Egg,其现在被认为是 Python 的二进制包的标准格式。 以下是 Wheel 和 Egg 的主要区别: Wheel 有一个官方的 PEP427 来定义,而 Egg 没有 PEP 定义 Wheel 是一种分发格式,即打包格式。而 Egg 既是一种分发格式,也是一种运行时安装的格式,并且是可以被直接 import Wheel 文件不会包含 .pyc 文件 Wheel 使用和 PEP376 兼容的 .dist-info 目录,而 Egg 使用 .egg-info 目录 Wheel 有着更丰富的命名规则。 Wheel 是有版本的。每个 Wheel 文件都包含 wheel 规范的版本和打包的实现 Wheel 在内部被 sysconfig path type 管理,因此转向其他格式也更容易 详细描述可见:Wheel vs Egg ...

April 14, 2016

Python函数式编程

[TOC] 函数式编程概念 函数式编程就是指高度抽象的编程范式。 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计。函数就是面向过程的程序设计的基本单元。 而函数式编程(请注意多了一个“式”字)——Functional Programming,虽然也可以归结到面向过程的程序设计,但其思想更接近数学计算。 我们首先要搞明白计算机(Computer)和计算(Compute)的概念。 在计算机的层次上,CPU执行的是加减乘除的指令代码,以及各种条件判断和跳转指令,所以,汇编语言是最贴近计算机的语言。 而计算则指数学意义上的计算,越是抽象的计算,离计算机硬件越远。 对应到编程语言,就是越低级的语言,越贴近计算机,抽象程度低,执行效率高,比如C语言;越高级的语言,越贴近计算,抽象程度高,执行效率低,比如Lisp语言。 函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用。而允许使用变量的程序设计语言,由于函数内部的变量状态不确定,同样的输入,可能得到不同的输出,因此,这种函数是有副作用的。 函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数! Python对函数式编程提供部分支持。由于Python允许使用变量,因此,Python不是纯函数式编程语言。 函数式编程内容 Python里面的函数式编程有: 1.高阶函数 2.返回函数 3.匿名函数 4.装饰器 5.偏函数 … 后面会吧这几个分别写出来.

April 10, 2016

Python之sort和sorted

[TOC] sort or sorted ? sort 与 sorted 区别: sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。 list 的 sort 方法返回的是对已经存在的列表进行操作,而内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。 list.sorted的用法 sorted(iterable) ---------------------------------------------------------------------------------- >>>a = [5,7,6,3,4,1,2] >>> b = sorted(a) # 保留原列表 >>> a [5, 7, 6, 3, 4, 1, 2] >>> b [1, 2, 3, 4, 5, 6, 7] ---------------------------------------------------------------------------------- sorted(iterable, cmp) sorted(iterable, key) sorted(iterable, cmp, key) sorted(iterable, cmp, key, reverse=False) ---------------------------------------------------------------------------------- >>> L=[('b',2),('a',1),('c',3),('d',4)] >>> sorted(L, cmp=lambda x,y:cmp(x[1],y[1])) # 利用cmp函数 [('a', 1), ('b', 2), ('c', 3), ('d', 4)] >>> sorted(L, key=lambda x:x[1]) # 利用key [('a', 1), ('b', 2), ('c', 3), ('d', 4)] >>> students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)] >>> sorted(students, key=lambda s: s[2]) # 按年龄排序 [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)] >>> sorted(students, key=lambda s: s[2], reverse=True) # 按降序 [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)] ---------------------------------------------------------------------------------- 与list.sort 的使用 sort(self, key=None, reverse=False) if __name__ == '__main__': a = [5, 7, 6, 3, 4, 1, 2] b = [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)] a.sort(reverse=True) print(a) b.sort(key=lambda x:x[0]) print(b)

April 2, 2016

Python特性之迭代器

[TOC] Iterable 我们已经知道,可以直接作用于for循环的数据类型有以下几种: 一类是集合数据类型,如list、tuple、dict、set、str等; 一类是generator,包括生成器和带yield的generator function。 这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。 可以使用isinstance()判断一个对象是否是Iterable对象: >>> from collections import Iterable >>> isinstance([], Iterable) True >>> isinstance({}, Iterable) True >>> isinstance('abc', Iterable) True >>> isinstance((x for x in range(10)), Iterable) True >>> isinstance(100, Iterable) False Iterator 而生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值了。 可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。 可以使用isinstance()判断一个对象是否是Iterator对象: >>> from collections import Iterator >>> isinstance((x for x in range(10)), Iterator) True >>> isinstance([], Iterator) False >>> isinstance({}, Iterator) False >>> isinstance('abc', Iterator) False 生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator。 Iteratble转Iterator 把list、dict、str等Iterable变成Iterator可以使用iter()函数: ...

March 31, 2016

Python shutil移动文件

[TOC] Python 终端输出字体设置 shutil可以实现文件的复制,移动 # 复制文件: shutil.copyfile("oldfile","newfile") # oldfile和newfile都只能是文件 shutil.copy("oldfile","newfile") # oldfile只能是文件夹,newfile可以是文件,也可以是目标目录 # 复制文件夹: shutil.copytree("olddir","newdir") # olddir和newdir都只能是目录,且newdir必须不存在 # 重命名文件(目录) os.rename("oldname","newname") # 文件或目录都是使用这条命令 # 移动文件(目录) shutil.move("oldpos","newpos")

March 29, 2016

Python特性之生成器

[TOC] 生成器(generator) 在生成列表的过程中,根据需要动态生成列表的机制成为生成器。 通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。 所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。 next()调用 要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator: >>> L = [x * x for x in range(6)] >>> L [0, 1, 4, 9, 16, 25] >>> g = (x * x for x in range(6)) >>> g <generator object <genexpr> at 0x1022ef630> 创建L和g的区别仅在于最外层的[]和(),L是一个list,而g是一个generator。 我们可以直接打印出list的每一个元素,但我们怎么打印出generator的每一个元素呢? 如果要一个一个打印出来,可以通过next()函数获得generator的下一个返回值: >>> next(g) 0 >>> next(g) 1 >>> next(g) 4 >>> next(g) 9 >>> next(g) 16 >>> next(g) 25 >>> next(g) Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration 我们讲过,generator保存的是算法,每次调用next(g),就计算出g的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。 ...

March 29, 2016

Python输出颜色

[TOC] Python 终端输出字体设置 实现过程: ​ 终端的字符颜色是用转义序列控制的,是文本模式下的系统显示功能,和具体的语言无关。 ​ 转义序列是以ESC开头,即用\033来完成(ESC的ASCII码用十进制表示是27,用八进制表示就是033)。 书写格式: ​ 开头部分:\033[显示方式;前景色;背景色m + 结尾部分:\033[m ​ 注意:开头部分的三个参数:显示方式,前景色,背景色是可选参数,可以只写其中的某一个;另外由于表示三个参数不同含义的数值都是唯一的没有重复的,所以三个参数的书写先后顺序没有固定要求,系统都能识别;但是,建议按照默认的格式规范书写。 ​ 对于结尾部分,其实也可以省略,但是为了书写规范,建议\033[***开头,\033[0m结尾。很多人在结尾部分写成\033[0m,很多文章也是这么说,多半估计他们都是直接抄的别人的blog,其实连0 都是可以省略掉的,我自己试过没有问题。 那这些参数分别是什么值,又代表什么意思呢,请看下边的表, 数值表示的参数含义: 显示方式 0(默认值) 22(非粗体) 4(下划线) 24(非下划线) 5(闪烁) 显示方式 25(非闪烁) 7(反显) 27(非反显) 前景色 30(黑色) 31(红色) 32(绿色) 33(黄色) 34(蓝色) 前景色 35(洋红) 36(青色) 37(白色) 背景色 40(黑色) 41(红色) 42(绿色) 43(黄色) 44(蓝色) 背景色 45(洋红) 46(青色) 47(白色) 常见开头格式: \033[m 默认字体正常显示,不高亮 \033[31m 红色字体正常显示 \033[1;32;40m 显示方式: 高亮 字体前景色:绿色 背景色:黑色 \033[31;46m 显示方式: 正常 字体前景色:红色 背景色:青色

March 27, 2016