python tips(2)

join函數的使用

通常的字符串組合操做都建議使用join, 字符串操做常用的就join, split, replace, 另外還有partition
join裏面能夠寫成一個列表解析的形式python

m = map(str, range(9))
','.join(x for x in m if x != '3')

# 而不是
','.join([x for x in m if x != '3'])

從列表中刪除多個相同的元素

list.remove是不行的, 只能刪除從左到右找到的第一個元素, 後面的不會刪除
自認爲兩種比較好的方式以下git

m = ['a', 'b', 'c', 'a']
m = filter(lambda x: x !='a', m)

或者bash

m[:] = (x for x in m if x != 'a')

隨機生成n位字符串

import random
import string

rand_str = "".join([random.choice(string.letters+string.digits) for _ in xrange(n)])

引用類型的問題

函數參數

函數默認參數,只在定義時參數求值了一次,函數的多個調用將使用同一個可變參數app

def test(data, x=[]):
    x.append(data)
    return x
print test(3)
# [3]
print test(4)
# [3, 4]

dict.fromkeys設置默認值的問題

和函數參數問題同樣,多個鍵值對應的value將調用同一個列表。設置爲{}天然也是同樣的結果dom

>>> a = dict.fromkeys('bc', [])
>>> a['b'].append(6)
>>> a
{'b': [6], 'c': [6]}

多個變量聲明

通常會有聲明多個空list和空dict的需求
將致使多個變量共享同一個[]{}的錯誤的作法函數

a = b = []
c = d = {}

正確的方式code

a, b = [], []
# for a lot of var
c, d, e, f = [{} for _ in xrange(4)]

其它int, str, bool等沒有此問題,可直接寫成對象

a = b = True

del的時候一次能夠刪除多個索引

>>> a = range(3)
>>> del a[2], a[0]
>>> a
[1]

切片操做

能夠用-1來反轉列表ip

>>> a = range(7)
>>> a[::-1]
[6, 5, 4, 3, 2, 1, 0]
>>> a[::2]
[0, 2, 4, 6]

用切片刪除某一段序列,等同於del a[1:4]

>>> a = [1, 2, 3, 4, 5, 6, 7]
>>> a[1:4] = []
>>> a
[1, 5, 6, 7]

去除偶數索引

>>> a = [0, 1, 2, 3, 4, 5, 6, 7]
>>> del a[::2]
>>> a
[1, 3, 5, 7]

關於省略號

主要用於多維矩陣中,減小定位操做時的複雜度,用得很少,更仔細的說明見這裏

>>> class C(object):
...  def __getitem__(self, item):
...   return item
...
>>> C()[1:2, ..., 3]
(slice(1, 2, None), Ellipsis, 3)

文件操做

一次讀取整個文件

使用二進制模式,如rb模式, 使用r則只能讀取到一部分

with open(path, 'rb') as f:
    return f.read()

按行讀取

將文件對象看錯iterator

with open(path, 'r') as f:
    for line in f:
        print line
相關文章
相關標籤/搜索