python重要知识汇总

Posted by zluckyH on September 10, 2016

字符编码

字符编码是计算机的基础,同时中文编码也是编程中最棘手的问题之一,所以了解字符编码非常重要。

生成器:yield

yield的功能类似于return,但是不同之处在于它返回的是生成器,在高级一点的编程中经常用到,以下为关于生成器的参考资料。

生成器

生成器是通过一个或多个yield表达式构成的函数,每一个生成器都是一个迭代器(但是迭代器不一定是生成器)。

如果一个函数包含yield关键字,这个函数就会变为一个生成器。

生成器并不会一次返回所有结果,而是每次遇到yield关键字后返回相应结果,并保留函数当前的运行状态,等待下一次的调用。

由于生成器也是一个迭代器,那么它就应该支持next方法来获取下一个值。

基本操作

# 通过`yield`来创建生成器
def func():
   for i in xrange(10);
        yield i

# 通过列表来创建生成器
[i for i in xrange(10)]



# 调用如下
>>> f = func()
>>> f # 此时生成器还没有运行
<generator object func at 0x7fe01a853820>
>>> f.next() # 当i=0时,遇到yield关键字,直接返回
0
>>> f.next() # 继续上一次执行的位置,进入下一层循环
1
...
>>> f.next()
9
>>> f.next() # 当执行完最后一次循环后,结束yield语句,生成StopIteration异常
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>> 

除了next函数,生成器还支持send函数。该函数可以向生成器传递参数。

>>> def func():
...     n = 0
...     while 1:
...         n = yield n #可以通过send函数向n赋值
... 
>>> f = func()
>>> f.next() # 默认情况下n为0
0
>>> f.send(1) #n赋值1
1
>>> f.send(2)
2
>>> 


嵌套字典

实际工作中会遇到需要嵌套很多层的字典,前天在研究决策树的时候遇到构造嵌套字典的问题,collections模块有一个defaultdict函数非常好用

from collections import defaultdict
tree = lambda: defaultdict(tree)
t = tree()
t['a']['b'] = 1
t['c'] = 1
t['d']['e']['f'] = 10

print (t)

defaultdict(<function <lambda> at 0x000001F23FCB78C8>, {'a': defaultdict(<function <lambda> at 0x000001F23FCB78C8>, {'b': 1}), 'c': 1, 'e': defaultdict(<function <lambda> at 0x000001F23FCB78C8>, {'e': defaultdict(<function <lambda> at 0x000001F23FCB78C8>, {'f': 10})})})

简直完美,如何灵活运用,还需要自己不断摸索

装饰器

详情参见廖雪峰的python教程 装饰器

定义如下函数,并将该函数对象赋值给一个变量f:

>>>def now():
>>>		print('2016-9-10')

>>>f = now
>>>f()
2016-9-10

函数对象有一个’name‘属性,可以拿到函数的名字:

>>> now.__name__
'now'
>>> f.__name__
'now'

现在,假设我们要增强now()函数的功能,比如,在函数调用前后自动打印日志,但又不希望修改now()函数的定义,这种在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)。

本质上,decorator就是一个返回函数的高阶函数。所以,我们要定义一个能打印日志的decorator,可以定义如下:

def log(func):
	def wrapper(*args,**kw):
		print('call {}():'.format(func.__name__))
		return func(*args,**kw)
	return wrapper

@log
def now():
	print('2017-4-9')

>>> now()
call now():
2017-4-9

字典排序

对字典排序可以使用sorted函数,利用其参数key设置按值排序,以下为代码:

import operator
d = {'a':3,'b':5,'c':1,'d':2}
sorted(d.items(),key = operator.itemgetter(1))