列表推导式
# 循环可以用来生成列表
values = [10, 21, 4, 7, 12]
squares = []
for x in values:
squares.append(x**2)
print squares
# 列表推导式可以使用更简单的方法来创建这个列表
values = [10, 21, 4, 7, 12]
squares = [x**2 for x in values]
print squares
# 例如在上面的例子中, 假如想要保留列表中不大于10的数的平方:
values = [10, 21, 4, 7, 12]
squares = [x**2 for x in values if x <= 10]
print squares
函数
# 定义函数
def add(x, y):
""" Add two numbers """
a = x + y
return a
# 函数通常有以下几个特征:
# 1. 使用def关键词来定义一个函数。
# 2. def后面是函数的名称, 括号中是函数的参数, 不同的参数用,隔开, def foo():的形式是必须要有的, 参数可以为空;
# 3. 使用缩进来划分函数的内容;
# 4. docstring 用"""包含的字符,用来解释函数的用途,可省略;
# 5. return返回特定的值,如果省略,返回None。
# 使用函数
print add(2, 3)
print add("foo", "bar")
# 设定函数的默认值
# 可以在设定函数定义的时候给参数设定默认值,例如:
def quad(x, a = 1, b = 0, c = 0):
return a*x**2 + b*x + c
# 可以省略有默认值的参数
print quad(2.0)
# 接受不定参数
# 使用以下方法,可以使函数接受不定数目的参数:
def add(x, *args):
total = x
for arg in args:
total += arg
return total
# 这里,*args表示参数数目不定,可以看成一个元组, 把第一个参数后面的参数当做元组的元素
print add(1, 2, 3, 4)
print add(1, 2)
# 返回多个值
form math import atan2
def to_polar(x, y):
r = (x**2 + y**2) ** 0.5
theta = atan2(y, x)
return r, theta
r, theta = to_polar(3, 4)
print r, theta
# map方法生成序列
def sqr(x):
return x ** 2
a = [2, 3, 4]
print map(sqr, a)
# 其用法为: map(aFun, aSeq), 将函数aFun应用到序列aSeq上的每一个元素上,返回一个列表,不管这个序列原来是什么类型。事实上,根据函数参数的多少,map可以接受多组序列,将其对应的元素作为参数传入函数:
def add(x, y):
return x + y
a = (2, 3, 4)
b = [10, 5, 3]
print map(add, a, b)
模块和包
模块
# Python会将所有.py结尾的文件认定为Python代码文件, 考虑下面的脚本ex1.py:
%%writefile ex1.py
PI = 3.1416
def sum(lst):
tot = lst[0]
for value in lst[1:]:
tot = tot + value
return tot
w = [0, 1, 2, 3]
print sum(w), PI
# 执行这个文件
%run ex1.py
# 这个脚本可以当做一个模块,可以使用import关键词加载并执行它(这里要求ex1.py在当前工作目录)
import ex1
__name__ 属性
有时候我们想讲一个.py文件既当做脚本,又能当作模块用,这个时候可以使用__name__这个属性。
只有当文件被当做脚本执行的时候, __name__的值才会是'__main__',所以我们可以:
%%writefile ex2.py
PI = 3.1416
def sum(lst):
""" Sum the values in a list
"""
tot = 0
for value in lst:
tot = tot + value
return tot
def add(x, y):
" Add two values."
a = x + y
return a
def test():
w = [0,1,2,3]
assert(sum(w) == 6)
print 'test passed.'
if __name__ == '__main__':
test()
# 运行文件
%run ex2.py
# 当做模块导入,test()不会执行
import ex2
import ex2 as e2
e2.PI
包
假设我们有这样一个文件夹:
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是一个包,它可以是个空文件
常用的标准库
- re 正则表达式
- copy 赋值
- math, cmath 数学
- decimal, faction
- sqlite3 数据库
- os, os.path 文件系统
- gzip, bz2, zipfile, tarfile 压缩文件
- csv, netrc 各种文件格式
- xml
- htmllib
- ftplib, socket
- cmd 命令行
- pdb
- profile, cProfile, timeit
- collections, heapq, bisect 数据结构
- mmap
- threading, Queue 并行
- multiprocessing
- subprocess
- pickle, cPickle
- struct