2 案例2:检查标识符
2.1 问题
创建checkid.py脚本,要求如下:
程序接受用户输入
判断用户输入的标识符是否合法
用户输入的标识符不能使用关键字
有不合法字符,需要指明第几个字符不合法
2.2 方案
本题主要利用标识符命名规则从三方面判断用户输入标识符是否合法,
首先,如果用户输入的第一个字符(用切片方式拿出idt第一个字符)不是以大小写字母或下划线开头,返回’第一个字符不合法’
接下来,利用for循环逐个判断其他字符是否合法,这里的判断范围除大小写字母、下划线外增加了0-9数字,如果其他字符不在判断范围之内,返回’第几个字符非法’
最后,判断idt是否是关键字,如果是返回’idt是关键字,不能作为自定义的标识符’
如果上诉三方面判断都结束,将符合标识符命名规则字符返回,将以上所有功能封装入函数,调用函数即可,需要注意的是:
1.导入String模块,其中ascii_letters是生成所有字母,从a-z和A-Z,digits是生成所有数字0-9
2.导入keyword模块,iskeyword(idt)是用来查看某一个字符串是否是关键字
3.enumerate()函数是python的内置函数,enumerate(idt[1:])最终会返回参数的索引和值,利用索引值输出是第几个字符不合法
4.标识符的命名规则有三项,以大小写字母或下划线开头,可包括字母、下划线和数字,如‘and’‘if’‘import’等关键字不可为标识符
2.3 步骤
实现此案例需要按照如下步骤进行。
步骤一:编写脚本
[root@localhost day04]# vim checkid.py
#!/usr/bin/env python3
import string
import keyword
first_chs = string.ascii_letters + '_'
all_chs = first_chs + string.digits
def check_id(idt): # abc@123
if idt[0] not in first_chs:
return '第一个字符不合法'
for ind, ch in enumerate(idt[1:]): # bc@123 [(0, b), (1, c)...]
if ch not in all_chs:
return '第%s个字符%s非法' % (ind+2, ch)
if keyword.iskeyword(idt):
return '%s是关键字,不能作为自定义的标识符' % idt
return '%s是合法的标识符' % idt
if __name__ == '__main__':
idt = input('请输入待检查的标识符:')
print(check_id(idt))
步骤二:测试脚本执行
[root@localhost day05]# python3 checkid.py
请输入待检查的标识符:abc@123
第4个字符@非法
[root@localhost day04]# python3 checkid.py
请输入待检查的标识符:bc@123
第3个字符@非法
[root@localhost day04]# python3 checkid.py
请输入待检查的标识符:and
and是关键字,不能作为自定义的标识符
[root@localhost day04]# python3 checkid.py
请输入待检查的标识符:_Ance
_Ance是合法的标识符
[root@localhost day04]# python3 checkid.py
请输入待检查的标识符:nice_en*-ni
第8个字符*非法