Chap1 数据结构与算法

从任意长度的可迭代对象中分解元素

“*表达式”可以用来将一个含有N个元素的数据结构类型分解成所需的几部分。
例如grades保存了100个成绩数据而我们只关心首末两个成绩,就可以把中间的所有成绩保存到一个列表里面,如下:

first, *middle, last = grades

保存最后N个元素

  • collection.deque(maxlen=N)创建了一个固定长度的队列,当有新记录加入而队列已满时会自动移除最老的那条记录。
  • 若不指定队列的大小,也就得到了一个无界限的队列;
  • deque支持从队列两端添加或弹出元素
from collection import deque
q = deque()
q.append(1)
q.append(2)
q.append(3)
q.appendleft(4)
q.pop()
q.popleft()

找到最大或最小的N个元素

  • heapq模块中有两个函数:nlargest()和nsmallest()
import heapqnums = [1, 8, 2, 23, 7, -4, 18, 23, 42, 37, 2]
print(heapq.nlargest(3, nums))
out: [42, 37, 23]
print(heapq.nsmallest(3,nums))
out: [-4, 1, 2]
  • 这两个函数还可以接受一个参数key
In [1]: portfolio = [...: {'name': 'IBM', 'shares': 100, 'price': 91.1},...: {'name': 'AAPL', 'shares': 50, 'price': 543.22},...: {'name': 'FB', 'shares': 200, 'price': 21.09},...: {'name': 'HPQ', 'shares': 35, 'price': 31.75},...: {'name': 'YHOO', 'shares': 45, 'price': 16.35},...: {'name': 'ACME', 'shares': 75, 'price': 115.65}...: ]cheap = heapq.nsmallest(3, portfolio, key=lambda s: s['price'])
cheap
out:
[{'name': 'YHOO', 'price': 16.35, 'shares': 45},{'name': 'FB', 'price': 21.09, 'shares': 200},{'name': 'HPQ', 'price': 31.75, 'shares': 35}]

让字典保持有序

  • collection模块的OrderedDict会按照元素初始添加的顺序进行操作;
  • 其内部维护了一个双向链表,它会根据元素加入的顺序来排列键的位置。因此OrderedDict的大小是普通字典的2倍多。

字典的计算问题

  • 利用zip()将字典的键与值反转

找出序列中出现次数最多的元素

  • collection模块的Counter类
  • 并且Counter类有一个非常方便的most_common(n)方法可以直接得到出现次数最多的前几位
from collections import Counter
words = [一系列单词组成的列表]
word_counts = Counter(words)
top_3 = word_counts.most_common(3)

通过公共键对字典列表排序

  • operator模块的itermgetter函数
from operator import itemgetterIn [26]: rows = [...: {'fname': 'Brian', 'lname': 'Jones', 'uid':1003},...: {'fname': 'David', 'lname': 'Beazley', 'uid':1002},...: {'fname': 'John', 'lname': 'Cleese', 'uid':1001},...: {'fname': 'Big', 'lname': 'Jones', 'uid':1004}...: ]itemgetter('fname')
Out[31]: <operator.itemgetter at 0x7f01606657d0>rows_by_frame = sorted(rows, key=itemgetter('fname'))
Out[30]:
[{'fname': 'Big', 'lname': 'Jones', 'uid': 1004},{'fname': 'Brian', 'lname': 'Jones', 'uid': 1003},{'fname': 'David', 'lname': 'Beazley', 'uid': 1002},{'fname': 'John', 'lname': 'Cleese', 'uid': 1001}]
  • itermgetter()函数还可以接受多个键
rows_by_frame = sorted(rows, key=itemgetter('fname','lname'))

Chap3 数字、日期和时间

对数值进行取整

  • 使用内建的round(value, ndigits)函数
>>> round(1.23, 1)
1.2
>>> round(1.27, 1)
1.3
>>> round(162773, -1)
162770
  • 当某个值恰好等于两个整数间的一半时,取整操作会去到离该值最近的那个偶数上。如1.5和2.5都会取整到2
  • round()中的ndigits可以是负数,在这种情况下会相应地取整到十位、百位。。。

对数值做格式化输出

  • 使用内建的format()函数
>>>x = 123.456
>>>format(x, '0.2f')
123.46

二进制、八进制和十六进制转换

  • 要将一个整数转换为二进制,使用bin()
  • 要将一个整数转换为八进制,使用oct()
  • 要将一个整数转换为十六进制,使用hex()

随机选择

  • random.choice()可以从序列中随机挑选出元素
>>>import random
>>>values = [1,2,3,4,5,6]
>>>random.choice(values)
4
>>>random.choice(values)
2
  • random.shuffle()可以在序列中原地打乱元素的顺序
>>>random.shuffle(values)
>>>values
[2,4,3,1,6,5]
  • random.sample()可以取样出N个元素
>>>random.sample(values, 2)
[6, 2]

时间换算

  • datatime模块可以用来完成不同时间单位间的换算。例如要表示一个时间间隔,可以创建一个timedelta实例
from datetime import timedeltaIn [33]: a = timedelta(days=2, hours=6)
In [34]: b = timedelta(hours=4.5)
In [35]: c = a + b
In [36]: c.days
Out[36]: 2
In [37]: c.seconds
Out[37]: 37800
In [38]: c.seconds/3600
Out[38]: 10.5
In [39]: c.total_seconds() / 3600
Out[39]: 58.5

Chap4 迭代器和生成器

手动访问迭代器中的元素

with open('/etc/passwd') as f:try:while True:line = next(f)print(line, end='')except StopIteration:pass

委托迭代

  • 对自定义的容器对象,其内部持有一个列表丶元组或其他的可迭代对象,我们想让自己的新容器能够完成迭代操作。一般来说,我们所要做的就是定义一个__iter__()方法,将迭代请求委托到对象内部持有的容器上。
class Node:def __init__(self, value):Self._value = vauleself._children = []def __repr__(self):return 'Node({!r})'.format(self._value)def __iter__(self):return iter(self._children)

在这个例子中,iter()方法将迭代请求转发给对象内部持有的_children属性上。

用生成器创建新的迭代模式

  • 函数中只要出现了yield语句就会将其转变成一个生成器
def frange(start, stop, increment):x = startwhile x < stop:yield xx += increment
  • 注意生成器只在响应迭代操作时才运行

对迭代器做切片操作

  • itertool.islice() 可以对迭代器和生成器做切片操作
In [3]: def count(n):...:     while True:...:         yield n...:         n += 1...:
In [5]: c = count(0)
In [6]: c
Out[6]: <generator object count at 0x7f92899b3c80>
----> 1 c[0]
TypeError: 'generator' object has no attribute '__getitem__'import itertools
In [10]: for x in itertools.islice(c, 10, 20):...:     print(x)
10
11
12
13
14
15
16
17
18
19

跳过可迭代对象中的前一部分元素

  • itertools.dropwhile() 函数回丢弃掉序列中的前面几个元素
    例如,我们需要读取一个文件,文件的开头有一系列注释行并不是我们想要的
from itertools import dropwhile
with open('/etc/passwd') as f:for line in dropwhile(lambda line: line,startwith('#'), f):print(line, end='')

迭代所有可能的组合

  • 我们想对一些列元素的所有可能组合进行迭代
  • itrtools.permutations()函数接受一个元素集合,将其中所有元素重排列为所有可能的情况,并以元组的形式返回。
In [11]: from itertools import permutations
In [12]: items = ['a', 'b', 'c']
In [13]: for p in permutations(items):...:     print(p)...:
('a', 'b', 'c')
('a', 'c', 'b')
('b', 'a', 'c')
('b', 'c', 'a')
('c', 'a', 'b')
('c', 'b', 'a')#如果想得到较短的所有全排列,可以指定长度
In [14]: for p in permutations(items, 2):...:     print(p)
('a', 'b')
('a', 'c')
('b', 'a')
('b', 'c')
('c', 'a')
('c', 'b')
  • itertools.combinations 不考虑元素间的实际顺序,即(‘a’, ‘b’)和(‘b’, ‘a’)被认为是相同的组合形式。
  • 若想解除这一限制,可用combinations_with_replacement。

同时迭代多个序列

  • zip()函数可以用来迭代多个序列中的元素
>>>xvalues = [1,5,4,2,10,7]
>>> yvalues = [101,78,37,15,62,99]
>>> for x, y in zip(xvalues, yvalues):
...     print(x, y)
...
1 101
5 78
4 37
2 15
10 62
7 99

在不同的容器中进行迭代

  • 我们需要对许多对象执行相同的操作,但是这些对象包含在不同的容器内,而我们希望可以避免写出嵌套的循环处理,保持代码的可读性。使用itertools.chain()方法可以用来简化这个任务。
from itertools import chainIn [18]: a = [1, 2, 3, 4]
In [19]: b = ['x', 'y', 'z']
In [20]: for x in chain(a, b):...:     print (x)...:
1
2
3
4
x
y
z

合并多个有序序列,再对整个有序序列进行迭代

  • heapq.merge()函数
>>>import heapq
>>>a = [1,4,7,10]
>>>b = [2,5,6,11]
>>>for c in heapq.merge(a,b):
...     print(c)
...
1
2
4
5
6
7
10
11

Chap 5 文件和IO

将输出重定向到文件中

  • 只需要在print()函数加上file关键字参数即可
with open('somefile.txt', 'rt') as f:print('Hello World!', file=f)

以不同的分隔符或行结尾符完成打印

>>>print('GKY',1995,5,18, sep='-',end='!!\n')
GKY-1995-5-18!!

在字符串上执行IO操作

  • 使用io.StringIO()和io.ByteIO()来创建类似于文件的对象,这些对象可操作字符串数据。

读写压缩的数据文件

  • gzip和bz2模块可以实现
import gzip
with open('somefile.gz', 'rt') as f:text = f.read()import bz2
with open('somefile.bz2', 'rt') as f:text = f.read()import gzip
with open('somefile.gz', 'wt') as f:f.write(text)import bz2
with open('somefile.bz', 'wt') as f:f.write(text)

将二进制数据读到可变缓冲区中

  • 我们想将二进制数据直接读取到一个可变缓冲区中,中间不经过任何拷贝环节。例如我们想原地修改数据再将它写回到文件中去。
import os.path
def read_into_buffer(filename):buf = bytearray(os.path.getsize(filename))with open(filename, 'rb') as f:f.readinto(buf)return bufwith open('sample.bin', 'wb') as f:f.write(b'hello world')buf = read_into_buffer('sample.bin')
In [16]: buf
Out[16]: bytearray(b'hello world')

序列化Python对象

  • 我们需要将Python对象序列化为字节流,这样就可以将其保存到文件中、存储到数据库中或者通过网络连接进行传输。
  • 序列化数据最常见的做法就是使用pickle模块。
import pickle
data = ...  #some python object
f = open('somefile', 'wb')
pickle.dump(data,f)
  • 要将对象转存为字符串,可以使用
import pickle
data = ...  #some python object
f = open('somefile', 'wb')
pickle.dumps(data,f)
  • 如果要从字节流中重新创建出对象,可以使用pickle.load()或者pickle.loads()

Chap 6 数据编码与处理

读写JSON数据

  • 主要使用JSON模块
  • 两个主要的函数为json.dumps()和json.loads()
  • 如果是文件而不是字符串的话使用json.dump()和json.load()

解析简单的XML文档

  • xml.etree.ElementTree可以从简单的XML文档中提取数据
from urllib.request import urlopen
from xml.etree.ElementTree import parseu = urlopen('http://planet.python.org/rss20.xml')
doc = parse(u)
In [24]: for item in doc.iterfind('channel/item'):....:     title = item.findtext('title')....:     date = item.findtext('pubDate')....:     link = item.findtext('link')....:     print (title)....:     print(date)....:     print(link)....:     print()....:

Python Cookbook手记I相关推荐

  1. Python Cookbook手记II

    Chap 7 函数 将元数据信息附加到函数参数上 函数的参数注解可以提示程序员该函数应该如何使用,这是很有帮助的.比如,考虑下面这个带参数注解的函数: def add(x:int, y:int) -& ...

  2. 分享一个python cookbook的在线教程地址

    分享一个python cookbook的在线教程地址: http://python3-cookbook.readthedocs.org/zh_CN/latest/ 翻译者:熊能 转载于:https:/ ...

  3. 《Python Cookbook》 最佳译本开放下载啦!

     摘要 看过<流畅的Python>的小伙伴应该知道作者Luciano Ramalho会推荐给读者另一部与Python相关的大作. David Beazley的<Python Cook ...

  4. 计算机编程书籍-Python Cookbook

    Python Cookbook [美] 大卫·比斯利(David Beazley),布莱恩·K.琼斯(Brian K.Jones) 著,陈舸 译 ISBN:9787115379597 包装:平装 开本 ...

  5. python cookbook 豆瓣_备受好评的20本python图书,不用到处找了!

    闲来无事,用豆瓣API爬取了豆瓣上的Python图书,筛选了评分人数>80的书,按照评分高低排序,删除了些中英文版本重复的书,整理出了下面这张最受好评的20本Python图书榜单. No.1 F ...

  6. python cookbook pdf下载-Python Cookbook 第3版 中文版.pdf

    作 者 :(美)比斯利,(美)琼斯著 出版发行 : 北京:人民邮电出版社 , 2015.05 ISBN号 :978-7-115-37959-7 页 数 : 684 原书定价 : 108.00 开本 : ...

  7. python cookbook 中文版 第 3 版-《Python Cookbook》第三版中文版

    人生苦短,我用 python! 我一直坚持使用 python3,因为它代表了python的未来.虽然向后兼容是它的硬伤,但是这个局面迟早会改变的, 而且python3的未来需要每个人的帮助和支持. 目 ...

  8. 《Python Cookbook(第3版)中文版》——1.9 在两个字典中寻找相同点

    本节书摘来自异步社区<Python Cookbook(第3版)中文版>一书中的第1章,第1.9节,作者[美]David Beazley , Brian K.Jones,陈舸 译,更多章节内 ...

  9. 将python3.7降为3.5_python3.7降至3.5【python cookbook】python访问子字符串

    访问子字符串最简单的的方式是使用切片 afiled=theline[3:8]但一次只能取一个子字符串 如果还要考虑字段的长度struct.unpack可能更合适 importstruct #得到一个5 ...

最新文章

  1. C#生成CHM文件(中级篇)
  2. java float f1=0.5_Java Math类静态float copySign(float f1,float f2)与示例
  3. Jmeter吞吐量控制器详解
  4. auto static 的区别
  5. hbuilderx版本怎么更新到新版本_2.9版本快雪迎春更新公告
  6. 如何用一段代码证明JVM加载类是懒加载模式?分享PDF高清版
  7. 浅谈前后端分离与实践 之 nodejs 中间层服务
  8. 堆排序(python实现)
  9. java常见面试题:Java程序员面试题(四)
  10. 航拍地形图转换成地形图_无人机航测生成地形图技术流程(Pix4D+ArcGIS+CASS)...
  11. STM32F412 串口接收不到数据的问题
  12. 6-3 读文章(*)
  13. calcbusiness使用教程_Calc Business
  14. 如何成为一个 IT 界的女装大佬?
  15. docker学习(十二)docker secret 的使用
  16. 《大话物联网(第2版)》赠书活动名单公告
  17. [RS] 基础概念区分:DN-辐射率-反射率
  18. 布袋除尘器过滤风速多少_布袋除尘器过滤风速一般多大
  19. Unity3D-iOS创建本地视频
  20. python教程40G,从入门到精通免费领取

热门文章

  1. SAP License:启动物料帐后不可更改物料价格的处理方法
  2. 重磅分享:一份关于车贷的政策性文件分享
  3. 智能排班系统、班次、班表、考勤、年假、调休、审批、请假、培训、值班、换班、加班、工时、自动排班、智能预测、人力需求预测、授权、团队、锁定量排、规则权重设置、菜单、角色、数据监控、工作台、axure
  4. 天池实验室-Task04-Python数据分析:从0完成一个数据分析实战
  5. 如何将自己的代码发布到Maven中央仓库?
  6. Centos7以上的版本 mysql 无法启动,无法停止问题
  7. 一周随笔--15.10.06
  8. Maven-搭建普通maven项目
  9. 使用Apache NFOP创建pdf
  10. java自学-基本数据类型