《Python基础教程》笔记
Python具有丰富和强大的库
数学运算 1 2 3 4 5 6 7 8 9 10 11 12 2 **3 pow (2 , 3 ) abs (-10 ) round (1.0 / 2.0 ) import mathmath.floor(32.9 ) from math import floorfloor(32.9 )
变量 1 2 3 x = 3 print ("Hello World!" )x = input ("prompt:" )
转换为字符串 str 类型
repr 函数
拼接字符串 1 2 3 4 5 6 "Hello " + "World!" temp = 100 s = "Hello" + str (temp) print ("Hello, \ World" )
长字符串 保留换行,和特殊字符比如’”:
1 2 """ string """ ''' string '''
原始字符串:
Unicode字符串:
基本类型 str int long
序列 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 a1 = ['Hello' , 100 ] str = 'Hello' str [0 ] str [-1 ] a1 = [1 , 2 , 3 , 4 , 5 ] a1[0 :3 ] a1[0 :] a1[:] a2[0 :3 :1 ] [1 ,2 ,3 ] + [4 ,5 ,6 ] 'Hello ' + 'World' 'python' * 4 [] [None ] * 10 permissions = 'rw' 'w' in permissions min (2 ,4 ,6 )x = [1 , 1 , 1 ] x[1 ] = 2 names = ['Alice' , 'Beth' , 'Cecil' ] del names[2 ]names[1 :] = ['a' , 'b' ] list ('Hello' ) names.append('Hello' ) names.count('Alice' ) a.extend(b) a.index('who' ) a.insert(index, value) a.pop(index) a.remove(value) a.reverse() a.sort() sorted (a) cmp(100 , 200 )
元组 元组不能修改
1 2 3 4 5 6 7 8 9 10 1 ,2 ,3 (1 ,2 ,3 ) () (42 ,) tuple ([1 ,2 ,3 ]) tuple ('abc' ) tuple ((1 ,2 ,3 ))
字符串方法 1 2 3 4 5 6 7 "With a moo-moo here, and a moo-moo there." .find('moo' )title = "Monty python" title.find('Monty' ) table = maketrans('ABC' , 'abc' ) word = 'ABC' word.translate(table)
字典 字典是引用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 phonebook = {'Alice' :'2341' , 'Beth' :'9120} # 空字典 {} # dict 类型 items = [(' name',' Gumby'), (' age',42)] d = dict(items) d = dict(name=' Gumby', age=42) # 基本字典操作 len(d) d[k] d[k] = v del d[k] k in d
导入模块 几种导入方式:
1 2 3 4 5 6 7 8 9 10 11 import modulemodule.function() from module import functionfunction() import math as foobarfoobar.sqrt(100 ) from math import sqrt as foobarfoobar(100 )
比较运算符
== 值相等 可以比较序列的值
is 引用相等 (避免用于比较类似数值和字符串这类不可变值)
逻辑运算符 and or not
三元运算符 类似c++中的?:
1 2 a = b and c or d c if b else d
循环 1 2 3 4 5 6 7 8 9 10 11 12 x=1 while x<=100 : print x x+=1 words=['this' ,'is' ,'an' ,'ex' ,'parrot' ] for word in words: print word range (0 , 10 )
zip 函数 1 2 3 4 5 6 7 8 names = ['anne' , 'beth' , 'george' , 'damon' ] ages = [12 , 45 , 32 , 102 ] zip (names, ages)for index, string in enumerate (strings): if 'xxx' in string: strings[index] = '[censored]'
函数 reversed sorted
循环的else子句 没有调用break时执行
1 2 3 4 5 6 7 for n in range (99 , 81 , -1 ) root = sqrt(n) if root == int (root): print n break else : print "Didn't find it!"
列表推导式 1 2 [x*x for x in range (10 )]
pass 语句 什么都不做的语句
删除名称 1 2 x = ["Hello" , "World] del x
执行字符串中的 Python 代码 1 exec ("print('Hello, world!')" )
命名空间 1 2 3 4 5 from math import sqrtscope = {} exec 'sqrt = 1' in scopesqrt(4 ) scope['sqrt' ]
eval eval 计算表达式值
函数是否可调用 1 2 callable (x)hasattr (func, __call__)
定义函数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 def hello (name ): return 'Hello. ' + name + '!' def 语句后面、模块或者类的开头``` python def square (x ): 'Calculates the square of the number x.' return x * x square.__doc__ help (square)def func (greeting, name ): print '%s, %s' % (greeting, name) func(greeting='Hello' , name='world' ) def func (greeting='Hello' , name='world' ): pass def func (*params ): print params func(1 , 2 , 3 )
vars() 返回当前作用域字典
globals() 返回全局作用域字典
locals()
给全局变量赋值 1 2 3 4 x = 1 def func (): global x x = x + 1
其他 支持闭包
lambda 数学中表示匿名函数
一切用递归实现的功能都可以用循环实现,但有时递归更易读。
递归的一个局限,有耗尽栈空间的风险。
1 2 3 4 5 map (func, seq) filter (func, seq) isinstance (object , tuple )isinstance (object , dict )
type
isinstance
issubclass
为变量随机赋值 1 2 from random import choicex = choice(['Hello, world!' , [1 ,2 ,'e' ,'e' ,4 ]])
repr函数 输出变量文本表示
1 2 x = 'Fnord' print repr (x)
创建类 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 __metaclass__ = type class Person : def setName (self, name ): self.name = name def getName (self ): return self.name def greet (self ): print "Hello, world! i'm %s." % self.name foo = Person() foo.setName('Hello' ) foo.greet() Person.setName(foo, 'Hello' )
私有实现方式:
前面加__,但仍然可以访问,s._类名__函数名()
指定超类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 class Filter :class SPAMFilter (Filter ):issubclass (SPAMFilter, Filter) SPAMFilter.__bases__ s.__class__ type (s) hasattr (tc, 'talk' )callable (getattr (tc, 'talk' , None ))hasattr (x, '__call__' )
术语 特性 - 成员变量
方法 - 成员函数
异常处理 异常类 从Exception继承
引发异常 raise Exception 会自动创建实例
1 raise Exception('hyperdrive overload' )
内建异常 exceptions模块
dir函数 列出模块的内容
1 2 import exceptionsdir (exceptions)
最重要的内建异常类:146页
捕获异常:
1 2 3 4 5 6 7 8 9 10 11 try : x = 12 y = 0 print x / y except ZeroDivisionError: print "The second number can't be zero!" except TypeError: print "That wasn't a number, was it?" // 多个异常作为元组列出 except (ZeroDivisionError, TypeError, NameError): print 'Your number were bogus...'
重新抛出捕获的异常:
获得异常实例:
1 2 3 4 5 except (ZeroDivisionError, TypeError), e: print e except (ZeroDivisionError, TypeError) as e:
捕获所有异常:
1 2 3 4 5 6 except : print 'Something wrong happened...' else : pass finally : pass
特殊方法 future
两边带下划线的被称为魔法或特殊方法
实现这些方法,这些方法会在特殊情况下被Python调用
构造函数 1 2 def __init__ (self ): self.somevar = 42
析构函数:
del
因为有垃圾回收机制,所以避免使用__del__
调用父类的构造函数:
1 2 3 4 5 6 7 8 9 10 11 class SongBird (Bird ): def __init__ (self ): Bird.__init__(self) self.sound = 'Squawk!' class SongBird (Bird ): def __init__ (self ): super (SongBird, self).__init__() self.sound = 'Squawk!'
静态方法和类成员方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 def smeth (): pass smeth = staticmethod (smeth) def cmeth (): pass cmeth = classmethod (cmeth) @staticmethod def smeth (): pass @classmethod def cmeth (cls ): pass MyClass.smeth() MyClass.cmeth()
可迭代 一个实现了__iter__方法的对象是可迭代的,一个实现了next方法的对象则是迭代器。
内建函数iter可以从可迭代的对象中获得迭代器:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 it = iter ([1 ,2 ,3 ]) it.next () it.next () ti = TestIterator() list (ti) 任何包含yield 语句的函数称为生成器。 生成器是逐渐产生结果的复杂递归算法的理想实现工具。 ``` python nested = [[1 , 2 ], [3 , 4 ], [5 ]] def flatten (nested ): for sublist in nested: for element in sublist: yield element for num in flatten(nested): print num
充电时刻 1 2 3 import syssys.path.append('c:/python' )
.py .pyw (windows系统)
.pyc 平台无关的,经过处理(编译)的,已经转换成Python能够更加有效地处理的文件。
导入模块的时候,其中的代码被执行。重复导入,不会重复执行。
.py 文件导入后文件名就是模块名作用域
主程序 name -> ‘main ‘
import name -> ‘模块名 ‘
模块中的测试代码可以使用__name__判断是否执行测试代码。
pprint模块中pprint函数 提供更加智能的打印输出,比如列表分行输出。
sys.path
PYTHONPATH 环境变量
包 - 目录,目录中包含__init__.py文件
查看模块包含的内容可以使用dir函数,他会将对象(以及模块的所有函数、类、变量等)的所有特性列出
1 2 3 4 5 6 7 8 9 dir (sys) from copy import *copy.__all__ help (copy.copy) print copy.copy.__doc__print copy.__file__
标准库
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 -sys argv exit([arg]) modules path platform stdin stdout stderr -os environ system(command) sep pathsep linesep urandom(n) webbrowser模块 -fileinput input filename() lineno() filelineno() isfirstline() isstdin() nextfile() close() -collections -heapq #堆 -time -random -shelve #序列化 保存到文件 -re #正则表达式
open 默认读模式
参数可以用到其他任何模式中,指明读和写都是允许的。比如r+能在打开一个文件用来读写时使用。
r 读模式
w 写模式
a 追加模式
b 二进制模式 (可添加到其他模式中使用)
rb 读取二进制文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 f = open (r'c:\file.txt' , 'w' ) f.write('0112345' ) f.seek(5 ) f.close() f.read() file.readline() file.readlines() try :finally : file.close() with open ("somefile.txt" ) as somefile:
with 上下文管理 enter exit contextlib模块
当到达文件末尾时,read方法返回一个空的字符串。
1 2 3 import fileinputfor line in fileinput.input (filename): pass
数据库
Python DB API的模块特性
apilevel 所使用的Python DB API版本
threadsafety 模块的线程安全等级
paramstyle 在SQL查询中使用的参数风格
1 2 3 4 5 import sqlite3conn = sqlite3.connect('somedatabase.db' ) curs = conn.cursor() conn.commit() conn.close()
socket模块
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 import sockets = socket.socket() host = socket.gethostname() port = 1234 s.bind((host, port)) s.listen(5 ) while True : c.addr = s.accept() print 'Got connection from' , addr c.send('Thank you for connecting' ) c.close() import sockets = socket.socket() host = socket.gethostname() port = 1234 s.connect((host, port)) print s.recv(1024 )
urllib urllib2模块
能让通过网络访问文件,就像那些文件存在于你的电脑上一样。通过一个简单的函数调用,几乎可以把任何URL所指向的东西用作程序的输入。
如果需要使用HTTP验证或cookie或者要为自己的协议写扩展程序的话,urllib2是个好的选择。
标准库中一些与网络相关的模块
服务器框架
SocketServer
BaseHTTPServer
SimpleHTTPServer
CGIHTTPServer
SimpleXMLRPCServer
DocXMLRPCServer
基于SocketServer的服务器
1 2 3 4 5 6 7 8 9 from SocketServer import TCPServer, StreamRequestHandlerclass Handler (StreamRequestHandler ): def handle (self ): addr = self.request.getpeername() print 'Got connection from' , addr self.wfile.write('Thank you for connection' ) server = TCPServer(('' , 1234 ), Handler) server.serve_forever()
Twisted 一个非常强大的异步网络编程框架
1 2 3 4 5 6 7 8 9 10 import fileinputfor line in fileinput.input (filename): process(line) inplace=1 import fileinputfor line in fileinput.input (inplace = 1 ): line = line.rstrip() num = fileinput.lineno() print '%-40s # %2i' % (line, num)
文件是一个可迭代对象
1 2 3 4 5 6 7 8 f = open (filename) for line in f: process(line) f.close() import webbrowserwebbrowser.open ('www.baidu.com' )
集合 set
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 set([0, 1, 2, 3]) set会剔除重复元素 set的元素顺序是随意的 a = set([1, 2, 3]) b = set([2, 3, 4]) 并集 a.union(b) a | b 交集 a.intersection(b) b & b a.issuperset(b) a.issubset() a.difference(b) a - b a.symmetric_difference(b) a ^ b a.copy() reduce(func, [a, b, c]) reduce执行以下步骤 tmp = func(a, b) tmp = func(tmp, c)
time 模块
time() 当前时间 - 1970至今的秒数
localtime() 将秒数转换为日期元组,本地时间
asctime() 将日期元组转换为字符串
mktime() 将日期元组转换为本地时间(秒数) 与localtime()功能相反
sleep()
datetime 模块
支持日期和时间的算法
timeit 模块
帮助开发人员对代码段的执行时间进行计时
random 模块
random() 0<= n < 1
randrange([start], stop, [step]) [start, stop) 随机整数
uniform(a, b) [a, b] 随机实数
choice() 从给定序列中选择随机元素
shuffle() 将给定(可变)序列的元素进行随机移位
sample() 从给定序列中 选择给定数目的元素,同时确保元素互不相同
re 正则表达式模块
compile(pattern, [flags]) 根据包含正则表达式的字符串创建模式对象
search(pattern, string, [flags]) 在字符串中寻找模式,返回第一个匹配的MatchObject
match(pattern, string, [flags]) 在字符串的开始处匹配模式,返回MatchObject
split(pattern, string, [maxsplit=0]) 根据模式的匹配项来分割字符串,返回列表
findall(pattern, string) 列出字符串中模式的所有匹配项,返回列表
sub(pat, repl, string, [count=0])将字符串中所有pat匹配项用repl替换
escape(string) 将字符串中所有特殊正则表达式字符转义
1 2 pattern = ... re.sub(pattern, r'<em>\1</em>' , 'Hello, *world*!' )
\1 引用模式匹配中的组
模式匹配默认是贪婪模式
所有的重复运算符都可以通过在其后面加上一个问号变成非贪婪版本
string模块中的模板系统 template类
functools 通过部分参数来使用某个函数,稍后再为剩下的参数提供数值
difflib 这个库让你可以计算两个序列的相似程度,还能让你在一些序列中找出和提供的原始序列最像的那个。
可以用于创建简单的搜索程序
hashlib 如果为两个不同的字符串计算出了签名。几乎可以确保这两个签名完全不同。
加密和安全性 见 md5 sha 模块
csv 读写csv文件
timeit profile trace
itertools
logging
getopt optparse
cmd
项目3 万能的XML
1 2 3 4 5 6 7 8 9 10 11 12 13 from xml.sax.handler import ContentHandlerfrom xml.sax import parseclass MyHandler (ContentHandler ):parse('website.xml' , MyHandler) str .capitalize()getattr ()callable ()os.makedirs('foo/bar/baz' ) os.path.isdir() a = ['hello' ] *a + ['boys' ] -> * (a + ['boys' ])
项目4 新闻聚合
nntplib
NNTP(Network News Transfer Protocal,网络新闻组传输协议)
urllib
strftime(‘%y%m%d’) # 年月日
strftime(‘%H%M%S’) # 时分秒
1 2 3 4 5 6 7 8 9 10 11 servername = 'news.foo.bar' group = 'comp.lang.python.announce' server = NNTP(servername) ids = server.newnews(group, date, hour)[1 ] head = server.head(id )[3 ] for line in head: if line.lower().startswith('subject:' ): subject = line[9 :] break body = server.body(id )[3 ]
打印完所有文章后 调用server.quit()
list.extend(list)
list.append(object)
BBC新闻网页的HTML页面布局可能会变,如果这样的话就需要重写正则表达式。
在使用其他页面的时候也要注意这样的情况。要查看HTML源代码然后试着去找到适用的匹配模式。
1 2 3 4 5 6 7 8 9 file str unicode zlib gzip bz2 zipfile tarfile shutil