参考资料:https://github.com/lijin-THU/notes-python(相应实体书为:《自学Python——编程基础、科学计算及数据分析》)
1. Python之禅:import this
Python的标准库提供了一个 keyword 模块,可以输出当前版本的所有关键字:import keyword + keyword.kwlist
2. iPython使用
- %lsmagic //查看所有magic命令;line magic % 作用于一行,cell magic %% 作用于整个cell
- %pylab //导入numpy和matplotlib两个包
- %matplotlib inline //页面内嵌画图,非弹窗 + import matplotlib + import matplotlib.pyplot as plt
- ? //使用 ? 查看函数的帮助,如sum?
- ?? //使用 ?? 查看函数帮助和函数源代码,sum??
- !ping baidu.com //使用 ! 来执行一些系统命令
- _ // _ 上个cell的输出结果
- %run、%timeit、%%writefile、%precision
3. Python支持链式比较:x = 2; 1 < x <= 3 输出True
4. list.append():每次只添加一个元素,并不会因为这个元素是序列而将其展开(不展开)
5. list.extend(lst):将序列lst的元素依次添加到列表list的最后,相当于list += lst
6. 数据类型
- 不可变类型:基本类型(整型、长整型、浮点数等)+ 复数 + 元组 + 字符串 +不可变集合(frozen set);
- 可变类型:列表 + 字典 + 集合 + numpy数组 + 用户自定义类型;
7. 赋值机制(02.13 how-python-assignment-works)
(1)对于简单类型而言,python会为每个出现的对象进行赋值(分配内存),哪怕它们的值是一样的;不过,为了提高内存利用效率,对于一些简单的对象,如一些数值较小的int对象,python采用了重用对象内存的办法; //可以使用 id() 函数查看内存地址,如id(x)返回变量x的内存地址;或者使用 is 来判断是不是指向同一个事物(内存地址),如 x is y 返回True或False
(2)对于容器类型而言,python给新对象赋值时,仅仅是指向同一块内存空间(不分配新内存),如 x = [500, 501, 502]; y = x; //改变列表数据时,会分配新的内存空间给新值,而旧值则会python自动调用垃圾处理机制回收
8. 生成随机数函数:range(), xrange() //xrange效果与range函数相同,但是xrange并不会一次性的产生所有的数据,可以节省时间和内存消耗
- %timeit for i in xrange(1000000): i = i //运行时间较快
- %timeit for i in range(1000000): i = i //运行时间较慢,一次性产生所有数据
9. 列表推导式 x = range(1000000)
- %timeit total = sum([i**2 for i in x]) //运行时间较慢,python会一次性生成整个临时列表,再进行求和,临时列表会被垃圾回收机制回收
- %timeit total = sum(i**2 for i in x) //运行时间较快,类似上述xrange()
10. map方法生成序列:map(aFun, aSeq) //将函数 aFun 应用到序列 aSeq 上的每一个元素上,返回一个列表,不管这个序列原来是什么类型
1 def sqr(x): 2 return x ** 2 3 4 a = [2, 3, 4] 5 print map(sqr, a)
输出:[4 9 6]
注:根据函数参数的多少,map 可以接受多组序列,将其对应的元素作为参数传入函数
1 def add(x, y): 2 return x + y 3 4 a = (2, 3, 4) 5 b = [10, 5, 3] 6 print map(add, a, b)
输出:[12 8 7]
11. 函数通过元组和字典传入参数 //结合可变参数的函数定义方式进行思考def func(arg1, *arg2, **arg3): 位置参数在前,键值对参数在后
1 def add(x, y): 2 """Add two numbers""" 3 a = x + y 4 return a 5 6 z = (2, 3) 7 print add(*z) #传入元组参数z,其中 * 必不可少
输出:5
1 def add(x, y): 2 """Add two numbers""" 3 a = x + y 4 return a 5 6 w = {'x': 2, 'y': 3} 7 print add(**w) #传入字典参数w,其中 ** 必不可少
输出:5
12. 模块
- import:载入模块,在导入时,python会执行一遍模块中的所有内容,包括输出语句print
注:为了提高效率,python只会载入模块一次,已经载入的模块再次载入时,Python并不会真正执行载入操作,哪怕模块的内容已经改变
- reload()函数:强制重新载入模块 reload(module);Python 3把 reload 内置函数移到了 imp 标准库模块中,必须先导入 from imp import reload
#利用__name__属性,使得.py文件既能当作脚本,又能当作模块用
1 PI = 3.1416 2 3 def sum(lst): 4 """ Sum the values in a list 5 """ 6 tot = 0 7 for value in lst: 8 tot = tot + value 9 return tot 10 11 def add(x, y): 12 " Add two values." 13 a = x + y 14 return a 15 16 def test(): 17 w = [0,1,2,3] 18 assert(sum(w) == 6) 19 print 'test passed.' 20 21 if __name__ == '__main__': #当文件被当作脚本执行时,__name__的值为"__main__",会执行test()函数,当做模块导入是,test()不执行 22 test()
13. 常用的标准库
- re 正则表达式
- copy 复制
- math, cmath 数学
- decimal, fraction
- 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
14. 警告warnings:出现了一些需要让用户知道的问题,但又不想停止程序,可以使用警告
1 import warnings 2 3 def month_warning(m): 4 if not 1<= m <= 12: 5 msg = "month (%d) is not between 1 and 12" % m 6 warnings.warn(msg, RuntimeWarning) #警告函数 7 8 month_warning(13)
输出:RuntimeWarning: month (13) is not between 1 and 12
#设置忽略特定类型的警告
1 warnings.filterwarnings(action = 'ignore', category = RuntimeWarning) 2 3 month_warning(13) #没有警告出现