1
2
3
4
5
6
7
8
9
10
11
import urllib
import urllib2

url = 'http://ave.bolyartech.com/params.php'
values = {'param1':'2','param2':'3'}
data = urllib.urlencode(values)
print data
req = urllib2.Request(url, data) # Post请求
response = urllib2.urlopen(req)
the_page = response.read() # 读取返回数据
print the_page

交换变量

1
2
3
x = 6
y = 5
x,y = y,x

行内if语句

1
print "Hello" if True else "World"	#  Hello

连接

不同类型的对象连接

1
2
3
4
5
6
7
8
9
10
11
12
13
nfc = ["Packers", "49ers"]
afc = ["Ravens", "Patriots"]
nfc + afc # ['Packers', '49ers', 'Ravens', 'Patriots']
print str(1) + " world"
>>> 1 world

print `1` + " world"
>>> 1 world

print 1, "world"
>>> 1 world
print nfc, 1
>>> ['Packers', '49ers'] 1

数字技巧

1
2
3
4
5.0//2 	#  向下取整 2
2**5 # 2的5次方
.3/.1 # 2.9999999999999996
.3//.1 # 2.0

数值比较

1
2
3
4
5
x = 2
if 3 > x > 1
print x
if 1 < x > 0
print x

同时迭代两个列表

1
2
3
4
nfc = ["Packers", "49ers"]
afc = ["Ravens", "Patriots"]
for teama, teamb in zip(nfc, afc):
print teama + " vs. " + teamb

带索引的列表迭代

1
2
3
teams = ["Packers", "49ers", "Ravens", "Patriots"]
for index, team in enumerate(teams):
print index, team

列表推导式

1
2
numbers = [1,2,3,4,5,6]
even = [number for number in numbers if number%2 == 0] # 取偶数

字典推导

1
2
teams = ["Packers", "49ers", "Ravens", "Patriots"]
print {key: value for value, key in enumerate(teams)}

初始化列表

1
items = [0]*3

列表转换成字符串

1
2
3
teams = ["Packers", "49ers", "Ravens", "Patriots"]
print ", ".join(teams)
>>> 'Packers, 49ers, Ravens, Patriots'

文件读写

Python内置的open()函数可以传入文件名和标示符打开一个文件对象

1
f = open('./test.txt','r')

r表示读,如果文件不存在open()函数会抛出一个IOError错误
如果文件打开成功,调用read()函数可以一次读取文件的全部内容,Python把内容读到内存,用一个str对象表示

1
str = f.read()

因为文件对象会占用系统资源,所以使用完毕需要调用close()函数关闭文件
Python引入with语句帮助我们自动调用close方法

1
2
with open('./file','r') as f:
f.read()

read方法可以read(size)每次最多读取size个字节的内容,调用readline()可以每次读取一行内容,调用readlines()一次读取所有内容并按行返回list

1
2
for line in f.readlines():
print(line.strip()) # 把末尾的`\n`删掉

二进制文件

读取二进制文件比如图片、视频等,用rb模式打开即可:

1
f = open('./test.jpg','rd')

字符编码

读取非ASCALL编码的文本文件,必须以二进制模式打开,再解码,比如GBK编码的文件

1
2
3
f = open('./gbk.txt','rb')
u = f.read().decode('gbk')
print u

写文件

open函数传入标识符W或者wb表示写文件或写二进制文件

1
2
3
f = open('./test.txt','w')
f.write('Hello,world!')
f.close

也可以使用with语句

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

写入特定编码也需要转码

文件操作

要操作文件需要导入Python内置的os模块

1
2
import os
os.name # 操作系统的名字

如果是posix说明系统是LinuxUnix或者Mac OS X,如果是nt就是Windows系统
获取系统详细信息可以调用uname()函数
通过os.environ可以看到系统环境变量的dict
要获取环境变量的某个值可以调用os.getenv()函数

操作文件和目录

  • os.path.abspath(‘.’) # 当前目录的绝对路径
  • os.path.join(‘/User/zoe’,’testDir’) # 合并路径
  • os.path.split(‘/Users/zoe/testDir/file.txt’) # 拆分目录
  • os.path.splitext(‘/path/file.txt’) # 拆分文件扩展名
  • os.mkdir(‘./testdir’) # 创建目录
  • os.rmdir(‘./testdir’) # 删除目录
  • os.rename(‘test.txt’,’test.py’) # 重命名
  • os.remove(‘test.txt’) # 删除文件
    os模块中并没有复制文件可以使用shutil模块提供的copyfile()函数
    1
    2
    3
    4
    #  列出当前目录下的所有子目录
    list1 = [x for x in os.listdir('.') if os.path.isdir(x)]
    # 列出所有py文件
    list2 = [x for x in os.listdir('.') if os.path.isfile(x) and os.path.splitext(x)[1]=='.py']

序列化

Python提供了cPicklepickle两个模块来实现序列化,两个模块功能一致,区别在于cPickle是C语言写的,速度快,pickle是纯Python写的,速度慢,用的时候先尝试导入cPickle,如果失败了,再导入pickle

1
2
3
4
try:
import cPickle as pickle
except ImportError:
import pickle

使用pickle.dumps()方法把任意对象序列化成一个str,然后,把str写入文件
也可以使用pickle.dump()直接把对象序列化写入file

1
2
3
4
5
d = dict(name='Bob',age=20,score=88)
str = pickle.dumps(d)
f = open('dump.txt','wb')
pickle.dump(d,f)
f.close()

反序列化是用pickle.loads()方法通过读取到字符串反序列化出对象,也可以直接用pickle.load()方法从file中直接反序列化出对象

1
2
3
f = open('dump.txt','rb')
d = pickle.load(f)
f.close()

Pickle的缺点很明显,只能用于Python并且可能不同版本的Python批次都不兼容

JSON

JSON表示的对象就是标准的JavaScript语言的对象,JSON和Python内置的数据类型对应如下:

JSON类型 Python类型
{} dict
[] list
“string” str或u”unicode”
1234.56 int或float
true/flase True/False
null None

Python内置的json模块提供了完善的Python对象到JSON格式的转换

1
2
3
import json
d = dict(name='Bob',age=20,score=88)
json.dumps(d) # '{"age": 20, "score": 88, "name": "Bob"}'

同样dump()方法可以直接把JSON写入文件,loads()load()方法可以把反序列化

JSON进阶

对象序列化,需要实现一个转换函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import json
class Stundent(object):
def __init__(self,name,age,score):
self.name = name
self.age = age
self.score = score

s = Stundent('Bob',20,88)

def student2dict(std):
return {
'name':std.name,
'age':std.age,
'score':std.score
}

json.dumps(s,default=student2dict) # 先被student2dict转换成dict在顺利序列化为JSON

通常class实例都有一个__dict__属性,用来存储实例变量,所以也可以这么写:

1
json.dumps(s,default=lambda obj:obj.__dict__)

反序列化时

1
2
3
4
def dict2student(d):
return Student(d['name'],d['age'],d['score'])

json.loads(json_str,object_hook=dict2student)

try错误

1
2
3
4
5
6
7
8
try:
r = 10/0
print r
except ZeroDivisionError,e:
print 'except:',e
finally:
print 'finally'
print 'END'

在某段代码可能会出错时,就可以用try来运行这段代码,如果执行出错,则后续代码不会继续执行,而是直接跳转至错误处理代码,即except语句块,执行完except后,如果有finally语句块,则执行finally语句块,至此执行完毕
如果没有发生错误发生,可以在except语句块后面加一个else,如果没有错误发生时,会自动执行else语句

记录错误

Python内置的logging模块可以非常容易地记录错误信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#  err.py
import logging

def foo(s):
return 10 / int(s)

def bar(s):
return foo(s) * 2

def main():
try:
bar('0')
except StandardError,e:
logging.exception(e)

main()
print 'END'

同样是出错,但程序打印完错误后会继续执行,并正常退出

抛出错误

错误是class,捕获一个错误就是捕获到该class的一个实例,因此,错误不是凭空产生的,而是有意创建抛出的。Python内置函数会抛出很多类型的错误,可以使用raise语句抛出错误

1
2
3
4
5
6
7
8
9
#  err.py
class FooError(StandarError):
pass

def foo(s):
n = int(s)
if n == 0:
raise FooError('invalid value:%s' % s)
return 10/n

断言

1
2
3
4
5
6
7
8
#  err.py
def foo(s):
n = int(s)
assert n != 0,'n is zero!'
return 10 / n

def main():
foo('0')

assert的意思是,表达式n != 0应该是True,否则,后面的代码就会出错(AssertionError)
Python解释器可以用-0参数来关闭assert

logging

1
2
3
4
5
6
7
#  err.py
import logging

s = '0'
n = int(s)
logging.info('n = %d' % n)
print 10 / n

logging.info()可以输出一段文本,可以使用logging.basicConfig(level=logging.INFO)指定记录信息的级别,有debuginfowarningerror,当指定level=INFO时,其他级别都不起作用,其他同理。

pdb

调试器,可以让程序以单步方式运行,可以随时查看运行状态

1
2
3
4
#  err.py
s = '0'
n = int(s)
print 10 / n

然后启动
$ python -m pdb err.py
以参数-m pdb启动后,pdb定位到下一步要执行的代码-> s = '0'输入命令l查看运行代码
输入n可以单步指定代码
也可以输入p 变量名来查看变量
输入q结束调试,退出程序

pdb.set_trace()

只需要import pdb然后在可能出错的地方放一个pdb.set_trace()就可以设置一个断点

1
2
3
4
5
6
7
#  err.py
import pdb

s = '0'
n = int(s)
pdb.set_trace()
print 10 / n

运行代码,程序自动在pdb.set_trace()暂停并进入pdb调试环境,可以用c继续运行

如果函数中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator。而变成generator的函数在每次调用next()的时候执行遇到yield语句返回,再次执行时从上一次返回的yield语句继续执行

1
2
3
4
5
def fib(max):
a,b,c = 0,1,0
while c < max:
yield b
a,b,c = b,a+b,c+1

>>> o = fib(1000)
>>> o.next()
1
>>> o.next()
1
>>> o.next()
2
>>> o.next()
3
>>> o.next()

Shell是一个程序,它接收从键盘输入的命令,然后把命令传递给操作系统去执行,几乎所有的Linux发行版都提供了一个名为bash的程序,bash是Shell的一种,是Bourne Again Shell的缩写,是Shell的增强版。

Read More