
1.3 input与print函数
案例7 接收键盘输入
导语
input函数会等待键盘输入,并以字符串类型返回输入的内容(去除末尾的换行符或回车符)。
input函数有一个可选的prompt参数,此参数可以设置一个字符串,主要起到提示的作用,例如“请输入一个整数”“请输入用户名”等。当输入完成后,input函数所返回的字符串内容不包括prompt参数所指定的内容。
操作流程
步骤1:下面代码等待键盘输入,并在屏幕上打印出刚刚输入的内容。

代码运行后,用键盘输入字符串“abcde”,然后按下回车键,屏幕显示内容如下:

步骤2:为了让用户能够了解应输入的内容,还可以适当添加提示信息。

在运行之后,屏幕上会显示“请输入你的名字:”,然后用户可以在这个提示之后输入内容。结果如下:

从输出结果也能看到,input函数所返回的内容中并没有包含提示信息部分。
案例8 打印屏幕消息
导语
print函数的功能是将字符串信息写入文本流中,其原型如下:

objects参数是一组序列,它的个数是不确定的,可以传递任意类型的对象,然后会将它们转换为字符串表达式,并且以sep参数的值为分隔符,最后追加上end参数的值。
objects是位置参数,传递值时按次序写入即可;sep、end、file、flush参数为关键字参数,传递时必须指定参数名。例如

“123”和“456”是要写进文本流的内容,这些内容以制表位符(\t)为分隔符,最后以换行符(\r与\n连用,\r是回车符)结尾。file参数指定要写入的文本流对象,此处假设是某个文本文件,其代理对象为my_file。
file参数如果忽略,那么默认就会将文本输出到标准输出流(sys.stdout),在应用程序中,标准输出一般是控制台窗口。因此,以默认参数调用print函数就可以直接把文本消息输出到屏幕上。
操作流程
步骤1:声明三个变量,依次赋值的类型为整型、浮点型和字符串。

步骤2:调用print函数输出三个变量到控制台屏幕。

print函数默认以空格来分隔要输出的对象,并在末尾追加换行符。
步骤3:声明四个变量,并用字符串案例赋值。

步骤4:调用print函数将以上四个变量输出,以中文的顿号(、)为分隔符。

步骤5:以上代码执行后输出结果如下:

案例9 打印进度条
导语
在实际的程序开发中,经常会执行一些比较消耗时间的任务(例如从网络中下载一个文件),为了让用户知道应用程序仍在工作,应当实时报告任务的执行进度。
输出实时进度条的方法有多种,例如,向标准输出流的缓冲区中写入不带换行符(\n)结尾的文本,然后当下次更新进度时将缓冲区中的内容清除(可通过写入退格符\b来移除),然后再写入新的文本。本案例采用的是一种更简单的方法——在进度指示文本前面加上一个回车符(即\r),使正在缓冲区中的文本另起一行并把光标移到行首。而控制台屏幕始终只显示最后一行文本。从表面上,人们就能感觉到进度条在动,而实际上应用程序只是将进度信息一行一行地进行输出,但除最后一行外其他的行被隐藏了。
本案例通过range函数产生一组从1到30的整数,然后以for循环逐个执行,并在每一轮循环中输出实时进度条。
操作流程
步骤1:调用range函数,产生一个包含从1到30的整数序列。

由于range函数在产生整数序列时只包含初值,并不包含终值。因此,要让产生的序列中包含数值30,终值应设定为31。
步骤2:本例假定要显示的进度条的字符串总宽度为25。

步骤3:进入for循环,并实时打印进度条。

在每一轮for循环中,调用一下time.sleep函数,让线程暂停一段时间,用来模拟执行耗时代码。
进度条的样式为:用“>”字符来表示实际进度,其余的字符用“-”字符来填充。ljust方法的作用是让字符串左对齐,剩下的空间则用指定的字符去填充,本例中使用“-”填充字符串的剩余宽度。
格式控制符“.0%”的含义是把浮点数值转换为百分比(乘以100,并在后面加上符号“%”),“.0”用于去掉小数位部分(保留0位小数)。
步骤4:运行上述代码,会输出如下的进度条。

当所有进度更新完毕后,就会变成

应用程序实际的内容如下。

但每一次写入缓冲区后,用户只看到最后一行,前面的行被隐藏了。
案例10 将文本打印到文件中
导语
print函数有一个关键字参数file,默认使用标准输出流(sys.stdout)。如果file参数引用一个文件对象,那么,文本内容会直接写入文件,而不是打印到屏幕上。
操作流程
步骤1:创建文件对象,新文件名为test.txt。

open函数调用后,返回一个经过内部模块封装的对象案例,案例类型取决于mode参数。如本例中,“wt”中的w表示应用程序请求具有写入文件的权限,如果只想读取文件,可以指定为r,t表示以文本形式读写文件,如果以二进制形式读写文件则指定为b。以文本形式读写文件时,返回的对象类型为_io.TextIOWrapper;以二进制形式读写文件时则返回的对象为_io.BufferedWriter类型。
步骤2:通过print函数向文件写入三行文本。

注意:print函数默认将文本输出到标准输出流,所以这里要明确指定file参数引用要写入的文件对象。
步骤3:当文件读写完毕后,应当调用close方法将其关闭,释放其占用的资源。

文件对象支持自动管理上下文引用,可以把文件对象的获取代码写入with语句块中,当语句块执行完成后会自动关闭文件对象。

案例11 打印文本时使用分隔符
导语
print函数的sep参数用来指定被打印对象之间的分隔符,默认使用空格。在调用print函数时,可以通过给sep参数赋值来自定义分隔字符。
操作流程
步骤1:使用“#”作为分隔符,打印两个字符串对象。

输出结果为

步骤2:使用换行符来分隔字符串。

输出结果为

步骤3:使用“->”作为分隔符,打印四个字符串对象。

输出结果为

注意:sep参数并非只能指定单个字符,它允许的类型是字符串,因此,该参数可以指定多个字符作为分隔符。
案例12 使用sys.stdout打印文本
导语
使用sys模块下的stdout对象(默认的标准输出流)也可以将文本信息打印到屏幕上。不过,stdout与print函数不同,它不会自动追加换行符,也不会自动插入分隔符,而且只接收字符串类型的参数。
操作流程
步骤1:Python程序在使用某个对象前,必须先将该对象所在的模块导入当前代码的名称空间中。

此语句的含义是从sys模块中把stdout对象导入。
步骤2:调用stdout对象的write方法写入要打印的文本。

write方法不会在字符串的末尾追加换行符,所以,如果需要换行,必须明确加上“\n”字符。
步骤3:再写入一个字符串对象,并让它居中对齐。

让字符串居中对齐,要调用str类的案例方法center。center方法的width参数指定整个字符串的总宽度,本例中设定为30个字符;fillchar指定用来填充剩余宽度的字符,在本例中,文本内容的宽度小于30个字符,居中对齐后,左右两端的剩余空间将由“=”来填充。
上述代码的运行效果如下

注意:使用from<模块名>import<对象名>导入的对象会复制到当前代码的名称空间中,可以直接用对象名来访问(如本例中,可以用stdout来访问sys.stdout对象)。如果使用import<模块名>语句来导入,那么在访问对象时需要加上模块名。本例中,若导入模块的代码改为:

那么,在访问stdout对象时应该加上模块名称,即
