0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Python 中的5种隐藏技巧

科技绿洲 来源:Python实用宝典 作者:Python实用宝典 2023-10-21 16:26 次阅读

1. ... 对象

没错,你没看错,就是 "..."

Python中 ... 代表着一个名为 Ellipsis 的对象。根据官方说明,它是一个特殊值,通常可以作为 空函数的占位符 ,或是 用于Numpy中的切片操作

如:

def my_awesome_function():
    ...

等同于:

def my_awesome_function():
    Ellipsis

当然,你也可以使用pass或者字符串作为占位符:

def my_awesome_function():
    pass
def my_awesome_function():
    "An empty, but also awesome function"

他们最终的效果都是相同的。

接下来讲讲...对象是如何在Numpy中体现出作用的,创建一个 3x3x3 的矩阵数组,然后获取所有最内层矩阵的第二列:

> >> import numpy as np
> >> array = np.arange(27).reshape(3, 3, 3)
> >> array
array([[[ 0, 1, 2],
        [ 3, 4, 5],
        [ 6, 7, 8]],

       [[ 9, 10, 11],
        [12, 13, 14],
        [15, 16, 17]],

       [[18, 19, 20],
        [21, 22, 23],
        [24, 25, 26]]])

为了获取最层矩阵的第二列,传统方法可能是这样的:

> >> array[:, :, 1]
array([[ 1, 4, 7],
       [10, 13, 16],
       [19, 22, 25]])

如果你会用...对象,则是这样的:

> >> array[..., 1]
array([[ 1, 4, 7],
       [10, 13, 16],
       [19, 22, 25]])

不过请注意, ... 对象仅可用于Numpy,不适用于Python内置数组。

2.解压迭代对象

解压迭代对象是一个非常方便的特性:

>> > a, *b, c = range(1, 11)
 >> > a
1
 >> > c
10
 >> > b
[2, 3, 4, 5, 6, 7, 8, 9]

或者是:

>> > a, b, c = range(3)
 >> > a
0
 >> > b
1
 >> > c
2

同理,与其写这样的代码:

>> > lst = [1]
 >> > a = lst[0]
 >> > a
1
 >> > (a, ) = lst
 >> > a
1

你不如跟解压迭代对象一样,进行更优雅的赋值操作:

>> > lst = [1]
 >> > [a] = lst
 >> > a
1

虽然这看起来有点蠢,但就我个人来看,比前一种写法更优雅一些。

3.展开的艺术

数组展开有各种千奇百怪的姿势,比如说:

>> > l = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
 >> > flattened = [elem for sublist in l for elem in sublist]
 >> > flattened
[1, 2, 3, 4, 5, 6, 7, 8, 9]

如果你对reduce和lambda有一定了解,建议使用更优雅的方式:

>> > from functools import reduce
 >> > reduce(lambda x,y: x+y, l)
[1, 2, 3, 4, 5, 6, 7, 8, 9]

reduce和lambda组合起来,就能针对 l 数组内的每个子数组做拼接操作。

当然,还有更神奇的方式:

> >> sum(l, [])
[1, 2, 3, 4, 5, 6, 7, 8, 9]
> >> # 其实相当于 [] + [1, 2, 3] + [4, 5, 6] + [7, 8, 9]

没错,这样对二维数组做sum操作,就能使二维数组内的每个元素做“加”法拼接起来。

同样的道理,如果你对三位数组做sum操作,就能使其变为二维数组,此时再对二维数组做sum操作,就能展开为一维数组。

虽然这个技巧很出色,但我并不推荐使用,因为可读性太差了。

4.下划线 _ 变量

每当你在Python解释器,IPython或Django Console中运行表达式时,Python都会将输出的值绑定到 _ 变量中:

>> > nums = [1, 3, 7]
 >> > sum(nums)
11
 >> > _
11
 >> >

由于它是一个变量,你可以随时覆盖它,或像普通变量一样操作它:

>> > 9 + _
20
 >> > a = _
 >> > a
20

5.多种用途的else

很多人都不知道,else 可以被用于许多地方,除了典型的 if else, 我们还可以在循环和异常处理里用到它。

循环

如果需要判断循环里是否处理了某个逻辑,通常情况下会这么做:

found = False
a = 0

while a < 10:
    if a == 12:
        found = True
    a += 1
if not found:
    print("a was never found")

如果引入else,我们可以少用一个变量:

a = 0

while a < 10:
    if a == 12:
        break
    a += 1
else:
    print("a was never found")

异常处理

我们可以在 try ... except ... 中使用 else 编写未捕获到异常时的逻辑:

In [13]: try:
    ...: {}['lala']
    ...: except KeyError:
    ...: print("Key is missing")
    ...: else:
    ...: print("Else here")
    ...:
Key is missing

这样,如果程序没有异常,则会走else分支:

In [14]: try:
    ...: {'lala': 'bla'}['lala']
    ...: except KeyError:
    ...: print("Key is missing")
    ...: else:
    ...: print("Else here")
    ...:
Else here

如果你经常做异常处理,你就会知道这个技巧相当方便。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 字符串
    +关注

    关注

    1

    文章

    552

    浏览量

    20130
  • python
    +关注

    关注

    51

    文章

    4677

    浏览量

    83468
  • 数组
    +关注

    关注

    1

    文章

    409

    浏览量

    25595
  • Lambda
    +关注

    关注

    0

    文章

    26

    浏览量

    9775
收藏 人收藏

    评论

    相关推荐

    回声隐藏在音频数字水印的应用

    信息隐藏技术对版权保护的作用非常重要。回声隐藏是信息隐藏的一常见应用,是对原始音频加入回声从而达到对秘密信息隐藏的一
    发表于 03-03 23:21

    基于混沌和小波变换的大容量音频信息隐藏算法

    `音频信息隐藏的主要原理是利用人耳听觉系统的某些特性,将秘密信息隐藏到普通的音频数据流以达到隐蔽通信的目的.提出了一基于混沌和小波变换的大容量音频
    发表于 03-06 18:32

    Python存储数据详解

    文件存储数据json是一轻量级的数据交换格式,采用完全独立于编程语言的文本格式来存储和表示数据,可以轻松解决py2和py3的编码问题,内容结构类似于python的字典和列表,层次结构简洁而清晰,易于
    发表于 03-29 15:47

    5Python实现方式详解

    python就是是一面向对象的解释型计算机程序设计语言,具有丰富和强大的库,语言因其简洁性、易读性以及可扩展性受到欢迎。python可用于图形处理、数学处理、文本处理、数据库编程、网络编程、Web
    发表于 05-22 15:52

    Python在开发实时嵌入式系统的作用

    的电气工程师能够利用Python编写有用的测试脚本或以最少的时间投入执行电路板检查。Python的学习曲线并不陡峭,熟悉它的开发人员发现它是一易于从其他语言切换的语言。语言本身灵活,并且可以适应在基于微控制器的环境
    发表于 01-11 18:22

    CAD看图软件怎么将图纸的文字隐藏

    个图层,那么想要进行文字隐藏的时候,也只需要将相应的文字图层关闭或者冻结就可以了。那么在CAD看图软件想要将文字隐藏该怎么进行操作呢?接下来就给大家介绍一下浩辰CAD看图王电脑版
    发表于 09-11 22:44

    为什么要提出一数据隐藏新算法?

    为什么要提出一数据隐藏新算法?DDE双重差值扩展算法包括哪些?
    发表于 04-20 07:05

    如何隐藏CAD图纸的部分图形对象?CAD局部隐藏

    在CAD绘图过程,如果想要局部隐藏一些CAD图纸的对象的话该如何操作呢?有些CAD新手可能对此并不清楚,下面就和小编一起来了解一下浩辰CAD建筑软件CAD局部
    发表于 06-06 17:55

    为什么近5年来,Python语言持续火爆?

    之下,非常简洁易学。4、大厂都在使用Python百度、新浪、阿里、腾讯、头条等互联网相关企业都在使用,对Python的人才需求很大。5、人工智能的兴起随着人工智能的兴起,Python
    发表于 07-16 16:43

    【Altium小课专题 第125篇】PCB如何快速隐藏铜皮?

    隐藏铜皮可分为以下三情况,不同的情况对应着不同的软件操作。1)如果只想隐藏当前选中的铜皮,那么就选中对应需要隐藏的铜,然后鼠标执行“右键”,在弹出的对话框中选择“铺铜操作-
    发表于 07-27 17:10

    1.3 两运行 Python 程序方法

    在 PowerShell 输入 python dmeo.py,就可以执行这个 python 脚本啦。以上介绍了两最原始的 Python
    发表于 02-16 18:31

    python判断是否包含子串的7方法

    ", "lol"))# False5、通过魔法方法在第一方法,我们使用 in 和 not in 判断一个子串是否存在于另一个字符,实际上
    发表于 04-08 15:15

    Python 转义字符的5表示方法

    ;>> repr(body)"'hello\\nworld'"5. 使用 string_escape如果你还在使用 Python 2 ,其实还可以使用另一方法。那就是
    发表于 04-11 15:18

    AD隐藏飞线、隐藏电源飞线办法

    隐藏飞线:法1:N->隐藏连接 -> 全部法2:如下隐藏电源飞线操作步骤隐藏电源飞线:打开PCB面板视图->面板->PCB右击->添加类3.修改类名,将电源成员添加到类中,确定。选中类
    发表于 01-05 14:29 23次下载
    AD<b class='flag-5'>隐藏</b>飞线、<b class='flag-5'>隐藏</b>电源飞线办法

    python如何通过_X和all隐藏模块数据

    python的_X指出不被复制的变量,**all**指出要复制的变量。
    的头像 发表于 02-21 11:29 409次阅读