《编写高质量代码 改善python程序的91个建议》读书笔记 之二

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'

猜你喜欢

转载自blog.csdn.net/steventian72/article/details/86532327
今日推荐