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()方法了。
=========================================
=========================================
=========================================
=========================================
6) dict对象有items()方法和iteritems()方法,它们的返回值是有区别的,items()返回的是列表对象,而iteritems返回的是iterator对象。同理还有keys()方法和values()方法。
7) id()方法。 python中每个对象都有一个id,指向的是它的内存地址,这个和ruby的__id__原理一样。
8) python中所有类的基类也是object。汗,这种设计思路怎么这么流行啊。
========================================
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。汗,这种设计思路怎么这么流行啊。