show | version | enable_checker |
---|---|---|
step |
1.0 |
true |
- 上次完成了彩色松树的显示
- 使用表驱动设置颜色与色彩代码的字典
- 使用默认参数确保原来只有一个参数的调用仍然好使
- 但是始终要修改源代码才能打印出松树
- 可以利用命令行的参数(arguement)么?
def draw_pine(n=5,color="white"):
draw_pine_head(n,color)
draw_pine_body()
def draw_pine_head(n,color="white"):
print(color)
print("\33["+d_colors[color]+"m",end="")
draw_pine_triangle()
draw_pine_triangle()
def draw_pine_triangle():
for i in range(6):
for j in range(6-i):
print(" ",end="",sep="")
for k in range(2*i+1):
print("*",end="",sep="")
print()
def draw_pine_body():
for i in range(5):
for j in range(5):
print(" ",end="",sep="")
for k in range(3):
print("*",end="",sep="")
print()
for i in range(6):
for j in range(6-i):
print(" ",end="",sep=",")
print("\33[0m",end="")
if __name__ == '__main__':
d_colors = {"green":"32","yellow":"33","white":"0"}
draw_pine()
- 我想从命令行中接受参数
- 设置 颜色 和 大小
- 查找帮助
- 导入sys模块
- 可以得到 命令行中的参数
- 导入 argparse 模块
- 可以 更加体系化地 使用 命令行参数
import argparse
import sys
- 准备 对于主程序
- 进行修改
- 确实可以运行处很好的效果
- 不过我想让参数含义更明确一点
- argparse分成两块
- arguement shell给的实参
- parse 语法分析
if __name__ == '__main__' :
parser = argparse.ArgumentParser (
prog='pine',
description='Show pine on screen')
parser.add_argument('-n', '-num', type=int, default=5)
parser.add_argument('-c', '-color', type=str, default="white")
args = parser.parse_args()
print(type(args),args)
d_colors = {"green": "32", "yellow": "33", "white": "0"}
#draw_pine(num,color)
- 修改 主函数 执行部分
- 我们去命令行试试
- 使用了 此命令后
- 命令行 添加了 帮助
- 参数名 必须明确
- 参数类型 也必须符合要求
- 尝试和我们的画松树对接
if __name__ =='__main__':
parser = argparse.ArgumentParser (
prog='pine',
description='Show pine on screen')
parser.add_argument('-n', '-num', type=int, default=5)
parser.add_argument('-c', '-color', type=str, default="white")
args = parser.parse_args()
print(type(args),args)
print(type(vars(args)),vars(args))
d_colors = {"green": "32", "yellow": "33", "white": "0"}
#draw_pine(num,color)
- 找到对接方式
- 字典
if __name__ =='__main__':
parser = argparse.ArgumentParser
prog='pine',
description='Show pine on screen')
parser.add_argument('-n', '-num', type=int, default=5)
parser.add_argument('-c', '-color', type=str, default="white")
args = parser.parse_args()
print(type(args),args)
print(type(vars(args)),vars(args))
color = vars(args)["c"]
num = vars(args)["n"]
d_colors = {"green": "32", "yellow": "33", "white": "0"}
draw_pine(num,color)
- 这样可以提高程序的可读性
- Readablity Counts
:w|!python3 % -n 3 -c yellow
- 效果
- 直接无命令行参数调用可以么?
- 直接调用是可以的
- 因为有默认参数
- 遇到了字典里没有的颜色
- 怎么办?
- 这个"blue"字典里面没有
- 可以限制命令行参数的选项(choices)
- choices
- 可以是列表
- 也可以是集合
- 或者其他容器类型
- 确实可以限定
- 参数必须为字典的key
- 整数num可以限制输入范围么?
- 成功约束范围
import argparse
def draw_pine(n=5,color="white"):
draw_pine_head(n,color)
draw_pine_body(n)
def draw_pine_head(n,color="white"):
print(color)
print("\33["+d_colors[color]+"m",end="")
draw_pine_triangle(n)
draw_pine_triangle(n)
def draw_pine_triangle(n,color="white"):
for i in range(n):
for j in range(n-i):
print(" ",end="",sep="")
for k in range(2*i+1):
print("*",end="",sep="")
print()
def draw_pine_body(n):
for i in range(5):
for j in range(5):
print(" ",end="",sep="")
for k in range(3):
print("*",end="",sep="")
print()
for i in range(6):
for j in range(6-i):
print(" ",end="",sep=",")
print("\33[0m",end="")
if __name__ == '__main__':
d_colors = {"green":"32","yellow":"33","white":"0"}
parser = argparse.ArgumentParser(
prog='pine',
description='Show pine on screen')
parser.add_argument("-num", "-n", type=int, default=5, choices=range(2,10))
parser.add_argument("-color","-c", type=str, default="white", choices=d_colors.keys())
args = parser.parse_args()
print(type(args),args)
print(type(vars(args)),vars(args))
color = vars(args)["color"]
num = vars(args)["num"]
draw_pine(num,color)
- 把取得命令行参数的过程封装成为一个函数
- 我们可以看到函数的返回值是一个元组类型
- 经过解包(unpacking)的过程
- 赋给两个变量
- 这样我们主函数里面就只有3句话了
- 定义颜色字典
- 从命令行得到相关参数
- 进行屏幕输出
- 我们这次学习了argparse这个包(module)
- 这个包可以接受一些命令行传过来的参数
- 可以编写命令帮助
- 可以定制参数名称和缩写
- 还可以对于参数设置
- 类型
- 默认值
- 可选项
- 我们最终把参数输入封装成了一个函数
- 这样主函数看起来就清爽多了
- 总共就3行
- 每行干什么很清晰
- 这样主函数看起来就清爽多了
- get_argument函数中
- 对于参数有明确要求
- 类型
- 默认值
- 选项
- 对于参数有明确要求
- 为什么要这么较真严格呢?🤔
- 我们下次再说👋