IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> Python 的 Ellipsis 对象 -> 正文阅读

[Python知识库]Python 的 Ellipsis 对象

Python 的 Ellipsis 对象

近来由于某些无聊原因在研读 Python 的文档,发现一个适合装逼好玩的东西。

Ellipsis 对象。

在 Python 3 中你可以直接写...?来得到这玩意。

>>> ...
Ellipsis
>>> type(...)
<class 'ellipsis'>
>>>

而在 2 中没有...?这个语法,只能直接写?Ellipsis?来获取。

>>> Ellipsis
Ellipsis
>>> type(Ellipsis)
<type 'ellipsis'>
>>>

它转为布尔值时为真

>>> bool(...)
True

最后,这东西是一个单例。

>>> id(...)
4362672336
>>> id(...)
4362672336

用法

那么这东西有啥用呢?实际上没什么用。它自身并没有什么特殊的方法或属性,只是一个普通的对象而已。而官方文档上说 Ellipsis 通常用来扩展切片的功能,但说得很模糊,也没见有多少人在用这个东西。

1. 辣鸡语法糖

切片 (Slicings) 用来选取一个序列的某个范围并返回,这个过程归根结底是一次函数调用。如?lst[1:3]?这样的切片操作会把?slice(1,3,None)?作为参数,传入__getitem__(self, key)?这个方法中,另外字典类型取值时?a[k]?实际上也是使用了这个__getitem__(self, key)?方法。

那么可以通过魔改这个东西来强行实现递推序列之类的玩意了。

class Mogic(object):
    def __getitem__(self, key):
        if len(key) == 3 and key[2] is Ellipsis:
            d = key[1] - key[0]
            r = key[0]
            while True:
                yield r
                r += d

ap = Mogic()    # arithmetic progression

import time 

for i in ap[1,3,...]:
    print(i)         # caution: infinity loop here
    time.sleep(1)    # slow down output

然后我们发现,这个东西,其实,不用它也能实现 = =

2. 别人家的语法糖

著名的数学计算库?NumPy?中是这样玩的,比如在迭代中修改 n 维数组中的值。

>>> a = np.arange(6).reshape(2,3)
>>> a
array([[0, 1, 2],
       [3, 4, 5]])
>>> for x in np.nditer(a, op_flags=['readwrite']):
...     x[...] = 2 * x
...
>>> a
array([[ 0,  2,  4],
       [ 6,  8, 10]])

当然 NumPy 中对 Ellipsis 还有很多其他的玩法,令人叹为观止,比我们的辣鸡实现不知道高到哪里去了。这些功能其实也是通过在__getitem__中做相应的判断而实现的。

3. 在 Type Hints 中使用

在 Python 3.5 中,PEP 484 -- Type Hints?特性被加了进来(虽然没见什么人用过)。在写 python hints 的时候也可以使用 Ellipsis。

在类型提示中使用 Callable,不确定参数签名时,可以用 Ellipsis 占位。

from typing import Callable

def foo() -> Callable[..., int]:
    return lambda x: 1

使用 Tuple 时返回不定长的 tuple,用 Ellipsis 进行指定。

from typing import  Tuple

def bar() -> Tuple[int, ...]:
    return (1,2,3)
    
def buzz() -> Tuple[int, ...]:
    return (1,2,3,4)

或者是在以.pyi?结尾的文件即 stub files 中,声明一个变量并标记它的类型,而且不想给它初始值时使用。

from typing import IO

stream = ...  # type: IO[str]

4. 对同事宝具

当你写程序写得无聊了,面对某个异常觉得十分无语,又不想普普通通的写个 pass,可以洒下一排...?表达自己忧伤又无奈的心情。

try:
    1/0
except ZeroDivisionError:
    ...

某天你听到旁边座位的小哥发出了一声 WTF,然后抄着 40 米长的大刀来砍你。

总结

Ellipsis 本身没有什么特殊的东西,它只是一个有着特殊类型的单例。Python 提供这个对象给你在一些特殊情况下做某些语法上的扩展,但通常情况下没什么强行使用的价值。


Ellipsis对象

写作 : ‘…’
中文解释:省略
该对象bool测试是为真
用途:

1.用来省略代码,作用类似于pass的一种替代方案,这是python的’TBD’(未确定内容)。

def fun(): 
	…

2.循环数据结构, 一个复合对象包含指向自身的引用。

L = [1,2,3]
L.append(L)
print(L)

此时输出为[1,2,3,[…]]

3.用来模拟一些情况,使结果看起来更友好,如等差数列等。

4.?在函数中使用:

def testThreeDot(flag=...):
    if flag:
        print(flag)
    else:...

在这里插入图片描述


转自:python小结之Ellipsis对象_zhuangkuoqi的博客-CSDN博客_ellipsis python

转载:Python的Ellipsis对象

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-02-03 01:09:59  更:2022-02-03 01:11:17 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 2:44:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码