Python 函数中能否使用 input() 输入值作为参数?
发布时间 - 2025-12-30 00:00:00 点击率:次python 中 `input()` 获取的值不能直接作为未定义变量传入函数;函数调用前,所有实参必须已存在。正确做法是让函数自身调用 `input()`,并通过 `return` 返回结果,再由调用方接收赋值。
在 Python 编程中,初学者常误以为可以将“尚未定义的变量名”(如 item_bought_1)作为参数传给函数,期待函数内部为其赋值——这是不可行的。Python 是按值传递(pass-by-object-reference),且函数参数是局部变量,对形参的重新赋值不会影响外部作用域中的同名变量(如果存在);更关键的是,若变量根本未定义,调用时就会立即抛出 NameError。
你遇到的错误:
NameError: name 'item_bought_1' is not defined
正是因为代码在执行 question_asker(item_bought_1, ...) 时,解释器试图查找名为 item_bought_1 的变量,但此时它尚未被创建(input() 还没执行),因此报错。
✅ 正确设计思路:
函数应封装输入逻辑与计算逻辑,不依赖外部变量传入,而是主动获取输入、处理数据,并通过 return 输出结果。调用方负责接收返回值并存储。
以下是优化后的专业写法:
def question_asker():
"""交互式获取单个商品信息,返回 (商品名, 单价, 数量, 小计) 元组"""
item = input("What item has been bought? ").strip()
if not item:
print("Warning: Empty item name. Using 'Unknown'.")
item = "Unknown"
whi
le True:
try:
price = float(input(f"How much is each unit of '{item}'? "))
break
except ValueError:
print("Please enter a valid number for price.")
while True:
try:
qty = int(input(f"How many units of '{item}' have been bought? "))
break
except ValueError:
print("Please enter a valid integer for quantity.")
total = price * qty
return item, price, qty, total
# 调用 4 次,每次接收完整结果
items = []
for i in range(1, 5):
print(f"\n--- Entry #{i} ---")
item, unit_price, quantity, item_total = question_asker()
items.append({
'name': item,
'unit_price': unit_price,
'quantity': quantity,
'total': item_total
})
# 示例:打印简洁表格
print("\n" + "="*50)
print(f"{'Item':<12} {'Price':<8} {'Qty':<6} {'Total':<10}")
print("-"*50)
for it in items:
print(f"{it['name']:<12} ${it['unit_price']:<7.2f} {it['quantity']:<6} ${it['total']:<9.2f}")
print("="*50)? 关键要点总结:
- ❌ 错误:question_asker(item_bought_1, ...) —— 变量未定义,且 Python 无法通过参数“反向赋值”到外部。
- ✅ 正确:item, price, qty, total = question_asker() —— 函数内完成输入与计算,返回结构化结果。
- ? 增强健壮性:添加 try/except 处理非数字输入,strip() 清理空格,避免运行时崩溃。
- ? 推荐数据结构:用 list[dict] 或 namedtuple 统一管理多组商品数据,便于后续排序、汇总或导出。
- ? 可扩展性:后续可轻松改为循环 n 次、支持“输入 done 结束”,或整合进类(如 ShoppingCart)中。
这种设计符合 Python 的清晰性与封装原则:函数职责单一(专注采集+计算),调用方专注流程控制与数据组织。
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?
Laravel怎么实现模型属性的自动加密
Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例
西安专业网站制作公司有哪些,陕西省建行官方网站?
如何快速搭建高效WAP手机网站?
百度浏览器网页无法复制文字怎么办 百度浏览器复制修复
SQL查询语句优化的实用方法总结
WEB开发之注册页面验证码倒计时代码的实现
Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案
网站建设保证美观性,需要考虑的几点问题!
Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决
Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】
JavaScript Ajax实现异步通信
悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】
微信h5制作网站有哪些,免费微信H5页面制作工具?
Laravel如何实现一对一模型关联?(Eloquent示例)
javascript基于原型链的继承及call和apply函数用法分析
HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】
怎么用AI帮你设计一套个性化的手机App图标?
如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】
Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用
如何快速打造个性化非模板自助建站?
Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】
惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?
佛山网站制作系统,佛山企业变更地址网上办理步骤?
Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
Python面向对象测试方法_mock解析【教程】
电视网站制作tvbox接口,云海电视怎样自定义添加电视源?
Android中AutoCompleteTextView自动提示
如何破解联通资金短缺导致的基站建设难题?
网页设计与网站制作内容,怎样注册网站?
HTML 中如何正确使用模板变量为元素的 name 属性赋值
Laravel如何实现密码重置功能_Laravel密码找回与重置流程
在线制作视频网站免费,都有哪些好的动漫网站?
Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程
香港服务器建站指南:免备案优势与SEO优化技巧全解析
Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理
高端建站三要素:定制模板、企业官网与响应式设计优化
Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验
Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】
Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理
JS中页面与页面之间超链接跳转中文乱码问题的解决办法
极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?
百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭
Laravel怎么调用外部API_Laravel Http Client客户端使用
再谈Python中的字符串与字符编码(推荐)
Linux安全能力提升路径_长期防护思维说明【指导】
如何将凡科建站内容保存为本地文件?
微信小程序制作网站有哪些,微信小程序需要做网站吗?


le True:
try:
price = float(input(f"How much is each unit of '{item}'? "))
break
except ValueError:
print("Please enter a valid number for price.")
while True:
try:
qty = int(input(f"How many units of '{item}' have been bought? "))
break
except ValueError:
print("Please enter a valid integer for quantity.")
total = price * qty
return item, price, qty, total
# 调用 4 次,每次接收完整结果
items = []
for i in range(1, 5):
print(f"\n--- Entry #{i} ---")
item, unit_price, quantity, item_total = question_asker()
items.append({
'name': item,
'unit_price': unit_price,
'quantity': quantity,
'total': item_total
})
# 示例:打印简洁表格
print("\n" + "="*50)
print(f"{'Item':<12} {'Price':<8} {'Qty':<6} {'Total':<10}")
print("-"*50)
for it in items:
print(f"{it['name']:<12} ${it['unit_price']:<7.2f} {it['quantity']:<6} ${it['total']:<9.2f}")
print("="*50)