常用内建模块

1:collections模块:集合模块,提供了许多有用的集合类。

namedtuple

namedtuple是一个函数,它用来创建一个自定义的tuple对象,并且规定了tuple元素的个数,并可以用属性而不是索引来引用tuple的某个元素。

这样一来,我们用namedtuple可以很方便地定义一种数据类型,它具备tuple的不变性,又可以根据属性来引用,使用十分方便。

  1. >>> from collections import namedtuple
  2. >>> Point = namedtuple('Point', ['x', 'y'])
  3. >>> p = Point(1, 2)
  4. >>> p.x
  5. 1
  6. >>> p.y
  7. 2

deque:为了高效实现插入和删除操作的双向列表,适合用于队列和栈。

deque除了实现list的append()pop()外,还支持appendleft()popleft(),这样就可以非常高效地往头部添加或删除元素。

  1. >>> from collections import deque
  2. >>> q = deque(['a', 'b', 'c'])
  3. >>> q.append('x')
  4. >>> q.appendleft('y')

defaultdict:使用dict时,如果引用的Key不存在,就会抛出KeyError。如果希望key不存在时,返回一个默认值,就可以用defaultdict

  1. dd = defaultdict(lambda: 'N/A')
  2. dd['key2'] # key2不存在,返回默认值 'N/A'

OrderedDict:保持Key的顺序,OrderedDict的Key会按照插入的顺序排列,不是Key本身排序。

  1. od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
  2. >>> od # OrderedDict的Key是有序的
  3. OrderedDict([('a', 1), ('b', 2), ('c', 3)])

Counter:一个简单的计数器。

统计字符出现的个数:

  1. >>> from collections import Counter
  2. >>> c = Counter()
  3. >>> for ch in 'programming':
  4. ... c[ch] = c[ch] + 1

2:hashlib

Python的hashlib提供了常见的摘要(散列)算法,如MD5,SHA1等等。

它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。

md5使用:

  1. import hashlib
  2.  
  3. md5 = hashlib.md5()//创建md5实例
  4. md5.update('how to use md5 in python hashlib?')//使用md5对字符串加密
  5. print md5.hexdigest()//得到md5加密后的字符串

sha1使用:

  1. import hashlib
  2.  
  3. sha1 = hashlib.sha1()//创建sha1实例
  4. sha1.update('how to use sha1 in ')//加密
  5. print sha1.hexdigest()//获取加密后字符串

摘要算法的正确使用:使用唯一性内容+需要加密的内容+混淆性内容 作为数据库存储的内容。

通过对原始口令加一个复杂字符串,俗称“加盐”。但是如果加密内容一致,加盐又一致,则会出现相同的存储内容。所以在此基础上再加上唯一性的内容,比如用户名。

  1. db[username] = get_md5(password + username + 'the-Salt')

3:itertools

Python的内建模块itertools提供了非常有用的用于操作迭代对象的函数。

几个“无限”迭代器:

count(n)会创建一个无限的迭代器,从n开始一直迭代下去,永不停止。

cycle(str)会把传入的一个序列无限重复迭代下去。

repeat(char,num)负责把一个元素无限重复下去,不过如果提供第二个参数就可以限定重复次数

无限序列虽然可以无限迭代下去,但是通常我们会通过takewhile()等函数根据条件判断来截取出一个有限的序列:

  1. >>> natuals = itertools.count(1)//创建一个无限迭代器
  2.  
  3. >>> ns = itertools.takewhile(lambda x: x <= 10, natuals)//遍历无限迭代器的内容,从中提取符合lambda表达式的内容

操作迭代器的几个函数:

chain()可以把一组迭代对象串联起来,形成一个更大的迭代器:

  1. for c in itertools.chain('ABC', 'XYZ'):
  2. print c
  3. # 迭代效果:'A' 'B' 'C' 'X' 'Y' 'Z'

groupby()把迭代器中相邻的重复元素挑出来放在一起。

imap()可以作用于无穷序列,并且,如果两个序列的长度不一致,以短的那个为准。当你调用imap()时,并没有进行任何计算,必须用for循环对r进行迭代,才会在每次循环过程中计算出下一个元素。

同理,ifilter()就是filter()的惰性实现。

4:XML操作模块

操作XML有两种方法:DOM和SAX。DOM会把整个XML读入内存,解析为树,因此占用内存大,解析慢,优点是可以任意遍历树的节点。SAX是流模式,边读边解析,占用内存小,解析快,缺点是我们需要自己处理事件。

正常情况下,优先考虑SAX,因为DOM实在太占内存。

在Python中使用SAX解析XML非常简洁,通常我们关心的事件是start_elementend_elementchar_data,准备好这3个函数,然后就可以解析xml了。

  1. from xml.parsers.expat import ParserCreate
  2.  
  3. #定义三个事件
  4. class DefaultSaxHandler(object):
  5. def start_element(self, name, attrs):
  6. print('sax:start_element: %s, attrs: %s' % (name, str(attrs)))
  7.  
  8. def end_element(self, name):
  9. print('sax:end_element: %s' % name)
  10.  
  11. def char_data(self, text):
  12. print('sax:char_data: %s' % text)
  13.  
  14. xml = r'''<?xml version="1.0"?>
  15. <ol>
  16. <li><a href="/python">Python</a></li>
  17. <li><a href="/ruby">Ruby</a></li>
  18. </ol>
  19. '''
  20.  
  21. handler = DefaultSaxHandler()
  22. parser = ParserCreate()
  23. parser.returns_unicode = True
  24. parser.StartElementHandler = handler.start_element
  25. parser.EndElementHandler = handler.end_element
  26. parser.CharacterDataHandler = handler.char_data
  27. parser.Parse(xml)

如何生成XML呢?最简单也是最有效的生成XML的方法是拼接字符串:

  1. L = []
  2. L.append(r'<?xml version="1.0"?>')
  3. L.append(r'<root>')
  4. L.append(encode('some & data'))
  5. L.append(r'</root>')
  6. return ''.join(L)

5:HTMLParser

如何解析HTML呢?

  1. from HTMLParser import HTMLParser
  2. from htmlentitydefs import name2codepoint
  3.  
  4. class MyHTMLParser(HTMLParser):
  5.  
  6. def handle_starttag(self, tag, attrs):
  7. print('<%s>' % tag)
  8.  
  9. def handle_endtag(self, tag):
  10. print('</%s>' % tag)
  11.  
  12. def handle_startendtag(self, tag, attrs):
  13. print('<%s/>' % tag)
  14.  
  15. def handle_data(self, data):
  16. print('data')
  17.  
  18. def handle_comment(self, data):
  19. print('<!-- -->')
  20.  
  21. def handle_entityref(self, name):
  22. print('&%s;' % name)
  23.  
  24. def handle_charref(self, name):
  25. print('&#%s;' % name)

6:强大的第三方图形处理模块——PIL


首先,要安装PIL。

然后,就行import相关模块,调用模块内的函数进行图形处理了。

网络编程

TCP/IP——Socket通信

1:客户端通信

  1. # 导入socket库:
  2. import socket
  3. # 创建一个socket:
  4. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  5. # 建立连接:
  6. s.connect(('域名', 端口))
  7.  
  8. #发送数据
  1. s.send('内容')
  1. # 每次最多接收1k字节:
    d = s.recv(1024)
  1. # 关闭连接:
  2. s.close()
  1.  

创建Socket时,AF_INET指定使用IPv4协议,如果要用更先进的IPv6,就指定为AF_INET6SOCK_STREAM指定使用面向流的TCP协议。

2:服务端通信

  1. #首先,创建一个基于IPv4和TCP协议的Socket:
  2. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  3. #然后绑定监听的地址和端口
  4. # 监听端口:
  5. s.bind(('IP地址',端口))
  6. #调用listen()方法开始监听端口,传入最大监听数
  7. s.listen(5)
  8. #通过一个永久循环来接受来自客户端的连接,accept()会等待并返回一个客户端的连接
  9.  
  10. while True:
  11. # 接受一个新连接:
  12. sock, addr = s.accept() #accept方法返回一个含有两个元素的元组(connection,address)
  13. # 创建新线程来处理TCP连接:
  14. t = threading.Thread(target=任务函数, args=(sock, addr))
  15. t.start()
  16.  
  17. data = sock.recv(1024)#接收内容
  18. sock.send('Hello, %s!' % data)#发回内容
  19. sock.close() #关闭socket

UDP编程

使用UDP协议时,不需要建立连接,只需要知道对方的IP地址和端口号,就可以直接发数据包。

服务端

  1. #创建服务端socket
  2. s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)#SOCK_DGRAM指定了这个Socket的类型是UDP
  3. # 绑定端口:
  4. s.bind(('127.0.0.1', 9999))
  5.  
  6. #无需监听端口,直接接收来自任何客户端的数据
  7. while True:
  8. # 接收数据:recvfrom()方法返回数据和客户端的地址与端口,这样,服务器收到数据后,直接调用sendto()就可以把数据用UDP发给客户端。
  9. data, addr = s.recvfrom(1024)
  10. print 'Received from %s:%s.' % addr
  11. s.sendto('Hello, %s!' % data, addr)

客户端

不需要调用connect(),直接通过sendto()给服务器发数据。

  1. #创建socket
  2. s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  3. for data in ['Michael', 'Tracy', 'Sarah']
  4. # 发送数据
  5. s.sendto(data, ('服务器IP',端口))
  6. # 接收数据
  7. print s.recv(1024)
  8. s.close()

数据库

操作Mysql:

  1. # 导入MySQL驱动
  2. >>> import mysql.connector
  3. >>> conn = mysql.connector.connect(user='数据库账户', password='密码', database='数据库名', use_unicode=True)
  4. >>> cursor = conn.cursor()//创建一个游标
  5. # 创建user表
  6. >>> cursor.execute('create table user (id varchar(20) primary key, name varchar(20))')//执行SQL语句
  7. # 插入一行记录,注意MySQL的占位符是%s:
  8. >>> cursor.execute('insert into user (id, name) values (%s, %s)', ['', 'Michael'])
  9. >>> cursor.rowcount //获取语句执行结果
  10. 1
  11. # 提交事务:
  12. >>> conn.commit()
  13. >>> cursor.close()
  14. # 运行查询:
  15. >>> cursor = conn.cursor()
  16. >>> cursor.execute('select * from user where id = %s', ('',))
  17. >>> values = cursor.fetchall()//查询所有
  18. >>> values
  19. [(u'', u'Michael')]
  20. # 关闭Cursor和Connection:
  21. >>> cursor.close()
  22. True
  23. >>> conn.close()

Python中的ORM框架:SQLAlchemy

  1. # 导入:
  2. from sqlalchemy import Column, String, create_engine
  3. from sqlalchemy.orm import sessionmaker
  4. from sqlalchemy.ext.declarative import declarative_base
  5.  
  6. # 创建对象的基类:
  7. Base = declarative_base()
  8.  
  9. # 定义User对象:
  10. class User(Base):
  11. # 表的名字:
  12. __tablename__ = 'user'
  13.  
  14. # 表的结构:
  15. id = Column(String(20), primary_key=True)
  16. name = Column(String(20))
  17.  
  18. # 初始化数据库连接:
  19. engine = create_engine('mysql+mysqlconnector://root:password@localhost:3306/test')
  20. # 创建DBSession类型:
  21. DBSession = sessionmaker(bind=engine)
  22.  
  23. # 创建session对象:
  24. session = DBSession()
  25. # 创建新User对象:
  26. new_user = User(id='', name='Bob')
  27. # 添加到session:
  28. session.add(new_user)
  29. # 提交即保存到数据库:
  30. session.commit()
  31. # 关闭session:
  32. session.close()
  33.  
  34. # 创建Session:
  35. session = DBSession()
  36. # 创建Query查询,filter是where条件,最后调用one()返回唯一行,如果调用all()则返回所有行:
  37. user = session.query(User).filter(User.id=='').one()
  38. # 打印类型和对象的name属性:
  39. print 'type:', type(user)
  40. print 'name:', user.name
  41. # 关闭Session:
  42. session.close()

Web开发

PythonWeb提供了一套接口:WSGI:Web Server Gateway Interface。它只要求Web开发者实现一个函数,就可以响应HTTP请求。

函数接收两个参数:

  • environ:一个包含所有HTTP请求信息的dict对象;

  • start_response:一个发送HTTP响应的函数。start_response()函数接收两个参数,一个是HTTP响应码,一个是一组list表示的HTTP Header,每个Header用一个包含两个strtuple表示。

使用web框架

除了Flask,常见的Python Web框架还有:

  • Django:全能型Web框架;

  • web.py:一个小巧的Web框架;

  • Bottle:和Flask类似的Web框架;

  • Tornado:Facebook的开源异步Web框架

Python学习摘录(下)的更多相关文章

  1. 《转》python学习--基础下

    转自http://www.cnblogs.com/BeginMan/archive/2013/04/12/3016323.html 一.数字 在看<Python 核心编程>的时候,我就有点 ...

  2. Python学习---Django下的Sql性能的测试

    安装django-debug-tools Python学习---django-debug-tools安装 性能测试: settings.py INSTALLED_APPS = [ ... 'app01 ...

  3. Python学习---django下的cookie操作 180201

    什么是Cookies 什么是Cookies cookies设置的原因: 1. http请求的无记忆性: 2.加快访问速度  3. 减少服务器压力 cookies特点: cookies保存在客户端浏览器 ...

  4. python学习--Linux下dlib安装(主要是cmake和boost的安装)

    昨天我们使用了dlib和opencv进行了人脸检测标注(http://www.cnblogs.com/take-fetter/p/8310298.html) 但是运行环境是基于windows的而且可能 ...

  5. Python学习摘录(上)

    1:接收输入 var=raw_input() 注意:raw_input()总数接收字符串形式的输入.所以,如果我们想接收其他类型的数据,则需要强制类型转换.(如果转换失败,就会抛出异常) 2:pass ...

  6. python学习:Windows 下 Python easy_install 的安装

    Windows 下 Python easy_install 的安装     下载安装python安装工具下载地址:http://pypi.python.org/pypi/setuptools 可以找到 ...

  7. Python学习---django下的Session操作 180205

    和Cookie一样,都是用来进行用户认证.不同的是,Cookie可以吧明文/密文的信息都会KV返回给客户段,但是session可以吧用户的Value[敏感信息]保存在服务器端,安全. Django中默 ...

  8. Python学习基础笔记(全)

    换博客了,还是csdn好一些. Python学习基础笔记 1.Python学习-linux下Python3的安装 2.Python学习-数据类型.运算符.条件语句 3.Python学习-循环语句 4. ...

  9. Python学习---Python下[元组]的学习

    元组是不可变的, 用小括号()定义,而且一旦定义 ,不可变[类型是tuple] [元组看做一个整体,不可拆分,不可赋值,但可以全部重新赋值] 通过圆括号,用逗号分隔,常用在使语句或用户定义的函数能够安 ...

随机推荐

  1. 利用ViewStub来延迟加载视图

    很多情况下,我们的视图可能会随着用户的操作的不同而变化,比如一个新的页面包含多个控件,但仅仅在用户点击这个按钮后,所有的控件才能完全显示.也就是说一上来可能就显示一个控件,点击按钮后把其他隐藏的控件再 ...

  2. 如何选择JAVA培训机构,兼议什么样的人适合培训机构

    首先,利益相关,本人就是培训机构创办者兼讲师,但这不妨碍我对此发表看法. 我们先来看什么样的人适合培训机构?要回答这个问题,需要先换个角度.这个角度就是,你学习一门语言的动机是什么?99%的人的回答是 ...

  3. SVG渲染顺序及z轴显示问题(zIndex)

    SVG是严格按照定义元素的顺序来渲染的,这个与HTML靠z-index值来控制分层不一样. 在SVG中,写在前面的元素先被渲染,写在后面的元素后被渲染.后渲染的元素会覆盖前面的元素,虽然有时候受透明度 ...

  4. Java命令学习系列(四)——jstat

    jstat(JVM Statistics Monitoring Tool)是用于监控虚拟机各种运行状态信息的命令行工具.他可以显示本地或远程虚拟机进程中的类装载.内存.垃圾收集.JIT编译等运行数据, ...

  5. [转]CENTOS LINUX安装并使用NFS共享文件

    FROM :http://www.qiansw.com/centos-linux-nfs.html NFS是linux常用的一种文件分享工具. 下面介绍安装及使用方法. CentOS 5.5 yum ...

  6. Guava CaseFormat

    概述 CaseFormat用来转换各种不同的编程语言间的变量名命名格式, 主要用到的方法只有一个 CaseFormat.to(CaseFormat from, String s) CaseFormat ...

  7. 【已解决】Android微信开放平台,申请移动应用的 应用签名 如何获取

    在微信开放平台,申请移动应用的时候: https://open.weixin.qq.com/cgi-bin/appcreate?t=manage/createMobile&type=app&a ...

  8. vim粘贴代码的时候,恶心的缩进.

    vim粘贴代码 如果有注释,那么粘贴后就惨不忍睹,类似于: 我粘贴代码到a.cpp,内容为: //打印函数 ) { ;i<length;i++){ ){ printf("0x &quo ...

  9. Pitch,Yaw,Roll的概念

    在航空中,pitch, yaw, roll下图所示. pitch是围绕X轴旋转,也叫做俯仰角. yaw是围绕Y轴旋转,也叫偏航角. roll是围绕Z轴旋转,也叫翻滚角.     在3D系统中,假设视点 ...

  10. @Autowired用法详解

    @Autowired 注释,它可以对类成员变量.方法及构造函数进行标注,完成自动装配的工作. 通过 @Autowired的使用来消除 set ,get方法.在使用@Autowired之前,我们对一个b ...