一、在字符串中包含不同的数字
在第一章中使用格式说明符将两个字符串连接在一起时,用到了格式说明符%s,它的含义是“一个字符串”。由于数值和字符串有不同的类型,必须使用不同的说明符将数值包含在字符串中:
print("including an intger works with %%d like this:%d" % 10)print("An integer converted to a float with %%f:%f" % 5)print("A normal float with %%f:%f"%1.2345)print("A readlly large number with %%E:%E" % 6.789E10)print("Controlling the number of decimal places shown:%.02f" % 25.101010101)
任何时候,当为字符串提供格式说明符时,可能会有一些选项可以用来控制该说明符如何显示与它相关联的值。数值说明符也是一种约定,指定特定类型的数值应该如何显示。当使用任意数值格式说明符时,这些约定控制着显示的结果。
二、在字符串中将%符号转义。
以前已经给出了另外一个敲门。如果想在程序中打印字符串%d,可以在Python字符串中联想使用两个%符号。这仅当在同一个字符串中还有Python可以替换的有效格式说明符时才是需要的。
print("The %% behaves differently when combined with other letters,like this:%%d %%s %%f %d" % 10)
注意,Python注意字母的组合,它将在一个字符串中既有格式说明符又有双百分号时正确地工作。
三、基本算术
print(5+300)print(399+3020+1+3456)print(300-59994+20)print(4023-22.46)
简单的算术运算看起来和预期的一样。除了+和-,乘法通过*执行,除法通过/执行。由于浮点数和整数的区别,乘法和除法在Python中并没有想象的那么直截了当。
观察下面的数值已经当这些数值达到一定大小时Python时如何提升它们的:
print(2000403030*392381727)print(2000403030*3923817273929)print(2E304*3923817273929)print(2E34*3923817273929)
注意,尽管Python可以处理非常大的数,但是一些操作的结果仍会超过Python的容纳能力。Python在遇到无法处理的大数时将会返回inf,这是infinity(无穷大)的缩写。
在Python3.1之前,在没有帮助的情况下,Python不能够通过除法将一种数转化为另一种数。只有当至少有一个操作数是浮点数(数后有一个小数点)时才显示浮点数结果。如果两个普通的整型或者长整型数(无论是其中的哪种情况,都缺少小树部分,包括.0)相除。目前的Python将显示小数,除非告诉它不要这么做。
print(44/11)print(5.0/2.5)print(324/101)print(324.5/102.9)
一个整数与另外一个整数相除,将显示一个浮点数,即使在没有余数的情况下也是如此。同样的,一个整数除以一个浮点数将返回一个浮点数。然而要注意,即使整型被显示为浮点型,如前面示例中的4.0和2.0,但实际上它仍旧是整型。不过,324/101的结果被转换成一个浮点数。
四、使用取余运算
Python还有一个基本运算应当注意:取余运算。Python一个新增的功能是允许查看一则除法的完整结果(如前面的公式324/101中所示)。以前,如果想知道余数,必须要用取余运算符,因为Python只显示结果的整数部分。对于324/101,Python将显示为3。不过在某些情况下,仍然仅需要除法结果的余数部分。为了确定这部分结果,必须要用取余运算符,符号是%。不必感到困惑,%只有在用于数值的时候才代表余数。当使用字符串时,它仍然表示格式说明符的含义。同样的操作在不同的上下文中有不同的含义,这叫做重载,时一种非常有用的功能,但是当某些操作通过设计而具有不同行为时请不要惊讶。
print(5/3)print(5%3)
上面的代码表示5除以3得1.6666666666666667,而在第二个示例中,当5除以3时余数为2。取余运算符一个非常有用的任务是确定某个数是否可以被另外一个数整除,例如,决定序列中的某些项是否可以均匀地填充到另外一个序列中。这里有一些示例可以尝试:
print(123%44)print(334%13)print(652%4)
五、打印结果
尝试实际打印出结果,将上面具有不同寻常结果的数学公式的结果显示给用户,例如,在某个程序内部就可以采取这种做法:
print("%f" % (4023-22.4))
前面介绍浮点数除法时提到,在Python3.0中会输出整个公式。在计算公式5/3时,会得到1.6666666666667。但是也许并不想向用户显示这么长的一串数值。可以用%f格式说明符将答案截短。
六、%f格式说明符
尝试下面的代码,观察Python处理浮点运算的不同方法,以及如何利用格式化方法操作结果:
print("%f"%(5/3))print("%.2f"%(5/3))print("%f"%(415*20.2))print("%0.f"%(415*20.2))
七、求值顺序
Python以如下方式对这些基本的数学运算求值:先计算乘法和除法,后计算加法和减法。
八、使用数学运算
当考虑一组数学运算时,将他们写下来(或者用键盘输入)看起来最直接,然而以后查看这些运算时很容易感到迷惑。尝试如下示例,设想它们没有括号:
print((24*8))print(24*(8+3))print(24*(8+3+7.0))print(24*(8+3+7.0+9))print(24*(8+3+7.0+9)/19)print(24*(8+3+7+9)/19)print(24*(8+3+7.0+9)%19)
在示例中药注意,使用浮点数时,整个公式会改为使用浮点数,而去掉所有浮点数会导致Python将所有数都看作整型,除非结果是浮点型。
上面的示例以类似于正常求值顺序的方式组合在一起,但是使用圆括号可以肯定哪组代数运算将首先被求值。最里面的运算最先被求值,最外面的运算最后被求值。在一对圆括号内,以正常顺序求值。
九、使用数字格式
例如,尝试下面的示例。这里把一个数值作为钱数打印:
print("$%.02f"%30.0)
也可以用类似的格式表示小于1美分的值,例如当列出单独售价的小件商品时。如果要打印的数值多余即将打印的位数,看看Python将怎么做:
print("$%.03f"% 30.00123)print("$%.03f" % 30.00163)print("%.03f" % 30.1777)print("%.03f" % 30.1113)
如果指定的格式比要求Python显示的精度更高,Python不会截断当前的数。它将适当地进行数学上的四舍五入操作。
十、出错
为了理解错误发生后,接下来会发生什么,这里给出一些可以尝试的示例。
print("%.03f" % (30.113,12))
Traceback (most recent call last):
File"E:/workspace/python/python入门/第二章.py", line 51, in
print("%.03f" % (30.113,12))
TypeError:not all arguments converted during string formatting
在上述代码中,序列中的元素(总共两个)多于字符串中的格式说明符(仅一个),因此Python给出一条帮助信息。这个错误将导致正在运行的程序停止运行,因此这通常是一个出错条件,或者称为异常。这里,词arguments指的是格式说明符,但通常用来代表使某个对象工作所需要的参数。当调用需要指定若干值得函数时,每个期望的值就叫做一个参数。
下面列出另外一个可能发生的错误:
print("%.03f,%f %d" % (30.113,12))
Traceback (most recent call last):
File"E:/workspace/python/python入门/第二章.py", line 51, in
print("%.03f,%f %d" % (30.113,12))
TypeError:not enough arguments for format string
代码中使用了一个格式说明符,但在伴随的序列中并没有一个值可以与之匹配,因此,没有足够多的参数。
如果尝试将字符串和数值相加,也将会出错:
print("This is a string"+4)
Traceback (most recent call last):
File"E:/workspace/python/python入门/第二章.py", line 51, in
print("This is a string"+4)
TypeError: Can't convert'int'object to str implicitly
十一、将数字格式化为八进制和十六进制
print('Octal uses the letter "o" lowercase. %d %o' % (10,10))
将数值10提供给字符串时,第二个数却打印为12,看起来这像是个错误。然而八进制仅仅有8个数值(0~7),因此0~10用八进制表示依次是:0、1、2、3、4、5、6、7、10、11、12。
print('Hex uses the letter "x" or "X".%d %x %X' % (10,10,10))
这有另外一个地方需要解释。十六进制使用0~15的数字,但是因为9以后就没有数字了,所以十六进制用了字符a~f。如果使用格式说明符%x,这些字符是小写的;如果使用%X,它们则是大写的。因此,十进制的0~19用十九进制表示为:0、1、2、3、4、5、6、7、8、9、a、b、c、d、e、f、10、11、12、13。