[oeasy]python095_列表_python_系统_sys_命令行参数列表_argv
回忆
-
上次研究了 midi音乐的制作
-
使用 旋律列表 生成音乐
# 《两只老虎》的音符序列 melody = [ '1', '2', '3', '1',... ]
-
这有什么用呢?
-
比如 按照调性 生成 随机旋律?🤔
添加图片注释,不超过 140 字(可选)
-
除了 midi音乐 旋律列表 之外
-
列表 还有 啥 实际应用 吗???🤔
命令的参数列表
ls
-
ls命令可以查询文件夹下的内容
-
默认参数是pwd
-
当前文件夹
添加图片注释,不超过 140 字(可选)
-
可以查询到当前目录下有三个文件夹
-
Code
-
Desktop
-
golang
增加参数
-
ls命令
-
后面 加上一个参数
-
Desktop
ls Desktop
-
查询 Desktop文件夹下 有什么
添加图片注释,不超过 140 字(可选)
-
ls命令 后面还可以
-
加上 两个参数
-
Desktop
-
golang
-
这就是 命令的参数列表
ls命令配合多个参数
ls Desktop golang
-
分别查询两个文件夹
-
先查询 Desktop 下内容
-
再查询 golang 下有什么
添加图片注释,不超过 140 字(可选)
-
python3命令
-
可以有参数列表吗?
参数
-
python3命令
-
后面也可以跟参数
-
首先的参数
-
就是要执行的py文件
-
比如下面的命令
python3 t.py
-
python3 是命令
-
被运行的 test.py
-
就是 python3命令的 参数
销售水果
-
我想做一个水果销售的程序
添加图片注释,不超过 140 字(可选)
-
命令行中告诉我
-
水果
-
数量
python3 shopping.py apple 3 python3 shopping.py banana 5
-
我来计算结果
ai生成代码
添加图片注释,不超过 140 字(可选)
-
ai生成的代码
import sys if len(sys.argv) != 3: print("请按正确格式输入:python 脚本名.py <水果类型> <数量>") sys.exit(1) fruit = sys.argv[1].lower() # 转换为小写方便比较 quantity = int(sys.argv[2]) if fruit == "apple": total_price = quantity * 1 elif fruit == "banana": total_price = quantity * 0.5 else: print("不支持的水果类型,仅支持 apple 或 banana") sys.exit(1) print(f"购买 {quantity} 个 {fruit} 的总价是: {total_price} 元")
参数的意义
-
计算 5个苹果的价格
python3 shopping.py apple 5
-
计算6根香蕉的价格
python3 shopping.py banana 6
-
参数数量为3的时候
-
可以顺利计算
添加图片注释,不超过 140 字(可选)
-
参数 如果不为3呢?
参数 数量
添加图片注释,不超过 140 字(可选)
-
如果 参数数量 不符合要求
-
直接 sys.exit(1)
-
退出py程序 运行过程
if len(sys.argv) != 3: print("请按正确格式输入:python 脚本名.py <水果类型> <数量>") sys.exit(1)
-
为什么 要使用参数呢?
参数的必要性
-
比如 我要
-
计算苹果或者香蕉总价
-
原来 需要把 这个苹果和香蕉的数量
-
写死在py文件里
-
要改 也要在py文件中修改
-
保存之后 才能执行
添加图片注释,不超过 140 字(可选)
-
但是 现在 通过使用命令行 参数
-
可以在命令行上
-
动态地将 参数传递给 py文件
-
python 的 命令行参数 怎么用?
询问ai
添加图片注释,不超过 140 字(可选)
-
需要引入sys包
-
并使用sys.argv来接受参数
-
来看看这个
-
sys.argv 具体是什么
python程序
-
新建 test.py
vi test.py
-
直接输出
-
sys.argv
import sys print(sys.argv)
-
回忆 % 含义
-
% 代表着 当前vim所编辑的文件缓存
-
!python3 % 就相当于
-
在shell 运行下面这个命令
python3 test.py
尝试运行
添加图片注释,不超过 140 字(可选)
-
运行结果
添加图片注释,不超过 140 字(可选)
-
输出了 参数列表
-
列表中 只有一个列表项
-
就是 当前文件的文件名
-
如果 给他更多 参数呢?
更多参数
-
进入 vim中 运行程序
添加图片注释,不超过 140 字(可选)
-
w|!python3 test.py aaa bbb
添加图片注释,不超过 140 字(可选)
-
可以 查询帮助吗?
帮助文档
-
进入游乐场
import sys help(sys)
-
去游乐场
添加图片注释,不超过 140 字(可选)
查询结果
-
能看到
-
argv是个 sys模块中的 列表
-
列表项 是个空串
添加图片注释,不超过 140 字(可选)
-
可以操控 这个列表吗?
python程序
-
回到vim编辑 test.py
import sys args = sys.argv print("len", len(args)) print("type", type(args)) print(args)
-
:w|!python3 % apple 5
添加图片注释,不超过 140 字(可选)
-
可以去掉
-
列表中的test.py 吗?
python程序
import sys args = sys.argv args.remove(args[0]) print("len", len(args)) print("type", type(args)) print(args)
-
运行结果
添加图片注释,不超过 140 字(可选)
-
回到 最初
计划流程
-
苹果1斤1块
-
香蕉2斤1块
添加图片注释,不超过 140 字(可选)
-
回头看程序
完成程序
import sys if len(sys.argv) != 3: print("请按正确格式输入:python 脚本名.py <水果类型> <数量>") sys.exit(1) fruit = sys.argv[1].lower() # 转换为小写方便比较 quantity = int(sys.argv[2]) if fruit == "apple": total_price = quantity * 1 elif fruit == "banana": total_price = quantity * 0.5 else: print("不支持的水果类型,仅支持 apple 或 banana") sys.exit(1) print(f"购买 {quantity} 个 {fruit} 的总价是: {total_price} 元")
-
带参数运行
-
:w|!python3 % apple 30
-
:w|!python3 % orange 130
-
运行结果
添加图片注释,不超过 140 字(可选)
原始程序
import sys if len(sys.argv) != 3: print("请按正确格式输入:python 脚本名.py <水果类型> <数量>") sys.exit(1) fruit = sys.argv[1].lower() # 转换为小写方便比较 quantity = int(sys.argv[2]) if fruit == "apple": total_price = quantity * 1 elif fruit == "banana": total_price = quantity * 0.5 else: print("不支持的水果类型,仅支持 apple 或 banana") sys.exit(1) print(f"购买 {quantity} 个 {fruit} 的总价是: {total_price} 元")
-
但是如果 没有办法把数量转化为整数呢?
提问
添加图片注释,不超过 140 字(可选)
import sys if len(sys.argv)!= 3: print("请按正确格式输入:python 脚本名.py <水果类型> <数量>") sys.exit(1) fruit = sys.argv[1].lower() try: quantity = int(sys.argv[2]) except ValueError: print("数量参数必须是整数,请重新输入正确的数量。") sys.exit(1) if fruit == "apple": total_price = quantity * 1 elif fruit == "banana": total_price = quantity * 0.5 else: print("不支持的水果类型,仅支持apple或banana") sys.exit(1) print(f"购买 {quantity} 个 {fruit} 的总价是: {total_price} 元")
新想法
-
如果想要
-
既有apple
-
又有orange呢?
添加图片注释,不超过 140 字(可选)
分类讨论
-
分成两种情况
-
只有一种水果 3个参数
-
有两种水果 5个参数
w|!python3 apple 3 w|!python3 banana 4 w|!python3 apple 3 banana 4 w|!python3 banana 4 apple 3
-
3个参数的话
-
逻辑和原来一样
-
5个参数的话
-
应该如何修改呢?
-
继续询问
ai的说法
添加图片注释,不超过 140 字(可选)
更多参数
-
分成两种情况
-
只有一种水果 3个参数
-
有两种水果 5个参数
import sys if len(sys.argv) not in [3, 5]: print("请按正确格式输入:python 脚本名.py <水果类型> <数量> 或者 python 脚本名.py <水果1类型> <水果1数量> <水果2类型> <水果2数量>") sys.exit(1) total_price = 0 if len(sys.argv) == 3: fruit = sys.argv[1].lower() try: quantity = int(sys.argv[2]) except ValueError: print("数量参数必须是整数") sys.exit(1) if fruit == "apple": total_price = quantity * 1 elif fruit == "banana": total_price = quantity * 0.5 else: print("不支持的水果类型,仅支持 apple 或 banana") sys.exit(1) else: fruit1 = sys.argv[1].lower() try: quantity1 = int(sys.argv[2]) except ValueError: print("第一个水果的数量参数必须是整数") sys.exit(1) fruit2 = sys.argv[3].lower() try: quantity2 = int(sys.argv[4]) except ValueError: print("第二个水果的数量参数必须是整数") sys.exit(1) if fruit1 == "apple": total_price += quantity1 * 1 elif fruit1 == "banana": total_price += quantity1 * 0.5 else: print(f"不支持的水果类型 {fruit1},仅支持 apple 或 banana") sys.exit(1) if fruit2 == "apple": total_price += quantity2 * 1 elif fruit2 == "banana": total_price += quantity2 * 0.5 else: print(f"不支持的水果类型 {fruit2},仅支持 apple 或 banana") sys.exit(1) print(f"购买水果的总价是: {total_price} 元")
-
w|!python3 % apple 10 banana 15
添加图片注释,不超过 140 字(可选)
-
python什么时候开始
-
可以用命令行参数的呢?
溯源
添加图片注释,不超过 140 字(可选)
-
1993年的时候
-
Guido 还在推广 python的时候
-
就支持命令行参数了
-
语法 到今天也没变
回顾
-
这一功能
-
出现在1990年代初
-
在Guido还在cwi做abc的时候就有了
添加图片注释,不超过 140 字(可选)
-
python最初的目的是
-
成为c和shell之间的桥梁
总结🤔
-
这次研究了python文件运行时的系统参数
-
sys.argv
-
通过sys.argv就可以接收从命令行来的参数了
-
可以通过索引来获得第n个参数
-
这就是索引(index)的作用
添加图片注释,不超过 140 字(可选)
-
处理了可能出现的
-
IndexError
-
ValueError
添加图片注释,不超过 140 字(可选)
-
列表(list)还有什么方法呢?🤔
-
下次再说 👋
浙公网安备 33010602011771号