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学习第一弹的更多相关文章

  1. Office宏病毒学习第一弹--恶意的Excel 4.0宏

    Office宏病毒学习第一弹--恶意的Excel 4.0宏 前言 参考:https://outflank.nl/blog/2018/10/06/old-school-evil-excel-4-0-ma ...

  2. Python3 学习第一弹:基本数据类型

    本人学习主要从<python基础教程第二版>,<dive into python3>等书籍,及一些网上大牛的博客中学习特别是Python官方文档<Python Tutor ...

  3. Python学习第一弹——Python环境搭建

    一.Python简介: Python,是一种面向对象.解释型计算机程序设计语言,由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年.Python语法简洁而清晰,具有 ...

  4. Java高精度学习第一弹

    为了快速解决高精度问题,总算是要来接触java了,算上这学期要开java的课了,好好学习吧! 拿来练手的是hdu的1002,高精度加法. import java.util.*; import java ...

  5. css学习の第一弹—格式创建

    构成结构:选择符(又称为选择qi器){声明(属性:值):}*****注意:大括号,冒号,每个声明后的分号. 注释:/*注释内容写在这里*/ 一.css样式 css样式写的地方的不同分类:内联式.嵌入式 ...

  6. html学习第一弹の常用标签的归类

    HTML初步学习: 行内元素:只占据他对应标签的边框所包含的空间,默认横向排布. 块级元素:块级元素占据其父元素(容器)的整个空间,因此创建了一个块,通常浏览器会在块级元素前后另起一行,默认竖向排布. ...

  7. WebService学习-第一弹

    一:WebService简介(1)简介----百度百科(注意标识的重点) Web service是一个平台独立的,低耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言 ...

  8. FluentData 学习 第一弹

    地址: http://fluentdata.codeplex.com/ 前世: FluentData 我们公司用的一个增删改查的里面的持久层.之前还不知道 这个持久层叫FluentData.  某天看 ...

  9. cookbook学习第二弹

    1.5怎样实现一个按优先级排序的队列?并且在这个队列上面每次pop操作总是返回优先级最高的那个元素 带有双下划线的方法,会在需要被调用的位置自动被调用 带有单下划线的变量是私有变量 下面利用类heap ...

随机推荐

  1. POJ1637 Sightseeing tour(判定混合图欧拉回路)

    有向连通图存在欧拉回路的充要条件是所有点入度=出度. 首先随便给定所有无向边一个方向(不妨直接是u->v方向),记录所有点的度(记:度=入度-出度). 这时如果有点的度不等于0,那么就不存在欧拉 ...

  2. float使内联支持宽高

    float使内联元素支持了宽高,可以设置宽高属性:float消除内联元素的空格:

  3. BZOJ3631[JLOI2014]松鼠的新家 题解

    题目大意: 给你一棵树,要从编号为a[1]的节点走到编号为a[2]的节点再走到编号为a[3]的节点……一直走到编号为a[n]的节点.问每个节点最少访问多少次. 思路: 将其进行轻重链剖分,则从a[i] ...

  4. JavaScript进阶(二)

    什么是事件 JavaScript 创建动态页面.事件是可以被 JavaScript 侦测到的行为. 网页中的每个元素都可以产生某些可以触发 JavaScript 函数或程序的事件. 比如说,当用户单击 ...

  5. BZOJ3625: [Codeforces Round #250]小朋友和二叉树

    Description 我们的小朋友很喜欢计算机科学,而且尤其喜欢二叉树.考虑一个含有n个互异正整数的序列c[1],c[2],...,c[n].如果一棵带点权的有根二叉树满足其所有顶点的权值都在集合{ ...

  6. sql分页代码

    //三种sql分页语句 SELECT TOP 分页尺寸 * FROM ( SELECT ROW_NUMBER() OVER (ORDER BY id) AS RowNumber,* FROM Blob ...

  7. kinderEditor + Struts2整合

    环境: kinderEditor4.1.5 Struts2.3.5 Spring3.0.5 Hibernate3.6 代码: FileManageAction package com.hcsoft.p ...

  8. jquery-uploadify 上传

    先从官网下载插件 http://www.uploadify.com/ 引入之后.... html.................... <!-- 上传 --> <div id=&q ...

  9. 从就业面分析web前端开发工程师就业前景(2011.6)

    案例一 公司名称:法国电信北京研发中心 工作地点:北京 联系方式:hao.luan@orange-ftgroup.com 栾先生 岗位名称:web 前端开发工程师 岗位要求: 1. 计算机或相关专业本 ...

  10. css圆角边框

    一.CSS3圆角的优点 传统的圆角生成方案,必须使用多张图片作为背景图案.CSS3的出现,使得我们再也不必浪费时间去制作这些图片了,而且还有其他多个优点: * 减少维护的工作量.图片文件的生成.更新. ...