Python Tips阅读摘要
发现了一本关于Python精通知识点的好书《Python Tips》,关于Python的进阶的技巧。摘录一些比较有价值的内容作为分享。
*args and **kwargs
在函数定义的时候我们经常看到*args和 **kwargs这两个定义对象。*args代表了函数定义中所有non-keyworded(这个词实在很难翻译)的传入参数,而**kwargs代表的所有带有keyworded的传入参数,举个栗子:
def test_var_args(*args, **kwargs):
print("args:{0}, kwargs:{1}".format(args,kwargs))
test_var_args(1,2,3)
>>>args:(1, 2, 3), kwargs:{}
test_var_args(a=1,b=2,c=3)
>>>args:(), kwargs:{'a': 1, 'c': 3, 'b': 2}
通过这个栗子我们可以清晰地区分keyworded和non-keyworded的区别了。本质上来说,args是一个数组,kwargs是一个字典。
args and *kwargs 最常用于装饰器,也可以用于monkey patching(猴子补丁),用来在运行时动态修改已有的代码,而不需要修改原始代码。
- monkey patching
monkey patch指的是在运行时动态替换,一般是在startup的时候.
用过gevent就会知道,会在最开头的地方gevent.monkey.patch_all();把标准库中的thread/socket等给替换掉.这样我们在后面使用socket的时候可以跟平常一样使用,无需修改任何代码,但是它变成非阻塞的了.
应用场景包括,一个已经定义好的函数被大量的引用,如果后面需要替换这个函数的话,直接在函数入口处进行替换即可。举个栗子,将ujson代替json:
main.py
import json
import ujson
def monkey_patch_json():
json.__name__ = 'ujson'
json.dumps = ujson.dumps
json.loads = ujson.loads
monkey_patch_json()
print 'main.py',json.__name__
import sub
======================
sub.py
import json
print 'sub.py',json.__name__
可以看到json在该模块中被完美替换,这个方法也可以用来做单元测试使用。
Generators生成器
首先区分Iterable、Iterator和Iteration三个概念:任何具有__iter__()或__getitem__()方法的对象,Python就认为它是一个iterable;使用内置的iter()函数来生成iterator,iterator可以通过__next__()方法来获取下一个元素。iterator遍历元素的过程可以认为iteration。
生成器同样是可迭代对象,但是你只能读取一次,因为它并没有把所有值存放内存中,它动态的生成值。
Yield是关键字, 用起来像return,yield在告诉程序,要求函数返回一个生成器,举个栗子:
def createGenerator():
my_list=range(3)
for i in my_list:
yield i*i
gen= createGenerator()
print(next(gen))
print(next(gen))
print(next(gen))
print(next(gen)) #StopIteration
Map, Filter and Reduce
- map
Map的定义是将某函数处理所有输入参数,其定义为:map(function_to_apply, list_of_inputs)
例如:
items = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x**2, items))
当时这两者还可以通过lambda表达式进行多个函数处理同一个输入的情况,这是一个非常美妙的转换,栗子如下:
def multiply(x):
return (x*x)
def add(x):
return (x+x)
funcs = [multiply, add]
for i in range(5):
value = list(map(lambda x: x(i), funcs))
print(value)
# Output:
# [0, 0]
# [1, 2]
# [4, 4]
# [9, 6]
# [16, 8]
神奇的事情发生了,两个函数对于同一个输入参数都进行处理,并返回在了结果中。
- filter
filter(function_to_apply, list_of_inputs)
在大部分的情况下map和filter都可以通过list/dict/tuple Comprehensions来实现。
List Comprehensions语法:[expr for iter_var in iterable] 或 [expr for iter_var in iterable if cond_expr]
L = [expr for iter_var in iterable]:for iter_var in iterable的作用是依次取 iterable赋值给iter_var,而expr for iter_var in iterable的作用就是依次取值给iter_var,expr做运算后,继续循环,expr运算得到的值赋给变量L
map
map(function_to_apply, list_of_inputs)
通过函数对于结果进行处理,并返回聚集结果。例如:
from functools import reduce
product = reduce((lambda x, y: x * y), [1, 2, 3, 4])
# Output: 24
Collections
Collections包括几个常用的数据结构:
- defaultdict : 是dict的子类,实现了dict的所有方法,功能使用上与dict.setdefault()类似,但是defaultdict构建时给出默认值。
- orderdict:dict自排序。
- counter:计数器,可以对iterator计数,也可以对list计数。
- deque:队列。
- nametuple:继承自tuple,我认为本质上是快速创建仅包括属性的类对象,从这个角度上看非常实用。
- enum:枚举类型,但是必须注意,枚举成员本身类型就是枚举类型,因此如果需要将枚举成员用以读写及比较操作将会报错。
这篇教程中还讲了一些协程coroutine、异步IO的概念,但都属于技巧性的内容,讲的不透彻就不再一一分享。
Python Tips阅读摘要的更多相关文章
- OpenCV学习笔记(六十二)——《OpenCV Computer Version with Python》阅读摘要
如今python火啊.每次OpenCV自带的ml模块都让我直呼坑爹,索性准备用python来做OpenCV后期的机器学习算法的处理.于是赶紧拿起这本书读读. 适合OpenCV和python都有一定基础 ...
- 使用Python自动提取内容摘要
https://www.biaodianfu.com/automatic-text-summarizer.html 利用计算机将大量的文本进行处理,产生简洁.精炼内容的过程就是文本摘要,人们可通过阅读 ...
- [转]Python tips: 什么是*args和**kwargs?
Python tips: 什么是*args和**kwargs? 原文地址:http://www.cnblogs.com/fengmk2/archive/2008/04/21/1163766.html ...
- python tips(持续更新中)
python tips 可变对象与不可变对象 在python中,可变对象有数值类型(int,float),字符串(str),元组(tuple),可变对象有列表(list),字典(dict),集合(se ...
- 【转载】Python tips: 什么是*args和**kwargs?
转自Python tips: 什么是*args和**kwargs? 先来看个例子: def foo(*args, **kwargs): print 'args = ', args print 'kwa ...
- Python代码阅读(第8篇):列表元素逻辑判断
Python 代码阅读合集介绍:为什么不推荐Python初学者直接看项目源码 本篇阅读的三份代码的功能分别是判断列表中的元素是否都符合给定的条件:判断列表中是否存在符合给定的条件的元素:以及判断列表中 ...
- Python代码阅读(第11篇):展开嵌套列表
Python 代码阅读合集介绍:为什么不推荐Python初学者直接看项目源码 本篇阅读的代码实现了展开嵌套列表的功能,将一个嵌套的list展开成一个一维list(不改变原有列表的顺序). 本篇阅读的代 ...
- Python代码阅读(第12篇):初始化二维数组
Python 代码阅读合集介绍:为什么不推荐Python初学者直接看项目源码 本篇阅读的代码实现了二维数组的初始化功能,根据给定的宽高初始化二维数组. 本篇阅读的代码片段来自于30-seconds-o ...
- Python代码阅读(第21篇):将变量名称转换为蛇式命名风格
Python 代码阅读合集介绍:为什么不推荐Python初学者直接看项目源码 本篇阅读的代码实现将变量名称转换为蛇式命名风格(snake case)的功能. 本篇阅读的代码片段来自于30-second ...
随机推荐
- 记一个逻辑bug
1 从数据库中找出一个学生能选的毕业设计(毕设的select or not 字段表示本题目是否已经被选 此时就按照其值为n来查询) 2 用户选择某个毕设后,先更新毕设表(select ...
- ios第三方数据请求 UI_15
AppDelegate.m //指定根视图 self.window.rootViewController = [[[UINavigationController alloc]initWithRootV ...
- ad network
全称:Advertising network.即"在线广告联盟".一种介于想出售广告空间的网站与想在网站上刊登广告的广告主之间的平台.比较知名的公司有Google的AdSense. ...
- OJ题:字符串分隔
题目描述 •连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组:•长度不是8整数倍的字符串请在后面补数字0,空字符串不处理. 输入描述: 连续输入字符串(输入2次,每个字符串长度小于10 ...
- 使用LogKit进行日志操作
1. 概述 任何一个系统中,日志都是不可缺少的,现在Apache提供了两套日志工具,一个就是Log4j,另一个是本文要给出例子的LogKit. Log4j和LogKit有很多相似的地方.比如 ...
- mysql进阶(三)游标简易教程
mysql游标简易教程 从mysql V5.5开始,进行了一次大的改变,就是将InnoDB作为默认的存储引擎.InnoDB支持事务,而且拥有相关的RDBMS特性:ACID事务支持,数据完整性(支持外键 ...
- 算法面试题-leetcode学习之旅(二)
题目: Given a non-negative integer num, repeatedly add all its digits until the result has only one di ...
- 原生CSS动画回调事件
原文链接: Detecting CSS Animation Completion with JavaScript 原文日期: 2014年02月20日 翻译日期: 2014年02月21日 翻译人员: 铁 ...
- 知名IT公司的年度大会合集
很多知名的IT公司都有年度大会,比如说谷歌,微软,Adobe,甲骨文,苹果等等.在这些公司的年度大会上,都会展示一些公司比较前沿的产品.看看这些大会的视频(也可以参会,但是门票可是非常贵的),对我们了 ...
- 【一天一道LeetCode】#328 Odd Even Linked List
一天一道LeetCode系列 (一)题目 Given a singly linked list, group all odd nodes together followed by the even n ...