python学习记录(二)

时间:2022-06-20 22:35:50

1. URL编码及还原

from urllib import quote, unquote ##使用quote, upquote进行url编码转换

2. 字符串前面的r表示不转义,原始字符串
如: 

>>> r'\n'  >>>输出 : '\\n'

3. 星号的用法

def multiply(*args): #表示支持多个参数 multiply(2, 3, 4, 5, 6)
def accept(**kwargs): #表示支持多个关键字参数 accept(foo='bar', spam='eggs')
def any(*args, **kwarg) #即可接受任意参数
# 偏函数,可以使用参数控制函数的功能
int('12345', base=8):#表示转换成int,按8进制,不传默认10进制

  

4. 数组的截取

a[start:end] # 从数组中取索引start开始到end-1的记录
a[start:] # 取从start开始到末尾的元素
a[:end] # 取从0开始到end-1的元素
a[:] # 复制整个数组
a[start:end:step] #从start开始,每隔step取一个值,到不超过end为止
a[-1] #取最后一个值
a[-2:] #取最后两个值
a[:-2] #从0开始取到倒数第三个

5. 循环

for key in d # 迭代key
for value in d.itervalues() # 迭代值
for k, v in d.iteritems() # 迭代keyvalue	
for index, value in enumerate(['A', 'B', 'C']): # 使用enumerate可获得index
for x, y in [(1, 1), (2, 4), (3, 9)]: # 同时引用了两个变量

6. 列表生成

[x * x for x in range(1, 11)] => [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
[x * x for x in range(1, 11) if x % 2 == 0] => [4, 16, 36, 64, 100]
[m + n for m in 'ABC' for n in 'XYZ'] => ['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']

7. 生成器
# 只要把一个列表生成式的[]改成()

g = (x * x for x in range(10)) ==>使用 g.next() 打印出来 或 for n in g:

8. 高阶函数

def f(x): return x * x
def add(x, y): return x + y

# map使用的函数只接受一个参数
map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])  ==> [1, 4, 9, 16, 25, 36, 49, 64, 81]

# reduce接受两个参数
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4) 
reduce(add, [1, 3, 5, 7, 9]) => 25
def str2int(s):
    return reduce(lambda x,y: x*10+y, map(char2num, s))

# 判断非空字符串
def not_empty(s): return s and s.strip()
filter(not_empty, ['A', '', 'B', None, 'C', '  ']) ===>  ['A', 'B', 'C']

# 闭包
# 返回闭包时牢记的一点就是:返回函数不要引用任何循环变量,或者后续会发生变化的变量。

9. 装饰器,用来增强函数功能的

def log(func):
    #相当于wrapper.__name__ = func.__name__,把函数签名移出来
	@functools.wraps(func)      
    def wrapper(*args, **kw):
        print 'call hhh %s():' % func.__name__
        return func(*args, **kw)
    return wrapper
@log     # 使用@注释来使用装饰器 ==> call hhh now():  2013-12-25
def now():
    print '2013-12-25'
#或者:===== now = log('execute')(now)
def log(text):
    def decorator(func):
    	 @functools.wraps(func)
        def wrapper(*args, **kw):
            print '%s %s():' % (text, func.__name__)
            return func(*args, **kw)
        return wrapper
    return decorator
#使用  @log('execute')

10. 访问限制
默认都是public的
内部属性不被外部访问,可以把属性的名称前加上两个下划线__,
实例的变量名如果以__开头,就变成了一个私有变量(private)

11. 对象信息

type() # 获取类型
isinstance(a, Class) # 判断是否是类型
dir() # 展示所有的属性和方法
getattr(obj, 'x') 、 setattr(obj, 'x') 、 hasattr(obj, 'x') # 获取、设置、判断是否有属性

12. 对象动态特性

 # 动态增加属性
 s = Student()
 s.name = 'Michael' # 动态给实例绑定一个属性
 print s.name
 # 动态增加方法
 def set_age(self, age): # 定义一个函数作为实例方法
     self.age = age
 from types import MethodType
 s.set_age = MethodType(set_age, s, Student) # 给实例绑定一个方法
 s.set_age(25) # 调用实例方法
 s.age # 测试结果
 # 限制动态增加
 class Student(object):
	 __slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称,但对子类无效

13. python允许多重继承

class MyTCPServer(TCPServer, CoroutineMixin): pass

14. 内置属性

__slots__ = ('name', 'age') # 限制类属性
def __str__(self): return 'xxx' # 打印类字符串,给用户看
__repr__(self) # 打印类字符串,给开发者看
__iter__(self) # 返回一个迭代对象
__getitem__(self, n) # 按下标取数据,n可能是int或者slice
if isinstance(n, int): 
if isinstance(n, slice): start = n.start ; stop = n.stop;
__getattr__(self, attr) # 获取属性
__call__(self) # 直接调用自已 s = Student('Michael'); s(); # 实例自己调
# 可以使用callable(s) 来检查是否可以被调用

15. 动态创建类

# 方法一:使用type方法
def fn(self, name='world'): # 先定义函数
    print('Hello, %s.' % name)
Hello = type('Hello', (object,), dict(hello=fn)) # 创建Hello class
# 参数依次为: 类名,继承父类名元组,class的方法名称与函数绑定
# 方法二:先定义metaclass,就可以创建类,最后创建实例
# metaclass是创建类,所以必须从`type`类型派生:
class ListMetaclass(type):
    def __new__(cls, name, bases, attrs):
        attrs['add'] = lambda self, value: self.append(value)
        return type.__new__(cls, name, bases, attrs)
# 指示使用ListMetaclass来定制类,通过ListMetaclass.__new__()来创建类
class MyList(list):
    __metaclass__ = ListMetaclass 

16. 文件读写

with open('d:/test/table.txt', 'r') as f :
	print f.read().decode('gbk')   # 请取并打印文件内容
#或者:
import codecs 
with codecs.open('d:/test/table.txt', 'r', 'gbk') as f:

with open('d:/test/table.txt', 'w') as f:
    f.write('Hello, world!')

17. 目录操作 import os

os.getenv('PATH')
os.path.abspath('.') # 当前绝对路径
os.path.join('/Users/michael', 'testdir') # 合并路径
os.mkdir('/Users/michael/testdir') # 创建目录
os.rmdir('/Users/michael/testdir') # 删除目录
os.path.split('d:/test/table.txt') # 分解路径 >>> ('d:/test', 'table.txt')
os.path.splitext('d:/test/table.txt') # 分解扩展名 >>> ('d:/test/table', '.txt')
os.rename('test.txt', 'test.py') ; os.remove('test.py')
[x for x in os.listdir('.') if os.path.isfile(x) and os.path.splitext(x)[1]=='.py'] # 列出所有的py文件

18. 序列化
cPickle和pickle 用来做序列化

f = open('d:/test/dump.txt', 'wb')
d = dict(name='Bob', age=20, score=88)
pickle.dumps(d, f) # 序列化写到文件
d = pickle.load(f) # 从文件中获取并反序列化

  

19. 对象与JSON相互转化
json.dumps(dict(name='1add'))
把类转成json的话,需要先把类转成dic再转成json

class Student(object): # 类定义
    def __init__(self, name, age, score):
        self.name = name
        self.age = age
        self.score = score
def student2dict(std): # 对象转json规则定义
    return {
        'name': std.name,
        'age': std.age,
        'score': std.score
    }
s = Student('Bob', 20, 88)
print(json.dumps(s, default=student2dict))  # 对象转成json

def dict2student(d): # json转对象规则定义
    return Student(d['name'], d['age'], d['score'])
json_str = '{"age": 20, "score": 88, "name": "Bob"}'
print(json.loads(json_str, object_hook=dict2student)) # json转成对象

  

20. 进程

pid = os.fork()  # 创建子进程  
os.getpid(), os.getppid() # 获取当前PID及父PID
from multiprocessing import Process, Pool # 可以在windows生成进程,进程池
#在Unix/Linux下,可以使用fork()调用实现多进程。 #要实现跨平台的多进程,可以使用multiprocessing模块 #进程间通信是通过Queue、Pipes等实现的 multiprocessing.cpu_count() # 获取cpu个数 # 使用managers模块还可以方便进行分布式开发 from multiprocessing.managers import BaseManager

21. 进程,py是真正的线程

# thread和threading,thread是低级模块,threading是高级模块,对thread进行了封装
# 获取当前线程
threading.current_thread()
# 启动新线程
t = threading.Thread(target=func, name='LoopThread') # 定义线程,target表示线程执行内容
t.start() # 启动线程
t.join()
# 线程同步使用锁
lock = threading.Lock() # 定义锁
lock.acquire() ;   lock.release()  # 获取和释放锁
# 可以使用threadLocal
local_school = threading.local()
# 在Python中,可以使用多线程,同一进程中有GIL锁,多个线程死循环也无法占用所有cpu
# 多个Python进程有各自独立的GIL锁

22. 常用模块

namedtuple('Point', ['x', 'y']) # 可以全名的元组
deque # 双向列表,适合用于队列和栈:
defaultdict # key不存在时返回默认值的dict
OrderedDict # key按插入顺序排序
Counter # 简单计数器
## itertools 中有无限循环迭代器,它们的返回值不是list,而是迭代对象
cs = itertools.cycle('ABC') # 一直a,b,c,a,b...
natuals = itertools.count(2) # 输出从2开始的自然数
ns = itertools.takewhile(lambda x: x <= 10, natuals) # takewhile函数可以从无限自然数中截取合要求的
ns = itertools.repeat('A', 10) # 定义循环10次
for c in chain('ABC', 'XYZ'): # 可以将一组迭代对象合起来形成更大的迭代组
for key, group in itertools.groupby('AAABBBCCAAA'): # 将相邻的重复元素放一起
for x in itertools.imap(lambda x, y: x * y, [10, 20, 30], itertools.count(1)): # 输出10,40,90
ifilter() # 就是filter()的惰性实现


23. base64编码

base64.b64encode/base64.urlsafe_b64encode
base64.b64decode/base64.urlsafe_b64decode

24. 其它
PIL 处理图片,常用的都有
WSGI服务器: wsgiref
最简单的服务器:

from wsgiref.simple_server import make_server

def application(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/html')])
    return '<h1>Hello, web!</h1>'
# 创建一个服务器,IP地址为空,端口是8000,处理函数是application:
httpd = make_server('', 8000, application)
print "Serving HTTP on port 8000..."
# 开始监听HTTP请求:
httpd.serve_forever()

 

25. 协程
yeild提供基本支持
gevent为Python提供了比较完善的协程支持。