成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Python中有趣的Ellipsis對象

開發(fā) 后端
在你輸入了三個點之后,Python 解釋器非但不會報錯,反而還會返回給你「Ellipsis」這么一個信息。那么這個有趣的東西是什么呢?來看一下吧。

[[335494]]

 什么是Ellipsis

在 Python 中你可能有時候會看到一個奇怪的用法,就像是這樣: 

  1. >>> ...  
  2. Ellipsis 

在你輸入了三個點之后,Python 解釋器非但不會報錯,反而還會返回給你「Ellipsis」這么一個信息。那么這個有趣的東西是什么呢?

查閱 Python 官方文檔后可以看到,它是一個**「內置常量」**(Built-in Constant)。經常用于對用戶自定義的容器數(shù)據類型進行切片用法的擴展。

這也就意味著它可能是會作為一個「小眾且另類」的語法糖來使用,但如果你用于 Python 中的容器數(shù)據類型(比如列表)進行切片索引時,可能會引發(fā)錯誤: 

  1. >>> nums = list(range(10))  
  2. >>> nums  
  3. [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]  
  4. >>> nums[...]  
  5. Traceback (most recent call last):  
  6.   File "<stdin>", line 1, in <module>  
  7. TypeError: list indices must be integers or slices, not ellipsis 

除此之外,如果你使用的是 Python 2 的解釋器,那么壓根就不支持 Ellipsis 的用法,從一開始輸入時就報錯: 

  1. $ python2  
  2. WARNING: Python 2.7 is not recommended.   
  3. This version is included in macOS for compatibility with legacy software.   
  4. Future versions of macOS will not include Python 2.7.   
  5. Instead, it is recommended that you transition to using 'python3' from within Terminal.  
  6. Python 2.7.16 (default, Nov  9 2019, 05:55:08)   
  7. [GCC 4.2.1 Compatible Apple LLVM 11.0.0 (clang-1100.0.32.4) (-macos10.15-objc-s on darwin  
  8. Type "help", "copyright", "credits" or "license" for more information.  
  9. >>> ...  
  10.   File "<stdin>", line 1  
  11.     ...  
  12.     ^  
  13. SyntaxError: invalid syntax 

雖然說在列表中使用 Ellipsis 會報錯,但是碰到這種情況你會發(fā)現(xiàn)解釋器返回給你的是這樣的東西: 

  1. >>> nums = [1,2,3]  
  2. >>> nums  
  3. [1, 2, 3]  
  4. >>> nums[1] = nums  
  5. >>> nums  
  6. [1, [...], 3] 

可以看到,這里我們將 nums 中的第二個元素替換成自身,就會形成不斷地遞歸嵌套賦值,而解釋器最后直接給出了頭尾兩個元素之外,其他全部元素都會被 ... 所囊括在內。

根據 Python 官方的另一處文檔,Ellipsis 本身也不支持任何操作,僅僅只是一個單例對象(Singleton)

誰能想到,Guido van Rossum 這么一位被人稱為「仁慈的獨裁者」的 Python 之父采納 Ellipsis 的原因竟然是因為:有人認為三個省略號的寫法可愛。(原文為:「Some folks thought it would be cute to be able to write incomplete code like this」)

應用

要說這個看起來「雞肋」的 Ellipsis 類型對象沒有用,這個說法似乎也不正確。因為它作為一種奇怪的語法糖也被應用到了某些地方。

Numpy 中的切片

雖然官方說 Ellipsis 主要用于用戶自定義容器類型的切片操作,但是在我搜索了許久之后發(fā)現(xiàn)用 Ellipsis 來實現(xiàn)所謂的切片操作的貌似只有 Numpy。

使用 Python 做數(shù)據分析、挖掘或機器學習相關的朋友一定對 Numpy 高性能的科學計算庫并不陌生。在 Numpy 中我們真正的使用 Ellipsis 來進行切片索引: 

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

需要注意的是,Ellipsis 主要是對二維以上的數(shù)組才起作用: 

  1. >>> arr[...,1:2]  
  2. array([[1],  
  3.        [4],  
  4.        [7]])  
  5. >>> arr[2, ...]  
  6. array([6, 7, 8]) 

從結果中我們看到,Ellipsis 三個省略號的寫法其實就等價于 arr[:, 1:2] 冒號的寫法。但是在使用過程中 Ellipsis 只能出現(xiàn)一次: 

  1. >>> ndarr = np.arange(24).reshape((2,3,4))  
  2. >>> ndarr  
  3. array([[[ 0,  1,  2,  3],  
  4.         [ 4,  5,  6,  7],  
  5.         [ 8,  9, 10, 11]],  
  6.        [[12, 13, 14, 15],  
  7.         [16, 17, 18, 19],  
  8.         [20, 21, 22, 23]]])  
  9. >>> ndarr[:, :, :]  
  10. array([[[ 0,  1,  2,  3],  
  11.         [ 4,  5,  6,  7],  
  12.         [ 8,  9, 10, 11]],  
  13.        [[12, 13, 14, 15],  
  14.         [16, 17, 18, 19],  
  15.         [20, 21, 22, 23]]])  
  16. >>> ndarr[..., ..., ...]  
  17. Traceback (most recent call last):  
  18.   File "<stdin>", line 1, in <module>  
  19. IndexError: an index can only have a single ellipsis ('...') 

Ellipsis 在 Numpy 中出現(xiàn)的意義在于,當你的數(shù)組是高維的數(shù)組時,那么可以直接使用它來作為選取其他維度的等價寫法,以下例子來源于 Numpy 官方文檔: 

  1. >>> z = np.arange(81).reshape(3,3,3,3)  
  2. >>> z[1,...,2] # 等價于 z[1, :,:, 2]  
  3. array([[29, 32, 35],  
  4.        [38, 41, 44],  
  5.        [47, 50, 53]]) 

Type Hint 類型注解

自從 PEP 484 之后,Python 解釋器開始支持類型注解。所謂的類型注解無非就是在 Python 實際代碼中能像注釋那樣對當中的一些參數(shù)或返回值添加類型注釋,就像是這樣: 

  1. def add(x: int, y: int) -> int:  
  2.     return x + y 

如果你是有使用過 Java 或者 Go 這類對類型注解要求較為嚴格的編譯型語言,那么相信對此并不陌生,無論是變量還是方法,都要寫上對應的類型以防編譯報錯;但即便沒有接觸過這類編譯型語言也不要緊,將其理解為注釋即可,這樣的注釋是能被編輯器或 IDE 所支持,在你要查看函數(shù)定義或文檔時會給予提示。

但是 Type Hint 僅僅只是一種「協(xié)定」,告訴別人你的方法里參數(shù)是如何、最后返回的是什么僅此而已,無論是加與不加都不會影響最終代碼的效果,影響的僅僅只是代碼的可讀性罷了。

如果你的方法有多個返回值,我們不可能對每個返回值的類型都寫上注解,因此這時 Ellipsis 對象就派上了用場。根據官方文檔給出的說明,我們完全可以像這樣來進行類型注解: 

  1. from typing import Tuple  
  2. def get_many_value(  
  3.     a:int, b:int, c:int,   
  4.     d:int, e:int, f:int  
  5. ) -> Tuple[int, ...]:  
  6.     return [a+b, c+d, e+f] 

這樣的寫法本質上就是 *args 的作用,表示同類型的可變長度元組。如果你將 Tuple 換成是 List,那么解釋器會報錯,因為 *args 在方法中的表現(xiàn)就是元組,那么作為注解的 Ellipsis 也應如此。這可能也就說明為什么在 Tuple 注解中不報錯了。

FastAPI 中的必選參數(shù)

目前正流行開來的高性能 Web 框架 FastAPI 中,也應用了 Ellipsis。它用以表示參數(shù)是必填項,這在 Swagger 頁面更能直觀體現(xiàn)。 

  1. # pip install fastapi  
  2. # pip install uvicorn  
  3. from fastapi import FastAPI, Query  
  4. app = FastAPI()  
  5. @app.get('/greetWithOutEllipsis')  
  6. async def greet(name: str = None):  
  7.     if name:  
  8.         return {"info": f"Welcome! {name}"}  
  9.     return {"info": f"Welcome to FastAPI!"}  
  10. @app.get('/greetWithEllipsis')  
  11. async def greet(name: str = Query(..., min_length=2)):  
  12.     if name:  
  13.         return {"info": f"Welcome! {name}"}  
  14.     return {"info": f"Welcome to FastAPI!"}  
  15. if __name__ == "__main__":  
  16.     import uvicorn  
  17.     uvicorn.run(app, port = 5000

啟動服務之后,在瀏覽器中輸入 http://127.0.0.1:5000/docs 便能進入到服務的 Swagger 頁面中,在上述例子中如果 name 參數(shù)并非是個必要的參數(shù)時,在 Swagger 頁面中不會看到任何標識,即便我們不帶上 name 參數(shù)也能進行請求: 

非必要參數(shù)

但當我們加上了一個 Query() 方法,并將其 Ellipsis 對象丟到當中時,不僅會給參數(shù)加上 required 的標識,同時還對傳入的字符串長度進行了限制。

必要參數(shù)

除了參數(shù)之外,在 FastAPI 中你還可以在請求體、路徑、字段等多個地方使用 Ellipsis 對象。

「偽」 pass 寫法

Ellipsis 有時候還可以作為 pass 的一種「偽」寫法,比如這樣: 

  1. def greet():  
  2.     ... #等價于 pass 

這其實就和 # 注釋符號與六個引號的長字符串注釋類似。但實際上僅僅只是一種取巧的方法,實際上我們可以將 ... 替換成任何值或對象,如 None、1、True 等,因為在方法中并沒有顯示聲明返回的對象,所以無論我們寫什么最后的效果都是一樣的。

但使用 Ellipsis 對象來作為 pass 關鍵字的替代品從「視覺」上來說或許還有點「意猶未盡」的意思。

當然如果在你和同事協(xié)作時,隨手寫下這樣一個省略號,沒準隱含著你對同事 Coding 的無奈,或者是對禿頭的憂愁(逃) 

 

責任編輯:龐桂玉 來源: Python中文社區(qū)
相關推薦

2010-03-12 10:30:18

Python語言

2023-08-13 16:32:12

JavaScript

2021-03-15 08:15:42

ES2021語言開發(fā)

2009-10-23 14:22:59

Windows 7微軟隱藏功能

2014-12-09 12:35:11

人工智能機器學習開源項目

2016-12-20 11:35:52

編程語言開源項目

2010-05-14 10:55:04

java對象序列化

2022-10-10 23:19:02

Python腳本語言工具庫

2017-08-08 16:04:30

Python圖片處理文章提取器

2009-04-30 16:21:37

VB.NET通用對象列表

2020-03-29 20:27:51

Python函數(shù)開發(fā)

2022-01-23 14:08:52

PythonPygame

2022-12-28 08:59:11

2025-03-19 09:55:17

2014-09-19 11:17:48

面試題

2023-07-14 22:36:42

Node.jsStorage

2010-07-17 01:03:13

CMD Telnet

2023-03-13 08:47:06

CSS數(shù)學函數(shù)

2016-10-21 10:15:53

2018-05-07 15:32:54

編程語言Python程序員
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久.com| 欧美国产91 | 久久久久亚洲精品中文字幕 | 欧美国产激情二区三区 | 日日夜夜天天久久 | 国产精品国产a级 | 一本一道久久a久久精品综合蜜臀 | h片免费在线观看 | 最近中文字幕免费 | 欧美vide| 日韩免费高清视频 | 成人3d动漫一区二区三区91 | 久久伊人一区二区 | 欧美日韩一卡 | 成人午夜电影网 | 中文字幕国产精品视频 | 91视视频在线观看入口直接观看 | 欧美精品久久久久久久久久 | 精品亚洲一区二区三区四区五区 | 日韩中文字幕网 | 日韩精品免费在线观看 | 九色综合网| 日韩在线一区二区三区 | 亚洲综合色站 | 欧美成人a∨高清免费观看 欧美日韩中 | 亚洲一区二区中文字幕 | 精品欧美一区二区精品久久久 | 国产小视频在线观看 | 国产成年人视频 | 精品九九 | 国产精品一区久久久 | 亚洲欧美精品 | 国产精品久久福利 | 国产欧美在线播放 | 在线观看国产视频 | www.久久久久久久久久久 | 日韩免费av | 国产二区三区 | 狠狠躁天天躁夜夜躁婷婷老牛影视 | 91欧美精品成人综合在线观看 | 爱爱视频网 |