风言枫语  

Python中所有变量都是值的引用,也就说变量通过绑定的方式指向其值。 而这里说的不可变指的是值的不可变。 对于不可变类型的变量,如果要更改变量,则会创建一个新值,把变量绑定到新值上,而旧值如果没有被引用就等待垃圾回收。不可变的类型还有一个特性,就是可以计算其hash值,这样才能进一步作为字典的key。可变类型数据对对象操作的时候,不需要再在其他地方申请内存,只需要在此对象后面连续申请(+/-)即可,也就是它的address会保持不变,但区域会变长或者变短。

不可变类型包括:int string float tuple

可变类型包括:list dict


1、list列表

列表数据类型还有其它一些方法。下面是列表对象的所有方法:

insert(i, x)    ---- 在指定位置插入一项。第一自变量是要在哪一个元素前面插入,用下 标表示。例如,a.insert(0, x)在列表前面插入,a.insert(len(a), x)等价于a.append(x) 。
append(x)    ---- 等价于a.insert(len(a), x)
index(x)    ---- 在列表中查找值x然后返回第一个值为x的元素的下标。没有找到时出错。
remove(x)    ---- 从列表中删去第一个值为x的元素,找不到时出错。
del        ---- 可以删除一个变量
sort()        ---- 对列表元素在原位排序。注意这个方法改变列表,而不是返回排序后的列表。
reverse()    ---- 把列表元素反序。改变列表。
count(x)    ---- 返回x在列表中出现的次数。


下例使用了所有的列表方法:
>>> a = [66.6, 333, 333, 1, 1234.5]
>>> print a.count(333), a.count(66.6), a.count('x')
2 1 0
>>> a.insert(2, -1)
>>> a.append(333)
>>> a
[66.6, 333, -1, 333, 1, 1234.5, 333]
>>> a.index(333)
1
>>> a.remove(333)
>>> a
[66.6, -1, 333, 1, 1234.5, 333]
>>> a.reverse()
>>> a
[333, 1234.5, 1, 333, -1, 66.6]
>>> a.sort()
>>> a
[-1, 1, 66.6, 333, 333, 1234.5]


Python中有一些函数程序设计风格的东西,例如前面我们看到的lambda形式。关于列表有 三个非常有用的内置函数: filter(), map()和reduce()。

“filter(函数, 序列)”返回一个序列(尽可能与原来同类型),序列元素是原序列中由 指定的函数筛选出来的那些,筛选规则是“函数(序列元素)=true”。filter()可以用来取出 满足条件的子集。例如,为了计算一些素数:


>>> def f(x): return x % 2 != 0 and x % 3 != 0
...
>>> filter(f, range(2, 25))
[5, 7, 11, 13, 17, 19, 23]

“map(函数,序列)”对指定序列的每一项调用指定的函数,结果为返回值组成的列表。map() 可以对序列进行隐式循环。例如,要计算三次方,可用:

>>> def cube(x): return x*x*x
...
>>> map(cube, range(1, 11))
[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]

可以有多个序列作为自变量,这时指定的函数必须也有相同个数的自变量,函数从每个序 列分别取出对应元素作为自变量进行调用(如果某个序列比其它的短则取出的值是None)。 如果指定的函数是None,map()把它当成一个返回自己的自变量的恒同函数。在函数用None的 情况下指定多个序列可以把多个序列搭配起来,比如“map(None, list1, list2)”可以把两 个列表组合为一个成对值的列表。见下例:

>>> seq = range(8)
>>> def square(x): return x*x
...
>>> map(None, seq, map(square, seq))
[(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25), (6, 36), (7, 49)]

“reduce(函数, 序列)”用来进行类似累加这样的操作,这里的函数是一个两个子变量的 函数,reduce()先对序列的前两项调用函数得到一个结果,然后对结果和序列下一项调用函 数得到一个新结果,如此进行到序列尾部。例如,要计算1到10的和:

>>> def add(x,y): return x+y
...
>>> reduce(add, range(1, 11))
55

如果序列中只有一个值则返回这个值,序列为空时会产生例外。可以指定第三个自变量作 为初始值。有初始值时对空序列函数将返回初始值,否则函数先对初始值和序列第一项作用 ,然后对结果和序列下一项作用,如此进行到序列尾。例如:

>>> def sum(seq):
...     def add(x,y): return x+y
...     return reduce(add, seq, 0)
...
>>> sum(range(1, 11))
55
>>> sum([])
0

posted on 2013-10-08 21:48  风言枫语  阅读(206)  评论(0编辑  收藏  举报