寒假整理3:Python的 zip函数 map函数 eval函数 的含义及应用实例

以下是我前年自学时找到的几个简单易懂的博客,但是没有记录来源,权作为整理者稍作删改排版,记录在下。

注:代码是Python2版本,不妨碍理解,基本上就是print少了括号。

PS. 昨天看到另一个也很简单的介绍博客,po在这https://blog.csdn.net/tz_zs/article/details/82804681

Python的zip函数

zip函数接受任意多个(包括0个和1个)序列作为参数,返回一个tuple列表。

 

1.示例1:

x = [1, 2, 3]
y = [4, 5, 6]
z = [7, 8, 9]
xyz = zip(x, y, z)
print xyz

运行的结果是:[(1, 4, 7), (2, 5, 8), (3, 6, 9)]

从这个结果可以看出zip函数的基本运作方式。

 

2.示例2:

x = [1, 2, 3]
y = [4, 5, 6, 7]
xy = zip(x, y)
print xy

运行的结果是:[(1, 4), (2, 5), (3, 6)]

从这个结果可以看出zip函数的长度处理方式。

 

3.示例3:

x = [1, 2, 3]
x = zip(x)
print x

运行的结果是:[(1,), (2,), (3,)]

从这个结果可以看出zip函数在只有一个参数时运作的方式。

 

4.示例4:

x = zip()
print x

运行的结果是:[]

从这个结果可以看出zip函数在没有参数时运作的方式。

 

5.示例5:

x = [1, 2, 3]
y = [4, 5, 6]
z = [7, 8, 9]

xyz = zip(x, y, z)
u = zip(*xyz)
print u

运行的结果是:[(1, 2, 3), (4, 5, 6), (7, 8, 9)]

一般认为这是一个unzip的过程,它的运行机制是这样的:

在运行zip(*xyz)之前,xyz的值是:[(1, 4, 7), (2, 5, 8), (3, 6, 9)]

那么,zip(*xyz) 等价于 zip((1, 4, 7), (2, 5, 8), (3, 6, 9))

所以,运行结果是:[(1, 2, 3), (4, 5, 6), (7, 8, 9)]

注:在函数调用中使用*list/tuple的方式表示将list/tuple分开,作为位置参数传递给对应函数(前提是对应函数支持不定个数的位置参数)

 

6.示例6:

x = [1, 2, 3]
r = zip(* [x] * 3)
print r

运行的结果是:[(1, 1, 1), (2, 2, 2), (3, 3, 3)]

它的运行机制是这样的:

[x]生成一个列表的列表,它只有一个元素x

[x] * 3生成一个列表的列表,它有3个元素,[x, x, x]

zip(* [x] * 3)的意思就明确了,zip(x, x, x)

 

Python的map函数

1.示例1

对可迭代函数'iterable'中的每一个元素应用‘function’方法,将结果作为list返回。

>>> def add100(x):
...     return x+100
...
>>> hh = [11,22,33]
>>> map(add100,hh)
[111, 122, 133]

就像文档中说的:对hh中的元素做了add100,返回了结果的list。

 

2.示例2

如果给出了额外的可迭代参数,则对每个可迭代参数中的元素‘并行’的应用‘function’。

>>> def abc(a, b, c):
...     return a*10000 + b*100 + c
...
>>> list1 = [11,22,33]
>>> list2 = [44,55,66]
>>> list3 = [77,88,99]
>>> map(abc,list1,list2,list3)
[114477, 225588, 336699]

看到并行的效果了吧!在每个list中,取出了下标相同的元素,执行了abc()。

 

3.示例3

如果'function'给出的是‘None’,自动假定一个‘identity’函数(这个‘identity’不知道怎么解释,看例子吧)

>>> list1 = [11,22,33]
>>> map(None,list1)
[11, 22, 33]
>>> list1 = [11,22,33]
>>> list2 = [44,55,66]
>>> list3 = [77,88,99]
>>> map(None,list1,list2,list3)
[(11, 44, 77), (22, 55, 88), (33, 66, 99)]

PS.

stackoverflow上有人说map()可以被理解为列表推导式:

map(f, iterable)基本上等于[f(x) for x in iterable]

乍看之下似乎合理:

>>> def add100(x):
...     return x + 100
...
>>> list1 = [11,22,33]
>>> map(add100,list1)
[101, 102, 103]
>>> [add100(i) for i in list1]
[101, 102, 103]

但换个例子,区别就显现出来了:

>>> def abc(a, b, c):
...     return a*10000 + b*100 + c
...
>>> list1 = [11,22,33]
>>> list2 = [44,55,66]
>>> list3 = [77,88,99]
>>> map(abc,list1,list2,list3)
[114477, 225588, 336699]
>>> [abc(a,b,c) for a in list1 for b in list2 for c in list3]
[114477, 114488, 114499, 115577, 115588, 115599, 116677, 116688, 116699, 224477, 224488, 224499, 225577, 225588, 225599, 226677, 226688, 226699, 334477, 334488, 334499, 335577, 335588, 335599, 336677, 336688, 336699]

其实,列表推导还可以这么写:

result = []
for a in list1:
    for b in list2:
        for c in list3:
            result.append(abc(a,b,c))

也即,若将三个list看做矩阵:

11 22 33
44 55 66
77 88 99

map()只做了列上面的运算,而列表推导(也就是嵌套for循环)做了笛卡尔乘积。

 

Python的eval函数

可以把list,tuple,dict和string相互转化。 

  功能:将字符串str当成有效的表达式来求值并返回计算结果。

  语法: eval(source[, globals[, locals]]) -> value

  参数:

    source:一个Python表达式或函数compile()返回的代码对象

    globals:可选。必须是dictionary

    locals:可选。任意map对象

 

1.字符串转换成列表

>>>a = "[[1,2], [3,4], [5,6], [7,8], [9,0]]"
>>>type(a)
<type 'str'>
>>> b = eval(a)
>>> print b
[[1, 2], [3, 4], [5, 6], [7, 8], [9, 0]]
>>> type(b)
<type 'list'>

 

2.字符串转换成字典

>>> a = "{1: 'a', 2: 'b'}"
>>> type(a)
<type 'str'>
>>> b = eval(a)
>>> print b
{1: 'a', 2: 'b'}
>>> type(b)
<type 'dict'>

 

3.字符串转换成元组

>>> a = "([1,2], [3,4], [5,6], [7,8], (9,0))"
>>> type(a)
<type 'str'>
>>> b = eval(a)
>>> print b
([1, 2], [3, 4], [5, 6], [7, 8], (9, 0))
>>> type(b)
<type 'tuple'>

猜你喜欢

转载自blog.csdn.net/BeerBread134/article/details/86918924