本节将对数值类型涉及到的、常用的内置函数做一个简单介绍,学会了对这些函数的熟练、正确使用,可以极大地提高编程的质量、效率。
1 abs函数
abs(x)
- 该函数返回数字的绝对值;
- 传入的参数可以是数值表达式、整数或者浮点数。
print('“2-8”的绝对值:',abs(2-8))
print('“-3.14”的绝对值:',abs(-3.14))
输出的结果如下所示:
“2-8”的绝对值: 6
“-3.14”的绝对值: 3.14
2 max与min函数
max(x, y, z...)
min((x, y, z...)
- max函数返回给定参数中的最大值;
- min函数返回给定参数中的最小值;
- 传入的参数可以是数值表达式、整数或者浮点数。
print('最大值:',max(-2, 8.9 + 6, 256 - 300, 314, 3.14*10))
print('最小值:',min(-2, 8.9 + 6, 256 - 300, 314, 3.14*10))
输出的结果如下所示:
最大值: 314
最小值: -44
3 round函数
round(x, n)
- 该函数返回传入的x数值(浮点型或整型)的四舍五入值;
- 参数n表示对x进行四舍五入时保留/参考的数位精度;
- 参数n可以不传入,此时其默认值为0,但若传入的话,则必须为整型;
- 当n为0时,返回的结果为整型,n为负整数或正整数时,返回值的数值类型与传入的x数值的类型一样(整型或者浮点型);
- 若n为正整数,则表示四舍五入时保留/参考的小数点后的位数;
- 若n为负整数,-1表示基于十位四舍五入(舍弃个位)、-2表示基于百位四舍五入(舍弃个位和十位),依次类推;
- round返回的是数值(整型或者浮点型),对于数值,我们关注的是准确性,因为数值是用于算术运算的,比如round(31415.0, 2),得到的结果是“31415.0”,是完全符合要求的,既按约定返回了浮点型(因为传入的参数也是浮点型),同时,也完全满足小数点后2位的数位精度(或者说有效位数),因为对于数值来说,“31415.0”与“31415.00”是完全相等的;
- 但需要注意的是:上述谈到的“数值”的有效位或者精准度,与我们平时提到的“保留多少有效位”,两者的概念是不一样的,或者说至少在编程方面,两者是不同层面的事情,前者关注的是“数值”的精准度,后者用于显示或输出,关注的是对数值的字符串格式化;
- 因此,若数值四舍五入后,用于算术表达式计算,我们则采用round函数对数值进行四舍五入处理,要是仅用于按要求保留有效位显示输出,则直接采用字符串格式化输出即可,例如:f'{31415:.2f}',输出为“31415.00”。
如下代码所示,各打印了两个值,前者按round调用后返回的真实数值输出,后者按字符串格式化输出。
print('对3.14159265保留小数点后3位、四舍五入的结果:',round(3.14159265, 3), f'{3.14159265:0.3f}')
print('对31415.9265仅保留整数部分、四舍五入的结果:',round(31415.9265), f'{31415.9265:.0f}')
print('对31415.9265基于百位进行四舍五入的结果:',round(31415.9265, -2), f'{round(31415.9265, -2):.0f}')
print('对31415基于百位进行四舍五入的结果:',round(31415, -2), f'{round(31415, -2):.0f}')
print('对31415参考小数点后2位、四舍五入的结果:',round(31415, 2), f'{31415:.2f}')
print('对31415.0参考小数点后2位、四舍五入的结果:',round(31415.0, 2), f'{31415.0:.2f}')
输出的结果如下所示:
对3.14159265保留小数点后3位、四舍五入的结果: 3.142 3.142
对31415.9265仅保留整数部分、四舍五入的结果: 31416 31416
对31415.9265基于百位进行四舍五入的结果: 31400.0 31400
对31415基于百位进行四舍五入的结果: 31400 31400
对31415参考小数点后2位、四舍五入的结果: 31415 31415.00
对31415.0参考小数点后2位、四舍五入的结果: 31415.0 31415.00
另外,更重要的,对于Python的这个round内置函数我们在使用时要需要注意以下两点:
- 四舍五入运算必然涉及到进位或者不进位,比如,我们对数值x(如1.45)进行四舍五入运算,假设进位得到A(如1.5,保留小数点后1位)、若不进位得到B(如1.4,保留小数点后1位),有时候会出现一种特别情况,x正好在A与B的中间,即离A和B的距离相同,这种情况下一般是碰到了“5”,此时,究竟取A还是取B呢?Python的处理是取“偶数”(如,1.4的最后一位4为偶数),跟我们传统的“五入”做法是不一样的。如下所示:
print('为了促成偶数,放弃“五入”:',round(0.5),round(-0.5),round(2.5),round(125,-1),round(1.45,1))
print('正好促成偶数,保留“五入”:',round(1.5),round(-1.5),round(1.5),round(135,-1),round(1.35,1))
输出的结果如下所示:
为了促成偶数,放弃“五入”: 0 0 2 120 1.4
正好促成偶数,保留“五入”: 2 -2 2 140 1.4
- 而且上述规则还存在另外的挑战,当碰到了“5”且又遇上了特别的浮点数时,情况会变得更加复杂,例如,round(6.675, 2)给出的结果是6.67,而不是按上述规则应该得出的6.68,这并不是Python语言的Bug或问题,而是因为:计算机本身对浮点数进行十进制至二进制转换时,存在着一些十进制小数不能以二进制精确地表示出来(相当于除法中除不断的情况),而计算机用来存储数字的二进制位数是有限的,必然导致后面的数位被舍弃,于是,x(比如,当前的6.675)不再是我们十进制中看到的,离A(即6.68)和B(即6.67)的距离完全相等,而是变小了些,离B更近了,于是被round函数选中了6.67。
print('受计算机精度影响的四舍五入:',round(6.675,2),round(1.355,2))
输出的结果如下所示:
受计算机精度影响的四舍五入: 6.67 1.35
需要说明的是,上述两点特殊情况,对于数值的字符串格式化会产生同样的影响,知道了上述规则和原因后,遇到类似的特殊情况,我们就不会再感到不解或者迷惑了,甚至在特殊的严格场合,我们可能需要进行特殊处理,规避上述情况的发生。如下所示,我们来看看字符串格式化对上述特殊数值的输出情况。
print('旧式格式化操作符:')
print('%.0f %.1f %.2f' % (-0.5,1.45,6.675))
print('%.0f %.1f' % (-1.5,1.35))
print('nstr.format()的格式化:')
print('{:.0f} {:.1f} {:.2f}'.format(-0.5,1.45,6.675))
print('{:.0f} {:.1f}'.format(-1.5,1.35))
print('nf-string格式化:')
print(f'{-0.5:.0f} {1.45:.1f} {6.675:.2f}')
print(f'{-1.5:.0f} {1.35:.1f}')
输出的结果如下所示:
旧式格式化操作符:
-0 1.4 6.67
-2 1.4
str.format()的格式化:
-0 1.4 6.67
-2 1.4
f-string格式化:
-0 1.4 6.67
-2 1.4
4 pow函数
pow(x,y,z)
- 一般通过pow(x,y)调用,返回x的y次幂,此时与幂运算符等价:x ** y;
- 三个参数都必须为数值类型(整型或浮点型);
- 若传入z,则相当于:(x ** y) % z,即对z取余,仅当x、y均为整型,且y必须为非负整数时有效,且强烈建议此种情况下调用该函数,该函数的处理效率远比(x ** y) % z高效。
print('2的3次幂:',pow(2, 3), 2**3)
print('2的-3次幂:',pow(2, -3), 2**-3)
print('2的1/2次幂:',pow(2, 1/2), 2**(1/2))
print('2的-1/2次幂:',pow(2, -1/2), 2**(-1/2))
print('pow(2,10,1000):',pow(2,10,1000), 2**10%1000)
print('***效率比较:***')
%timeit pow(12345,23456,34)
%timeit 12345**23456%34
输出的结果如下所示:
2的3次幂: 8 8
2的-3次幂: 0.125 0.125
2的1/2次幂: 1.4142135623730951 1.4142135623730951
2的-1/2次幂: 0.7071067811865476 0.7071067811865476
pow(2,10,1000): 24 24
***效率比较:***
930 ns ± 15.7 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
5.83 ms ± 78.1 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
5 进制转换函数
bin(x)
oct(x)
hex(x)
- bin用于把传入的整数转换成一个前缀为“0b”的二进制字符串;
- oct用于把传入的整数转换成一个前缀为“0o”的八进制字符串;
- hex用于把传入的整数转换成一个前缀为“0x”的十六进制字符串(采用小写字母);
- 三个函数的传入参数必须为整数(0、正整数或者负整数)或者最终结果为整数的算术表达式;
- 另外,必须注意,三个函数返回的都是字符串,而不是原来的数值(整型)。
Pythonprint('3×5所得结果的二进制表示:',bin(3 * 5))
print('-15的八进制表示:',oct(-15))
print('15的十六进制表示:',hex(15))
x = hex(15) #注意:hex返回的是15这个整数的十六进制字符串,x是字符串类型。
y = 0xf #注意:这里采用的是整数的十六进制表示法(没有引号),y最终是整型。
print("x:",type(x),x)
print("y:",type(y),y)
输出的结果如下所示:
3×5所得结果的二进制表示: 0b1111
-15的八进制表示: -0o17
15的十六进制表示: 0xf
x: <class 'str'> 0xf
y: <class 'int'> 15
6 类型转换函数
int(x,base=10)
float(x)
bool(x)
- int把传入的x转换成整数返回,x可以是数字类型或字符串类型;若x为字符串类型,base参数表示该字符串采用的进制形式,比如2、8、16进制等,默认为10进制;若不传入x,返回0;
- float把传入的x转换成浮点数,x可以是数字类型或字符串类型;若x为字符串类型,其必须采用十进制形式,或者为“inf”(表示正无穷大)、“-inf”(表示负无穷的)、“NaN”(非数字);若不传入x,返回0.0;
- bool对传入的x进行评价测试,返回一个布尔值(True或者False),如果x是假或者不传入x,返回False,其他情况返回True。
print(int(),int(-1.6), int("0xf",16), int("-f",16), int("-15"))
print(float(),float(3), float(-5e-2))
print("字符串转浮点数:", float("-3.14"),float("-5e-2"))
print("特殊浮点数:", float("NaN"), float("-inf"), float("inf"))
print("返回False的情况:", bool(), bool(0), bool(0.0), bool(''))
print("返回True的情况:", bool(2), bool(0.2), bool(' '), bool('inf'), bool('-inf'), bool('NaN'))
输出的结果如下所示:
0 -1 15 -15 -15
0.0 3.0 -0.05
字符串转浮点数: -3.14 -0.05
特殊浮点数: nan -inf inf
返回False的情况: False False False False
返回True的情况: True True True True True True
青少年、零基础、初学者Python编程从入门到精通,“老马带小马 一块学Python”编程系列。