python基础
python查被用作数据分析,就是得益于它优雅高效的处理字符串的能力。
1. 装饰器和闭包
函数装饰器用于在源码中“标记”函数,以某种方式增强函数的行为。严格来说,装饰器只是语法糖。
def hello(fn):
def outer(fn):
def wrapper(*args):
print "hello, %s" % fn.__name__
fn(*args)
print "goodbye, %s" % fn.__name__
return wrapper
return outer
## 相当于 Hao = Hello(Hao)
@hello
def Hao():
print "i am Hao Chen"
Hao()
装饰器,创建了一个闭包函数,来代替原来的函数。在闭包函数中调用原来的函数,并且增强其它的功能。这样调用hao相当于调用warpper。
闭包
返回的averager闭包,会保存函数的局部变量series的绑定,所以在以后还可以继续访问series。
额外
def spam(a,b,c,d):
print(a,b,c,d)
s1 = functools.partial(spam,1) #对a赋默认值
s1(2,3,4)
2. 迭代器
python用函数生成器来更方便的生成迭代器。函数生成器不仅能够迭代集合,还能无中生有。
只要 Python 函数的定义体中有 yield 关键字,该函数就是生成器函数。调用生成器函数时,会返回一个生成器对象。
def gen_123():
yield 1
yield 2
yield 3
>>> g = gen_123()
>>> next(g)
1
>>> next(g)
2
>>> next(g)
3
>>> next(g)
Traceback (most recent call last):
...
StopIteration
每次迭代调用函数生成器对象的时候,生成器函数就会执行直至下一个yield。
iter函数
解释器需要迭代对象 x 时,会自动调用 iter(x) 。
3. 模块和包
目录结构就是一个包。目录里可以有__init__.py
文件来定义导入时候的初始化操作。
两种导入方式
- 决对路径,在
sys.path
中搜索,包括当前目录 - 也可以当前文件的相对路径导入。已
.
开头的import
from mypackage.A import grok
from . import grok
使用相对路径导入使修改模块名相当方便。但是导入不能跨越mypackage到其它包,直接执行脚本下的python也不能用相对导入。
python mypackage/A/star.py
# 需要
python -m mypackage.A.spam
动态导入模块
import importlib
importlib.import_module('moduleName')
来自《python cookbook》
字符串
字符串的多种表示表示
#字符串用单引号,双引号包围都可以
s = "i'm 'iron man' haha"
#用三引号可以包括换行的字符串
s = """this is
wonderful cat
"""
#前缀r,忽略转义
s = r'd:\code'
字符串的拼接
strs = ['a','b','c']
s = 'b'+'d'
s = '-'*20
s = ",".join(strs)
也可以format来拼接字符串
>>>"{0}----{1}".format('xxx','uuuu')
'xxx----uuuu'
>>> format(text, '*^20s')
'****text****'
>>> '{:>10s}'.format("c")
' c'
查找替换
#从开始查找
str.find('c')
#从后面查找
str.rfind('c')
#后缀判断
str.endswith(('.c','.h'))
#简单替换
str.replace('b','a')
也可以用shell统配符做字符串匹配,函数匹配能力介于简单的字符串方法和强大的正则表达式之间。但如果只是对文件名进行匹配,可以使用flob模块
from fnmatch import fnmatch, fnmatchcase
fnmatch('foo.bb', '*.bb')
更复杂的操作就需要用到正则表达式
re.findall(r'\d+',"abc&*(")
re.sub(r'\d')
去除字符串
# 移除字符串头尾指定的字符序列
str.strip()
# replace
str.replace('ff','')
切片
lang[2:9]
#每隔两个取出一个
lang[::2]
#反序
lang[::-1]
字符串的format方法,和全局的format有细微区别。
推导式
推导和生成式,是python优雅处理字符串列表的方式
strs = re.split('\s+',text)
[str.split(',') for str in strs]
编码
'ffs'.encode('utf-8')
b'FF12'.decode('utf-8')
将字符串安装不同编码编码成字节流。