任务要求
现需要设置一个密码,要求长度大于等于8,全部为字母,并且必须同时包含大写字母和小写字母。
要求从键盘读取输入,判断它是不是一个合规的密码,是输出"yes",否输出"no"。
两行压缩
第一次感觉不太能写一行,就写了两行,tcl……
a = input()
print("yes" if (len(a)>=8 and a.isalpha() and (not a.islower()) and (not a.isupper())) else "no")
使用的是类似于三目运算的 if…else… ,Python专属,秀秀的。
len()是内置函数,直接用,判串长度。
isalpha()、islower()、isupper() 分别判断是不是全字母、是不是全小写字母、是不是全大写字母。
我的思路是,将这个“全部是字母且必须有大写字母和小写字母”进行逻辑化简和转化,转化语义为:“全部是字母 and 不能全是大写字母 and 不能全是小写字母”。
直接输出即可。
反复尝试压缩一行
第二次就想压一行了,于是想用 lambda函数,即:
lambda a: "yes" if (len(a)>=8 and a.isalpha() and (not a.islower()) and (not a.isupper())) else "no"
那只需要在同一行内把从 input() 获取的输入传给这个lambda函数即可,这需要map()的支持。
语句被扩展为:
map(lambda a: "yes" if (len(a)>=8 and a.isalpha() and (not a.islower()) and (not a.isupper())) else "no",[input()])[0]
获取map()得到的列表的第一个元素,于是报错:
TypeError: ‘map’ object is not subscriptable
读了读,知道是因为不可获取下标,于是打印一下(此时我以为是直接得到了结果):
<map object at 0x00000249262DB710>
想想Java的hashCode,有内味了……那就不能这么做……
这就很难受,想了一下发现自己记错了,获取列表是Python2的操作,Python3获取的是迭代器对象。
那就需要进一步套上iter()了:
iter(map(lambda a: "yes" if (len(a)>=8 and a.isalpha() and (not a.islower()) and (not a.isupper())) else "no",[input()]))
想要获取第一个元素,需要使用next(),注意不是使用点运算符,而是套在外面:
next(iter(map(lambda a: "yes" if (len(a)>=8 and a.isalpha() and (not a.islower()) and (not a.isupper())) else "no",[input()])))
最终代码
print(next(iter(map(lambda a: "yes" if (len(a)>=8 and a.isalpha() and (not a.islower()) and (not a.isupper())) else "no",[input()]))))