格式化输出小结
Option1: %-formatting
import math
Radius = 3
Area = Radius**2*math.pi
print("周长为%d的圆的面积是%.3f"%(Radius, Area))
输出结果为:
周长为3的圆的面积是28.274
Option2: str.format
import math
Radius = 3
Area = Radius**2*math.pi
print("周长为{0}的圆的面积是{1:.3f}".format(Radius, Area))
输出结果为:
周长为3的圆的面积是28.274
Option3: f-Strings
**import math
Radius = 3
Area = Radius**2*math.pi
print(f"周长为{Radius}的圆的面积是{Area:.3f}")**
输出结果为:
周长为3的圆的面积是28.274
小结
从上面三种风格的格式化输出,我得出以下结论:
- 如果使用%-formatting的形式,需要给出占位符(%d, %f…),并在最后需要用%(parm1, parm2…)的形式给出需要输出的变量
- 如果使用str.format()的形式,需要在str里给出占位符{},并且需要给每个占位符标号,例如{0},{1}…;除此之外,如果还对输出结果有特殊的格式化要求,则需要在序号后面用冒号说明,例如:{1:.3f}表示对该占位符表示变量保留小数点后三位;同样地,最后我们需要在括号()里加入待输出的变量
- 如果使用f-Strings的形式,可以直接在占位符里面给出我们输出的变量,并在冒号后面给出特殊格式化的要求
- 因此Option1和Option2是没有很大差别,但是Option3却显得简单很多,而且代码可读性也大大加强;而且似乎格式化速度上Option3也由比较大的优势,想要深入学习的同学可以参考这篇文章:https://www.cnblogs.com/c-x-a/p/9333826.html
- 因此现在官方都推荐Option3的格式化形式
序列解包小结
容易出现的错误1:ValueError: too many values to unpack
>>> x,y,z = 1,3,4,5
Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
x,y,z = 1,3,4,5
ValueError: too many values to unpack (expected 3)
>>>
这是由于接收个数比输出个数少的原因,因此无法正确解包
容易出现的错误2:ValueError: not enough values to unpack
>>> x, y, z = 1, 2
Traceback (most recent call last):
File "<pyshell#5>", line 1, in <module>
x, y, z = 1, 2
ValueError: not enough values to unpack (expected 3, got 2)
>>>
这是由于接收个数比输出个数多的原因,因此无法正确解包
因此在使用序列解包的时候一定要保证接收和输出的个数相等
当然也有例外的情况,当使用列表切片时,且切片连续时是可以不用相等的!
>>> x = [i for i in range(5)]
>>> x
[0, 1, 2, 3, 4]
>>> x[:3] = map(str, range(6,10))
>>> x
['6', '7', '8', '9', 3, 4]
>>>
使用*对列表和元组进行解包
>>> x = ['6', '7', '8', '9', 3, 4]
>>> print(*x)
6 7 8 9 3 4
>>>
>>> x = ('6', '7', '8', '9', 3, 4)
>>> print(*x)
6 7 8 9 3 4
使用**对字典进行解包
>>> x = {'x':1, 'y':2, **{'z':3, 'a':4}}
>>> x
{'x': 1, 'y': 2, 'z': 3, 'a': 4}
>>>
列表推导式和生成器推导式
>>> [p for p in range(2,100) if 0 not in [p%d for d in range(2, int(p**0.5+1))]]
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
>>>
上述利用列表推导式求出100以内所有素数。
>>> x = (p for p in range(2,100) if 0 not in [p%d for d in range(2, int(p**0.5+1))])
>>> x
<generator object <genexpr> at 0x0000016439F00F48>
>>> print(x)
<generator object <genexpr> at 0x0000016439F00F48>
>>> print(*x)
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
>>>
上述是利用生成器表达式求出100以内的所有素数。可以发现生成器表达式是不可以直接输出的,因此你可以通过将其转化为列表或者元组,或者通过生成器对象__next__方法,或者通过内置函数next()这些方式访问。
>>> x = (p for p in range(2,100) if 0 not in [p%d for d in range(2, int(p**0.5+1))])
>>> x.__next__()
2
>>> next(x)
3
>>>
值得注意的是,生成器访问过的对象便不存在了,因而无法再次访问。
>>> x = (p for p in range(2,100) if 0 not in [p%d for d in range(2, int(p**0.5+1))])
>>> x.__next__()
2
>>> next(x)
3
>>> 3 in x
False
>>> 5 in x
False
>>>
大家一定不难理解3为什么不在x里,但是为什么5也不在x里呢?原因是因为在执行3 in x的时候,已经遍历整个生成器对象,此时生成器对象已经没有任何一个对象了!