python切片、迭代、生成器、列表生成式等高階特性學習
python高階特性
1行程式碼能實現的功能,決不寫5行程式碼。請始終牢記,程式碼越少,開發效率越高。
切片
當我們要取一個list中的前n各元素時,如果前n個少的話,我們還可以一個一個的取,但是若前n個元素極其多的話,我們就要採取其他辦法:L = []; n = 1; while n <= 99: L.append(n); n = n + 2; print(L); #取前三個元素 r = []; a = 3; for i in range(a): r.append(L[i]); print(r);
對這種經常指定索引範圍的操作,用迴圈會十分繁瑣,所以python提供了切片(slice)操作符,取前三個元素一行程式碼就可以完成:
#一行程式碼完成取前三個元素 print(L[0:3]);
表示從0開始取,直到3結束,不包括索引3。類似的。L[-1],就指倒數第一個元素
迭代
如果給定一個list或tuple,我們可以通過for迴圈來遍歷這個list或tuple,這種遍歷我們稱為迭代。#迭代dict(相當於map) d = {"a": 1, "b": 2, "c": 3}; for key in d: print(key); #a b c #迭代value for value in d.values(): print(value); #1 2 3
注意:如果要對list實現類似於Java那樣的下標迴圈,我們可以使用python內建的enumerate函式實現索引-元素對。
#用enumerate函式實現list變成索引-元素對 for i, value in enumerate(["a", "b", "c"]): print(i, value); # 0 a # 1 b # 2 c;
列表生成式
即list comprehensions,是用來建立list的生成式,生成1~10d的list可以用list(range[1, 11])#用列表生成式建立list print(list(range(1, 11)));
生成[1*1,2*2, 3*3, … ,10*10]
L1 = []; for x in range(1, 11): L1.append(x*x); print(L1); #[1, 4, 9, 16, 25, 36, 49, 64, 81, 100] #使用列表生成式 print([x*x for x in range(1, 11)]);
for迴圈後面還可以加上if判斷語句:
L2 = [x * x for x in range(1, 11) if x % 2 == 0]; print(L2);#[4, 16, 36, 64, 100]
等等這樣的生成操作,可以根據自己的情況來進行生成。
生成器
是一種一邊迴圈一遍計算的機制(也是一個函式):generator (我沒記錯的話,es6中也有這個生成器,但是功能還有有區別)
建立一個generator,方式:將列表生成器的[ ]改成( ),就建立了一個generator:
#用()建立一個generator L3 = (x*x for x in range(10)) print(L3); #<generator object <genexpr> at 0x00000276D57E8A40>
可以通過next()來一個個列印generator的返回值,也可以用迴圈:
L3 = (x*x for x in range(10)); for i in L3: print(i);
帶yield的generator function
斐波拉契數列列印:#普通函式編寫的費比拉數列 def fib(max): n, a, b = 0, 0, 1; while n < max: print(b); a, b = b, a + b; n = n + 1; return 'done'; print(fib(6)); # 1 # 1 # 2 # 3 # 5 # 8 # done #用generator函式只需要把print(b)變成yield b即可 def fib1(max): n, a, b = 0, 0, 1 while n < max: yield b a, b = b, a + b n = n + 1 return 'done' print(fib1(6)); #<generator object fib at 0x104feaaa0>
generator的函式,在每次呼叫next()的時候執行,遇到yield語句返回,再次執行時從上次返回的yield語句處繼續執行。在執行過程中,遇到yield就中斷,下次又繼續執行。
楊輝三角
#楊輝三角 def triangles(): N = [1] while True: yield N N.append(0) N = [N[i]+N[i-1] for i in range(len(N))] n1 = 0 results = [] for t in triangles(): print(t) results.append(t) n1 = n1 + 1 if n1 == 10: break
- 總結
generator是非常強大的工具,在Python中,可以簡單地把列表生成式改成generator,也可以通過函式實現複雜邏輯的generator。
要理解generator的工作原理,它是在for迴圈的過程中不斷計算出下一個元素,並在適當的條件結束for迴圈。對於函式改成的generator來說,遇到return語句或者執行到函式體最後一行語句,就是結束generator的指令,for迴圈隨之結束。
區分普通函式和generator函式,普通函式呼叫直接返回結果,generator函式的“呼叫”實際返回一個generator物件
迭代器
可以被next()函式呼叫並不斷返回下一個值的物件稱為迭代器:Iterator(很像es6的Iterator介面)
凡是可作用於for迴圈的物件都是Iterable型別;
凡是可作用於next()函式的物件都是Iterator型別,它們表示一個惰性計算的序列;
集合資料型別如list、dict、str等是Iterable但不是Iterator,不過可以通過iter()函式獲得一個Iterator物件。總結
以上都是python非常強大的特性,他們靈活的運用在python處理list、tuple等資料組上,自己學習的很淺,還是需要進行不斷地練習及接觸更多的關於python的demo。
相關推薦
python切片、迭代、生成器、列表生成式等高階特性學習
python高階特性 1行程式碼能實現的功能,決不寫5行程式碼。請始終牢記,程式碼越少,開發效率越高。 切片 當我們要取一個list中的前n各元素時,如果前n個少的話,我們還可以一個一個的取,但
Python(七)語法 高階特性 切片 | 迭代(迴圈)| 列表生成式 | 生成器 | 迭代器
切片 取一個list或tuple的部分元素是非常常見的操作 有一個list[0,1,2,3,4,5]如果我們要取前n個元素比如說3個數 一般做法是 >>> L=[] >>> n=3 >>> for i in range(n): .
《OpenCV3程式設計入門》——5.1.5 訪問影象中畫素的三類方法(指標訪問、迭代器iterator、動態地址計算配合at元素)
目錄 1、指標訪問畫素 2、迭代器操作畫素 3、動態地址計算 OpenCV中,有三種方式訪問影象畫素: 指標訪問:C操作符[]; 迭代器iterator 動態地址計算 上述方法在訪問速度上略有差異。debug模式下,
java設計模式之——策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、直譯器模式(行為型)【讀書筆記】
一、策略模式 定義:定義了演算法家族,分別封裝起來,讓他們之間可以互相替換,此模式讓演算法的變化,不會影響到演算法的客戶。 使用場景:策略模式是一種定義一系列演算法的方法,從概念上看,所有的這些演算法完成的都是相同的工作,只是實現不
如何正確遍歷刪除List中的元素(普通for迴圈、增強for迴圈、迭代器iterator、removeIf+方法引用)
遍歷刪除List中符合條件的元素主要有以下幾種方法: 普通for迴圈 增強for迴圈 foreach 迭代器iterator removeIf 和 方法引用 (一行程式碼搞定) 其中使用普通for迴圈容易造成遺漏元素的問題,增強for迴圈foreach會報java.util.Concurre
關於python yield 和 迭代器 生成器的使用
python的迭代器 就是重複的做很多事情,可以使用for 迴圈 將裡面的元素迴圈遍歷出來。 迭代器的優點: 使用迭代器不要求事先準備好整個迭代過程中的所有元素,僅僅是在迭代的時候才會展示出來, 建立迭代器: a = [1,2,3,4,5,6,7] b
Python生成器和列表生成式
生成器: 在Python中, 這種一邊迴圈一邊計算的機制, 稱為生成器:generator 列表生成式:L(list) = [x * x for x in range(10)] 生成器: g(generator) = (x * x for x in range(10)
python迭代器&生成器使用技巧(2):切片、遍歷、索引值、多序列、多容器物件
1. 迭代器切片 迭代器和生成器不能使用標準的切片操作,因為它們的長度事先並不知道(並且也沒有實現索引)。 函式 islice() 返回一個可以生成指定元素的迭代器,通過遍歷並丟棄直到切片開始索引位置的所有元素,然後開始一個個的返回元素,並直到切片結束索引位置。 impo
Python學習筆記--3、高階特性-切片、迭代、列表生成式、生成器、迭代器
廖老師在這個地方提到了,在Python 中,並不是寫的程式碼越多越好,而是寫的程式碼越少越好,月簡單越好。 1、切片 什麼是切片,簡單來說就是對list或者tuple中的部分元素進行取出操作。例子如下: 應注意的是,python的首位的元素的編號是0,所以,要確定好[
Python切片、迭代、列表生成式、生成器、迭代器
切片: 在Python中對於具有序列結構的資料來說都可以使用切片操作,比如列表(list)中,我們可以用切片取出其中一部分元素。 需要注意的是序列物件某個索引位置返回的是一個元素,而切片操作返回是和被切片物件相同型別物件的副本 如: >>> alis
python生成器、迭代器、__call__、閉包簡單說明
1.生成器 這種一邊迴圈一邊計算的機制,稱為生成器:generator,最簡單的方法是把生成式的[]改為(). >>> l=(x * x for x in range(1, 11) if x % 2 == 0) >>> l <generator obje
python 基礎系列--可迭代物件、迭代器與生成器
迭代器是 Python 最強大的功能之一,可以想像如果有個幾十 GB 的大檔案,你需要編寫程式處理其中的文字資訊,如果一次性全部讀入記憶體,估計機器會直接罷工了,但是借住可迭代物件,可以一次從硬碟讀取一小塊內容到記憶體,處理完後寫回硬碟,不斷迭代,從而節省記憶體,加快處理速度。 首先來解
python-生成器、迭代器、閉包、裝飾器
一、生成器 1、什麼是生成器 在Python中,這種一邊迴圈一邊計算的機制,稱為生成器(generator) 2、建立生成器方法 方法1:只要把一個列表生成式的[ ]改為() In [1]: L = [ x*2 for x in range(5)] In [2]: L Out[
Python練習-生成器、迭代器-2018.12.01
如果列表元素可以按照某種演算法推算出來,可以在迴圈的過程中不斷推算出後續的元素。這樣就不必建立完整的list,從而節省大量的空間。在Python中,這種一邊迴圈一邊計算的機制,稱為生成器:generator。 #將列表生成式的[]改為()得到generator,通過for迴圈得到generator的下
3、【Python】Python 3入門(流程控制/迭代器/生成器/函式/變數作用域)
一、流程控制 1、if 控制 if 表示式1: 語句 if 表示式2: 語句 elif 表示式3: 語句 else: 語句 elif 表示式4: 語句 else: 語句 1、
python3自學筆記4-切片、迭代、列表生成式、生成器和迭代器
目錄切片迭代列表生成式生成器迭代器 切片 1、Python提供了切片(Slice)操作符:; 2、list可以進行切片操作: # 生成列表 >>> L = list(range(100)) >>> L [0, 1, 2, 3,
完全理解Python迭代物件、迭代器、生成器
本文源自RQ作者的一篇博文,原文是Iterables vs. Iterators vs. Generators,俺寫的這篇文章是按照自己的理解做的參考翻譯,算不上是原文的中譯版本,推薦閱讀原文,謝謝網友指正。 在瞭解Python的資料結構時,容器(container)、可迭代物件(ite
【python學習筆記】33:生成器、迭代器、高階函式
生成器 生成器(generator)相比列表推導式,只佔用很小的空間,因為它是一邊迴圈一邊推算,通過next()呼叫下一元素,並在結束時丟擲StopIteration異常,在語法上只要把[]換成()即可
Python之切片、迭代和列表生成式
切片 L=list(range(5)) 取相應範圍內的元素:L[m:n]表示從索引m開始取,直到索引n為止,但不包括索引n,如果第一個索引是0,還可以省略: L[0:3]/L[:3]——[1,2,3] 還支援倒數切片: L[-2:]——[4,5] L[-2:-
Python中的容器(container)、迭代器(iterator)和生成器(generator:yield)
1、容器迭代器iterator 以list容器(tuple,range,file類似)為例,list容器可以呼叫自己的__iter__()方法獲取用來迭代自己內部元素的迭代器。例如: # list容器 myList = [1, 2, 3] # 獲取list容器的迭代器 it