18、构建合理的包层次来管理module
包(package)其实就是文件目录,除了普通的.py文件外,还包含了一个__init__.py文件,允许嵌套。
- 访问方式:包.模块
package.module
package.subpackage.module
- 导入:
- 直接导入:import package
- 导入模块或子包:
from package import module1
import package.module1
from package import subpackage
import package.subpackage
from package.subpackage import module1
import package.subpackage.module1
-
_init_.py的作用:
- 使包和普通文件目录区分
- 在该文件中申明模块级别的import语句
- 在该文件中定义__all__变量,控制需要导入的子包和模块
-
包的好处:
- 合理组织代码,便于维护和使用
- 有效避免名称空间冲突
19、有节制地使用from … import语句
- 优先使用import a的形式,如访问B时,需使用a.B的形式;
- 有节制地使用from a import B,可以直接访问B;
- 尽量避免from a import *,会污染命名空间;
python的import机制:
1、python在初始化运行环境时,会预先加载一批内建模块,这些模块信息会被存放在sys.modules中;
2、当加载一个模块时,解释器实际上要完成以下动作:
a、在sys.modules中搜索,看该模块是否已经存在,如果存在,则将其导入到当前局部命名空间;
b、如果在sys.modules中找不到对应的模块名,则为需要导入的模块创建一个字典对象,并将该对象信息插入sys.modules中;
c、加载前确认是否需要对该模块进行编译;
d、执行动态加载,并将其所有对象放入模块对应字典中。
from … import有可能造成嵌套饮用错误,而直接使用import可以解决。
24、遵循异常处理的几点基本原则
- python异常处理:
try except
try except else
try finally
try except else finally
- 注意事项:
- try中不推荐放入过多的代码,尽量只在可能抛出异常的语句块前面放入try语句;
- 谨慎使用单独的except语句处理所有异常;
- 注意异常捕获的顺序,在合适的层次处理异常;
- 使用更为友好的异常信息,遵守异常参数的规范。
26、深入理解None,正确判断对象是否为空
python中,以下数据会被当作空来处理:
- 常量None
- 常量False
- 任何形式的数值类型零:0,0L,0.0,0j
- 空序列,如’’, (), []
- 空字典,如{}
- 用户定义类中定义了__nonzero__()方法和__len__()方法,且该方法返回整数0或者布尔值False的时候
None,既不是0、False,也不是空字符串,它就是一个空值对象,其数据类型为NoneType
正确判断列表是否为空:
if list :
Dosomething
else
DoSomeotherthing
如果一个类中,既没有定义__nonzero__()方法,也没有定义__len__()方法,该类的实例用if判断的结果都是True。
28、格式化字符串尽量使用format而不是%
format在使用上较%操作符更为灵活,可以方便的传递参数。
(到目前为止还不能深入的理解这两点,留作备案参考)
- %操作符的基本形式:
%[(name)][flag][width][.][precision]type
"""
name:可为空,数字(占位),命名(传递参数名,不能以数字开头)以字典格式映射格式化,其为键名;
flag:标记格式限定符号,包含+-#和0。+(右对齐,正数前加正号,负数前加负号),-(左对齐正数前无符号,负数前加负号),空格(右对齐,正数前加空格,负数前加负号),0(右对齐,正数前无符号,负数前加负号;用0填充空白处),#表示八进制时前面补充0,16进制数填充0x,二进制填充0b;
width:宽度(最短长度,包含小数点,小于width时会填充);
precision:可选,小数点后保留的位数;
type:输入格式类型:
s,获取传入对象的__str__方法的返回值,并将其格式化到指定位置
r,获取传入对象的__repr__方法的返回值,并将其格式化到指定位置
c,整数:将数字转换成其unicode对应的值,10进制范围为 0 <= i <= 1114111(py27则只支持0-255);字符:将字符添加到指定位置
o,将整数转换成八进制表示,并将其格式化到指定位置
x,将整数转换成十六进制表示,并将其格式化到指定位置
d,将整数、浮点数转换成 十 进制表示,并将其格式化到指定位置
e,将整数、浮点数转换成科学计数法,并将其格式化到指定位置(小写e)
E,将整数、浮点数转换成科学计数法,并将其格式化到指定位置(大写E)
f, 将整数、浮点数转换成浮点数表示,并将其格式化到指定位置(默认保留小数点后6位)
F,同上
g,自动调整将整数、浮点数转换成 浮点型或科学计数法表示(超过6位数用科学计数法),并将其格式化到指定位置(如果是科学计数则是e;)
G,自动调整将整数、浮点数转换成 浮点型或科学计数法表示(超过6位数用科学计数法),并将其格式化到指定位置(如果是科学计数则是E;)
%,当字符串中存在格式化标志时,需要用 %%表示一个百分号
"""
- %常用方法:
- 直接格式化字符串或数值
>>> print ('Your score is %06.1f' %9.5)
Your score is 0009.5
- 以元组的形式格式化
>>> import math
>>> itemname = 'circumference'
>>> radius = 3
>>> print ('the %s of a circle with radius %f is %0.3f' % (itemname, radius, math.pi*radius*2))
the circumference of a circle with radius 3.000000 is 18.850
- 以字典的形式格式化
>>> itemdict = {'itemname':'circumference', 'radius':3, 'value':math.pi*radius*2}
>>> print ('the %(itemname)s of a circle with radius %(radius)f is %(value)0.3f' % itemdict)
the circumference of a circle with radius 3.000000 is 18.850
- format的基本语法
{[name][:][[fill]align][sign][#][0][width][,][.precision][type]}
fill 可选,空白处填充的字符
align 可选,对齐方式(需配合width使用)
<,内容左对齐
>,内容右对齐(默认)
=,内容右对齐,将符号放置在填充字符的左侧,且只对数字类型有效。 即使:符号+填充物+数字
^,内容居中
sign 可选,有无符号数字
+,正号加正,负号加负;
-,正号不变,负号加负;
空格 ,正号空格,负号加负;
# 可选,对于二进制、八进制、十六进制,如果加上#,会显示 0b/0o/0x,否则不显示
, 可选,为数字添加分隔符,如:1,000,000
width 可选,格式化位所占宽度
.precision 可选,小数位保留精度
type 可选,格式化类型
传入” 字符串类型 “的参数
s,格式化字符串类型数据
空白,未指定类型,则默认是None,同s
传入“ 整数类型 ”的参数
b,将10进制整数自动转换成2进制表示然后格式化
c,将10进制整数自动转换为其对应的unicode字符
d,十进制整数
o,将10进制整数自动转换成8进制表示然后格式化;
x,将10进制整数自动转换成16进制表示然后格式化(小写x)
X,将10进制整数自动转换成16进制表示然后格式化(大写X)
传入“ 浮点型或小数类型 ”的参数
e, 转换为科学计数法(小写e)表示,然后格式化;
E, 转换为科学计数法(大写E)表示,然后格式化;
f , 转换为浮点型(默认小数点后保留6位)表示,然后格式化;
F, 转换为浮点型(默认小数点后保留6位)表示,然后格式化;
g, 自动在e和f中切换
G, 自动在E和F中切换
%,显示百分比(默认显示小数点后6位)
- format的使用方法:
- 使用位置符号:
>>> "The number {0:,} in hex is: {0:#x}, the number {1} in oct is {1:#o}".format(4746, 45)
#其中{0}表示format方法中对应的第一个参数,{1}表示format方法中对应的第二个参数,以此类推
'The number 4,746 in hex is: 0x128a, the number 45 in oct is 0o55'
- 使用名称:
>>> "The max number is {max}, the min number is {min}, the average number is {average:0.3f}".format(max=189, min=12.6, average = 23.5)
'The max number is 189, the min number is 12.6, the average number is 23.500'
- 通过属性:
class Customer(object):
def __init__(self, name, gender, phone):
self.name = name
self.gender = gender
self.phone = phone
def __str__(self):
#通过str()函数返回格式化的结果
return 'Customer({self.name}, {self.gender}, {self.phone})'.format(self=self)
str(Customer('Lisa', 'Female', '67889'))
>>>'Customer(Lisa, Female, 67889)'
- 格式化元组的具体项:
>>> point = (1, 3)
>>> 'X:{0[0]}; Y:{0[1]}'.format(point)
'X:1; Y:3'