Python的偷懒用法
在 Python 中,其实是有很多可以偷懒的方法的。原生的 Python 语言就自带了非常多小技巧,小实用方法。 我经常在日常写代码的时候用到它们。这可以节约我很多写代码的时间。还是回到最开始那一个课程介绍页的内容。 人生苦短,我用 Python 这句话,那既然我们抱着这个目的在学 Python,你势必要学会更加有效的方法,让你在苦短人生中, 比一般 Pythoner 更加出众。
在这一节主要涉及到的功能:
- Lambda
lambda x: x+1
- for 的简写模式
[i*2 for i in range(10)]
{"i"+str(i): i*2 for i in range(10)}
- if else 简写模式
a = 1 if True else 2
- 一行 for + if
[i*2 for i in range(10) if i%2==0]
- enumerate
for i, item in enumerate(items)
- zip
for n, s in zip(items, scores)
- reverse & reversed
list.reverse()
for i in reversed(list)
Lambda: 更直接的 Function¶
在 Python 中,我们肯定会定义功能 Function,或者 method,无论你管它叫什么,它都是一个会执行你任务的功能。
你看,即使是一个简单的 add
功能,我都要写一长串的固定格式才能把它当功能使用。 有没有更简单的方法?答案是肯定的。如果你发现你的情况是:
- 我的功能很简单
- 调用次数不多(没那么正式的功能)
你就可以用 lambda 来写功能啦。
你看,我一行就能解决的事,为什么要写那么多行呢?不过 lambda
也不能滥用,一定要记得有这么个约定的前提条件。 它不是正式功能,你要临时使用的时候可以用,正式的功能,特别是你要为别人写功能的时候,你写在 lambda 里,大家不会把它当回事的。
一行for能解决的事,干嘛写那么多¶
你是否有这么一个时候:
- 我想要出一个列表,
- 然后用 for 循环不断添加列表里的元素。
正常来说,我们通常要这样写,列表才会添加完毕。
但是这样写,对于我来说太麻烦了。不就是要按规律得到一个列表吗?我一行就可以解决呀。
甚至,你还能那这种方法来创造字典。
但是这种方法也是有适用场景的,如果你的列表/字典生成逻辑非常复杂,这种一行的 for 就太劳民伤财了,你会为其中的格式纠结死的。 所以这种列表/字典的生成方式只适合 for 内部只有比较简单的运算逻辑的情况。
可以一行判断,何必多行¶
这里要说的是判断逻辑,那些简单的 if-else 判断,如果写成多行,有时候还挺费力的。比如
你对比下面这种写法,你的生命负担是不是又减轻了~
不过上面这种简写模式,也有一些经验上的偏爱条件。如果你的 if else 逻辑很复杂,比如里面还有 elif 这种逻辑,就不要用一行写。 一行只是为了减少你处理简单情况的时间。如果你在一行里面写了太多逻辑,阅读起来就很困难了。
一行for+判断也行¶
我们刚刚说了 for
的超简写模式,和 if else
的简写模式,如果上天再给我一个恩惠,我想,它一定会把这两种模式整合起来, 让我的生命得到升华~这不它来了。
在这种情况下,我们通常是处理一种特殊的列表/字典生成方式。
- 我要用一行 for 生成一个列表/字典
- 对原始数据进行判断,符合要求的生成,不符合的抛弃
如果我们用原始的 for 来写这样的逻辑,将会是下面这样
当你看到下面的写法的时候,将会豁然开朗~
那么字典行吗?
我的生命从此得到了升华~ Yeah。
enumerate 自动加 index¶
有时候你肯定会苦恼,我想为在 for 里面记个数,到某个数的时候做点特殊处理。我的生命没有得到升华的时候,我肯定会这样写。
这个 count
的存在是不是很费事?还要我手动去累加。要不试试 enumerate
?
还有更炫酷的,如果我自定义 count
还好,我可以初始化 count
到不同的数值。不急,这点小 case,enumerate
也能应付。
Zip让你同时迭代¶
我要同时处理两个列表,一个是姓名一个是分数,并把它们做成一个字典,你会怎么做?
这种写法对于我来说,还是比较累赘的。怎么搞?直接上 zip
。
其实这也就是在 d[n]=s
这一步得到了简化,但是你有没有想过,如果需要同时循环的东西变多了以后,情况就变得复杂很多。我们 zip 还是能简化写法的。
我看见了光~ 生命之光。
reverse & reversed¶
翻转列表?你会遇到吗?有时候还真有这种需求,比如页面上用户想要按时间正序排列,有时候想要按时间倒叙,这不就是一个最常见的场景吗? 你怎么办?如果我用一些列表技巧,可能这样比较合适
如果你学了今天的内容,上面我们不是提到了一种 for
的续命短模式吗?
这还不是最简单的,最简单的当然是 Python 自带的翻转功能呀。比如下面这三种种都可以。 第一种是自己就地反转。
另一种是可以用在 for 循环里的翻转迭代器,你也可以试试不用在 for 循环中,它会返回什么。
最后一种是要 copy 出一个浅拷贝副本的反转
一个反转都有这么多种不同的方式,真不愧是 Python。
总结¶
有了这些 handly 的方法,我的秃头病也要治好了,用 Python 无时无刻都体现出生命之光的本色。印证了生命苦短,我用 Python
这句话。