100 个 Python 小例子(练习题一)

  • Post category:Python

题目描述:

本练习题是《流畅的python》附录A中的100个Python小例子练习题练习题一。要求实现一个类似于shell实现的基础版本的命令行解释器,支持的功能包括:1. 打印历史记录;2. 执行命令。

攻略:

  1. 转换输入的命令

首先,我们需要将用户输入的命令进行解析,将其转换为程序可以识别并执行的形式。这里我们可以使用shlex模块中的split()函数对命令进行解析,生成一个列表,列表中的每个元素为命令的一个参数。

import shlex

command_line = input()
command = shlex.split(command_line)
  1. 实现历史记录

随后,我们需要实现打印历史记录的功能。在实现这个功能之前,我们需要先记录用户输入的所有命令。这里我们可以定义一个列表history,用来存储用户输入的所有命令。

history = []

每次用户输入新的命令后,我们可以将该命令添加到history列表中。

history.append(command_line)

要实现打印历史记录的功能,我们可以使用列表的切片操作,将history列表中的前n个元素取出并打印。

n = 10
for i, command in enumerate(history[-n:]):
    print('{0}: {1}'.format(i+1, command))
  1. 执行命令

最后,我们需要实现执行用户输入的命令。在实现这个功能之前,我们需要定义一些可以被执行的命令。这里我们可以定义一个字典cmds,用来储存所有可以被执行的命令和相应的函数。

def cmd_hello(args):
    print('Hello {0}!'.format(args[0]))

cmds = {
    'hello': cmd_hello
}

在用户输入了一个命令之后,我们可以判断这个命令是否存在cmds字典中,如果存在,就调用相应的函数执行该命令。

if command[0] in cmds:
    cmds[command[0]](command[1:])

示例说明:

下面两个示例,分别实现了一个输出字符串和输出当前时间的命令。

import datetime

def cmd_hello(args):
    print('Hello {0}!'.format(args[0]))

def cmd_datetime(args):
    print(datetime.datetime.now())

cmds = {
    'hello': cmd_hello,
    'datetime': cmd_datetime
}

使用以下的代码进行测试:

history = []

while True:
    command_line = input('> ')
    command = shlex.split(command_line)
    history.append(command_line)

    if len(history) > 10:
        history.pop(0)

    if command[0] == 'history':
        n = 10
        for i, cmd in enumerate(history[-n:]):
            print('{0}: {1}'.format(i+1, cmd))
    elif command[0] in cmds:
        cmds[command[0]](command[1:])
    else:
        print('Unknown command: {0}'.format(command[0]))

输入”hello world”,输出:

> hello world
Hello world!

输入”datetime”,输出:

> datetime 
2021-10-25 15:59:52.579658

输入”history”,输出:

> history 
1: hello world
2: datetime
3: history