GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • 莫烦PYTHON
  • 学习 ▾
  • 推荐学习顺序
  • 交互式学Python
  • 多进程 multiprocessing
  • 多线程 threading
  • 窗口视窗 Tkinter
  • 有趣的机器学习
  • 强化学习 Reinforcement Learning
  • 进化算法 Evolutionary Algorithm
  • Tensorflow
  • PyTorch
  • Theano
  • Keras

This view

  • Original page
  • New address

GeezerVison is showing mofanpy.com — Python的偷懒用法 | 莫烦Python

  • 支持

📢

莫烦有新起点啦!「莫烦 x 无限可能」— 关于 AI、行业、产品、教育的经验思考,欢迎来新站看看 →

« 字符串的高级玩法 复制的"玄学" »

Python的偷懒用法

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

在 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 功能,我都要写一长串的固定格式才能把它当功能使用。 有没有更简单的方法?答案是肯定的。如果你发现你的情况是:

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

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

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

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

你是否有这么一个时候:

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

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

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

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

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

可以一行判断,何必多行¶

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

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

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

一行for+判断也行¶

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

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

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

如果我们用原始的 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 这句话。


降低知识传递的门槛

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

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

wechat
« 字符串的高级玩法 复制的"玄学" »
    教程目录

    交互式学Python

      介绍

    • 课程介绍

      基础功能

    • 变量与运算

      循环、数据、判断

    • 条件判断
    • for 和 while 循环
    • 数据种类

      函数、类、模块

    • Function 函数
    • Class 类
    • Module 模块

      文件管理

    • 读写文件
    • 文件目录管理
    • 正则表达式
    • pickle/json 序列化

      异常检查和处理

    • 如何控制异常 try-except
    • 单元测试

      做个项目

    • 没啥用计算器
    • 文件批量处理

      高阶内容

    • 字符串的高级玩法
    • Python的偷懒用法
      • Lambda: 更直接的 Function
      • 一行for能解决的事,干嘛写那么多
      • 可以一行判断,何必多行
      • 一行for+判断也行
      • enumerate 自动加 index
      • Zip让你同时迭代
      • reverse & reversed
      • 总结
    • 复制的"玄学"
    • 为什么要有生成器
    • 套娃的装饰器
    • Python 安装和依赖管理:Conda/Pip
    • Python编辑器

      进阶学习

    • 多线程多进程
    • Python 窗口部件
    • 数据三剑客 Numpy Pandas Matplotlib
    • 数据采集-爬虫技术
    You are visitor 01402520 — GeezerVison does not store the pages you look up.
    Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.