Python Cookbook3 (8)类与对象

1. 改变对象的字符串显示

自定义__repr__()__str__()通常是很好的习惯,因为它能简化调试和实例输出。例如,如果仅仅只是打印输出或日志输出某个实例,那么程序员会看到实例更加详细与有用的信息。
repr()生成的文本字符串标准做法是需要让eval(repr(x))==x为真。
如果str()没有被定义,那么就会使用repr()来代替输出。

2. 自定义字符串的格式化

如果format时传入对象,会默认执行对象的format方法,如果在format函数中提供参数,那么在格式化字符串时可以通过冒号传入参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class A:
def __init__(self, val):
self.val = val

def __repr__(self):
return str(self.val)

def __str__(self):
return "this is my class A"

def __format__(self,par):
return "A({}) with parameter {}".format(self.val,par)

print("{:hello}".format(A(1)))

Read More

Python Cookbook3 (7)函数

1. 任意数量的位置参数和关键字参数

关键字参数必须全部在位置参数后面

1
2
3
def anyargs(*args, **kwargs):
print(args) # A tuple
print(kwargs) # A dict

2. 强制使用关键字参数

1
2
3
4
5
6
def recv(maxsize, *, block):
'Receives a message'
pass

recv(1024, True) # TypeError
recv(1024, block=True) # Ok

Read More

Python Cookbook3 (3)数字日期和时间

1. 数字的舍入

使用round函数。round 函数返回离它最近的偶数。也就是说,对 1.5 或者 2.5 的舍入运算都会得到 2。

1
2
3
4
5
print(round(12.3)) # 12
print(round(1.23, 1)) # 1.2
print(round(1.25, 1)) # 1.2
print(round(1.27, 1)) # 1.3
print(round(127, -1)) # 130

如果只希望输出一定的宽度(也会舍入啊?没明白区别在哪),使用format

1
2
format(1.23456, '0.2f') # 1.23
format(1.23456, '0.3f') # 1.235

2. 执行精确的浮点数运算

浮点数的一个普遍问题是它们并不能精确的表示十进制数。并且,即使是最简单的数学运算也会产生小的误差。这些错误是由底层 CPU 和 IEEE 754 标准通过自己的浮点单位去执行算术时的特征。由于 Python 的浮点数据类型使用底层表示存储数据,因此你没办法去避免这样的误差。

1
print(1.2+2.4) # 反正不是3.6...

使用Decimal模块,再去书里面看。

3. 数字的格式化输出

1
2
3
4
5
x = 1234.56789
print(format(x, '0.2f'))
print(format(x, '>10.1f')) # 10位长度右对齐
print(format(x, '<10.1f')) # 10位长度左对齐
print(format(x, '^10.1f')) # 10位长度居中

当指定数字的位数后,结果值会根据 round() 函数同样的规则进行四舍五入后返回。format同样适用于Decimal


  1. 知乎:怎样才算是精通python
  2. Python格式化字符串
  3. Python3.5 协程究竟是个啥
  4. python多重继承新算法C3介绍
  5. Python: 你不知道的 super
  6. python的类变量与实例变量以及dict属性
  7. 详解Python中 getgetattrgetattribute的区别
  8. Python黑魔法————描述器
  9. Python中的classmethod和staticmethod有什么具体用途
  10. 如何理解python装饰器
  11. 详解python的装饰器
  12. Python getattribute vs getattr 浅谈
  13. 你真的理解Python中MRO算法吗?
  14. 关于python中inspect模块的一些探究
  15. Python “黑魔法” 之 Meta Classes
  16. Range对象并不是迭代器

Python Cookbook3 (4)迭代器与生成器

1. 手动遍历迭代器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 捕获迭代终止异常
a = [1,2,3]
it = iter(a)
try:
while True:
ch = next(it)
print(ch)
except StopIteration:
print("结束")

# 为迭代失败设置异常值
a = [1,2,3]
it = iter(a)
ch = True
while ch:
ch = next(it,None)
print(ch)

对于返回的StopIteration异常,我们在迭代中通常使用的 for 语句会自动处理这种细节,所以你无需担心。

Read More

Python Cookbook3 (1)数据结构与算法

1. 解压序列赋值给多个变量

基本用法很简单,注意的是这种解压赋值可以用在任何可迭代对象上面,而不仅仅是列表或者元组。 包括字符串, 文件对象, 迭代器和生成器。

1
2
a, b, c = "abc"
x1, x2, x3 = range(3) # 我也不知道这有啥用

2. 解压可迭代对象赋值给多个变量

扩展的迭代解压语法是专门为解压不确定个数或任意个数元素的可迭代对象而设计的。星号表达式在迭代元素为可变长元组的序列时是很有用的。星号表达式一定可以得到一个列表,即使没有元素分配给他。

1
2
3
4
5
6
7
8
data = (
('scores', 98,97,99),
('names', 'tom','jack'),
('ages', )
)

for tag, *content in data:
print("{}:{}".format(tag, content))

Read More

本站总访问量