![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=1739299183-W9Y01he3F4L4SsSgR8P8wZQWMUl52urw-0-5b90564c7f9da895c28451f677fbc2d2)
代码运行后,用键盘输入字符串“abcde”,然后按下回车键,屏幕显示内容如下:
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P27_80035.jpg?sign=1739299183-dh5sIRWGLsKImcjZESmeXdQYfpzz1Vva-0-336a7981c71aa11a46c2bc791b347599)
步骤2:为了让用户能够了解应输入的内容,还可以适当添加提示信息。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P27_80036.jpg?sign=1739299183-cJpHQiCDvqPo5wu1FHqhxE57pDPG4bQX-0-86e125377e6a62cbd1d6d1be070fa1e2)
在运行之后,屏幕上会显示“请输入你的名字:”,然后用户可以在这个提示之后输入内容。结果如下:
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P28_80038.jpg?sign=1739299183-acL8lCJmws5JNodAUzJeeMfNujruoIFp-0-e1d12934e5e9bf39039af0a826181f28)
从输出结果也能看到,input函数所返回的内容中并没有包含提示信息部分。
案例8 打印屏幕消息
导语
print函数的功能是将字符串信息写入文本流中,其原型如下:
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P28_80039.jpg?sign=1739299183-GPDo0aWCaPeeEtOO3MT1bb6ZXJhWK5Jl-0-14b8c7aa9afa22814067537e24cb8a44)
objects参数是一组序列,它的个数是不确定的,可以传递任意类型的对象,然后会将它们转换为字符串表达式,并且以sep参数的值为分隔符,最后追加上end参数的值。
objects是位置参数,传递值时按次序写入即可;sep、end、file、flush参数为关键字参数,传递时必须指定参数名。例如
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P28_80040.jpg?sign=1739299183-FwO78493nUM5TjC6Xm9HkV5xa6xBZCWO-0-71c7a39bb5403adb45f45d73cc11d5c1)
“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=1739299183-B1MpclvMpzIb2p36u1E43W17adJKdMgt-0-32c3cb9a7d3fd9dcd29d804ea20ff719)
步骤2:调用print函数输出三个变量到控制台屏幕。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P28_80041.jpg?sign=1739299183-Q6ZYoxmdCWvfed8gzQ9j9eORZ880OIai-0-fa957b5fe9af855a7e0c51f569f084d5)
print函数默认以空格来分隔要输出的对象,并在末尾追加换行符。
步骤3:声明四个变量,并用字符串案例赋值。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P29_80043.jpg?sign=1739299183-MNpgACpGBp3ervIdHryzFocn9N30DVnZ-0-a6597a98350ab7636d512b4a787dacc3)
步骤4:调用print函数将以上四个变量输出,以中文的顿号(、)为分隔符。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P29_80044.jpg?sign=1739299183-AAxIaGqCsLoAnYo71JRGd84nh5VXFddk-0-02468718bb33dbc91c4fdc6f2699b1e2)
步骤5:以上代码执行后输出结果如下:
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P29_80045.jpg?sign=1739299183-CjWwCWGB9CNTnsJTkNgwV5suuqlvLL5z-0-5008fb87a6eaa41425e5f2398968cdec)
案例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=1739299183-PEzU6GBcbXrJS2KSJd0bKHvS8HC2f9ur-0-abb62784cb5ec5c2efd3c8baed166ae7)
由于range函数在产生整数序列时只包含初值,并不包含终值。因此,要让产生的序列中包含数值30,终值应设定为31。
步骤2:本例假定要显示的进度条的字符串总宽度为25。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P29_80047.jpg?sign=1739299183-ENon4EqI2Xd25IoIOTq0T18ZinMz0H22-0-2d03f5bc9f5c0e4ddf58ad5c8644be88)
步骤3:进入for循环,并实时打印进度条。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P30_79974.jpg?sign=1739299183-LA6VzS0x6WqrPcSTDEhlUVyVwKPNY4tX-0-f2b99dbcc5dc415a94f149badbfaf53d)
在每一轮for循环中,调用一下time.sleep函数,让线程暂停一段时间,用来模拟执行耗时代码。
进度条的样式为:用“>”字符来表示实际进度,其余的字符用“-”字符来填充。ljust方法的作用是让字符串左对齐,剩下的空间则用指定的字符去填充,本例中使用“-”填充字符串的剩余宽度。
格式控制符“.0%”的含义是把浮点数值转换为百分比(乘以100,并在后面加上符号“%”),“.0”用于去掉小数位部分(保留0位小数)。
步骤4:运行上述代码,会输出如下的进度条。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P30_80049.jpg?sign=1739299183-F0KlZzuVn8n7kOWb4fmzpGhprMyri31p-0-feda31bb9aec48f89df8e84ca8f656d8)
当所有进度更新完毕后,就会变成
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P30_80050.jpg?sign=1739299183-disdNaerHSFpkPk0OmdPyjctzPv0XQGp-0-a09201c3d7c954af6b82e7d0d7b9c398)
应用程序实际的内容如下。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P30_79976.jpg?sign=1739299183-gf83OVV9mHlS43fr8cKeIgJPeT9tLtfV-0-6c972540e10a18d9360f1f41e8fd8a32)
但每一次写入缓冲区后,用户只看到最后一行,前面的行被隐藏了。
案例10 将文本打印到文件中
导语
print函数有一个关键字参数file,默认使用标准输出流(sys.stdout)。如果file参数引用一个文件对象,那么,文本内容会直接写入文件,而不是打印到屏幕上。
操作流程
步骤1:创建文件对象,新文件名为test.txt。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P31_80052.jpg?sign=1739299183-tn9mTeqFyDnZlB7Nqm8KxGwJ6qOGFwJV-0-aedd6e1a422d7ae562117dc51cd64138)
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=1739299183-hKIkl7GLCeFjfDirRQLGYasxXGAOOpKt-0-b0469eb8074f82a312303f61ccd61c4d)
注意:print函数默认将文本输出到标准输出流,所以这里要明确指定file参数引用要写入的文件对象。
步骤3:当文件读写完毕后,应当调用close方法将其关闭,释放其占用的资源。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P32_80055.jpg?sign=1739299183-XdfB2erSghkukrOkGCTKwfwzBrDGngy1-0-caba5f9ffa90cd29cf28a307f5f4dc81)
文件对象支持自动管理上下文引用,可以把文件对象的获取代码写入with语句块中,当语句块执行完成后会自动关闭文件对象。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P32_80056.jpg?sign=1739299183-cGRHl1ZgxfJrY56gc3WHbXjJeQPkWdMD-0-cb7dcd0a62f730001b38e9cafc2abf8a)
案例11 打印文本时使用分隔符
导语
print函数的sep参数用来指定被打印对象之间的分隔符,默认使用空格。在调用print函数时,可以通过给sep参数赋值来自定义分隔字符。
操作流程
步骤1:使用“#”作为分隔符,打印两个字符串对象。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P32_80057.jpg?sign=1739299183-eGrmt5TQvmpiE86Mm8G1i0HbfrangyIf-0-d6cce4aa65d83753e9119243f112f2b3)
输出结果为
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P32_80058.jpg?sign=1739299183-URZYwSKXtpe365tuT2JtTfcWjvRqwG5G-0-cd9dc8cfa74ee97dec65f8d8bbe9524f)
步骤2:使用换行符来分隔字符串。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P32_80059.jpg?sign=1739299183-gN4OPzlzMbLrcKJhtfHHOXC0sVo6iFXK-0-cc68b4ef69d0485cbb37d8ca78c76470)
输出结果为
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P32_80060.jpg?sign=1739299183-FvWs1UZ0ieCtbqBbo0AOs3bJB1XGVSHc-0-9c90e96c3d7af1bccce7cc867e97b748)
步骤3:使用“->”作为分隔符,打印四个字符串对象。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P32_80062.jpg?sign=1739299183-E7nj3YBEvWs8UgQoWx1wdBDv7XdoKCsI-0-51cd457619e4156c67a0f90746a65f1e)
输出结果为
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P32_80063.jpg?sign=1739299183-WpHlQdFyVFz55BgwO6BqQYAJlX0zV6Vd-0-3f682a067522ee26960472a67c0a615a)
注意:sep参数并非只能指定单个字符,它允许的类型是字符串,因此,该参数可以指定多个字符作为分隔符。
案例12 使用sys.stdout打印文本
导语
使用sys模块下的stdout对象(默认的标准输出流)也可以将文本信息打印到屏幕上。不过,stdout与print函数不同,它不会自动追加换行符,也不会自动插入分隔符,而且只接收字符串类型的参数。
操作流程
步骤1:Python程序在使用某个对象前,必须先将该对象所在的模块导入当前代码的名称空间中。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P33_80065.jpg?sign=1739299183-GJO3WXgSI6LS9YU5X23GucqFimOJECwf-0-4b5fb857a2236c7a9f198caa32e694f0)
此语句的含义是从sys模块中把stdout对象导入。
步骤2:调用stdout对象的write方法写入要打印的文本。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P33_80066.jpg?sign=1739299183-hH6pAeo4cCl9pXZleTkQQxktqmsuvFYu-0-91dda797b26eaac0a5c3cc213b91a237)
write方法不会在字符串的末尾追加换行符,所以,如果需要换行,必须明确加上“\n”字符。
步骤3:再写入一个字符串对象,并让它居中对齐。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P33_80067.jpg?sign=1739299183-CcJrcMHXMedT0JiPsVuqa2WKsli5wEgq-0-bbbd7aa2f3e78bc6d512f033b02eee99)
让字符串居中对齐,要调用str类的案例方法center。center方法的width参数指定整个字符串的总宽度,本例中设定为30个字符;fillchar指定用来填充剩余宽度的字符,在本例中,文本内容的宽度小于30个字符,居中对齐后,左右两端的剩余空间将由“=”来填充。
上述代码的运行效果如下
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P33_80068.jpg?sign=1739299183-kN5758aRGSNdyhVotdMlM5LK3iGZdo9w-0-8dc4053ec3184c14a3f2da5b29b3ec1e)
注意:使用from<模块名>import<对象名>导入的对象会复制到当前代码的名称空间中,可以直接用对象名来访问(如本例中,可以用stdout来访问sys.stdout对象)。如果使用import<模块名>语句来导入,那么在访问对象时需要加上模块名。本例中,若导入模块的代码改为:
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P34_80072.jpg?sign=1739299183-wKYc8GS73BWv64KYgSafC7Xxz2f1kgGW-0-4d320a8a04902de665026ae8840e8111)
那么,在访问stdout对象时应该加上模块名称,即
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P34_80073.jpg?sign=1739299183-QkDPWeLky77LPtXdVenTbNuN41SKoQfg-0-fa7c3f093a879df044a15fb4af73633a)