python tips(2)
整理字符串、列表删除、可变引用、切片、省略号和文件操作等 Python 2 实用技巧。
join函数的使用
一般的字符串组合操作都建议使用join, 字符串操作经常使用的就join, split, replace, 另外还有partition
join里面可以写成一个列表解析的形式
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是不行的, 只能删除从左到右找到的第一个元素, 后面的不会删除
自认为两种比较好的方式如下
m = ['a', 'b', 'c', 'a']m = filter(lambda x: x !='a', m)或者
m[:] = (x for x in m if x != 'a')随机生成n位字符串
import randomimport string
rand_str = "".join([random.choice(string.letters+string.digits) for _ in xrange(n)])引用类型的问题
函数参数
函数默认参数,只在定义时参数求值了一次,函数的多个调用将使用同一个可变参数
def test(data, x=[]): x.append(data) return xprint test(3)# [3]print test(4)# [3, 4]dict.fromkeys设置默认值的问题
和函数参数问题一样,多个键值对应的value将调用同一个列表。设置为{}自然也是一样的结果
>>> a = dict.fromkeys('bc', [])>>> a['b'].append(6)>>> a{'b': [6], 'c': [6]}多个变量声明
一般会有声明多个空list和空dict的需求
将导致多个变量共享同一个[]或{}的错误的做法
a = b = []c = d = {}正确的方式
a, b = [], []# for a lot of varc, d, e, f = [{} for _ in xrange(4)]其它int, str, bool等没有此问题,可直接写成
a = b = Truedel的时候一次可以删除多个
>>> a = range(3)>>> del a[2], a[0]>>> a[1]切片操作
可以用-1来反转列表
>>> 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