Python essentials
李金的中文Python笔记[https://github.com/lijin-thu/notes-python]的学习笔记及摘要。
SCIentific PYthon 简介
Ipython
提供了一个很好的解释器界面。
Matplotlib
提供了一个类似 Matlab
的画图工具。
Numpy
提供了 ndarray
对象,可以进行快速的向量化计算。
Scipy
是 Python
中进行科学计算的一个第三方库,以 Numpy
为基础。
Pandas
是处理时间序列数据的第三方库,提供一个类似 R
语言的环境。
StatsModels
是一个统计库,着重于统计模型。
Scikits
以 Scipy
为基础,提供如 scikits-learn
机器学习和**scikits-image
图像处理**等高级用法。
分片
-
分片用来从序列中提取出想要的子序列,其用法为:
var[lower:upper:step]
其范围包括lower
,但不包括upper
,即[lower, upper)
,step
表示取值间隔大小,如果没有默认为1
。 -
当step的值为负时,省略lower意味着从结尾开始分片,省略upper意味着一直分片到开头。
s = "hello world"
s[::-1]
> 'dlrow olleh'
列表
向列表添加单个元素
l.append(ob)
将元素 ob
添加到列表 l
的最后。
a = [10, 11, 12]
a.append(11)
向列表添加序列
l.extend(lst)
将序列 lst
的元素依次添加到列表 l
的最后,作用相当于 l += lst
。
a = [10, 11, 12, 11]
a.extend([1, 2])
排序
l.sort()
会将列表中的元素按照一定的规则排序:
a = [10, 1, 11, 13, 11, 2]
a.sort()
print a
> [1, 2, 10, 11, 11, 13]
如果不想改变原来列表中的值,可以使用 sorted
函数:
a = [10, 1, 11, 13, 11, 2]
b = sorted(a)
print a
print b
> [10, 1, 11, 13, 11, 2]
> [1, 2, 10, 11, 11, 13]
列表反向
l.reverse()
会将列表中的元素从后向前排列。
a = [1, 2, 3, 4, 5, 6]
a.reverse()
print a
> [6, 5, 4, 3, 2, 1]
如果不想改变原来列表中的值,可以使用这样的方法:
a = [1, 2, 3, 4, 5, 6]
b = a[::-1]
print a
print b
> [1, 2, 3, 4, 5, 6]
> [6, 5, 4, 3, 2, 1]
字典
get
方法,没有该键则返回默认值None
之前已经见过,用索引可以找到一个键对应的值,但是当字典中没有这个键的时候,Python会报错,这时候可以使用字典的 get
方法来处理这种情况,其用法如下:
d.get(key, default = None)
返回字典中键 key
对应的值,如果没有这个键,返回 default
指定的值(默认是 None
)。
pop
方法删除元素
pop
方法可以用来弹出字典中某个键对应的值,同时也可以指定默认参数:
d.pop(key, default = None)
删除并返回字典中键 key
对应的值,如果没有这个键,返回 default
指定的值(默认是 None
)。
update
方法更新字典
之前已经知道,可以通过索引来插入、修改单个键值对,但是如果想对多个键值对进行操作,这种方法就显得比较麻烦,好在有 update
方法:
d.update(newd)
将字典newd
中的内容更新到d
中去。
keys
方法,values
方法和items
方法
d.keys()
,返回一个由所有键组成的列表;
d.values()
,返回一个由所有值组成的列表;
d.items()
,返回一个由所有键值对元组组成的列表;
for 循环
range和xrange
range(10000)
会先生成一个长度为100000
的临时列表- 使用
xrange
来代替range
函数,其效果与range
函数相同,但是xrange
并不会一次性的产生所有的数据
列表推导式
循环可以用来生成列表:
values = [10, 21, 4, 7, 12]
squares = [x**2 for x in values]
print squares
> [100, 441, 16, 49, 144]
还可以在列表推导式中加入条件进行筛选。例如在上面的例子中,假如只想保留列表中不大于10
的数的平方:
values = [10, 21, 4, 7, 12]
squares = [x**2 for x in values if x <= 10]
print squares
> [100, 16, 49]
也可以使用推导式生成集合和字典:
square_set = {x**2 for x in values if x <= 10}
print(square_set)
square_dict = {x: x**2 for x in values if x <= 10}
print(square_dict)
> set([16, 49, 100])
> {10: 100, 4: 16, 7: 49}
函数
定义函数
def add(x, y):
"""Add two numbers"""
a = x + y
return a
函数通常有一下几个特征:
- 使用
def
关键词来定义一个函数。 def
后面是函数的名称,括号中是函数的参数,不同的参数用,
隔开,def foo():
的形式是必须要有的,参数可以为空;- 使用缩进来划分函数的内容;
docstring
用"""
包含的字符串,用来解释函数的用途,可省略;return
返回特定的值,如果省略,返回None
。
接收不定参数
*args 和 **kwargs
*args
表示参数数目不定,可以看成一个元组,把第一个参数后面的参数当作元组中的元素
def add(x, *args):
total = x
for arg in args:
total += arg
return total
print add(1, 2, 3, 4)
print add(1, 2)
> 10
> 3
**kwargs
表示参数数目不定,相当于一个字典,关键词和值对应于键值对
def add(x, **kwargs):
total = x
for arg, value in kwargs.items():
print "adding ", arg
total += value
return total
print add(10, y=11, z=12, w=13)
> adding y
> adding z
> adding w
> 46
包
假设我们有这样的一个文件夹:
foo/
__init__.py
bar.py
(defines func)baz.py
(defines zap)
这意味着 foo 是一个包,我们可以这样导入其中的内容:
from foo.bar import func
from foo.baz import zap
bar
和 baz
都是 foo
文件夹下的 .py
文件。
导入包要求:
- 文件夹
foo
在Python的搜索路径中 __init__.py
表示foo
是一个包,它可以是个空文件。
异常处理
将except
的值改成 Exception
类,来捕获所有的异常。
import math
while True:
try:
text = raw_input('> ')
if text[0] == 'q':
break
x = float(text)
y = 1 / math.log10(x)
print "1 / log10({0}) = {1}".format(x, y)
except ValueError:
print "the value must be greater than 0"
except ZeroDivisionError:
print "the value must not be 1"
except Exception:
print "unexpected error"