尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Python根据输入参数计算结果的实例方法
前言「根据命令行传入的参数算出结果」是脚本最朴素的形态传两个数和一个运算符打印算式的结果。它的价值不在计算本身而在于演示一条清晰的流水线——取参数 → 校验 → 计算 → 输出。把这条线理顺了脚本长大以后再接入更复杂的输入文件、配置、网络也不会乱。两个常见误解要先说清。第一把sys.argv当成「参数列表」——它包含脚本名本身sys.argv[0]是脚本的路径真正的用户参数从下标 1 开始。第二用eval()去算用户输入的算式——eval()能执行任意 Python 代码绝不能拿它处理不可信输入。本文只用标准库的sys模块手工解析参数不借助argparse目的是把「手写解析」的每一步摊开sys.argv[0]是什么、len(sys.argv)怎么校验、int()转换失败怎么处理以及为什么要把「解析 → 计算 → 输出」拆成三个独立函数。示例基于 Python 3.8 及以上。一、sys.argv 到底是什么官方文档对sys.argv的定义传给脚本的命令行参数列表。关键的两句是——argv[0]是脚本名如果用了-c选项argv[0]被设为字符串-c如果没传脚本名argv[0]是空字符串。# 适用于 Python 3.8import sysprint(脚本名, sys.argv[0])print(用户参数, sys.argv[1:])print(参数个数含脚本名, len(sys.argv))若把上面代码存成show.py并执行python show.py a b c输出会是三行脚本名、[a, b, c]、以及4。注意最后这个4len(sys.argv)数的是含脚本名的个数所以「用户给了几个参数」要写成len(sys.argv) - 1。这是最容易数错的一处。还有一点sys.argv里的每个元素都是字符串哪怕你敲的是123。要参与算术必须自己转换。执行方式sys.argv[0]说明python script.py a bscript.py最常见情形python -c ... a b-c-c模式下脚本名被替换python -m pkg.mod a模块文件完整路径-m模式下是模块文件路径python -从 stdin-从标准输入读代码时二、拆成三段解析、计算、输出把逻辑塞进一个大main()里能跑但不好测、不好改。更稳的写法是切三块parse_args(argv)只负责把字符串列表变成结构化的数据负责「格式不对就报错」。compute(parsed)只负责算输入是已经校验过的数据不再操心字符串。format_result(result)只负责把结果变成要打印的文本。这样一来compute可以用普通值直接调用测试不必再造一个命令行环境。parse_args的职责先认清输入的形状本计算器约定用户传三个参数——左操作数、运算符、右操作数。# 适用于 Python 3.8import sysUSAGE 用法python calc.py 数字 运算符 数字def parse_args(argv):把 argv不含脚本名解析成 (a, op, b) 三元组。只做格式与类型的校验不做计算。if len(argv) ! 3:raise ValueError(f需要 3 个参数实际收到 {len(argv)} 个。\n{USAGE})left_raw, op, right_raw argvtry:# 用 float 而不是 int这样 1.5 这类输入也能支持left float(left_raw)except ValueError:raise ValueError(f左操作数不是数字{left_raw!r})try:right float(right_raw)except ValueError:raise ValueError(f右操作数不是数字{right_raw!r})if op not in (, -, *, /):raise ValueError(f不支持的运算符{op!r}只支持 - * /)return left, op, right这里刻意用try/except ValueError包住float()而不是先写if left_raw.isdigit()。原因是isdigit()判不出-3、1.5、1e3而float()的失败语义才是权威的——让它去抛我来接。!r是repr()的格式化写法会把字符串带上引号报错时说清「你给的是字符串abc」而不是含糊的数字。计算段把运算符映射到函数避免一长串if# 适用于 Python 3.8import operatordef compute(parsed):根据已解析的 (a, op, b) 计算结果。left, op, right parsed# 用函数表代替 if/elif 链条也不碰 evaloperations {: operator.add,-: operator.sub,*: operator.mul,/: operator.truediv,}func operations[op] # 前面已校验过 op这里不会 KeyErrortry:return func(left, right)except ZeroDivisionError:raise ValueError(除数不能为 0)operator.truediv就是/的语义真除法无论 Python 版本都返回浮点结果如果本意是整数整除应该用operator.floordiv//。不要导入operator.div——那是 Python 2 的名字在 Python 3 里已被移除写上去只会得到AttributeError。顺带提醒Python 2 里3 / 2得1Python 3 里得1.5要整除必须写//而 Python 2.7 已于 2020-01-01 停止维护本文一律按 Python 3 的语义。输出段只做格式化# 适用于 Python 3.8def format_result(parsed, result):left, op, right parsed# :g 去掉多余的零例如 4.0 显示成 4return f{left:g} {op} {right:g} {result:g}最后在入口处把三段串起来唯一的try/except负责把ValueError转成友好提示# 适用于 Python 3.8def main(argv):try:parsed parse_args(argv)result compute(parsed)except ValueError as exc:print(f错误{exc}, filesys.stderr)return 2 # 用非零退出码表示失败print(format_result(parsed, result))return 0if __name__ __main__:sys.exit(main(sys.argv[1:]))python calc.py 3 4python calc.py 3.5 * 2python calc.py 1 / 0python calc.py 1 xpython calc.py 1 依次会得到3 4 7、3.5 * 2 7、错误「除数不能为 0」、错误「右操作数不是数字x」、错误「需要 3 个参数实际收到 2 个」。注意 shell 里*有特殊含义示例中用引号包住避免被 shell 先展开。三、为什么不写 eval有人图省事直接把3 4交给eval()求值# 反面示例不要这样写# value eval( .join(sys.argv[1:]))eval()会执行传给它的任意 Python 表达式包括函数调用、属性访问、导入。只要参数来自用户或外部系统这就等于把执行权交了出去。本文的做法是把运算符限定在一个白名单字典里——用户能选的运算符只有那四个其余一律拒绝。这是「白名单校验」也是处理外部输入时最可靠的一类思路不是去猜哪些输入危险而是只承认明确允许的那些。四、用 input 做交互式输入sys.argv适合「一次性传参」另一条路是运行时用input()逐项询问。注意input()总是返回字符串同样的转换与校验逻辑要照搬# 适用于 Python 3.8def read_expression():left_raw input(左操作数).strip()op input(运算符 - * /).strip()right_raw input(右操作数).strip()return parse_args([left_raw, op, right_raw])这里复用了刚才的parse_args把input()拿到的三项装成列表传进去校验规则完全相同。这条「输入来源可以换、校验逻辑只写一遍」正是分段设计带来的好处。input()没有输入如读到 EOF时抛EOFError需要的话一并捕获。顺带纠正一个新旧差异Python 2 里读一行是raw_input()它不执行内容、返回字符串而 Python 3 的input()就等于 Python 2 的raw_input()。Python 2 的input()会去eval输入内容是危险行为在 Python 3 里已被移除。老教程里的raw_input请一律换成input。常见坑点坑点 1把sys.argv[0]当成第一个用户参数。❌a int(sys.argv[0])—— 拿到的是脚本路径int()立刻报错。 ✅ 用户参数从sys.argv[1:]取要判个数用len(sys.argv) - 1。坑点 2直接用int()而不管失败。❌int(sys.argv[1])—— 用户敲了1.5或abc程序带着ValueError栈回溯崩掉。 ✅ 用try/except ValueError接住转成一句人话错误再退出要支持小数就用float()。坑点 3用isdigit()当数字校验。❌if sys.argv[1].isdigit():——-3、1.5、1e3都会被判为「不是数字」而拒掉。 ✅ 让float()或int()去判定捕获它抛出的ValueError。坑点 4用eval算用户输入。❌eval( .join(sys.argv[1:]))—— 能执行任意代码输入可控即等于漏洞。 ✅ 用白名单字典把运算符映射到operator里的函数只承认允许的操作。坑点 5忘记处理除以零。❌compute里直接left / right—— 用户传1 / 0时抛ZeroDivisionError。 ✅ 在计算段捕获ZeroDivisionError转成「除数不能为 0」的提示。坑点 6把整数除法当默认行为。❌ 认为3 / 2得1—— 那是 Python 2 的语义Python 2.7 已于 2020-01-01 停止维护。 ✅ Python 3 里/是真除法得1.5要整除写//或operator.floordiv。坑点 7失败时仍返回 0。❌ 出错分支里只print不sys.exit(非零)—— 调用方shell 脚本、CI以为成功。 ✅ 失败路径return 2或sys.exit(2)成功才return 0。坑点 8把解析和计算揉成一个函数。❌ 在同一个函数里边转类型边算 —— 类型错误与运算错误混在一起错误信息说不清是谁的问题。 ✅ 拆成parse_args/compute/format_result三段各自只关心自己的输入约定。总结环节怎么做关键点取参数sys.argv[1:]argv[0]是脚本名不是用户参数判个数len(argv) ! 3数的是用户参数别把脚本名算进去转类型try: float(x)让转换自己抛ValueError别用isdigit校验运算符白名单元组杜绝eval只承认允许的操作计算operator函数表truediv是真除法零除要接住输出f-string 格式化:g去掉多余零退出码成功 0 / 失败非零让调用方能判断成败一个「根据输入参数算结果」的脚本难度不在算术而在边界参数少了怎么办、类型不对怎么办、除数为零怎么办、运算符不认识怎么办。把这些边界收在parse_args里用白名单而非黑名单去校验再让compute只处理已经合法的数据脚本就既短又稳。等需求变复杂时这套「解析 → 计算 → 输出」的结构也能原样保留只是把sys.argv换成更完整的解析方式而已。
RELATED

相关推荐

BlueField-4 STX:AI存储加速器的架构革新与应用

BlueField-4 STX:AI存储加速器的架构革新与应用

1. BlueField-4 STX:为Agentic AI而生的存储加速器革命在2026年GTC大会上亮相的BlueField-4 STX,标志着AI基础设施进入了一个全新阶段。这款专为Agentic AI设计的存储加速器,本质上重构了传统存储架构的运作范式——它不再是被动存放数据的仓…

📅 2026/10/30 7:15:03
无人驾驶自动泊车技术:多项式规划与单步系统优化

无人驾驶自动泊车技术:多项式规划与单步系统优化

1. 无人驾驶自动泊车技术全景解析垂直泊车作为城市驾驶的高频刚需场景,其技术实现涉及感知、决策、控制三大核心模块的深度耦合。不同于开放道路驾驶,泊车场景具有空间约束强(通常仅有车身1.2-1.5倍的操作空间)、动态障碍物多&…

📅 2026/10/30 7:15:03
标准库中的设计模式活教材

标准库中的设计模式活教材

Java 标准库/Android/Spring 库之所以能成为无数应用的基石,除了功能完备之外,一个常被忽视却至关重要的原因在于:它的设计本身就是设计模式最经典的“活教材”。GoF 的 23 种模式并非纸上谈兵,在 java.lang、java.util、java.io …

📅 2026/10/30 7:15:03
MORE NEWS

更多资讯

📰

WPF三种启动方式 + 静态资源 + 数据绑定 满分知识点整理

模块一:WPF应用程序三种启动方式(必考大题)1.1 三种方式核心对比(背诵)方式1:StartupUri 指定启动页(推荐、最常用)特点:XAML直接配置、写法最简、无需后台代码缺点&…

📰

系统规划与管理师-第七章-第八章-考点记忆

1、云原生架构的设计原则。(1)服务化(2)弹性(3)可观测(4)韧性(5)所有过程自动化(6)零信任(7)架构持续演进2、云…

📰

系统规划与管理师-第九章-考点记忆

1、信息系统服务管理的主要活动。(1)服务战略规划(2)服务设计实现(3)服务运营提升(4)服务退役终止(5)持续改进与监督2、服务战略规划的主要活动。&#xff08…

📰

Python中apply与map的区别

在分享里面讲述apply与map二者之间的区别, 以及阐述使用技巧, 以此来助力你利用更好的方式掌握数据处理方法。1、 处理数据之际, 能够借由apply()函数、()函数以及map()函数来对数据施加操作, 其对此予以支持的有传入内置函数、经由def定义的自定函数或者匿名函数, 可灵活地达成…

📰

编程基础学习

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

SSM医院住院系统实战:从毕设到业务闭环的全链路解析

简介:这是一套面向计算机专业本科生的Java Web毕业设计实战项目,聚焦医院住院管理业务场景,适用于课程设计、毕设选题与SSM框架入门实践。资源完整包含可运行源码、配套演示视频及详细说明文档,帮助学习者掌握B/S架构下医疗信息系…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬