ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Python输入输出完全指南:print与input核心用法详解

Python输入输出完全指南:print与input核心用法详解 1. 先搞明白程序到底是咋“开口说话”的学习编程到第三课很多人会卡在一个问题上我写的代码能计算、能判断、能循环但结果写在屏幕上谁看得见用户想输入点数据程序又该怎么接住这个问题说白了就是输入输出Input/Output简称 I/O。程序跟人打交道靠的就是输入和输出这两条通道。输出是程序的“嘴”把计算结果、提示信息说给你听输入是程序的“耳朵”接收你敲进去的数据再拿去做后续处理。没有这两样程序就是一台在黑暗里瞎转的机器能算但不会表达毫无实用价值。这一课我会把 Python 里最核心的输入输出函数print()和input()彻底讲透从基础语法到格式化输出、从类型转换到多值输入最后带大家写一个真正“会聊天”的小程序。内容适合刚学完变量和数据类型、准备进入实战环节的初学者也适合写过几段代码但始终对输入输出细节模模糊糊的朋友照着敲一遍你会发现自己对“程序与人交互”这件事的理解会上一个台阶。2. 输出让程序把话说到位2.1 print() 的完整参数别只会填一个值先从输出说起。绝大多数人学print()的时候只知道print(你好)能打印字符串。但实际上print()是一个参数非常丰富的函数完整签名是这样的print(value, ..., sep , end\n, filesys.stdout, flushFalse)这里最容易被忽略的是sep和end两个参数。sep控制多个值之间的分隔符默认是空格。比如print(张三, 18, 北京) # 输出张三 18 北京如果你想要用逗号隔开一行代码就能搞定print(张三, 18, 北京, sep, ) # 输出张三, 18, 北京end控制打印结束后的结尾字符默认是换行符\n。这就是为什么你连续写两个print()输出会各占一行。如果你不想换行可以把它改成空字符串print(正在加载, end) print(...完成) # 输出正在加载...完成这在做进度提示、逐字符输出动画时非常管用。还有一个flush参数控制是否立即刷新输出缓冲区。默认是False意味着内容可能先存在内存缓冲区里等缓冲区满了或程序结束才真正显示。如果你在写实时日志、进度条这类需要立刻看到输出的场景记得加上flushTrue否则会看到内容“卡住”半天才蹦出来。实操心得我早期写爬虫脚本在终端里打印进度数据量大了以后输出会一段一段地“蹦”就是因为没设置flushTrue。后来统一在打印函数里封装了一层问题直接消失。2.2 格式化字符串三种主流姿势怎么选光能打印还不够实际开发中你经常需要把变量拼进一段话里。比如name 李四 age 20 print(我叫 name 今年 str(age) 岁)这种用加号拼接的方式又丑又容易出错——尤其当你忘了把数字转成字符串直接报TypeError。Python 提供了三种更优雅的格式化方案。第一种% 格式化老牌选手print(我叫%s今年%d岁 % (name, age))%s表示字符串占位%d表示整数占位%f表示浮点数占位。这是从 C 语言继承过来的写法老项目里很常见作为新手了解一下即可实际新代码不建议用了因为参数一多% 和数据之间的对应关系很容易看岔。第二种str.format()过渡方案print(我叫{}今年{}岁.format(name, age))花括号是占位符后面.format()按顺序填充。也可以指定位置或名字print(我叫{name}今年{age}岁.format(namename, ageage))比%清晰很多但在变量太多时写起来还是略显啰嗦。第三种f-string强烈推荐Python 3.6 之后引入的 f-string直接在字符串前加一个f然后把变量写进花括号里print(f我叫{name}今年{age}岁)个人强烈推荐新手直接学这一种原因有三可读性最强代码最短执行速度也是三者中最快的。f-string 里甚至可以直接写表达式price 9.9 count 3 print(f总价{price * count:.2f}元) # 输出总价29.70元冒号后面的.2f表示保留两位小数这种写法在做金额计算、数据展示时简直是神器。2.3 f-string 的进阶玩法对齐与填充文字排版也是输出里容易忽略的细节。你用print()打印几行姓名和成绩如果数据长度不一致输出会参差不齐非常难看。f-string 支持类似 Excel 里的对齐操作语法是{变量:宽度}print(f{姓名:6}{成绩:6}) print(f{张三:6}{85.5:6}) print(f{李四丰:6}{92:6})6表示左对齐并占 6 个字符宽度:6是右对齐:^6是居中。举个实际例子做成绩单输出students [(张三, 85), (李四丰, 92), (王五, 78)] print(f{姓名:8}{成绩:6}) print(- * 16) for name, score in students: print(f{name:8}{score:6})这样输出的表格干净整齐中文和数字混排也不会显得歪七扭八。注意如果宽度不够它不会截断字符串而是把内容原样输出所以宽度宁大勿小。3. 输入让程序听懂人话3.1 input() 的本质一切输入都是字符串有输出就得有输入。Python 里接收用户键盘输入的函数只有一个input()。name input(请输入你的名字) print(f你好{name})运行这段代码终端会先显示括号里的提示文字等你敲入内容并按下回车输入的值才会被赋给变量name。这里有一个新手必踩的坑input()返回的一定是字符串不管你在键盘上敲了什么。你输入了18它返回的是字符串18不是整数18。如果你直接拿它做数学运算age input(请输入年龄) print(age 1)会报错TypeError: can only concatenate str (not int) to str。这就是程序在告诉你你拿字符串和整数做加法了它不知道该怎么算。注意input()的执行是阻塞的程序运行到这一行会停下来等用户输入并按回车。如果你写了一个循环里反复调input()注意给用户明确的退出条件否则程序会一直“卡”在那里等待输入看起来像死循环。3.2 类型转换的坑与正解既然input()返回字符串那我们就要学会把它转成需要的类型。常用的转换函数有三个int()转整数、float()转浮点数、str()转字符串。age int(input(请输入年龄)) score float(input(请输入成绩))看着简单但坑也不少。坑一输入了非数字内容。如果用户输入了abcint(abc)会直接抛出ValueError: invalid literal for int() with base 10: abc程序当场崩溃。更好的做法是先判断再转换或者用异常处理兜底num_str input(请输入一个整数) if num_str.isdigit(): num int(num_str) print(f你输入的是{num}) else: print(你输入的不是纯数字请重新运行。)isdigit()是字符串自带的方法判断内容是否全部由数字字符组成。注意负数和小数不能用它判断-5.isdigit()和3.14.isdigit()返回的都是False这种情况要用try/excepttry: num float(input(请输入一个数字)) print(f你输入的数字是{num}) except ValueError: print(输入无效请输入合法数字。)坑二整数和浮点数混用。你输入18然后用float()转换得到18.0没有问题。但如果你用int()转18.6会报ValueError因为int()不接受带小数的字符串。需要先转float再转intscore int(float(input(请输入成绩)))这种链式转换看着折腾但能规避很多意外的崩溃。我个人写脚本时凡是涉及用户输入的统一按“先收字符串、再校验、再转换”的流程处理宁可多写两行代码也不让程序因为一个错误输入直接退出。3.3 多值输入的优雅处理有时候你想一次让用户输入多个数据比如坐标x, y或者姓名和年龄。最直接的做法是让用户用空格或逗号分隔输入然后配合split()方法拆分。x, y input(请输入坐标空格分隔).split() print(fx{x}, y{y})split()默认按空白字符空格、制表符、换行拆分返回一个字符串列表。你还可以指定分隔符data input(请输入姓名和年龄逗号分隔).split(,) name data[0].strip() age int(data[1].strip())注意这里用了.strip()作用是去掉字符串两端的空白字符。用户输入中文逗号、多余空格的情况特别常见不处理会在后续比较或存储时出问题。如果输入的数据个数和接收变量个数不匹配Python 会报ValueError: not enough values to unpack或too many values to unpack。稳妥的写法是先接收列表再判断数量parts input(请输入三个数字空格分隔).split() if len(parts) ! 3: print(输入格式不对需要三个数字。) else: a, b, c map(float, parts) print(f平均值为{(a b c) / 3:.2f})这里还用到了map(float, parts)意思是把列表里每个字符串都用float()转一遍返回的结果可以直接解包给三个变量。这个组合是处理多值输入的标配建议背下来。4. 实战写一个“会聊天”的学员信息登记程序4.1 需求拆解理论讲再多不如动手做个小东西。这一节我带你写一个“会聊天”的学员信息登记程序它做的事情很简单询问学员的姓名、年龄、三门课成绩然后计算平均分最后输出一张整齐的信息卡片。需求可以拆成四步收集输入姓名字符串、年龄整数、三门成绩浮点数。校验数据年龄和成绩必须是合法数字否则提示用户重新输入。计算处理求三门成绩的平均分。格式化输出用表格形式展示学员信息和平均分。这个程序麻雀虽小五脏俱全覆盖了本课全部知识点也模拟了真实开发中“输入—处理—输出”的完整链路。4.2 完整代码与讲解直接上代码我写的是适合初学者阅读的版本每一个关键位置都加了注释# 学员信息登记程序 print( * 30) print(欢迎使用学员信息登记系统) print( * 30) # 收集姓名 name input(请输入学员姓名) # 收集年龄带校验 age_str input(请输入学员年龄) while not age_str.isdigit(): age_str input(年龄必须是整数请重新输入) age int(age_str) # 收集三门成绩带校验 scores [] for i in range(1, 4): while True: score_str input(f请输入第{i}门课成绩) try: score float(score_str) break except ValueError: print(成绩必须是数字请重新输入。) scores.append(score) # 计算平均分 avg sum(scores) / len(scores) # 输出信息卡片 print(\n * 30) print(f{学员姓名:8}{age:6}) print(f{姓名:6}{name:8}) print(f{年龄:6}{age:6}) print(f{课程1:6}{scores[0]:8.1f}) print(f{课程2:6}{scores[1]:8.1f}) print(f{课程3:6}{scores[2]:8.1f}) print(- * 30) print(f{平均分:6}{avg:8.2f}) print( * 30)这里有几个值得细讲的设计。第一年龄校验我用了while not age_str.isdigit()意思是只要输入不全是数字就继续问直到用户输入正确为止。这个循环结构叫“带条件的重复输入”是处理用户输入最常用的模式。第二成绩校验我用了while True加上try/except。为什么不用isdigit()因为成绩可能是小数85.5.isdigit()是False会误判。所以这里直接用float()强转失败了就捕获异常再让用户重新输。这是处理“非整数数字输入”最稳妥的姿势。第三格式化输出部分用:6做左对齐:8.1f表示左对齐、占 8 个字符宽度、保留 1 位小数。这样输出的信息卡片每一行都对得整整齐齐虽然实际字符宽度会受中文占位影响但作为入门练习已经够用。4.3 运行效果与扩展方向运行这个程序交互过程大概是这样的 欢迎使用学员信息登记系统 请输入学员姓名张三 请输入学员年龄20 请输入第1门课成绩85 请输入第2门课成绩92.5 请输入第3门课成绩78 姓名 张三 年龄 20 课程1 85.0 课程2 92.5 课程3 78.0 ------------------------------ 平均分 85.17 如果你故意输入非法的年龄或成绩比如年龄输abc程序会一直提示你重新输入不会崩溃。这种健壮性是真实项目里非常看重的能力。做完这个小程序你还可以自己扩展方向把信息保存到文件里用后面会学的文件读写、加一个“是否继续录入”的判断、或者把多门课改成动态数量。每加一个功能你对输入输出的理解就深一层。实操心得初学者写交互式程序最容易犯的毛病是“只处理正常输入不处理异常输入”。有一次我让学生用这个程序录 100 个人的成绩结果录到一半有人不小心输了个字母整个程序就退出了前 50 条数据全白录。从那以后我养成了习惯凡是input()接到的数据一律先当“不可信数据”处理校验之后再使用。5. 输入输出常见报错与排查实录5.1 高频报错速查表这一节整理了我在教学和实际开发中遇到的、和输入输出相关的最常见报错做成一个速查表方便你以后遇到问题直接对照。报错信息出现原因解决办法TypeError: can only concatenate str (not int) to str用拼接字符串和数字数字先转str()或直接用 f-stringValueError: invalid literal for int() with base 10int()转换了非数字字符串先用isdigit()判断或用try/except捕获ValueError: not enough values to unpacksplit()后变量数量比拆分数少先接收为列表检查len()再解包ValueError: too many values to unpack变量数量比拆分数多检查输入格式或加数量判断NameError: name xxx is not defined变量没定义就使用常因拼写错误检查变量名拼写是否一致程序运行后无任何输出忘记写print()或输出被缓冲确认代码里写了print()必要时加flushTrue5.2 我踩过的坑和几点建议最后分享几条个人经验都是踩过坑之后总结出来的。关于input()的提示语。很多人写input(请输入姓名)不加空格用户输入时光标会紧贴在提示语后面视觉上很拥挤体验也不好。建议写成input(请输入姓名)冒号后面加一个空格输入区域和提示文字之间就有了自然间隔。关于编码问题。在 Windows 命令行里运行包含中文的 Python 程序偶尔会遇到乱码或报SyntaxError。这通常是编码不匹配导致的。解决办法是代码文件统一保存为 UTF-8 编码或者在文件开头加# -*- coding: utf-8 -*-Python 3 默认支持 UTF-8这行主要是为了兼容老环境。如果在终端里中文显示乱码用chcp 65001命令把终端切到 UTF-8 编码再运行。关于print()的调试价值。新手往往觉得print()太简单不值一提但实际上它是排查问题最直接的工具。程序逻辑跑不通时在关键位置打印中间变量的值很快就能定位问题出在哪一步。等后面学了日志模块可以把print()升级成更规范的日志输出但调试思路完全一样——让你的程序“说出”它内部发生了什么。关于交互体验。多行输出时适当用\n换行、用- * 20画分割线能明显提升程序的“人味”。你写的程序不只是给自己看的更是给使用者看的输出清晰整洁本身就是一种专业素养。输入输出是 Python 里最基础也最常用的能力但它绝不只是两个函数那么简单。print()的参数细节、格式化输出的选型、input()的类型转换和多值处理每一个点都藏着实实在在的实战经验。把这节课的内容消化透把那个学员信息登记程序亲手敲一遍再自己改几处功能试试你的程序就真正“会说话”了。
返回列表