异常处理
单个异常处理:
try:
print(num)
except NameError:
print('没有定义变量')
except FileNotFoundError:
print('找不到文件路径')
print(1)
多个异常处理:
try:
print(num)
# 11/0
# open('xxx.txt')
except (NameError, FileNotFoundError, ZeroDivisionError): # 多个异常统一处理
print('异常')
print(1)
所有异常处理:
try:
print(num)
except Exception: # 所有异常处理
print('所有异常处理')
print(1)
查看原来异常输出:
try:
print(num)
except Exception as err:
print(err)
print(1)
没有异常执行
try:
a = 1
execpt Exception as err:
print(err)
else:
print('没有异常执行')
finally:
print('不管是否出现异常, 都执行')
print(1)
import time
try:
f = open('test.txt')
try:
while True
content = f.readline()
if len(content) == 0:
break
time.sleep(2)
print(content)
except Exception:
# pass
print('文件产生异常')
finally:
f.close()
print('关闭文件')
except Exception:
print('没有这个文件')
try与except需要同时存在
当函数嵌套的时候,如果函数出现异常,会返回异常,然后捕获到异常
抛出自定义异常
raise: 抛出一个自定义异常
raise语句如果不带参数,就会把当前错误原样抛出。
def main ():
try:
s = input('请输入-->')
if len(s) < 3:
raise ShortInputException(len(s), 3)
else:
print(s)
except ShortInputException as result:
print('ShortInputException: 输入的长度是 %d, 长度至少需要是 %d' % (result.length, result.atleast))
else:
print('没有异常发生.')
class ShortInputException(Exception):
'''自定义异常类'''
def __init__(self, length, atleast):
# super().__init()
self.length = length
self.atleast = atleast
main()
模块
如何获取当前模块的文件名: __file__
引入模块
import sys导入模块中的全部功能
from argv import sys, from argv import sys,executable导入模块中的单独功能
from sys import *
from sys as s 别名
__name__: 用于表示当前模块的名字,同时还能反映一个包的结构
导入输出的是当前模块名
模块被直接运行时模块名为:__main__
if __name__ == '__main__': # 如果模块是被直接运行的,则代码块被运行,如果模块是被导入的,则代码块不被运行。
# code
常用内建模块
标准库
说明
builtins
内建函数默认加载
os
操作系统接口 [系统级别的操作(文件和目录)]
sys
Python自身的运行环境 [对解释器相关的操作]
functools
常用的工具
json & pickle
编码和解码 JSON 对象
logging
记录日志,调试
multiprocessing
多进程
threading
多线程
copy
拷贝
time
时间
datetime
日期和时间
calendar
日历
hashlib
加密算法
random
生成随机数
re
字符串正则匹配
socket
标准的 BSD Sockets API
shutil
文件和目录管理 [高级的 文件、文件夹、压缩包 处理模块(递归,文件复制等)]
glob
基于文件通配符搜索
shelve
一个简单的k,v将内存数据通过文件持久化的模块,可以持久化任何pickle可支持的python数据格式
hashlib
import hashlib
m = hashlib.md5() # 创建hash对象,md5:(message-Digest Algorithm 5)消息摘要算法,得出一个128位的密文
print m #
m.update('alogy') # 更新哈希对象以字符串参数
print m.hexdigest() # 返回十六进制数字字符串
例子:用于注册、登录
import hashlib
import datetime
KEY_VALUE = 'alogy'
now = datetime.datetime.now()
m = hashlib.md5()
str = '%s%s' % (KEY_VALUE,now.strftime("%Y%m%d"))
m.update(str.encode('utf-8'))
value = m.hexdigest()
print(value) # c69c59b58209a94f40e6a7a425f9a977
functools
['WRAPPER_ASSIGNMENTS', 'WRAPPER_UPDATES', '__builtins__', '__doc__', '__file__', '__name__', '__package__', 'cmp_to_key', 'partial', 'reduce', 'total_ordering', 'update_wrapper', 'wraps']
partial()
把一个函数的某些参数设置默认值,返回一个新函数,调用这个新函数会更简单。
import functools
def showarg(*args, **kw):
print(args)
print(kw)
p1 = functools.partial(showarg, 1, 2, 3)
p1()
p1(4,5,6)
p1(a='python', b='alogy')
p2 = functools.partial(showarg, a=3, b='linux')
p2()
p2(1, 2)
p2(a='python', b='alogy')
wraps()
使用装饰器时,被装饰后等函数其实已经是另外一个函数(函数名等函数属性会发生变化)
添加后由于函数名和函数的doc发生了改变,对测试结果有一些影响,例如:
def note(func):
"note function"
def wrapper():
"wrapper function"
print('note something')
return func()
return wrapper
@note
def test():
"test function"
print('I am test')
test()
print(test.__doc__)
运行结果
note something
I am test
wrapper function
所以,Python的functools包中提供了一个叫wraps的装饰器来消除这样的副作用。例如:
import functools
def note(func):
"note function"
@functools.wraps(func) # 保存外边函数名
def wrapper():
"wrapper function"
print('note something')
return func()
return wrapper
@note
def test():
"test function"
print('I am test')
test()
print(test.__doc__)
运行结果
note something
I am test
test function
常用扩展库
扩展库
说明
requests
使用的是 urllib3,继承了urllib2的所有特性
urllib
基于http的高层库
scrapy
爬虫
beautifulsoup4
HTML/XML的解析器
celery
分布式任务调度模块
redis
缓存
Pillow(PIL)
图像处理
xlsxwriter
仅写excle功能,支持xlsx
xlwt
仅写excle功能,支持xls ,2013或更早版office
xlrd
仅读excle功能
elasticsearch
全文搜索引擎
pymysql
数据库连接库
mongoengine/pymongo
mongodbpython接口
matplotlib
画图
numpy/scipy
科学计算
django/tornado/flask
web框架
xmltodict
xml 转 dict
SimpleHTTPServer
简单地HTTP Server,不使用Web框架
gevent
基于协程的Python网络库
fabric
系统管理
pandas
数据处理库
scikit-learn
机器学习库
例如:读写excel文件
安装esay_install工具
sudo apt-get install python-setuptools
安装模块
sudo easy_install xlrd
sudo easy_install xlwt
所有内置模块
import sys
sys.modules.keys()
['builtins', 'sys', '_frozen_importlib', '_imp', '_warnings', '_thread', '_weakref', '_frozen_importlib_external', '_io', 'marshal', 'nt', 'winreg', 'zipimport', 'encodings', 'codecs', '_codecs', 'encodings.aliases', 'encodings.utf_8', '_signal', '__main__', 'encodings.latin_1', 'io', 'abc', '_weakrefset', 'site', 'os', 'errno', 'stat', '_stat', 'ntpath', 'genericpath', 'os.path', '_collections_abc', '_sitebuiltins', 'sysconfig', 'idlelib', 'idlelib.run', 'linecache', 'functools', '_functools', 'collections', 'operator', '_operator', 'keyword', 'heapq', '_heapq', 'itertools', 'reprlib', '_collections', 'types', 'collections.abc', 'weakref', 'tokenize', 're', 'enum', 'sre_compile', '_sre', 'sre_parse', 'sre_constants', '_loc
ale', 'copyreg', 'token', 'queue', 'threading', 'time', 'traceback', 'warnings', 'tkinter', '_tkinter', 'tkinter.constants', 'idlelib.autocomplete', 'string', '_string', 'idlelib.autocomplete_w', 'platform', 'subprocess', 'signal', 'msvcrt', '_winapi', 'idlelib.multicall', 'idlelib.config', 'configparser', '_bootlocale', 'encodings.gbk', '_codecs_cn', '_multibytecodec', 'idlelib.hyperparser', 'idlelib.pyparse', 'idlelib.calltips', 'inspect', 'ast', '_ast', 'dis', 'opcode', '_opcode', 'importlib', 'importlib._bootstrap', 'importlib._bootstrap_external', 'importlib.machinery', 'textwrap', 'idlelib.calltip_w', 'idlelib.debugger_r', 'idlelib.debugger', 'bdb', 'fnmatch', 'posixpath', 'idlelib.macosx', 'idlelib.scrolledlist', 'idlelib.windows', 'idlelib.debugobj_r', 'idlelib.rpc', 'pickle', 'struct', '_struct', '_compat_pickle', '_pickle', 'select', 'socket', '_socket', 'selectors', 'math', 'socketserver', 'idlelib.iomenu', 'shlex', 'tempfile', 'shutil', 'zlib', 'bz2', '_compression', '_bz2', 'lzma', '_lzma', 'random', 'hashlib', '_hashlib', '_blake2', '_sha3', 'bisect', '_bisect', '_random', 'locale', 'idlelib.stackviewer', 'idlelib.debugobj', 'idlelib.tree', 'idlelib.zoomheight', 'pydoc', 'importlib.util', 'importlib.abc', 'contextlib', 'pkgutil', 'urllib', 'urllib.parse']
内置全局变量:vars()
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': , '__spec__': None, '__annotations__': {}, '__builtins__': }
第三方模块:
anaconda: 数十个常用的第三方模块
内建属性
python类的内建属性和方法
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
常用专有属性
说明
触发方式
__init__
构造初始化函数
创建实例后,赋值时使用,在__new__后
__new__
生成实例所需属性
创建实例时
__class__
实例所在的类
实例.__class__
__str__
实例字符串表示,可读性
print(类实例),如没实现,使用repr结果
__repr__
实例字符串表示,准确性
类实例 回车 或者 print(repr(类实例))
__del__
析构
del删除实例
__dict__
实例自定义属性
vars(实例.__dict__)
__doc__
类文档,子类不继承
help(类或实例)
__getattribute__
属性访问拦截器
访问实例属性时
__bases__
类的所有父类构成元素
类名.__bases__
__getattribute__例子:
class Person(object):
def __init__(self, subject1):
self.subject1 = subject1
# 属性访问时拦截器,打log
def __getattribute__(self, obj):
if obj == 'subject1':
print('log subject1')
return 'redirect python'
def show(self):
print('this is Person')
p = Person("python")
print(p.subject1)
内建函数
dir(__builtins__)
['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BufferError', 'BytesWarning', 'DeprecationWarning', 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'NameError', 'None', 'NotImplemented', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'ReferenceError', 'RuntimeError', 'RuntimeWarning', 'StandardError', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'True', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'ZeroDivisionError', '__debug__', '__doc__', '__import__', '__name__', '__package__', 'abs', 'all', 'any', 'apply', 'basestring', 'bin', 'bool', 'buffer', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', 'cmp', 'coerce', 'compile', 'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'execfile', 'exit', 'file', 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'intern', 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'long', 'map', 'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property', 'quit', 'range', 'raw_input', 'reduce', 'reload', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'unichr', 'unicode', 'vars', 'xrange', 'zip']
range()
range(stop) # 整数列表
range(start, stop[, step]) # 整数列表
strat: 计数从start开始,默认是从0开始。例如:range(5)等价于range(0, 5)
stop: 到stop结束,但不包括stop。例如:range(0, 5), 返回[0, 1, 2, 3, 4]没有5
step: 每次跳跃的间距,默认为1。例如:range(0, 5)等价于range(0, 5, 1)
map()
map函数会根据提供的函数作为指定序列做映射
map(function, sequence[, sequence, ...]) -> list
function: 一个函数
sequence: 一个或多个序列,取决于function需要几个参数
返回值是一个list
# 函数需要一个参数
map(lambda x: x*x, [1, 2, 3]) # [1, 4, 9]
# 函数需要两个参数
map(lambda x, y: x+y, [1, 2, 3], [4, 5, 6]) # [5, 7, 9]
def f1( x, y ):
return (x, y)
l1 = [0, 1, 2, 3, 4, 5, 6]
l2 = ['Sun', 'M', 'T', 'W', 'T', 'F', 'S']
l3 = map(f1, l1, l2)
print(list(l3))
# [(0, 'Sun'), (1, 'M'), (2, 'T'), (3, 'W'), (4, 'T'), (5, 'F'), (6, 'S')]
filter()
filter()会对指定序列执行过滤操作
filter(function or None, sequence) -> list, tuple, or string
function: 接受一个参数,返回布尔值True或False
sequence: 序列可以是str,tuple, list
返回值list, tuple, string
filter(lambda x: x%2, [1, 2, 3, 4])
[1, 3]
filter(None, "a")
'a'
reduce()
reduce会对参数序列中对元素进行累积
reduce(function, sequence[, initial]) -> value
function:该函数有两个参数
sequence:序列可以是str,tuple,list
initial:固定初始值
function: 该函数有二个参数
sequence: 序列可以是str, tuple, list
initial: 固定初始值
返回value
reduce(lambda x, y: x+y, [1,2,3,4]) # 10
reduce(lambda x, y: x+y, [1,2,3,4], 5) # 15
reduce(lambda x, y: x+y, ['aa', 'bb', 'cc'], 'dd') # 'ddaabbcc'
sorted()
sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list
iterable: 迭代器
key: 函数
reverse: 正序,倒序
返回一个新的列表
sorted([1, 4, 2, 6, 3, 5]) # [1, 2, 3, 4, 5, 6]
sorted([1, 4, 2, 6, 3, 5], reverse = 1) # 倒序 # [6, 5, 4, 3, 2, 1]
sorted(['dd', 'aa', 'cc', 'bb']) # ['aa', 'bb', 'cc', 'dd']
lst = [3, -19, -1, 28, 7, 0, -2, -5, 7, 8, 0 -3, 9, 0, 11]
sorted(lst, key=lambda x: (x >= 0, -x if x >= 0 else x)) # [-19, -5, -3, -2, -1, 28, 11, 9, 8, 7, 7, 3, 0, 0]
sorted(lst, key=lambda x: (x >= 0, -abs(x))) # [-19, -5, -3, -2, -1, 28, 11, 9, 8, 7, 7, 3, 0, 0]
模块中的__all__的作用
__all__只影响from import *这种导入方式
__all__ = ['test']
def test():
print('test')
包、__init__.py的作用
某个文件夹下具有__init.py的,称之为包
__init__.py作用:
package的标识
定义package中的__all__,用来模糊导入
模块的发布和安装
新建一个setup.py写入:
from distutils.core import setup
setup(name='alogy', version='1.0', description='a', author='alogy', py_modules=['suba.aa']) # suba.aa 包名.模块名
发布:
> python setup.py build
> python setup.py sdist
安装:
> python setup.py install
import搜索路径
import sys
sys.path # sys.path的先后顺序
重新导入模块
模块被导入后,import module不能重新导入模块,需要重新导入
from imp import *
reload('module') # module模块名
调试
pdb是基于命令行的调试工具
运行时启动
python -m pdb xxx.py
l: list 查看运行的代码
n: next 往下行执行
c: continue 继续执行代码直到结束
b 7,b 行数: break 添加断点(通过c执行)
b: 查看所有断点
clear 断点序号: 清除指定断点
s: step 进入当前作用域中
p 变量名: 查看指定变量名的值
a: 查看所有当前作用域的变量名和变量值
q: quit 退出调试
r: return 快速执行到函数最后一行
交互式调试
import pdb
pdb.run('testfun(args)') # 此时会打开pdb调试,注意:先使用s跳转到testfun函数中,然后可以使用
程序里埋点
当程序执行到pbd.set_trace()位置时停下来调试
import pdb
pdb.set_trace()
package
常用内置模块:
sys: 系统模块, 程序与python解释器的交互, 用于操控python的运行时环境
os: 操作系统模块, 程序与操作系统的交互, 系统操作IO等行为
time,datetime: 时间模块
re: 正则
json: json处理
urllib: 网络处理
random: 随机
不常用内置模块:
itertools: 一些特殊的函数可以操作可迭代对象或者排列组合
copy: 拷贝的函数(赋值一般是传递对象的引用,修改一个对象,会导致其它对象也受到改变)
string: String模块包含大量实用常量和类
Naked
Naked: 一个Python命令行应用程序框架. 可用于执行JS代码
from Naked.toolshed.shell import execute_js, muterun_js
import sys
response = muterun_js('file.js')
if response.exitcode == 0:
print(response.stdout)
else:
sys.stderr.write(str(response.stderr))
shutil
用于复制和归档文件和目录树的实用函数。
# 清dist目录
clearDist = (len(sys.argv) == 4 and (sys.argv[3] == '--clear'))
if clearDist:
shutil.rmtree('./dist/')
subprocess
访问I/O流的子进程
# 编译vue
buildStat = subprocess.call('node build/build.js ' + webPath + ' ' + verPath, shell=True)
if buildStat != 0:
print('vue 编译错误')
sys.exit(1)
six
Python 2和3兼容库
import six
def bytes_to_str(s, encoding='utf-8'):
"""Returns a str if a bytes object is given."""
if six.PY3 and isinstance(s, bytes):
return s.decode(encoding)
return s
其它
给程序传递参数
import sys
print(sys.argv) # 接收运行时接受的参数
终止程序运行
import sys
sys.exit(1)