您的位置:首页 > 编程语言 > Python开发

pythoncook 随记

2016-08-01 20:08 447 查看
第一章 数据结构与算法

1 赋值多个变量 *
2 collections deque 构造固定大小队列,插入删除比list快
3 查找最大和最小元素的N个元素 heapq nlargest() nsmallest()
4 实现一个优先级队列
5 字典中的键映射多个值 collections defaultdict
6 字典排序 collections OrderedDict
7 字典的运算 键值使用zip反转
8 查找两个字典的相同点 使用并交集 & - 字典 集合
9 删除序列相同元素并保持顺序 构建set集合
10 切片命名 slice
11 序列中最多的元素collections Counter 返回字典
12 通过某个关键字排序一个字典列表(列表元素是字典) operator itemgetter
sorted(rows, key=itemgetter('fname'))
min max
13 排序不支持原生比较的对象
14 通过某个字段记录分组 itertools groupby
groupby() 函数扫描整个序列并且查找连续相同值(或者根据指定key函数返回值相同)的元素序列。 在每次迭代的时候,它会返回一个值和一个迭代器对象, 这个迭代器对象可以生成元素值全部等于上面那个值的组中所有对象。
15 过滤序列元素
列表推导 filter(过滤条件(True,False),迭代值)
16 从字典中提取子集 字典推导
17 映射名称到序列元素
18 转换并同时计算数据
19 合并多个字典或映射 collections ChainMap

第二章 字符串和文本
正则表达式 re包 r 原生字符
1 字符组 [ ] ^ -
2 通配符 . \d \D \s \S \w \W
3 重复 * + ? {n} {m,n}
4 或 |
5 首尾描述和单词边界 ^ $ \A \Z \b \B

1、使用多个界定符分割字符
re.split() 注意匹配模式中的括号 捕获分组
2、字符串开头或结尾匹配
startswith() endwith()
3、用shell通配符匹配字符串 fnmatch() fnmatch() fnmatchcase()
4、字符串匹配与搜索
str.find()
re.match() re.findall() re.finditer()
5、字符串的搜索与替换
str.replace()

text = 'Today is 11/27/2012. PyCon starts 3/13/2013.'
re.sub(r'(\d+)/(\d+)/(\d+)', r'\3-\1-\2', text)

calender month_abbr
6、字符串忽略大小写的搜索替换
使用re 的re.IGNORECASE
re.findall('python',text,flags=re.IGNORECASE)
7、最短匹配模式
非贪婪匹配*? +? ?? {m,n}?
8、多行匹配模式
(?:.|\n) 指定了一个非捕获组 (也就是它定义了一个仅仅用来做匹配,而不能通过单独捕获或者编号的组)。
换行匹配
9、将Unicode文本标准化 删除麻烦时需要先标准化
10、在正则式中使用Unicode
11、删除字符中不需要的字符
strip()左右 lstrip()左 rstrip()右
replace()替代中间
re.sub()
lines = (line.strip() for line in f)
12、审查清理文本字符串
translate 字符串转化
13、字符串对齐
str.ljust() str.rjust() str.center()
format() >20 <20 ^20 @^20s
14、合并拼接字符串
join()
'.'.join(parts) ','.join(str(d) for d in data)
+ 性能较差
'aaaa'+'bbbbb'
'aaaabbbbb'
print(a, b, c, sep=':')
15、字符串中插入便量
s = '{name} has {n} messages.'
s.format(name='Guido', n=37)
'Guido has 37 messages.'
16、指定字符串列宽
使用textwrap包

17、在字符串中处理HTML和XML
import html
from html.parser import HTMLPARSER 解析器

18、字符串令牌解析
19、实现一个简单的递归下降分析器
20、字节字符串上的字符串操作

2016-7-25
第三章 数字日期和时间
1、数字的四舍五入
round函数 round(value,ndigits) 可以是小数或整数

2、执行精确的浮点数运算 牺牲性能
使用decimal Decimal
数据库或金融方面

3、数字的格式化输出
format()
>>> x=1234.56789
>>> format(x,'0.2f')
'1234.57'
>>> format(x,'>10.1f')
' 1234.6'
>>> format(x,'<10.1f')
'1234.6 '
>>> format(x,'^10.1f')
' 1234.6 '
>>> format(x,',')
'1,234.56789'
>>> format(x,'0,.1f')
'1,234.6'
>>> format(x,',')
'1,234.56789'
>>> format(x,'0,.1f')
'1,234.6'
>>> format(x,'e')
'1.234568e+03'
>>> format(x,'0.2e')
'1.23e+03'
>>> 'The value is {:0,.2f}'.format(x)
'The value is 1,234.57'
<>^前跟填充符
使用'{}".format格式化时,:后跟填充符

4、二八十六进制整数
bin() oct() hex()
format(x,'b') format(x,'o') format(x,'x')

5、字节到大整数的打包与解包
int.from_bytes() int.to_bytes()

6、复数运算
>>> a=complex(2,4)
>>> a
(2+4j)
>>> b=3+5j
复数的三角函数运算 cmath

7、无穷大与NaN
正无穷、负无穷或NaN(非数字)的浮点数
>>> a=float('inf')
>>> a
inf
>>> b=float('-inf')
>>> b
-inf
>>> c=float('nan')
>>> c
nan
测试判断
>>> import math
>>> math.isinf(a)
True
>>> math.isinf(b)
True
>>> math.isnan(b)
False
>>> math.isnan(c)
True

8、分数运算
fractions
>>> from fractions import Fraction
>>> a=Fraction(5,4)
>>> b=Fraction(7,16)
>>> print(a*b)
35/64

9、大型数组运算
NumPy库

10、矩阵与线性代数运算
NumPy库

11、随机选择
random模块
>>> import random
产生随机数
>>> values=[1,2,3,4,5]
>>> random.choice(values)
3
提取N个元素
>>> random.sample(values,2)
[4, 5]
打乱序列元素顺序
>>> random.shuffle(values)
>>> values
[5, 1, 2, 4, 3]
生成随机整数(均匀分布)
>>> random.randint(0,10)
1
生成随机小数(均匀分布)
>>> random.uniform(1,10)
5.722191939956784
生成0到1范围内的均匀分布的浮点数
>>> random.random()
0.7264309456697686
>>> random.random()
0.9688873083844298

12、基本的日期与时间转换
datetime模块 time calendar
dateutil
13、时区问题
使用pytz模块

2016-7-30
第四章 迭代器和生成器 itertools模块
1、手动遍历迭代器
def manual_iter():
with open('/etc/passwd') as f:
try:
while True:
line = next(f)
print(line, end='')
except StopIteration:
pass

with open('/etc/passwd') as f:
while True:
line = next(f, None)
if line is None:
break
print(line, end='')

2、代理迭代
3、使用生成器创建新的迭代模式
yield
4、实现迭代器协议
5、反向迭代
使用reversed()
a = [1, 2, 3, 4]
for x in reversed(a):
print(x)
自定义实现类的反向迭代 __reversed__()
6、带有外部状态的生成器函数
7、迭代器切片
使用itertools.islice()
islice() 会消耗掉传入的迭代器中的数据。 必须考虑到迭代器是不可逆的这个事实.
8、跳过可迭代对象的开始部分
使用itertools dropwhile
for line in dropwhile(lambda line: line.startswith('#'), f):
9、排列组合的迭代
迭代遍历一个集合中元素的所有可能的排列或组合
itertools.permutations() 输出元组
可以指定长度
for p in permutations(items, 2):

使用 itertools.combinations() 可得到输入集合中元素的所有的组合
集合的子集,包括重复元素但是没有顺序
itertools.combinations_with_replacement() 允许同一个元素被选择多次
for c in combinations_with_replacement(items, 3):
10、序列上的索引值迭代
使用enumerate() 迭代值增加索引号
for idx, val in enumerate(my_list,1): 1位置用于设置开始行号
跟踪某些值在列表中的位置
data = [ (1, 2), (3, 4), (5, 6), (7, 8) ]
for n, i in enumerate(data):
for n, (x, y) in enumerate(data):
11、同时迭代多个序列
使用zip() 生成元组迭代器
itertools.zip_longest() 选择最长数组,用None补齐
zip生成字典
s=dict(zip(keys,values))
12、不同集合上的元素迭代
多个对象执行相同操作,迭代对象类型可以不相同
>>> from itertools import chain
>>> a = [1, 2, 3, 4]
>>> b = ['x', 'y', 'z']
>>> for x in chain(a, b):
... print(x)
13、创建数据处理管道
14、展开嵌套的序列
将一个多层嵌套的序列展开成一个单层列表
yield from
15、顺序迭代合并后的排序迭代对象
多个序列排序后,合并成一个序列并迭代遍历
heapq.merge()
16、迭代器代替while无线循环
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: