Python的偷懒用法

Python的偷懒用法

作者: 莫烦 编辑: 莫烦 发布于: 2021-06-05

在 Python 中,其实是有很多可以偷懒的方法的。原生的 Python 语言就自带了非常多小技巧,小实用方法。 我经常在日常写代码的时候用到它们。这可以节约我很多写代码的时间。还是回到最开始那一个课程介绍页的内容。 人生苦短,我用 Python 这句话,那既然我们抱着这个目的在学 Python,你势必要学会更加有效的方法,让你在苦短人生中, 比一般 Pythoner 更加出众。

在这一节主要涉及到的功能:

Lambda: 更直接的 Function

在 Python 中,我们肯定会定义功能 Function,或者 method,无论你管它叫什么,它都是一个会执行你任务的功能。

Image

你看,即使是一个简单的 add 功能,我都要写一长串的固定格式才能把它当功能使用。 有没有更简单的方法?答案是肯定的。如果你发现你的情况是:

  1. 我的功能很简单
  2. 调用次数不多(没那么正式的功能)

你就可以用 lambda 来写功能啦。

Image

你看,我一行就能解决的事,为什么要写那么多行呢?不过 lambda 也不能滥用,一定要记得有这么个约定的前提条件。 它不是正式功能,你要临时使用的时候可以用,正式的功能,特别是你要为别人写功能的时候,你写在 lambda 里,大家不会把它当回事的。

一行for能解决的事,干嘛写那么多

你是否有这么一个时候:

  1. 我想要出一个列表,
  2. 然后用 for 循环不断添加列表里的元素。

正常来说,我们通常要这样写,列表才会添加完毕。

Image

但是这样写,对于我来说太麻烦了。不就是要按规律得到一个列表吗?我一行就可以解决呀。

Image

甚至,你还能那这种方法来创造字典

Image

但是这种方法也是有适用场景的,如果你的列表/字典生成逻辑非常复杂,这种一行的 for 就太劳民伤财了,你会为其中的格式纠结死的。 所以这种列表/字典的生成方式只适合 for 内部只有比较简单的运算逻辑的情况。

可以一行判断,何必多行

这里要说的是判断逻辑,那些简单的 if-else 判断,如果写成多行,有时候还挺费力的。比如

Image

你对比下面这种写法,你的生命负担是不是又减轻了~

Image

不过上面这种简写模式,也有一些经验上的偏爱条件。如果你的 if else 逻辑很复杂,比如里面还有 elif 这种逻辑,就不要用一行写。 一行只是为了减少你处理简单情况的时间。如果你在一行里面写了太多逻辑,阅读起来就很困难了。

一行for+判断也行

我们刚刚说了 for 的超简写模式,和 if else 的简写模式,如果上天再给我一个恩惠,我想,它一定会把这两种模式整合起来, 让我的生命得到升华~这不它来了。

在这种情况下,我们通常是处理一种特殊的列表/字典生成方式。

  1. 我要用一行 for 生成一个列表/字典
  2. 对原始数据进行判断,符合要求的生成,不符合的抛弃

如果我们用原始的 for 来写这样的逻辑,将会是下面这样

Image

当你看到下面的写法的时候,将会豁然开朗~

Image

那么字典行吗?

Image

我的生命从此得到了升华~ Yeah。

enumerate 自动加 index

有时候你肯定会苦恼,我想为在 for 里面记个数,到某个数的时候做点特殊处理。我的生命没有得到升华的时候,我肯定会这样写。

Image

这个 count 的存在是不是很费事?还要我手动去累加。要不试试 enumerate

Image

还有更炫酷的,如果我自定义 count 还好,我可以初始化 count 到不同的数值。不急,这点小 case,enumerate 也能应付。

Image

Zip让你同时迭代

我要同时处理两个列表,一个是姓名一个是分数,并把它们做成一个字典,你会怎么做?

Image

这种写法对于我来说,还是比较累赘的。怎么搞?直接上 zip

Image

其实这也就是在 d[n]=s 这一步得到了简化,但是你有没有想过,如果需要同时循环的东西变多了以后,情况就变得复杂很多。我们 zip 还是能简化写法的。

Image

我看见了光~ 生命之光。

reverse & reversed

翻转列表?你会遇到吗?有时候还真有这种需求,比如页面上用户想要按时间正序排列,有时候想要按时间倒叙,这不就是一个最常见的场景吗? 你怎么办?如果我用一些列表技巧,可能这样比较合适

Image

如果你学了今天的内容,上面我们不是提到了一种 for 的续命短模式吗?

Image

这还不是最简单的,最简单的当然是 Python 自带的翻转功能呀。比如下面这三种种都可以。 第一种是自己就地反转。

Image

另一种是可以用在 for 循环里的翻转迭代器,你也可以试试不用在 for 循环中,它会返回什么。

Image

最后一种是要 copy 出一个浅拷贝副本的反转

Image

一个反转都有这么多种不同的方式,真不愧是 Python。

总结

有了这些 handly 的方法,我的秃头病也要治好了,用 Python 无时无刻都体现出生命之光的本色。印证了生命苦短,我用 Python 这句话。


降低知识传递的门槛

莫烦经常从互联网上学习知识,开源分享的人是我学习的榜样。 他们的行为也改变了我对教育的态度: 降低知识传递的门槛

我组建了微信群,欢迎大家加入,交流经验,提出问题,互相帮持。 扫码后,请一定备注"莫烦",否则我不会同意你的入群申请。

wechat