divmod a,b :a//b, a%b
前言讲到,本书主要强调 Python 独有的特性。这里记录了一些自己所忽视的一些用法和函数。
通常原则是为了更易读
用 listcomp 来创建新的列表,若超过两行,则应考虑重写。
map 和 filter 配合 lambda 能做 listcomp 一样的事,但是缺点在于可读性差,且运行效率不一定。
例子:
symbols='这是一个字符串abcdef'
ascii_1=[ord(s) for s in symbols if ord(s)>127]
ascii_2=list(filter(lambda x:x>127,map(ord,symbols)))
遵循了迭代器协议,逐个产出元素,节省内存,经典例子:Fibonacci
用法和 listcomp 相似,仅仅把方括号改为圆括号。
元组不仅仅是不可变列表,应注重其记录数据的特性和元组拆包。
用 * 来处理剩下的元素
*rest 可放在任何位置
a,b,*rest = range(5)
>>> (0, 1, [2, 3, 4])
a,*rest,b = range(5)
>>> (0, [1, 2, 3], 4)
嵌套元组拆包:
(a, b, (c, d)) 相应格式构造即可。
路径函数
import os
os.path.split(path)
返回路径和文件名的元组
另:
Python3 后元组不能作为形参放在函数声明中,调用函数不影响
几个典型的小技巧
- list[:x] 和 list[x:]
将一个 list 划分为两个列表
- s[a:b:c] s [ a : b : c ]
- 切片实际上调用的是 seq.__getitem__(slice(start,end,step))
- 实例化切片对象(不知道准不准确)
切片名 = slice(start,end,step)
提高可读性
所有的序列都是一维的
当建立3个引用同一个列表的对象是毫无用处的
如
lst=[[]*3]*3
将是错误的
三个序列是同一个对象
正确用法:
lst=[[]*3 for i in range(3)]
字符串格式(旧):
'%s %s'%(a,b)
新:
'{}{}'.format(a,b)
'{0}{1}'.format(a,b)
'{1}{0}'.format(a,b)
'{name}{sex}'.format(name=a,sex=b)
'{name}{sex}'.format(**dict)
divmod a,b :a//b, a%b
import elipsis
Elipsis 等于 。。。(省略) 简写
bisect(haystack,needle)
草垛里找针:)
bisect.right 类似于 upper_bound
bisect.left 类似于 lower_bound 可写为 bisect
bisect.insert 插入,并保持升序
list.sort(list,key)
key 是函数,默认为 identity function(恒等函数),可传入 str.lower 等等
key=str.lower 和 str.lower是有区别的
timsort 不改变原有顺序的情况下排序,实际应用效率不低,考虑到现实有很多数据是存在部分排序的情况。