cookbook学习第一弹
1.1现在有一个包含N个元素的元组或者是序列,怎样将它里面的值解压后同时赋值给N个变量
代码:
>>>p = (4,5)
>>>x,y = p
>>>x
4
>>>y
5
>>>data = ['ACME',50,91.1,(2012,12,21)]
>>>name,shares,price,data = data
>>>name
'ACME'
>>>data
(2012,12,21)
>>>name,shares,price,(year,mon,day) = data
>>>name
'ACME'
>>>year
2012
如果变量个数和序列元素的个数不匹配,会产生一个异常。实际上,解压赋值可以用在任何可迭代对象上面,而不仅仅是列表或者元组。包括字符串,文件对象,迭代器和生成器
有时候, 如果只想解压一部分,丢弃其他部分,可以用任意变量去占位,到时候丢掉这些变量就行了
代码:
>>>data = ['ACME',50,91.1,(2012,12,21)]
>>>_,shares,price,_ = data
>>>shares
50
1.2如果一个可迭代对象的元素个数超过变量个数时,回抛出一个ValueError。那么怎样才能从这个可迭代对象中解压出N个元素出来?
代码:
def drop_first_last(grades):
first,*middle,last = grades
return avg(middle)
也可以把*号放在最后一个位置,最后一定得到的是一个列表
代码:
>>>record = ('Dave','dave@example.com','773-555-1212','847-555-1212')
>>>name,email,*phone_numbers = record
>>>name
'Dave'
>>>phone_numbers
['773-555-1212','847-555-1212']
也可以把*放在最前面
代码:
*trailing_qtrs,current_qtr = sales_record
trailing_avg = sum(trailing_qtrs)/len(trailing_qtrs)
return avg_comparison(trailing_avg,current_qtr)
1.3在迭代操作或者其他操作的时候,怎样只保留最后有限几个元素的历史记录
代码:
from collections iport deque
def search(lines,pattern,history=5):
previous_lines = deque(maxlen=history)
for li in lines:
if pattern in li:
yield li,previous_lines
previous_lines.append(li)
if __name__ == '__main__':
with open(r'../../cookbook/somefile.txt')as f:
for line,prevlines in search(f,'python',5):
for pline in prevlines:
print(pline,end='')
print(line,end='')
print('_'*20)
代码讲解:
首先是deque,使用deque(maxlen=N)构造函数回新建一个固定大小的队列。当新的元素加入并且这个队列已满的时候,最老的元素会自动被移除掉,如果没有指定大小,默认就是无限大
代码示例:
>>>q = deque(maxlen=3)
>>>q.append(1)
>>>q.append(2)
>>>q.append(3)
>>>q
deque([1,2,3],maxlen=3)
>>>q.append(4)
>>>q
deque([2,3,4],maxlen=3)
>>>q=deque()
>>>q.append(1)
>>>q.append(2)
>>>q.append(3)
>>>q
deque([1,2,3])
>>>q.appendleft(4)
>>>q
deque([4,1,2,3])
>>>q.pop()
3
>>>q.popleft()
4
生成器yield的用法讲解
def fab(max):
n, a, b = 0, 0, 1
while n < max:
yield b
# print b
a, b = b, a + b
n = n + 1 '''
仅仅把 print b 改为了 yield b,就在保持简洁性的同时获得了 iterable 的效果。
>>> for n in fab(5):
... print n
...
1
1
2
3
5
简单地讲,yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator,调用 fab(5) 不会执行 fab 函数,而是返回一个 iterable 对象!在 for 循环执行时,每次循环都会执行 fab 函数内部的代码,执行到 yield b 时,fab 函数就返回一个迭代值,下次迭代时,代码从 yield b 的下一条语句继续执行,而函数的本地变量看起来和上次中断执行前是完全一样的,于是函数继续执行,直到再次遇到 yield。
1.4、怎样从一个集合中获得最大或者最小的N个元素列表
heapq模块有两个函数:nlargest和nsmallest()可以解决
代码:
import heapq
nums = [1,8,2,23,7,-4,18,23,42,37,2]
print(heapq.nlargest(3,nums))
print(heapq.lsmallest(3,nums))
两个函数都能接受一个关键字参数,用于更复杂的数据结构中:
代码:
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'])
expensive = heapq.nlargest(3,portfolio,key=lambda s:s['price'])
heapq的排序函数heapify
>>>nums = [1,8,2,23,7,-4,18,23,42,37,2]
>>>import heapq
>>>heapq.heapify(nums)
>>>nums
[-4, 2, 1, 23, 7, 2, 18, 23, 42, 37, 8]
>>>heapq.heappop(nums)
-4
如果是查找唯一的最大或者最小的话,可以直接使用min()和max()
如果N接近集合的大小的话,可以直接用sorted先排序再取sorted(items)[:N]或者sorted(items)[_N:]
cookbook学习第一弹的更多相关文章
- Office宏病毒学习第一弹--恶意的Excel 4.0宏
		Office宏病毒学习第一弹--恶意的Excel 4.0宏 前言 参考:https://outflank.nl/blog/2018/10/06/old-school-evil-excel-4-0-ma ... 
- Python3 学习第一弹:基本数据类型
		本人学习主要从<python基础教程第二版>,<dive into python3>等书籍,及一些网上大牛的博客中学习特别是Python官方文档<Python Tutor ... 
- Python学习第一弹——Python环境搭建
		一.Python简介: Python,是一种面向对象.解释型计算机程序设计语言,由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年.Python语法简洁而清晰,具有 ... 
- Java高精度学习第一弹
		为了快速解决高精度问题,总算是要来接触java了,算上这学期要开java的课了,好好学习吧! 拿来练手的是hdu的1002,高精度加法. import java.util.*; import java ... 
- css学习の第一弹—格式创建
		构成结构:选择符(又称为选择qi器){声明(属性:值):}*****注意:大括号,冒号,每个声明后的分号. 注释:/*注释内容写在这里*/ 一.css样式 css样式写的地方的不同分类:内联式.嵌入式 ... 
- html学习第一弹の常用标签的归类
		HTML初步学习: 行内元素:只占据他对应标签的边框所包含的空间,默认横向排布. 块级元素:块级元素占据其父元素(容器)的整个空间,因此创建了一个块,通常浏览器会在块级元素前后另起一行,默认竖向排布. ... 
- WebService学习-第一弹
		一:WebService简介(1)简介----百度百科(注意标识的重点) Web service是一个平台独立的,低耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言 ... 
- FluentData 学习 第一弹
		地址: http://fluentdata.codeplex.com/ 前世: FluentData 我们公司用的一个增删改查的里面的持久层.之前还不知道 这个持久层叫FluentData. 某天看 ... 
- cookbook学习第二弹
		1.5怎样实现一个按优先级排序的队列?并且在这个队列上面每次pop操作总是返回优先级最高的那个元素 带有双下划线的方法,会在需要被调用的位置自动被调用 带有单下划线的变量是私有变量 下面利用类heap ... 
随机推荐
- Android自动化测试 - 自动化测试工具比较
- Java jar命令 常见用法
			一.jar命令作用: 进行打包 -- 把多个文件打包成一个压缩包 -- 这个压缩包和Winzip的压缩格式是一样的. 区别在于jar压缩的文件默认多一个META-INF的文件夹,该文件夹下包含一个Ma ... 
- .net平台下垃圾回收机制
			引言:使用c++进行编程,内存的处理绝对是让每个程序设计者最头疼的一块了.但是对于.net平台下使用c#语言开发系统,内存管理可以说已经不算是问题了.在.net平台下CLR负责管理内存,CLR中的垃圾 ... 
- BZOJ3607 : 数据网络
			首先答案一定是包含直径某个端点的一个连通块里所有边权值之和,设直径为$AB$,以$A$和$B$分别为根进行处理. 首先按照最长路法则将这棵树进行树链剖分,那么每个叶子的贡献为它与它所在链顶端的点的距离 ... 
- gulp + webpack 构建多页面前端项目
			修改增加了demo地址 gulp-webpack-demo 之前在使用gulp和webpack对项目进行构建的时候遇到了一些问题,最终算是搭建了一套比较完整的解决方案,接下来这篇文章以一个实际项目为例 ... 
- POJ 1279 Art Gallery(半平面交)
			题目链接 回忆了一下,半平面交,整理了一下模版. #include <cstdio> #include <cstring> #include <string> #i ... 
- 【bzoj2049】[Sdoi2008]Cave 洞穴勘测 link-cut-tree
			2016-05-30 11:04:51 学习了link-cut-tree 二中神犇封禹的讲义感觉讲的超级清晰易懂啊(没有的可以q窝 算是模板吧 #include<bits/stdc++.h&g ... 
- DBLink创建 ORA-12154: TNS: 无法解析指定的连接标识符
			因为对oracle不了解,这个问题可TM的搞了好久! 走的弯路: 1. 在客服端的PLSQL连接工具上折腾,而不是在服务器的PLSQL解决 2. 配置的tnsnames.org文件在环境变量path( ... 
- C#.NET Form设置/取消开机自动运行,判断程序是否已经设置成开机自动启动(转载)
			#region//开机自动运行 private void CB_Auto_CheckedChanged(object sender, EventArgs e) {//CB_ ... 
- POJ3903:Stock Exchange(LIS)
			题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87125#problem/E 题目: Description The world ... 
