• 列表推导式和生成器表达式
  • 列表推导式 list comprehension/listcomp/lc
  • map/filter
  • 生成器表达式
  • 元组
  • 元组拆包
  • 切片
  • 列表的列表
  • 其他用法
  • 字符串
  • 整除,取余divmod a,b :a//b, a%b
  • 二分查找,插入
  • 排序函数

前言讲到,本书主要强调 Python 独有的特性。这里记录了一些自己所忽视的一些用法和函数。

列表推导式和生成器表达式

列表推导式 list comprehension/listcomp/lc

通常原则是为了更易读
用 listcomp 来创建新的列表,若超过两行,则应考虑重写。

map/filter

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 不改变原有顺序的情况下排序,实际应用效率不低,考虑到现实有很多数据是存在部分排序的情况。