python学习笔记(五)

1) python的数组操作功能比js强大,比起ruby会少很多方法,但已非常够用了。老实说,功能过多,也让人头晕,恰好够用可能更好。
========================================
test = [1,2,3]
test.append(4)         #=> [1,2,3,4]             相当于push
test.extend([5,6])     #=> [1,2,3,4,5,6]       合并两个数组
test += [7,8]             #=> [1,2,3,4,5,6,7,8] 合并两个数组,和extend效果相似。+号不会改变test的值,而是生成一个新值,而extend会改变test的值。也就是说,extend是破坏性的方法
test.remove(3)         #=> [1,2,4,5,6]          删除第一个3
del test[3]                 #=> [1,2,4,6]             删除位置下标为3的元素
test.insert(2,3)          #=> [1,2,3,4,6]         在下标为2的位置,添加元素3
test.reverse()            #=> [6,4,3,2,1]         逆向
test.pop()                  #=> [6,4,3,2]            向最后一个数弹出去
test.pop(2)                #=> [6,4,2]               向下标为2的元素弹出去
test.index(4)              #=> 1                       返回第一个值为4的元素的下标
test.sort()                  #=> [2,4,6]               排序
test.count(4)             #=> 1                       返回数组中4出现的次数
len(test)                    #=> 3                       返回数组的长度
========================================

几个值得注意的地方:
《1》 数组可以直接相加,结果为把两个数组直接拼接起来;
《2》 数组删除元素可以用arr.remove()方法,也可以用del arr[i]方法,两者分别是通过值和通过位置进行删除;
《3》 可以使用count()方法统计元素出现的次数;
《4》 pop()方法可以传参,弹出指定下标的元素。

2) python中列表没有map方法,但有种奇怪的用法类似于map,被称为列表推导式。
========================================
arr = [1,2,3]
[3*x for x in arr if x>1]               #=> [6,9]
[(x,2*x) for x in arr]                   #=> [(1,2),(2,4),(3,6)]     
========================================

3) 如果不会引起误解的话,元组可以省略()号。如果元组只有一个数值,也一定要在结尾处加“,”,这是为了防止和()引起误解。
========================================
t = 123,456,"hello"               # 效果等同于 t = (123,456,"hello")
t = 123,                                # 效果等同于 t = (123,)
========================================

4) python中类似于ruby也可以做集合的操作,不同的是,ruby的集合操作是对数组进行运算,而python中集合是专门一种类型。
========================================
s = set(['a','b','c'])
len(s)               #=> 3
'a' in s              #=> True
'd' not in s        #=> True       not的用法可真语义啊  效果同 not "d" in s ,但语义更强,赞一个
t = set(['a','b','c','d'])
s <= t               #=> True        s是否t的子集
s >= t               #=> False       s是否t的超集
s | t                  #=> set(['a','b','c','d'])      s 和 t的合集
s & t                 #=> set(['a','b','c'])          s 和 t的交集
s - t                  #=> set([])        s和t的集合的差
t - s                  #=> set(['d'])     t和s的集合的差
========================================

5) dict对象。 dict对象有clear()方法,用于清除自己的所有内容,变成一个空的{}。dict也有传址的问题,数组的传址问题是利用[:]来解决的,dict的传址问题可以用copy()方法,但如果dict的元素本身也是复杂类型,copy就解决不了了,这时就需要利copy模块的deepcopy()方法了。
=========================================

>>> d = {'age': 42, 'name': 'Gumby'}

>>> d

{'age': 42, 'name': 'Gumby'}

>>> d.clear()

>>> d

{}
=========================================

>>> x = {'username': 'admin', 'machines': ['foo', 'bar', 'baz']}

>>> y = x.copy()

>>> y['username'] = 'mlh'

>>> y['machines'].remove('bar')

>>> y

{'username': 'mlh', 'machines': ['foo', 'baz']}

>>> x

{'username': 'admin', 'machines': ['foo', 'baz']}
=========================================

>>> from copy import deepcopy

>>> d = {}

>>> d['names'] = ['Alfred', 'Bertrand']

>>> c = d.copy()

>>> dc = deepcopy(d)

>>> d['names'].append('Clive')

>>> c

{'names': ['Alfred', 'Bertrand', 'Clive']}

>>> dc

{'names': ['Alfred', 'Bertrand']}
=========================================

6) dict对象有items()方法和iteritems()方法,它们的返回值是有区别的,items()返回的是列表对象,而iteritems返回的是iterator对象。同理还有keys()方法和values()方法。

7) id()方法。 python中每个对象都有一个id,指向的是它的内存地址,这个和ruby的__id__原理一样。

8) python中所有类的基类也是object。汗,这种设计思路怎么这么流行啊。
posted on 2010-07-13 17:57  真阿当  阅读(112)  评论(0编辑  收藏  举报