pythoncook 随记

第一章 数据结构与算法

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无线循环

时间: 2024-10-10 21:06:36

pythoncook 随记的相关文章

微信运动记步原理,及刷步数方法大揭密

随着"微信运动"功能的开启,朋友圈里燃起了每天刷步的热情,每天为了争夺运动封面第一名,不惜下班还在楼下多绕一圈儿再回家.那么你们都知道微信运动是如何记录我们每日行程步数的吗?这个数据到底准不准确呢?今天小编就为大家来一个大揭密. 原理: 手机内置了振动传感器或协助处理器,根据这些设备的震动频率来储存数据.简单地说,就是人在步行时重心都有一点上下移动,传感器和协作器感应到这种重心移动并进行记数. 设备: iPhone 5S/6/6 Plus三款苹果手机因为自带M7/M8协处理器,无需任何

.NET Core爬坑记 1.0 项目文件

前言: 之所以要写这个系列是因为在移植项目到ASP.NET Core平台的过程中,遇到了一些“新变化”,这些变化有编译方面的.有API方面的,今天要讲的是编译方面的一些问题.我把它们整理后分享出来,以便各位博友不要再遇到这些坑. 在Dotnet Core RC2版本中,project.json 管理着整个项目,包括编译文件.依赖包管理.版本信息.平台依赖与发布等功能. 关于项目中引用: 比如我们一般看到Project.json中一般会有如下内容: "dependencies": { &

最美的时光在路上 - 记第一次深马

昨天跑了深圳马拉松的半马,这是我的第二马,家门口跑马还是有些兴奋的,就因为这个兴奋劲儿,凌晨两点才入睡,朦朦胧胧睡了三个小时,5点半就不得不爬起来洗洗涮涮了,吃了准备好的早餐,坐第一班地铁奔赴市民中心,到达市民中心,已经是人山人海了,各方跑友汇聚于此.话说,这两年跑步是越来越火,我是觉得和现在各种跑步APP的兴起有关,有了这些记步APP,跑了步晒下,朋友们点点赞,这些正向反馈让你跑步的心气就有更足了,其他运动可能很难通过什么APP有这样的体验. 时间紧,存了包,就赶紧往起点一点点的挤(人多,真的

基于Android的计步器(Pedometer)的讲解(四)——后台记步

今天先不说Pedometer(计步器)项目UI方面的了,今天讲一个基于重力加速度的记步功能传感器(Sensor),然后 在后台开启记步. 计步器(Pedometer)整个项目的源代码,感兴趣的朋友可以下载来看看(记得帮小弟在github打个星~) https://github.com/296777513/pedometer 先上几张效果图:(效果和上一篇讲到的CircleBar非常的相似,因为记步功能在后台) 如图所示,能根据你的一些基本参数,来记步.有一个缺点,因为这个是根据感应加速度来计算是

记一次varnish异常/故障

公司一varnish集群运行很久了,一直很稳定,没发现什么问题.最近开发那边反馈新传的静态文件访问不了.出现以下错误: Error 503 Service Unavailable Guru Meditation: XID: 1267841165 cache server 5443 检查varnish启动配置, ps -ef | grep varnish usr/sbin/varnishd -P /var/run/varnish.pid -a :80 -f /etc/varnish/default

ACM退役记&amp;&amp;回忆录

ACM退役记 2017.9.19星期二,"九一八事变"八十六年后的第二天,永远记住这个日子,刚好是我报名ACM到现在,刚好满一年,而今天正是我注册杭州电子科技大学OJ的时间(就是这一天报名的),附上小图一张! 嗯,我退役了,真的退役了,从此告别了ACM的生涯,虽然有很多遗憾,虽然有很多不舍,虽然有很多很多不情愿,但是,,,还是没能阻止这一天的到来,可能你们会认为我退役的有点早,可能你们也会有很多疑惑,为啥这么优秀这么强的大佬竟然退役的这么早...(自嘲一下,其实菜的一逼) 其实这个原因

踩坑记(1)——使用slf4j+logback记录日志

jar包版本: <spring.version>3.1.0.RELEASE</spring.version> <slf4j.version>1.7.25</slf4j.version> <logback.version>1.2.3</logback.version> <logback.ext.version>0.1.1</logback.ext.version> commons-logging:scope为pr

记一次django的诡异报错 Could not parse the remainder: &#39;=&#39; from &#39;=&#39;

如题,一个展示日志的功能,调用该模板文件时报错,Could not parse the remainder: '=' from '='.这行模板语言在上面出现过同样的,仅仅是改了'<='右端的整数大小,而且该有的标签也不少. 百般思考无解,stackoverflow和百度都没答案.后来重新看了下开发文档,发现是Django的版本不对,开发时用的1.8.2,我部署时用的1.11.5.重新安装低版本的django后问题解决.但原因仍待查. 记一次django的诡异报错 Could not parse

Linux随记

1. 设置 极点五笔 自动上屏 默认情况下,ibus-table不开启直接上屏模式(即敲完四个码,没有重码时,直接显示到屏幕上),在五笔输入法下 Ctrl + / 即可. Linux随记,码迷,mamicode.com