python學習(三) 高階特性

2021-07-10 17:26:53 字數 1096 閱讀 2676

在python中,**不是越多越好,而是越少越好。**不是越複雜越好,而是越簡單越好。1行**能實現的功能,決不寫5行**。請始終牢記,**越少,開發效率越高。

取乙個list或tuple的部分元素是非常常見的操作,python提供了切片(slice)操作符,對應型別為slice型別,能大大簡化這種操作。可以先宣告乙個slice物件,然後對集合物件取部分元素,如:list[slice].有了切片操作,很多地方迴圈就不再需要了。python的切片非常靈活,一行**就可以實現很多行迴圈才能完成的操作。

即list comprehensions,是python內建的非常簡單卻強大的可以用來建立list的生成式。

如果要生成[1x1, 2x2, 3x3, …, 10x10]怎麼做?方法一是迴圈,但是迴圈太繁瑣,而方法二列表生成式,則可以用一行語句代替迴圈,如:[x * x for x in range(1, 11)];還可以使用兩層迴圈,可以生成全排列,如: [m + n for m in 『abc』 for n in 『xyz』]。運用列表生成式,可以寫出非常簡潔的**。列表解析語法概括如下:

[expr for iter_var in iterable]

[expr for iter_var in iterable if cond_expr]

通過列表生成式,我們可以直接建立乙個列表。但是,受到記憶體限制,列表容量肯定是有限的。而且,建立乙個包含100萬個元素的列表,不僅占用很大的儲存空間,如果我們僅僅需要訪問前面幾個元素,那後面絕大多數元素占用的空間都白白浪費了。所以,如果列表元素可以按照某種演算法推算出來,那我們是否可以在迴圈的過程中不斷推算出後續的元素呢?這樣就不必建立完整的list,從而節省大量的空間。在python中,這種一邊迴圈一邊計算的機制,稱為生成器:generator。

要建立乙個generator,有很多種方法:

凡是可作用於for迴圈的物件都是iterable型別;

凡是可作用於next()函式的物件都是iterator型別,它們表示乙個惰性計算的序列;集合資料型別如list、dict、str等是iterable但不是iterator,不過可以通過iter()函式獲得乙個iterator物件。

python的for迴圈本質上就是通過不斷呼叫next()函式實現的。

RabbitMQ實戰 三 高階特性

在實際生產中,很難保障前三點的完全可靠,比如在極端的環境中,生產者傳送訊息失敗了,傳送端在接受確認應答時突然發生網路閃斷等等情況,很難保障可靠性投遞,所以就需要有第四點完善的訊息補償機制。2.1.2.1 方案一 訊息資訊落庫,對訊息狀態進行打標 常見方案 將訊息持久化到db並設定狀態值,收到cons...

深入淺出Redis(三)高階特性 管道

redis是乙個響應式的服務,當client傳送乙個請求後,就處於堵塞狀態等待redis返回結果。這樣一次命令消耗的時間就包含三個部分 請求從client到server的時間 結果從server到client的時間和命令真正執行時間,前兩個部分消耗的時間總和稱為rtt round trip time...

python學習 高階特性

高階函式 可以使用函式作為引數的函式 def f func sorted 對列表排序,有乙個名為key的引數 指定key為abs,根據l的絕對值排序sorted l,key abs filter 對序列過濾 filter a,b a為函式,b為被處理的資料列表,a會對b中的每個元素判斷,結果為真擇保...