第4章 基本输入与输出
本章摘要
4-1 Python的辅助说明help( )
4-2 格式化输出数据使用print( )
4-3 输出数据到文件
4-4 数据输入input( )
4-5 处理字符串的数学运算eval( )
4-6 列出所有内建函数dir( )
4-7 专题——温度转换/房贷问题/正五角形面积/计算经纬度距离
本章将介绍如何在屏幕上进行输入与输出,另外也将讲解Python内建的实用功能。
4-1 Python的辅助说明help( )
help( )函数可以列出某一个Python指令或函数的使用说明。
实例:列出输出函数print( )的使用说明。
当然程序语言是全球化的语言,所有说明是以英文为基础,要有一定的英文能力才可彻底了解,不过笔者在本书中会详尽地用中文引导读者入门。
4-2 格式化输出数据使用print( )
相信读者经过前三章的学习,对于使用print( )函数输出数据已经非常熟悉了,现在是时候完整解说这个输出函数的用法了。
4-2-1 函数print( )的基本语法
print( )的基本语法格式如下:
print(value, … , sep=" ", end="\n", file=sys.stdout, flush=False)
value:表示想要输出的数据,可以一次输出多个数据,各数据间以逗号隔开。
sep:当输出多个数据时,可以插入各数据的分隔字符,默认是一个空格。
end:当数据输出结束时所插入的字符,默认是插入换行字符,所以下一次print( )函数的输出会在下一行输出。如果想让下次输出不换行,可以在此设置空字符串,或是空格或是其他字符串。
file:数据输出位置,默认是sys.stdout,也就是屏幕。也可以使用此设置,将输出导入其他文件或设备。
flush:是否清除数据流的缓冲区,默认是不清除。
程序实例ch4_1.py:重新设计ch3_18.py,其中在第二个print( )中两个输出数据的分隔字符是“ $$$”。
执行结果
程序实例ch4_2.py:重新设计ch4_1.py,将两个数据在同一行输出,彼此之间使用Tab键的距离隔开。
执行结果
4-2-2 格式化print( )输出
在使用格式化输出时,基本使用格式如下:
print(" …输出格式区… " % ( 变量系列区, … ))
在上述输出格式区中,可以放置变量系列区相对应的格式化字符,这些格式化字符的基本意义如下。
%d:格式化整数输出。
%f:格式化浮点数输出。
%x:格式化十六进制整数输出。
%X:格式化大写十六进制整数输出。
%o:格式化八进制整数输出。
%s:格式化字符串输出。
%e:格式化科学记数法e的输出。
%E:格式化科学记数法大写E的输出。
程序实例ch4_3.py:格式化输出的应用。
执行结果
设计程序时,在print( )函数内的输出格式区也可以用一个字符串变量取代。
程序实例ch4_4.py:重新设计ch4_3.py,在print( )内用字符串变量取代字符串列,读者可以参考第5行和第6行与原先ch4_3.py的第5行做比较。
执行结果 与ch4_3.py相同。
程序实例ch4_5.py:格式化十六进制和八进制输出的应用。
执行结果
程序实例ch4_6.py:将整数与浮点数分别以%d、%f、%s格式化,同时观察执行结果。特别要注意的是,浮点数以整数%d格式化后,小数数据将被舍去。
执行结果
下列是使用%x和%X格式化数据输出的实例。
下列是使用%e和%E格式化科学记数法数据输出的实例。
4-2-3 精准控制格式化的输出
在上述程序实例ch4_6.py中,我们发现最大的缺点是无法精确地控制浮点数的小数输出位数,print( )函数在格式化过程中,可以让我们设置保留多少格的空间让文件做输出,此时格式化的语法如下。
%(+|-)nd:格式化整数输出。
%(+|-)m.nf:格式化浮点数输出。
%(+|-)nx:格式化十六进制整数输出。
%(+|-)no:格式化八进制整数输出。
%(-)ns:格式化字符串输出。
%(-)m.ns:m是输出字符串宽度,n是显示字符串长度,n小于字符串长度时会有裁减字符串的效果。
%(+|-)e:格式化科学记数法e输出。
%(+|-)E:格式化科学记数法大写E输出。
上述格式对浮点数而言,m代表保留多少格数供输出(包含小数点),n则是小数数据保留格数。至于其他的数据格式,n则是保留多少格数空间,如果保留格数空间不足将完整输出数据,如果保留格数空间太多则数据靠右对齐。
如果是格式化数值数据或字符串数据有加上负号(-),表示保留格数空间有多余时,数据将靠左输出。如果是格式化数值数据有加上正号(+),如果输出数据是正值时,将在左边加上正值符号。
程序实例ch4_7.py:格式化输出的应用。
执行结果
程序实例ch4_8.py:格式化输出,靠左对齐的实例。
执行结果
程序实例ch4_9.py:格式化输出,正值数据将出现正号(+)。
执行结果
程序实例ch4_10.py:格式化输出的应用。
执行结果
下面是格式化科学记数法e和E输出的应用。
对于格式化字符串有一个特别的是使用“%m.n”方式格式化字符串,这时m是保留显示字符串空间,n是显示字符串长度,如果n的长度小于实际字符串长度,会有裁减字符串的效果。
4-2-4 format( )函数
这是Python增强版的格式化输出功能,是字符串使用format方法做格式化的动作,基本使用格式如下:
print(" …输出格式区… " .format( 变量系列区, … ))
在输出格式区内的变量使用“{ }”表示。
程序实例ch4_11.py:使用format( )函数重新设计ch4_3.py。
执行结果 与ch4_3.py相同。
程序实例ch4_12.py:以字符串代表输出格式区,重新设计ch4_11.py。
执行结果 与ch4_3.py相同。
在使用{ }代表变量时,也可以在{ }内增加编号n,此时n将是format( )内变量的顺序,编号从0开始计算,变量多时方便了解变量的顺序。
程序实例ch4_12_1.py:重新设计ch4_12.py,在{ }内增加编号。
执行结果
也可以在format( )内使用具名参数。
程序实例ch4_12_2.py:使用具名参数,重新设计ch4_12_1.py。
执行结果
也可以将4-2-2节所述格式化输出数据的概念应用于format( ),例如,d是格式化整数、f是格式化浮点数、s是格式化字符串等。传统的格式化输出是使用%配合d、s、f,使用format则是使用“:”,可参考下列实例第5行。
程序实例ch4_12_3.py:计算圆面积,同时格式化输出。
执行结果
在使用格式化输出时默认是靠右输出,也可以使用下列参数设置输出对齐方式。
>:靠右对齐
<:靠左对齐
^:居中对齐
程序实例ch4_12_4.py:输出对齐方式的应用。
执行结果
在使用format输出时也可以使用填充字符,字符是放在“:”后面,在<、^、>或指定宽度之前。
程序实例ch4_12_5.py:填充字符的应用。
执行结果
4-2-5 字符串输出与基本排版的应用
适度利用输出格式,可以制作一封排版的信件,以下程序的前3行会先利用sp字符串变量建立一个含40格的空白格数,然后产生对齐效果。
程序实例ch4_12_6.py:有趣排版信件的应用。
执行结果
4-2-6 一个无聊的操作
程序实例ch4_12_6.py第2行,利用空格乘以40产生40个空格,功能是用于排版。如果将某个字符串乘以500,然后用print( )输出,可以在屏幕上建立一个无聊的画面。
实例:在屏幕上建立一个无聊的画面。
上述实例是启发读者活用Python,可以产生许多意外的结果。
4-3 输出数据到文件
在4-2-1节有讲解在print( )函数中,默认输出位置是屏幕(sys.stdout),其实可以利用这个特性将输出导向一个文件。
4-3-1 打开一个文件open( )
open( )函数可以打开一个文件供读取或写入,如果这个函数执行成功,会返回文件流对象,这个函数的基本使用格式如下:
file_Obj = open(file, mode="r")# 只列出最常用的两个参数
file:用字符串列出要打开的文件,如果不指明路径,则打开目前工作文件夹。
mode:打开文件的模式,如果省略代表是mode="r",使用时如果mode="w"或其他,也可以省略“mode=”,直接写“w”。也可以同时具有多项模式,例如,“wb”代表以二进制文件打开供写入,可以是下列基本模式。下列是第一个字母的操作意义。
"r":这是默认值,打开文件供读取(read)。
"w":打开文件供写入,如果原先文件有内容将被覆盖。
"a":打开文件供写入,如果原先文件有内容,新写入数据将附加在后面。
"x":打开一个新的文件供写入,如果所打开的文件已经存在会产生错误。下列是第二个字母的意义,代表文件类型。
"b":打开二进制文件模式。
"t":打开文本文件模式,这是默认值。
file_Obj:这是文件对象,读者可以自行命名,未来print( )函数可以将输出导向此对象,不使用时要关闭file_Obj.close( ),才可以返回操作系统的文件管理器观察执行结果。
4-3-2 使用print( )函数输出数据到文件
程序实例ch4_13.py:将数据输出到文件的实例,其中,输出到out1.txt采用“w”模式,输出到out2.txt采用“a”模式。
执行结果
这个程序执行后需到ch4文件夹查看执行结果内容,如果执行程序一次,可以得到out1.txt和out2.txt内容相同。但是如果持续执行,out2.txt内容会持续增加,out1.txt内容则保持不变,下列是检查文件夹内容。
下列是执行两次此程序后out1.txt和out2.txt的内容。
4-4 数据输入input( )
这个input( )函数功能与print( )函数功能相反,会从屏幕读取用户从键盘输入的数据,它的使用格式如下:
value = input("prompt: ")
value是变量,所输入的数据会存储在此变量内,特别需注意的是所输入的数据不论是字符串或是数值数据返回到value时一律是字符串数据,如果要执行数学运算需要用int( )函数转换为整数。
程序实例ch4_14.py:认识输入数据类型。
执行结果
程序实例ch4_15.py:基本数据输入与运算。
执行结果
接下来的程序主要是处理中文名字与英文名字的技巧,假设要求使用者分别输入姓氏(lastname)与名字(firstname),在中文中要处理成名字,可以使用下列字符串连接方式。
fullname = lastname + firstname
在英文中首先名字在前面,姓氏在后面,同时中间有一个空格,因此处理方式如下:
fullname = firstname + " " + lastname
程序实例ch4_16.py:分别输入中文和英文的姓氏以及名字,本程序将会输出名字组合并输出问候语。
执行结果
4-5 处理字符串的数学运算eval( )
Python内有一个非常好用的计算数学表达式的函数eval( ),这个函数可以直接返回字符串内数学表达式的计算结果。
result = eval(expression) # expression是字符串
程序实例ch4_17.py:输入公式,本程序可以列出计算结果。
执行结果
由上述执行结果可以发现,在第一个执行结果中输入的是“5*9+10”字符串,eval( )函数可以处理此字符串的数学表达式,然后将计算结果返回,同时也可以发现即使此数学表达式之间有空字符也可以正常处理。
Windows操作系统有计算器程序,其实当我们使用计算器输入运算公式时,就可以将所输入的公式用字符串存储,然后使用eval( )方法就可以得到运算结果。在ch4_15.py中input( )所输入的数据是字符串,当时我们使用int( )将字符串转成整数处理,其实也可以使用eval( )配合input( ),直接返回整数数据。
程序实例ch4_18.py:使用eval( )重新设计ch4_15.py 。
执行结果
一个input( )可以读取一个输入字符串,我们可以灵活运用多重指定在eval( )与input( )函数上,然后产生一行输入多个数值数据的效果。
程序实例ch4_19.py:输入3个数字,本程序可以输出平均值,注意输入时各数字间要用“,”隔开。
执行结果
4-6 列出所有内建函数dir( )
阅读至此,相信读者已经使用了许多Python内建的函数了,例如help( )、print( )、input( )等,读者可能想了解到底Python提供哪些内建函数可供我们在设计程序时使用,可以使用下列方式列出Python所提供的内建函数。
dir(_ _ builtins _ _) # 列出Python内建函数
实例:列出Python所有内建函数。
在本书中,笔者会依功能分类将常用的内建函数分别融入各章节主题中,如果读者想了解某一个内建函数的功能,可参考4-1节使用help( )函数。
4-7 专题——温度转换/房贷问题/正五角形面积/利用经纬度计算距离
4-7-1 设计摄氏温度和华氏温度的转换
摄氏温度(Celsius,C)的由来是在标准大气压环境,纯水的凝固点是0℃,沸点是100℃,中间划分100等份,每个等份是摄氏1度。为了纪念瑞典科学家安德斯·摄尔修斯(Anders Celsius)对摄氏温度定义的贡献,所以称为摄氏温度(Celsius)。
华氏温度(Fahrenheit,F)的由来是在标准大气压环境,水的凝固点是32℃、水的沸点是212℃,中间划分180等份,每个等份是华氏1度。为了纪念德国科学家丹尼尔·加布里埃尔·华伦海特(Daniel Gabriel Fahrenheit)对华氏温度定义的贡献,所以称为华氏温度(Fahrenheit)。
摄氏和华氏温度互转的公式如下:
摄氏温度 = ( 华氏温度 – 32 )×5 / 9
华氏温度 = 摄氏温度×( 9 / 5 ) + 32
程序实例ch4_20.py:请输入华氏温度,这个程序会输出摄氏温度。
执行结果
4-7-2 房屋贷款问题
每个人在成长的过程中可能都会经历买房子,第一次住在属于自己的房子中是一个美好的经历,大多数人在这个过程中可能需要向银行贷款。这时会思考需要贷多少钱?贷款年限是多少?银行利率是多少?然后可以利用上述已知资料计算每个月还款金额是多少,同时我们会好奇整个贷款结束究竟还了多少贷款本金和利息。在做这个专题分析时,已知的条件是:
贷款金额:使用loan当变量
贷款年限:使用year当变量
年利率:使用rate当变量
然后需要利用上述条件计算下列结果。
每月还款金额:使用monthlyPay当变量
总共还款金额:使用totalPay当变量
处理这个贷款问题的数学公式如下:
在银行的贷款术语习惯使用年利率,所以碰上这类问题需要将所输入的利率先除以100,这是转成百分比,同时要除以12表示是月利率。可以用下列方式计算月利率,用monthrate当变量。
monthrate = rate / (12*100) # 第5行
为了不让求每月还款金额的数学式变得复杂,将分子(第8行)与分母(第9行)分开计算,第10行是计算每月还款金额,第11行是计算总共还款金额。
程序实例ch4_21.py:请输入贷款金额、贷款年限和年利率,程序会输出每月还款金额和总共还款金额。
执行结果
4-7-3 正五角形面积
在几何学中正五角形边长假设是s,其面积的计算公式如下:
上述计算正五角形面积需要使用数学中的PI,虽然可以使用3.14159代替,不过笔者此处先引导读者学习使用Python的数学模块,有关模块的概念将在第13章说明,此节将先教导读者使用,可以使用“import math”导入此数学模块。
程序实例ch4_22.py:请输入正五角形的边长s,此程序会计算此正五角形的面积。
执行结果
可以将上述概念扩充应用在正多边形面积计算,相关概念可以参考习题13。
4-7-4 利用经纬度计算地球各城市间的距离
地球是圆的,我们可以使用经度和纬度来了解地球上每一个点的位置。有了两个地点的经纬度后,可以使用下列公式计算彼此的距离。
distance = r×acos(sin(x1)×sin(x2)+cos(x1)×cos(x2)×cos(y1-y2))
上述r是地球的半径约6371千米,由于Python的三角函数都是弧度(radians)单位,我们使用上述公式时,需使用math.radian( )函数将角度转成弧度。上述公式西经和北纬是正值,东经和南纬是负值。
经度坐标介于-180°~180°,纬度坐标是-90°~和90°,虽然我们习惯称经纬度,在用小括号表达时却是(纬度, 经度),也就是第一个参数放纬度,第二个参数放经度。
最简单的获得经纬度的方式是打开Google地图,其实打开Google地图后就可以在网址列看到我们目前所在地点的经纬度,选择地点就可以在网址列看到所选地点的经纬度信息,可参考下方左图。
由上图可以知道中国台北车站的经纬度是(25.0452909, 121.5168704),以上概念可以应用于查询世界各地的经纬度,上方右图是中国香港红磡车站的经纬度(22.2838912, 114.173166),程序为了简化小数取4位。
程序实例ch4_23.py:中国香港红磡车站的经纬度信息是(22.2839, 114.1731),中国台北车站的经纬度是(25.0452, 121.5168),请计算中国台北车站至中国香港红磡车站的距离。
执行结果
习题
1. 请重新设计第2章的习题4,将输出方式改为下列方式。(4-2节)
2. 扩充ch4_10.py,最右边增加平均分数字段,这个字段的格式化方式是%4.1f,相当于取到小数第1位。(4-2节)
3. 设计前一个程序,输出到out.txt,最后用记事本显示执行结果,下列是执行画面。(4-3节)
下列是验证out.txt结果。
4. 写一个程序,要求用户输入3位数数字,最后舍去个位数字输出,例如,输入是777输出是770,输入是879输出是870。(4-4节)
5. 请重新设计ch4_20.py,改为输入摄氏温度,转成华氏温度输出,输出温度格式化到小数第1位。(4-4节)
6. 输入厘米,转成英寸输出,输出格式化到小数第1位。提示:1英寸约是2.54厘米。(4-4节)
7. 输入英寸,转成厘米输出,输出格式化到小数第1位。提示:1英寸约是2.54厘米。(4-4节)
8. 请重新设计ch2_5.py,将年利率和存款年数改为从屏幕输入,输出金额舍去小数相当于单位是元。(4-4节)
9. 请重新设计第2章的习题5,将火箭飞行速度改为从屏幕输入,输出舍去小数。(4-4节)
10. 请重新设计ch3_24.py,将速度speed改为从屏幕输入马赫数,程序会将速度马赫数转为千米/小时,然后才开始运算。(4-4节)
11. 请重新设计程序实例ch3_26.py,计算两个点之间的距离,但是将点的坐标改为从屏幕输入,一行需可以输入x和y坐标,输出到小数第2位。(4-5节)
12. 前一个习题的扩充,平面任意3个点可以产生三角形,请输入任意3个点的坐标,可以使用下列公式计算此三角形的面积。假设三角形各边长是dist1、dist2、dist3。(4-5节)
13. 在4-7-3节介绍了正五角形的面积计算公式,可以将该公式扩充为正多边形面积计算,如下所示。(4-7节)
14. 请扩充ch4_23.py,将程序改为输入两个地点的经纬度,本程序可以计算这两个地点的距离。(4-7节)
15. 假设一架飞机起飞的速度是v,飞机的加速度是a,下列是飞机起飞时所需的跑道长度公式。(4-7节)
请输入飞机时速(米/秒)和加速速(米/秒),然后列出所需跑道长度(米)。
16. 北京故宫博物院的经纬度信息大约是(39.9196, 116.3669),法国巴黎罗浮宫的经纬度大约是(48.8595, 2.3369),请计算这两个博物馆之间的距离。(4-7节)