![Python实战指南:手把手教你掌握300个精彩案例](https://wfqqreader-1252317822.image.myqcloud.com/cover/214/44510214/b_44510214.jpg)
1.3 input与print函数
案例7 接收键盘输入
导语
input函数会等待键盘输入,并以字符串类型返回输入的内容(去除末尾的换行符或回车符)。
input函数有一个可选的prompt参数,此参数可以设置一个字符串,主要起到提示的作用,例如“请输入一个整数”“请输入用户名”等。当输入完成后,input函数所返回的字符串内容不包括prompt参数所指定的内容。
操作流程
步骤1:下面代码等待键盘输入,并在屏幕上打印出刚刚输入的内容。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P27_80034.jpg?sign=1738960304-Wxh7EYVXo8RguzGq1rH5BedYYHJcfhqS-0-7491d8056af16ddf9fa1c5b88e29f7ac)
代码运行后,用键盘输入字符串“abcde”,然后按下回车键,屏幕显示内容如下:
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P27_80035.jpg?sign=1738960304-LLzw6NEbIDk54tSlQt5Hjkmeqs18WI22-0-fd3fe367c7a9e6c2600472e1c918f2ee)
步骤2:为了让用户能够了解应输入的内容,还可以适当添加提示信息。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P27_80036.jpg?sign=1738960304-EactGr8ICXQWvkHEVzZ1jYELwBD290Me-0-c3a5691b8d12a4a450b67b6c1943529b)
在运行之后,屏幕上会显示“请输入你的名字:”,然后用户可以在这个提示之后输入内容。结果如下:
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P28_80038.jpg?sign=1738960304-FdSRdtjNrrGRhWeaquGl1PARU4FDGUUr-0-fffbc69a4a0f5e3a09fb851fef706877)
从输出结果也能看到,input函数所返回的内容中并没有包含提示信息部分。
案例8 打印屏幕消息
导语
print函数的功能是将字符串信息写入文本流中,其原型如下:
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P28_80039.jpg?sign=1738960304-wthQGBYAE0N71ufpdFTYY2TJShILMncy-0-5670256cd8c05793e46a6ba5917a0f9d)
objects参数是一组序列,它的个数是不确定的,可以传递任意类型的对象,然后会将它们转换为字符串表达式,并且以sep参数的值为分隔符,最后追加上end参数的值。
objects是位置参数,传递值时按次序写入即可;sep、end、file、flush参数为关键字参数,传递时必须指定参数名。例如
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P28_80040.jpg?sign=1738960304-nB5XR3MaXXdySlRILbD1GzYo16AGDfdF-0-c513f7d904436b28f3e7db43c8ec22e4)
“123”和“456”是要写进文本流的内容,这些内容以制表位符(\t)为分隔符,最后以换行符(\r与\n连用,\r是回车符)结尾。file参数指定要写入的文本流对象,此处假设是某个文本文件,其代理对象为my_file。
file参数如果忽略,那么默认就会将文本输出到标准输出流(sys.stdout),在应用程序中,标准输出一般是控制台窗口。因此,以默认参数调用print函数就可以直接把文本消息输出到屏幕上。
操作流程
步骤1:声明三个变量,依次赋值的类型为整型、浮点型和字符串。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P28_79970.jpg?sign=1738960304-c05raKP3sjGipoZhiUXxOfEvTCNUdQVS-0-aedcd58671cfa1bd49129dd1425347b5)
步骤2:调用print函数输出三个变量到控制台屏幕。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P28_80041.jpg?sign=1738960304-OwVESw2xzUtdA4MUrn6PUNUL3GK2yt10-0-df858883ba1ef75cada231ef73dd315e)
print函数默认以空格来分隔要输出的对象,并在末尾追加换行符。
步骤3:声明四个变量,并用字符串案例赋值。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P29_80043.jpg?sign=1738960304-PmKdJI1x9UdFo5UlQM4aBXE4YL6jtFi1-0-d03e2389e6c54b3c36c17653c2422c5c)
步骤4:调用print函数将以上四个变量输出,以中文的顿号(、)为分隔符。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P29_80044.jpg?sign=1738960304-vGtJWSsv4sXWKh87bAp1rmRqwtG36Cs5-0-489a7897932985ee783676aa5ea1cbae)
步骤5:以上代码执行后输出结果如下:
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P29_80045.jpg?sign=1738960304-hFu1MrIP5aqlOSyDfS97ZUfFGWneqtBc-0-c36e5da764a47b46bb278c513fb7cde6)
案例9 打印进度条
导语
在实际的程序开发中,经常会执行一些比较消耗时间的任务(例如从网络中下载一个文件),为了让用户知道应用程序仍在工作,应当实时报告任务的执行进度。
输出实时进度条的方法有多种,例如,向标准输出流的缓冲区中写入不带换行符(\n)结尾的文本,然后当下次更新进度时将缓冲区中的内容清除(可通过写入退格符\b来移除),然后再写入新的文本。本案例采用的是一种更简单的方法——在进度指示文本前面加上一个回车符(即\r),使正在缓冲区中的文本另起一行并把光标移到行首。而控制台屏幕始终只显示最后一行文本。从表面上,人们就能感觉到进度条在动,而实际上应用程序只是将进度信息一行一行地进行输出,但除最后一行外其他的行被隐藏了。
本案例通过range函数产生一组从1到30的整数,然后以for循环逐个执行,并在每一轮循环中输出实时进度条。
操作流程
步骤1:调用range函数,产生一个包含从1到30的整数序列。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P29_80046.jpg?sign=1738960304-aQqZyj0t48UBbUWSoGBInKQ69vDf6zRA-0-5e670f2952d92725a0e797f91e30618e)
由于range函数在产生整数序列时只包含初值,并不包含终值。因此,要让产生的序列中包含数值30,终值应设定为31。
步骤2:本例假定要显示的进度条的字符串总宽度为25。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P29_80047.jpg?sign=1738960304-kJLRTRWxVKSZkSbxGJFMJfsUjIrOelWd-0-048aee9403dba7f21588801ffefd776d)
步骤3:进入for循环,并实时打印进度条。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P30_79974.jpg?sign=1738960304-7oMOFHo6rLNlKcKiDN3xFrFzMb1lnuAU-0-912958e0e57b6740b5a5b6e5b8474666)
在每一轮for循环中,调用一下time.sleep函数,让线程暂停一段时间,用来模拟执行耗时代码。
进度条的样式为:用“>”字符来表示实际进度,其余的字符用“-”字符来填充。ljust方法的作用是让字符串左对齐,剩下的空间则用指定的字符去填充,本例中使用“-”填充字符串的剩余宽度。
格式控制符“.0%”的含义是把浮点数值转换为百分比(乘以100,并在后面加上符号“%”),“.0”用于去掉小数位部分(保留0位小数)。
步骤4:运行上述代码,会输出如下的进度条。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P30_80049.jpg?sign=1738960304-1iLEb6kY1yxnqJcqQukHmGZVUP7yosNE-0-b3272186c679e934a4467717433be90c)
当所有进度更新完毕后,就会变成
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P30_80050.jpg?sign=1738960304-2P1myOqcQ22gwrws0j5SagInYgjCedsz-0-6160ece49f99413713391492398cf418)
应用程序实际的内容如下。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P30_79976.jpg?sign=1738960304-hzYX8CKPyzEhXeMFmDraIo0ywp4onHXU-0-c3e04a820d043bd58d16a39629cfa594)
但每一次写入缓冲区后,用户只看到最后一行,前面的行被隐藏了。
案例10 将文本打印到文件中
导语
print函数有一个关键字参数file,默认使用标准输出流(sys.stdout)。如果file参数引用一个文件对象,那么,文本内容会直接写入文件,而不是打印到屏幕上。
操作流程
步骤1:创建文件对象,新文件名为test.txt。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P31_80052.jpg?sign=1738960304-GRTtzhiVCo1ejXGr0f76HzA635urthFk-0-31ba14eb20f60532ff93d4b3fe44206b)
open函数调用后,返回一个经过内部模块封装的对象案例,案例类型取决于mode参数。如本例中,“wt”中的w表示应用程序请求具有写入文件的权限,如果只想读取文件,可以指定为r,t表示以文本形式读写文件,如果以二进制形式读写文件则指定为b。以文本形式读写文件时,返回的对象类型为_io.TextIOWrapper;以二进制形式读写文件时则返回的对象为_io.BufferedWriter类型。
步骤2:通过print函数向文件写入三行文本。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P31_80053.jpg?sign=1738960304-KK7PTT8zoOeiiQOnLtE7KEnoUd24tfBT-0-31ef0dfdb026008300532ffc33a0f1ed)
注意:print函数默认将文本输出到标准输出流,所以这里要明确指定file参数引用要写入的文件对象。
步骤3:当文件读写完毕后,应当调用close方法将其关闭,释放其占用的资源。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P32_80055.jpg?sign=1738960304-6psPNPygI8lmis0ihhNcqVEbJ5fnRr8z-0-dafa83551844f34287a98fc0bd6192ef)
文件对象支持自动管理上下文引用,可以把文件对象的获取代码写入with语句块中,当语句块执行完成后会自动关闭文件对象。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P32_80056.jpg?sign=1738960304-aJqiUJUfUUwaUMVCU5MeGgXCYFHkyVCi-0-730151b253f0b16cd54a8b02d21e81f6)
案例11 打印文本时使用分隔符
导语
print函数的sep参数用来指定被打印对象之间的分隔符,默认使用空格。在调用print函数时,可以通过给sep参数赋值来自定义分隔字符。
操作流程
步骤1:使用“#”作为分隔符,打印两个字符串对象。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P32_80057.jpg?sign=1738960304-ka6MQYWOqfkoJsyuWKBAL3ABa1Jji5Ly-0-85de93aa07f0ce55ce9e31be5f7646aa)
输出结果为
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P32_80058.jpg?sign=1738960304-xgBt3h6wbLwB4Fyii24RET2RTc8Jkx7w-0-fbb112f8003a23911d79213c0f7687c7)
步骤2:使用换行符来分隔字符串。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P32_80059.jpg?sign=1738960304-hAMeA9zUwNTK0QBGYF5Erra8U6rE5ZNX-0-8754347dade82b8ae415c0e126619434)
输出结果为
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P32_80060.jpg?sign=1738960304-pk1g92SPvzXwNDnjHoAn5irmxroD2hE9-0-e929e5ba9ae713470a682a0d17412163)
步骤3:使用“->”作为分隔符,打印四个字符串对象。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P32_80062.jpg?sign=1738960304-AFcRfdS2V5Ab19Idwgg8UCZu04orTa6S-0-7662cefb121436945d92a9a4590cb53d)
输出结果为
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P32_80063.jpg?sign=1738960304-WBg5WjZeY2A7BA1a7oTzQ5yOULUrsXOj-0-72b135b7a86e7c8f752b894c8dcff54a)
注意:sep参数并非只能指定单个字符,它允许的类型是字符串,因此,该参数可以指定多个字符作为分隔符。
案例12 使用sys.stdout打印文本
导语
使用sys模块下的stdout对象(默认的标准输出流)也可以将文本信息打印到屏幕上。不过,stdout与print函数不同,它不会自动追加换行符,也不会自动插入分隔符,而且只接收字符串类型的参数。
操作流程
步骤1:Python程序在使用某个对象前,必须先将该对象所在的模块导入当前代码的名称空间中。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P33_80065.jpg?sign=1738960304-CGhwyq8Qk64D4jOsCNVo4u5HLzVQGDDZ-0-da8701fe4bebb6f1de181254be4c2ecf)
此语句的含义是从sys模块中把stdout对象导入。
步骤2:调用stdout对象的write方法写入要打印的文本。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P33_80066.jpg?sign=1738960304-gQrRhWVR4QxApzjsGK9vNq9tLbck6Rip-0-fc1f8d195540039106b71b79a6cdc15b)
write方法不会在字符串的末尾追加换行符,所以,如果需要换行,必须明确加上“\n”字符。
步骤3:再写入一个字符串对象,并让它居中对齐。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P33_80067.jpg?sign=1738960304-biwlE6nn8En8sGUr9mg2PnsiGdaVT03c-0-c12b335d0b28369d8e3da033e6dec386)
让字符串居中对齐,要调用str类的案例方法center。center方法的width参数指定整个字符串的总宽度,本例中设定为30个字符;fillchar指定用来填充剩余宽度的字符,在本例中,文本内容的宽度小于30个字符,居中对齐后,左右两端的剩余空间将由“=”来填充。
上述代码的运行效果如下
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P33_80068.jpg?sign=1738960304-dydVDimwwrCyZidKSHMwNQzvafHKCOKE-0-b463bc5895a164a4bfe6446feee5b521)
注意:使用from<模块名>import<对象名>导入的对象会复制到当前代码的名称空间中,可以直接用对象名来访问(如本例中,可以用stdout来访问sys.stdout对象)。如果使用import<模块名>语句来导入,那么在访问对象时需要加上模块名。本例中,若导入模块的代码改为:
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P34_80072.jpg?sign=1738960304-OsmnjexH3w7zgUrTv5GZfY6HAkh16AP7-0-930c34ecd948b4a53cdccb30bd2d4adf)
那么,在访问stdout对象时应该加上模块名称,即
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P34_80073.jpg?sign=1738960304-vF6oxzNprJoLKEBsRce9gYI2bOm97zuR-0-f2b43f457555d72b1bc0b4697050c831)