python 列表解析 匿名函数 对象概念

看一段代码

ll=[]
L=[1,2,3,4,5]
for i in L:
ll.append(i+5)

这段代码表达的意思非常简单,将一个列表中的每一项值都加上5,然后再得到一个列表。 同时,我们可以有另外一种写法:

ll=[i+5 for i in L]

这两段程序看上去实现的功能是一样的,表面上,仅仅是第二段程序实现的比较简单。然而在python代码执行的时候,第二段代码执行速度比前一段代码的速度快一倍。因为python的迭代在解释器内部是以C的速度运行的。

很多时候,我们有两个列表,其中一个列表的每一个值和另一个列表的值相对应,因此,很自然,我们就希望可以建立一个这样对应的字典。 zip()函数,可以将两个列表,装成相应的元组对列表。

    key = ['num1','num2','num3']
    value = [1,3,5]
    >>>list(zip(key,value))
    [('num1',1),('num2',3),('num3',5)]
    >>>dict(zip(key,value))
    {'num1':1,'num2':3,'num3':5}

很简单就可以把两个列表转成对应的字典

其实对于zip函数,不仅仅对于列表有这样的功能,对于字符窜和元组也同样有这样的作用,并且可以对多个列表, 元组,序列也是同样起作用的,当有多个序列的长度不一样的时候,以最小长度 为准,使用zip的时候再加上for循环操作往往可以达到很高的效率

zip-use

看一段例子

map1

这里我们可以看到,使用map可以将我们上面说的不等成序列(包括字符窜)补上None. 其实map有更加重要的用处。 刚才我们讲过列表解析,现在又有一种可以实现相似功能的方法,

def func(x):
    return x+10
a = [1,2,3]
ll=list(map(func,a))

上面代码的功能就是将列表中的每一个数,执行一下func函数,也就是加上5。 其实map功能,理解起来非常容易,第一个参数就是一个函数,然后使用后面的可迭代的类型每个元素作为参数, 进行函数调用,最后返回一个序列,同样后面的参数取决去,函数的参数个数。

lanbda表达式也叫做匿名函数,其实和函数在功能上实现是一样的,有函数有两点不用:

  • lambda的主体只是一个表达式,因此和函数相比有一定的限制性
  • lambda没有名字,其本身就是函数的名字

下面用代码演示一下

"用函数实现"
def func(x,y,z):
    return x+y+z
sum = func(1,2,3)
"用lambda实现"
f= lambda x,y,z:x+y+z
sum=f(1,2,3)

上面两段代码实现的功能都是获得三个数相加的和。从这里可以看出,函数可以实现lambda表达式可以实现的所有功能 只是lanbda表达式省了几行代码。很多人觉得lambda表达式没什么特别意义,但是我们现在回过去看看刚才说的 map使用方式。再看看下面用lambda表达式实现的方式,结果自然知晓。

a = [1,2,3]
ll=list(map(lanbda x:x+5,a))

显然lambda表达式map联合起来使用非常漂亮

在这里稍微讲讲我理解的python对象的概念。

python中的对象概念要和变量的概念区别开来。我们知道在使用一个变量的时候是不用像C语言那样子,先要声明的。 而是直接拿过来就是可以使用的。其实这里面一句话就可以解决,python中的类型属于对象,不属于变量。 下面用自己画的一张图表示一下:

变量一 = 对象一

py_object1

变量二 = 变量一

py_object2

变量二 = 对象二

py_object3

Xiang Chao 10 February 2012
blog comments powered by Disqus
Fork me on GitHub