装饰器 decorators(专业提高篇)
问题:
def say(x):
print("您好:", x)
say('老魏') # 您好: 老魏
say('小张')
函数装饰器
函数装饰器是指装饰的是一个函数,传入的是一个函数,返回的也是一个函数的函数
函数装饰器的语法:
def 装饰器函数名(参数):
语句块
return 函数对象
被装饰函数的语法
@装饰器函数名
def 函数名(形参列表):
语句块
函数的 __doc__属性
__doc__属性用于绑定该函数的文档字符串
示例:
def fx(a, b):
'''这是函数的文档字符串
这是第二行...
'''
print(fx.__doc__)
函数的__name__属性:
__name__属性用于绑定函数名的字符串
示例:
def fx():
pass
f1 = fx
print(f1.__name__)
函数定义语句(def语句的语法)
[@装饰器名1]
[@装饰器名2]
...
def 函数名([位置形参],[*[元组形参名]], [命名关键字形参], [**字典形参]):
'''文档字符串'''
语句块
注: []里的内容代表可省略
模块 Module
什么是模块:
模块是一个包含有一系列数据,函数,类等组成的程序组
模块是一个文件,模块文件名通常以.py结尾
作用:
让一些相关的数据,函数,类等有逻辑的组织在一起,使逻辑结构更加清晰
模块中的数据,函数和类等可提供给其它模块或程序使用
模块的分类:
1. 内置模块(builtins),在解析器的内部可以直接使用
2. 标准库模块,安装python时已安装且可直接使用
3. 第三方模块(通常为开源),需要自己安装
4. 用户自己完的模块(可以作为其它人的第三方模块)
import 语句
语法:
import 模块名1[as 模块新名1][,模块名2 [as 模块新名2]], ...
示例:
# 导入数学模块
import math
# 导入系统模块sys和 os模块
import sys, os
作用:
将某模块整体导入到当前模块
用法:
模块.属性名
dir(obj) 函数返回模块所有属性的字符串列表
help(obj) 可以查看模块相关的文档字符串
from import 语句
语法:
from 模块名 import 模块属性名1 [as 属性新名1][,模块属性名2[as 属性新名2], ...]
作用:
将某模块内的一个或多个属性导入到当前模块的作用域
示例:
from math import pi
from math import pow, sqrt
from math import factorial as fac
...
from import *语句
语法:
from 模块名 import *
作用:
将某模块的所有属性都导入到当前模块
示例:
from math import *
dir 函数:
dir([对象]) 返回一个字符串列表
作用:
一、如果没有参数调用,则返回当前作用域内的所有变量的列表
二、如果给定一个对象作为参数,则返回这个对象的所有变量的列表
1. 对于一个模块,返回这个模块的全部属性
2. 对于一个类对象,返回类对象的所有变量,亲递归基类对象的所有变量
3. 对于其它对象,返回所有的变量,类变量,基类变量
数学模块 math
模块名math
时间模块 time
此模块提供了时间相关的函数,且一直可用
系统模块 sys
此模块全部是运行时系统相关的信息
模块化编程的优点:
1. 有利于多人合作开发
2. 使代码更易于维护
3. 提高代码的复用率
4. 有利于解决变量名冲突问题
import 语句 搜索模块的路径顺序
1. 搜索程序运行时的路径(当前路径)
2. sys.path 提供的路径
3. 搜索内置模块
sys.path 是一个存储模块搜索路径的列表
1. 可以把自定义的模块放在相应的路径下可以导入
2. 可以把自己模块的路径添加在sys.path列表中
模块内预置的属性
__doc__属性
作用:
用来绑定模块的文档字符串
模块内第一个没有赋值给任何变量的字符串为模块的文档字符串
__file__属性
__file__ 绑定模块对应的文档路径名
1. 对于内建模块,不绑定路径(没有__file__属性)
2. 对于其它模块,绑定路径名的字符串
__name__属性
此属性用来记录模块的自身名字
作用:
1. 记录模块名
2. 用来判断是否为主模块(最先运行的模块)
说明:
当此模块为主模块时,__name__绑定 '__main__'
当此模块不是主模块时,此属性绑定模块名
模块的__all__列表
模块中的 __all__列表是一个用来存放可导出属性的 字符串列表
作用:
当用 from import *语句导入时,只导入 __all__ 列表内的属性
模块的隐藏属性
模块中以'_'开头的属性,在from import * 语句导入时,将不被导入,通常称这些属性为 隐藏属性
随机模块 random
作用:
用于模拟或生成随机输出的模块
包 (模块包) package
包是将模块以文件夹的组织形式进行分组管理的方法
作用:
将一系列模块进行分类管理,有利于防止命名冲突
可以在需要时加载一个或部分模块而不是全部模块
包示例:
mypack/
init.py
menu.py
games/
init.py
contra.py
supermario.py
tanks.py
office/
init.py
excel.py
word.py
init.py 文件
常规包内必须存在的文件
__init__.py 会在包加载时被自动调用
作用
编写此包的内容
在内部填写文档字符串
在__init__.py 内可以加载此包所依懒的一些其它模块
包的导入:
用三条import语句可以导入包(同模块的导入规则)
import 包名 [as 包别名]
import 包名.模块名 [as 模块新名]
import 包名.子包名.模块名
from 包名 import 模块名 [as 模块新名]
from 包名.子包名 import 模块名 [as 模块新名]
from 包名.子包名.模块名 import 属性名 [as 属性新名]
from 包名 import *
from 包名.模块名 import *
...
异常 exception
什么是错误
错误是指由于逻辑或语法等导致一个程序无法正常执行的问题
特点:
有些错误是无法预知的
什么是异常
异常是程序出错时标识的一种状态
当异常发生时,程序不会再向下执行,而转去调用此函数的地方待处理此错误并恢复为正 常状态
异常的作用:
1. 通知上层调用者有错误产生需要处理
2. 用作信号
try语句的两种语法
try-except语句
try-finally语句
try-except语句
语法:
try:
可能触发异常的语句
except 错误类型1 [as 变量1]:
异常处理语句1
except 错误类型2 [as 变量2]:
异常处理语句2
except (错误类型3, 错误类型4, ...) [as 变量3]:
异常处理语句3
...
except:
异常处理语句other
else:
末发生异常时执行的语句
finally:
最终执行语句
作用:
偿试捕获异常,将程序转为正常状态并继续执行
语法说明:
as 子句是用于绑定错误对象的变量,可以省略不写
except子句可以有一个或多个,但至少要有一个
else子句最多只能有一个,也可以省略不写
finally子句最多只能有一个,也可以省略不写
try-finally语句
语法:
try:
可能触发异常的语句
finally:
最终语句
说明:
finally 子句不可以省略
一定不存在except子句
作用:
通常用try-finally语句来做触发异常时必须要处理的事情,无论异常是否发生,finally子句 都会被执行
注:
try-finally语句不会改变程序的(正常/异常)状态
raise 语句
作用:
触发一个错误,让程序进入异常状态
语法:
raise 异常类型
或
raise 异常对象
assert 语句(断言语句)
语法:
assert 真值表达式, 错误数据(通常是字符串)
作用:
当真值表达式为False时,用错误数据创建一个 AssertionError 类型的错误,并进入异常状态
类似于:
if 真值表达式 == False:
raise AssertionError(错误数据)
小结:
接收错误消息:
try-except
做必须要处理的事情的语句:
try-finally
发错误消息的语句:
raise 语句
assert 语句
为什么要用异常处理机制
在程序调用层数较深时,向主调函数传递错误信息需要用return语句层层传递比较麻烦,所 以用异常处理机制
迭代器 iterator 和 生成器 generator
什么是迭代器
迭代器是指用iter(可迭代对象) 函数返回的对象(实例)
迭代器可以用next(it) 函数获取可迭代对象的数据
迭代器函数:
iter(iterable) 从可迭代对象中返回一个迭代器,iterable必须是一个能提供迭代器的可迭代 对象
next(iterator) 从迭代器iterator中获取下一条记录,如果无法获取下一条记录,则触发 StopIteration 异常
说明:
迭代器是访问可迭代对象的一种方式
迭代器只能向前取值,不会后退
用iter函数可以返回一个可迭代对象的迭代器
r = range(100, 10000)
it = iter(r)
print("第一个数是:", next(it)) # 100
print("第二个数是:", next(it)) # 101
print("第三个数是:", next(it)) # 102
迭代器的用途
代迭器对象能用next函数获取下一个元素
示例:
# 用while循环语句来访问如下列表
L = [2, 3, 5, 7]
生成器 Generator (python2.5 及之后)
什么是生成器:
生成器是能够动态提供数据的对象,生成器对象也是可迭代对象(实例)
生成器有两种:
生成器函数
生成器表达式
生成器函数定义
含有 yield 语句的函数是生成器函数,此函数被调用时将返回 一个生成器对象
注: yield 翻译为产生(或生成)
yield 语句
语法:
yield 表达式
说明:
yield用于def函数中,目的是将此函数作为生成器函数使用
yield用来生成数据,供迭代器 next(it) 函数使用
生成器函数说明:
生成器函数的调用将返回一个生成器对象,生成器对象是一个可迭代对象
在生成器函数调用return时会出生一个 StopIteration 异常来通知next(it) 函数不再能提 供数据
生成器表达式:
语法:
(表达式 for 变量 in 可迭代对象 [if 真值表达式])
注: []里的内容可以省略
作用:
用推导式的形式生成一个新的生成器
示例:
gen = (x**2 for x in range(1, 4))
it = iter(gen)
next(it) # 1
next(it) # 4
next(it) # 9
next(it) # StopIteration
优点:
不占用内存空间
函数
zip(iter1 [,iter2, iter3,...]) 返回一个zip对象此对象用于生成一个元组,此元组的个数由最小 的可迭代对象决定
enumerate(iterable[,start]) 生成带索引的枚举对象,返回迭代类型为索引-值对(index,value) 对, 默认索引从零开始,也可以使用start绑定
示例:
numbers = [10086, 10000, 10010, 95588]
names = ['中国移动', '中国电信', '中国联通']
for n, a in zip(numbers, names):
print(a, '的客服号码是:', n)
for x in zip(numbers, names):
print(x)
# 以下用zip函数生成一个字典
d = dict(zip(names, numbers))
for x in zip(range(10), numbers, names):
print(x)
enumerate函数(枚举函数)
格式
enumerate(iterable[,start])
示例:
names = ['中国移动', '中国电信', '中国联通']
for x in enumerate(names):
print(x) # (0, '中国移动'), (1, '中国电信').
for x in enumerate(names, start=100):
print(x) # (100, '中国移动'), (101, '中国电信'), (102, '中国联通')
字节串 bytes
作用:
存储以字节为单位的数据
说明:
字节串是不可变的字节序列
字节是0~255之间的整数
字节串的构造函数 bytes
bytes() 生成一个空的字节串 等同于 b''
bytes(整型可迭代对象) 用可迭代对象初始化一个字节串
bytes(整数n) 生成n个值为零的字节串
bytes(字符串, encoding='utf-8') 用字符串的转换编码生成一个字节串
示例:
b = b'abc' + b'123' # b=b'abc123'
b += b'ABC' # b=b'abc123ABC'
b'ABD' > b'ABC' # True
b = b'ABCD'
65 in b # True
b'A' in b # True
bytes 与 str的区别:
bytes 存储字节(0-255)
str 存储Unicode字符(0-65535)
bytes 与 str 转换
编码(encode)
str ------> bytes
b = s.encode('utf-8')
解码(decode)
bytes ------> str
s = b.decode('utf-8')
字节数组 bytearray
可变的字节序列
创建字节数组的构造函数:
bytearray() 创建空的字节数组
bytearray(整数)
bytearray(整型可迭代对象)
bytearray(字符串,encoding='utf-8')
注: 以上参数等同于字节串
bytearray的方法:
B.clear() 清空字节数组
B.append(n) 追加一个字节(n为0-255的整数)
B.remove(value) 删除第一个出现的字节,如果没有出现,则产生ValueError错误
B.reverse() 字节的顺序进行反转
B.decode(encoding='utf-8') # 解码
B.find(sub[, start[, end]]) 查找
文件 file
什么是文件
文件是数据存储的单位
文件通常用来长期存储数据
文件中的数据是以字节为单位进行顺序存储的
文件的操作流程
1. 打开文件
2. 读写文件
3. 关闭文件
任何的操作系统,一个应用程序同时打开文件的数量有最大数限制
文件的打开函数 open
open(file, mode='rt') 用于打开一个文件,返回此文件对应的文件流对象,如果打开失败, 则会触发OSError错误!
文件关闭方法:
F.close() 关闭,释放系统资源
python文件读写的类型有两种:
文本文件 (text file)
二进制文件 (binary file)
各种操作系统的换行符:
Linux换行符 : '\n'
Window换行符 : '\r\n'
旧的Macintosh换行符: '\r'
新的Mac Os 换行符 : '\n'
文本文件的迭代读取
open()函数返回来的文件流对象是可迭代对象
示例:
f = open('abc.txt')
# 每次取出一行,相当于line = f.readline()
for line in f:
print(line)
f.close()
标准输入输出文件
模块名: sys
sys.stdin (默认为标准键盘输入设备)
ctrl + d 输入文件末尾标识
sys.stdout (默认为屏幕终端)
sys.stderr (默认为屏幕终端)
标准文件不需要打开和关闭就可以使用
二进制文件操作:
'b' 二进制(binary)文件操作
对于二进制文件的读写通常需要用字节串(bytes)进行操作
示例:
f = open("infos.txt", 'rb') # 以二进制模式打开
# 在此处对f绑定的对象以bytes为单位进行读写
# ...
f.close()
F.seek() 方法
F.seek(偏移量, whence=相对位置)
偏移量:
大于0代表向文件末尾方向移动
小于0代表向文件头方向移动
相对位置:
0 代表人文件头开始
1 代表从当前读写位置开始偏移
2 代表从文件尾开始偏移
汉字编码:
国标系列:
GB18030 (二字节或四字节编码)
GBK (二字节编码)
GB2312 (二字节编码)
(Windows 常用)
国际标准:
UNICODE(2/4字节) <---> UTF-8 (1~6字节)
(Linux / Mac OS X / IOS / Android 常用)
python 编码(encode) 字符串
'gb2312'
'gbk'
'gb18030'
'utf-8'
'ascii'
...