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')

将字符串安装不同编码编码成字节流。

Updated: