一、输出:让程序说话
1.1 print()基础用法
print()是Python最常用的输出函数,负责把内容显示在屏幕上。
# 输出单个内容print("Hello World")print(123)print(3.14)print(True)# 输出多个内容(自动用空格分隔)print("姓名:", "张三", "年龄:", 18)# 输出:姓名: 张三 年龄: 18# 输出空行print()
1.2 print()的完整语法
print(value1, value2, ..., sep=' ', end='\n', file=sys.stdout)
参数说明:
1.3 sep参数——自定义分隔符
# 默认空格print("苹果", "香蕉", "橙子") # 苹果 香蕉 橙子# 自定义分隔符print("苹果", "香蕉", "橙子", sep="、") # 苹果、香蕉、橙子print("2024", "01", "15", sep="-") # 2024-01-15print("192", "168", "1", "1", sep=".") # 192.168.1.1print("Hello", "World", sep="") # HelloWorld(无分隔符)
1.4 end参数——自定义结尾
# 默认换行print("第一行")print("第二行")# 输出:# 第一行# 第二行# 不换行print("第一行", end="")print("第二行", end="")print("第三行")# 输出:第一行第二行第三行# 自定义结尾print("正在加载", end="...")print("完成")# 输出:正在加载...完成# 实际应用:进度指示import timefor i inrange(5):print(f"\r进度:{i+1}/5", end="") time.sleep(1)print("\n完成!")
1.5 格式化输出的三种方式
方式1:f-string(Python 3.6+ 推荐)
name = "小明"age = 18score = 95.5print(f"姓名:{name},年龄:{age},分数:{score}")# 姓名:小明,年龄:18,分数:95.5# 表达式计算print(f"10年后{name}的年龄:{age + 10}")# 调用方法print(f"大写名字:{name.upper()}")# 格式化数字price = 19.995print(f"价格:{price:.2f}元") # 价格:20.00元print(f"百分比:{0.856:.1%}") # 百分比:85.6%print(f"左对齐:{name:<10}") # 左对齐,宽度10print(f"右对齐:{name:>10}") # 右对齐print(f"居中:{name:^10}") # 居中
方式2:format()方法
# 位置参数print("{}今年{}岁".format("小明", 18))# 索引参数print("{1}今年{0}岁".format(18, "小明")) # 小明今年18岁# 关键字参数print("{name}今年{age}岁".format(name="小明", age=18))# 格式化数字print("{:.2f}".format(3.14159)) # 3.14print("{:,}".format(1000000)) # 1,000,000
方式3:%格式化(旧式)
name = "小明"age = 18print("%s今年%d岁" % (name, age)) # 小明今年18岁# %s 字符串,%d 整数,%f 浮点数print("%.2f" % 3.14159) # 3.14
二、输入:让程序听你说话
2.1 input()基础用法
input()函数让程序暂停,等待用户输入,输入的任何内容都会作为字符串返回。
# 基本输入name = input("请输入你的姓名:")print(f"你好,{name}")# 不写提示语也行data = input()print(f"你输入了:{data}")
2.2 输入的返回值永远是字符串
# ❌ 常见错误age = input("请输入年龄:")next_year = age + 1# 报错!age是字符串# ✅ 正确做法age = int(input("请输入年龄:"))next_year = age + 1print(f"明年你{next_year}岁")
2.3 处理多种输入
# 输入多个值(空格分隔)data = input("请输入两个数字(空格分隔):")a, b = data.split() # split()默认按空格分割a = int(a)b = int(b)print(f"和:{a + b}")# 输入多个值(逗号分隔)data = input("请输入姓名、年龄、城市(逗号分隔):")name, age, city = data.split(",")age = int(age)print(f"姓名:{name},年龄:{age},城市:{city}")
三、输入输出的实战应用
案例1:个人信息收集
print("=" * 40)print(" 个人信息登记系统")print("=" * 40)# 收集信息name = input("请输入姓名:")age = int(input("请输入年龄:"))height = float(input("请输入身高(cm):"))weight = float(input("请输入体重(kg):"))city = input("请输入所在城市:")hobby = input("请输入爱好:")# 计算BMIheight_m = height / 100bmi = weight / (height_m ** 2)# 输出信息卡print("\n" + "=" * 40)print(" 个 人 信 息 卡")print("=" * 40)print(f"姓名:{name}")print(f"年龄:{age}岁")print(f"身高:{height:.1f}cm")print(f"体重:{weight:.1f}kg")print(f"BMI:{bmi:.1f}")print(f"城市:{city}")print(f"爱好:{hobby}")print("=" * 40)# BMI判断if bmi < 18.5:print("体型:偏瘦")elif bmi < 24:print("体型:正常")elif bmi < 28:print("体型:偏胖")else:print("体型:肥胖")
案例2:猜数字游戏
import randomprint("=" * 40)print(" 猜 数 字 游 戏")print("=" * 40)print("我已经想好了一个1-100之间的数字")# 生成随机数secret = random.randint(1, 100)attempts = 0max_attempts = 7while attempts < max_attempts:# 获取玩家输入try: guess = input(f"\n还剩{max_attempts - attempts}次机会,请猜数:") guess = int(guess)except ValueError:print("请输入有效的数字!")continue attempts += 1# 判断if guess < secret:print("猜小了,再大一点")elif guess > secret:print("猜大了,再小一点")else:print(f"\n🎉 恭喜!你猜对了!用了{attempts}次机会")breakelse:print(f"\n😢 游戏结束,答案是{secret}")print("\n游戏结束,感谢游玩!")
案例3:简单的计算器
print("=" * 40)print(" 简 易 计 算 器")print("=" * 40)print("支持运算:+ - * /")whileTrue:print("\n" + "-" * 40)# 获取第一个数try: num1 = float(input("请输入第一个数字:"))except ValueError:print("输入无效,请重新开始")continue# 获取运算符 op = input("请输入运算符(+ - * /):")if op notin ['+', '-', '*', '/']:print("不支持的运算符")continue# 获取第二个数try: num2 = float(input("请输入第二个数字:"))except ValueError:print("输入无效,请重新开始")continue# 计算if op == '+': result = num1 + num2elif op == '-': result = num1 - num2elif op == '*': result = num1 * num2else: # op == '/'if num2 == 0:print("错误:除数不能为0")continue result = num1 / num2# 输出结果if result.is_integer():print(f"\n结果:{num1}{op}{num2} = {int(result)}")else:print(f"\n结果:{num1}{op}{num2} = {result:.2f}")# 是否继续 again = input("\n继续计算?(y/n):")if again.lower() != 'y':print("感谢使用,再见!")break
案例4:登录系统
deflogin_system():"""简单的登录系统"""print("=" * 40)print(" 用 户 登 录")print("=" * 40)# 预设用户数据 users = {"admin": "123456","user1": "abc123","test": "test123" } max_attempts = 3 attempts = 0while attempts < max_attempts:print(f"\n剩余尝试次数:{max_attempts - attempts}")# 输入用户名和密码 username = input("用户名:") password = input("密码:")# 检查输入是否为空ifnot username ornot password:print("用户名和密码不能为空!") attempts += 1continue# 验证if username in users and users[username] == password:print(f"\n✅ 登录成功!欢迎{username}")# 显示菜单print("\n1. 查看个人信息")print("2. 修改密码")print("3. 退出") choice = input("请选择:")if choice == '1':print(f"用户名:{username}")print(f"密码:{'*' * len(password)}")elif choice == '2': new_pass = input("新密码:") users[username] = new_passprint("密码修改成功")returnTrueelse:print("❌ 用户名或密码错误") attempts += 1print("\n❌ 尝试次数过多,账号已锁定")returnFalse# 运行登录# login_system()
案例5:成绩录入系统
defgrade_entry_system():"""成绩录入系统"""print("=" * 50)print(" 成 绩 录 入 系 统")print("=" * 50) students = []whileTrue:print("\n1. 添加学生成绩")print("2. 查看所有成绩")print("3. 统计报表")print("4. 退出") choice = input("请选择(1-4):")if choice == '1':# 添加学生 name = input("学生姓名:")# 输入成绩try: chinese = float(input("语文成绩:")) math = float(input("数学成绩:")) english = float(input("英语成绩:"))# 验证成绩范围ifnot (0 <= chinese <= 100and0 <= math <= 100and0 <= english <= 100):print("成绩必须在0-100之间")continue# 计算总分和平均分 total = chinese + math + english average = total / 3# 保存数据 student = {'name': name,'chinese': chinese,'math': math,'english': english,'total': total,'average': average } students.append(student)print(f"✅ 学生{name}的成绩录入成功")except ValueError:print("请输入有效的数字")elif choice == '2':# 查看所有成绩ifnot students:print("还没有学生数据")continueprint("\n" + "=" * 60)print(f"{'姓名':<10}{'语文':<8}{'数学':<8}{'英语':<8}{'总分':<8}{'平均分':<8}")print("=" * 60)for s in students:print(f"{s['name']:<10}{s['chinese']:<8.1f}{s['math']:<8.1f}"f"{s['english']:<8.1f}{s['total']:<8.1f}{s['average']:<8.1f}")elif choice == '3':# 统计报表ifnot students:print("还没有学生数据")continue# 计算班级平均 avg_chinese = sum(s['chinese'] for s in students) / len(students) avg_math = sum(s['math'] for s in students) / len(students) avg_english = sum(s['english'] for s in students) / len(students)# 最高分 max_student = max(students, key=lambda s: s['total'])print("\n" + "=" * 40)print(" 成 绩 统 计")print("=" * 40)print(f"总人数:{len(students)}")print(f"语文平均分:{avg_chinese:.1f}")print(f"数学平均分:{avg_math:.1f}")print(f"英语平均分:{avg_english:.1f}")print(f"最高分学生:{max_student['name']} "f"(总分:{max_student['total']:.1f})")elif choice == '4':print("感谢使用成绩录入系统!")breakelse:print("无效选择,请重新输入")# grade_entry_system()
四、高级输入输出技巧
4.1 密码输入(隐藏显示)
# 需要导入getpass模块import getpass# 密码输入时不显示username = input("用户名:")password = getpass.getpass("密码:") # 输入时不显示print(f"用户名:{username}")print(f"密码:{'*' * len(password)}")
4.2 带超时的输入
import sysimport selectimport timedefinput_with_timeout(prompt, timeout):"""带超时的输入函数"""print(prompt, end='', flush=True) ready, _, _ = select.select([sys.stdin], [], [], timeout)if ready:return sys.stdin.readline().rstrip('\n')returnNone# 使用示例print("你有5秒钟时间回答问题:")answer = input_with_timeout("Python的作者是谁?", 5)if answer isNone:print("\n⏰ 时间到!")else:print(f"\n你的答案是:{answer}")
4.3 进度条显示
import timedefshow_progress(iterations):"""显示进度条"""for i inrange(iterations + 1):# 计算百分比 percent = i / iterations * 100# 进度条长度20 bar_length = 20 filled = int(bar_length * i / iterations) bar = '█' * filled + '░' * (bar_length - filled)# 输出(\r回到行首)print(f"\r进度:|{bar}| {percent:.1f}%", end="") time.sleep(0.1)print() # 最后换行print("正在下载...")show_progress(50)
4.4 表格输出
defprint_table(data, headers):"""打印表格"""# 计算每列宽度 col_widths = []for i, header inenumerate(headers): col_width = len(header)for row in data: col_width = max(col_width, len(str(row[i]))) col_widths.append(col_width + 2) # 加2作为内边距# 打印分隔线defprint_sep(): line = "+"for w in col_widths: line += "-" * w + "+"print(line)# 打印表头 print_sep() header_line = "|"for i, header inenumerate(headers): header_line += f" {header:<{col_widths[i]-1}}|"print(header_line) print_sep()# 打印数据for row in data: data_line = "|"for i, cell inenumerate(row): data_line += f" {str(cell):<{col_widths[i]-1}}|"print(data_line) print_sep()# 使用示例data = [ ["张三", 18, 95], ["李四", 19, 87], ["王五", 18, 92]]headers = ["姓名", "年龄", "分数"]print_table(data, headers)
五、常见问题与解决方法
问题1:输入数字时直接报错
# ❌ 不好的做法age = int(input("年龄:")) # 输入非数字就崩溃# ✅ 好的做法try: age = int(input("年龄:"))except ValueError:print("请输入有效的数字") age = 0
问题2:输入包含多余空格
# 用户可能输入 " 张三 "name = input("姓名:")print(f"你好,{name}") # 输出:你好, 张三 # 使用strip()去除首尾空格name = input("姓名:").strip()print(f"你好,{name}") # 输出:你好,张三
问题3:input()在IDLE中运行不同
# 在IDLE中运行input()不会显示提示语# 解决:先print提示,再inputprint("请输入姓名:", end="")name = input()
问题4:连续输入数字
# 一次性输入多个数字numbers = input("请输入多个数字(空格分隔):").split()numbers = [int(x) for x in numbers]print(f"总和:{sum(numbers)}")
六、输入输出最佳实践
6.1 输入验证模板
defget_int_input(prompt, min_val=None, max_val=None):"""获取整数输入,带范围验证"""whileTrue:try: value = int(input(prompt))if min_val isnotNoneand value < min_val:print(f"输入不能小于{min_val}")continueif max_val isnotNoneand value > max_val:print(f"输入不能大于{max_val}")continuereturn valueexcept ValueError:print("请输入有效的整数")# 使用age = get_int_input("请输入年龄(0-150):", 0, 150)score = get_int_input("请输入分数(0-100):", 0, 100)
6.2 选择菜单模板
defmenu(options, title="请选择"):"""显示菜单并获取选择"""print(f"\n{title}")print("-" * 20)for i, option inenumerate(options, 1):print(f"{i}. {option}")whileTrue:try: choice = int(input("请输入编号:"))if1 <= choice <= len(options):return choiceelse:print(f"请输入1-{len(options)}之间的数字")except ValueError:print("请输入数字")# 使用choice = menu(["添加", "删除", "修改", "查询"], "主菜单")if choice == 1:print("执行添加")elif choice == 2:print("执行删除")# ...
6.3 确认对话框
defconfirm(prompt, default=True):"""确认对话框"""if default: prompt = f"{prompt} (Y/n):"else: prompt = f"{prompt} (y/N):"whileTrue: answer = input(prompt).strip().lower()ifnot answer:return defaultif answer in ['y', 'yes']:returnTrueif answer in ['n', 'no']:returnFalseprint("请输入 y 或 n")# 使用if confirm("确定要删除吗?", default=False):print("正在删除...")else:print("取消删除")
七、总结
输入输出核心要点
输出(print)
输入(input)
记忆口诀
输出用print,多个值逗号sep改分隔,end改结尾f-string最方便,花括号填变量输入用input,返回是字符串数字要转换,类型要判断验证加循环,程序更健壮
常用模式速查
# 1. 基本输出print(f"变量值:{variable}")# 2. 数字输入num = int(input("数字:"))# 3. 带验证的输入whileTrue:try: num = int(input("数字:"))breakexcept:print("输入无效")# 4. 去除空格text = input().strip()# 5. 多个输入a, b = input().split()# 6. 不换行输出print("进度", end="")# 7. 格式化表格print(f"{'姓名':<10}{'分数':>5}")