一次奇妙的Python压行经历

任务要求

现需要设置一个密码,要求长度大于等于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()]))))

扩展阅读

《只一行Python 代码究竟能实现多少丧心病狂的功能》

讴歌伟大的Python

在这里插入图片描述

发布了719 篇原创文章 · 获赞 1594 · 访问量 75万+

猜你喜欢

转载自blog.csdn.net/weixin_43896318/article/details/105136704
今日推荐