Python高级特性(一)
一.切片
L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']
取出前三個(gè)元素 , 笨方法就是通過(guò)下標(biāo)一個(gè)一個(gè)獲取 [L[0], L[1], L[2]]
Python做好了封裝
可以通過(guò)切片就行快速獲取
L[0:3] 進(jìn)行獲取 還可以倒著來(lái) 比如L[-2,-1]
取出前幾個(gè) L[:N]
后幾個(gè)L[N:]
前幾個(gè)每幾個(gè)取一個(gè)L[:N:X]
所有數(shù)每幾個(gè)取一個(gè)L[::X]
其中字符串也可以進(jìn)行切片 例如C#的substring(N,X) 當(dāng)然tuple也肯定可以.
二.迭代
給list或者tuple進(jìn)行遍歷 我們叫做迭代
如何判斷一個(gè)對(duì)象是否可迭代呢 通過(guò)isinstance關(guān)鍵字
>>> isinstance('abc', Iterable) # str是否可迭代
True
如果要對(duì)集合實(shí)現(xiàn)類(lèi)似JAVA那樣的下標(biāo)循環(huán)怎么辦?
Python內(nèi)置了一個(gè)enumerate函數(shù)可以將list變成 索引-元素對(duì),這樣就可以for循環(huán)迭代索引和元素本身
for i ,value in enumerate(['a','b','c'])
print(i,value)
如果要循環(huán)多個(gè)tuple可以這么搞
>>> for x, y in [(1, 1), (2, 4), (3, 9)]:
... print(x, y)
...
1 1 2 4 3 9
練習(xí) :使用迭代找到list中最大和最小的數(shù),并返回一個(gè)tuple
def findmaxandmin(L):
if L!=[]:
max = L[0]
min = L[0]
for i in L:
if i>max:
max = i
elif i<min:
min = i
return(min,max)
else:
return (None,None)
>>> a = findmaxandmin([7,11,17,4,8])
>>> print(a)
(4, 17)
三.列表生成式
列表生成式即list comprehensions,是python非常簡(jiǎn)單卻非常強(qiáng)大的可以用來(lái)創(chuàng)建list的生成式
舉個(gè)例子: 要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]可以用list(range(1, 11)):
但如果要生成[1x1, 2x2, 3x3, ..., 10x10]怎么做?方法一是循環(huán):
L = []
for x in range(1,11):
L.append(x*x)
但是這種方式有點(diǎn)呵呵了..讓我們看一種高級(jí)的寫(xiě)法
[x * x for x in range(1, 11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
這種方式是列表生成式用處的最好體現(xiàn).
[x + n for x in 'ABC' for n in 'FGH']
['AF', 'AG', 'AH', 'BF', 'BG', 'BH', 'CF', 'CG', 'CH']
呵呵..還有這種騷操作...
for 循環(huán)的后面還可以加上if判斷
>>> [x * x for x in range(1, 11) if x % 2 == 0]
[4, 16, 36, 64, 100]
比如查看當(dāng)前目錄的文件
import os
>>> [d for d in os.listdir('.')]
['DLLs', 'Doc', 'include', 'Lib', 'libs', 'LICENSE.txt', 'NEWS.txt', 'python.exe', 'python3.dll', 'python37.dll', 'pythonw.exe', 'Scripts', 'tcl', 'Tools', 'vcruntime140.dll']
for循環(huán)可以循環(huán)多個(gè)變量,例如 d = {'x':'A','y':'a','E':'C'} for x,v in d.items():print(k,'=',v)
但是不夠簡(jiǎn)潔,我們這個(gè)時(shí)候就還可以使用列表生成式.. [k +'='+v for k,v in d.items()] 結(jié)果 : ['x=A', 'y=a', 'E=C']
比如將一組字符串轉(zhuǎn)換為小寫(xiě) L = ['ASFAS','Acaac'] >>> [v.lower() for v in L] 結(jié)果 : ['asfas', 'acaac']
反正用處多多了,再見(jiàn)了列表生成式...
四.生成器
通過(guò)列表生成式,我們可以直接創(chuàng)建一個(gè)列表,但是,但是收到內(nèi)存限制,列表容量肯定是有限的,而且創(chuàng)建100萬(wàn)個(gè)元素,不僅占據(jù)了很大的內(nèi)存空間,而且我們們就僅僅用那幾個(gè)元素.那后面絕大的空間就白白浪費(fèi)了.所以.如果列表元素根據(jù)那種算法推算出來(lái),這樣就可以去掉不必要的元素,從而節(jié)省大量?jī)?nèi)存,在Python中,這種 "一邊循環(huán)一邊計(jì)算的機(jī)制" 叫做 "generator".
創(chuàng)建generator的方法和列表生成器差不多,就是把中括號(hào)變成括號(hào) [列表生成式] ----(生成器)
示例:
>>> [x*x for x in range(1,10)] ##這是列表生成式
[1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> g = (x*x for x in range(10)) ##這是生成器
>>> g
<generator object <genexpr> at 0x000001E4C1D82318>
但是我們應(yīng)該怎么去訪問(wèn)里面的元素的呢.. Python讓我們通過(guò)next關(guān)鍵字 一個(gè)一個(gè)去里面找
>>> next(g)
0
>>> next(g)
1
>>> next(g)
4
>>> next(g)
9
>>> next(g)
16
>>> next(g)
25
>>> next(g)
36
>>> next(g)
49
>>> next(g)
64
>>> next(g)
81
>>> next(g)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
generator保存的是算法,每次調(diào)用next(n),就會(huì)計(jì)算出n的下一個(gè)元素.直到最后一個(gè)元素.沒(méi)有更多的元素時(shí),拋出StopIteration的錯(cuò)誤.
不過(guò)!!!,這太變態(tài),正確的方式應(yīng)該是通過(guò)for循環(huán),因?yàn)間enerator是可迭代對(duì)象.
isinstance(g,Iterable) --》true
>>> for i in g:
print(i)
所以我們創(chuàng)建了一個(gè)generator后,基本上永遠(yuǎn)都不會(huì)用到next() ,二十通過(guò)for循環(huán)去迭代它,并不需要關(guān)心StopIteration的error
網(wǎng)上的一個(gè)斐波拉契數(shù)
用函數(shù)表示
def fib(max):
n, a, b = 0, 0, 1
while n < max:
print(b)
a, b = b, a + b
n = n + 1
return 'done'
其中賦值的操作 n,a,b = 0,0,1相當(dāng)于 t = (0,0,1) #t就是個(gè)tuple, n = t[0] a = t[1] b = t[2]
其中斐波拉契數(shù)就非常類(lèi)似generator 我們需要如何修改呢 : 直接將print 改成yield.
五.迭代器
我們已經(jīng)知道,可以直接用于for循環(huán)的數(shù)據(jù)類(lèi)型有以下幾種:
一類(lèi)是集合類(lèi)型:list、tuple、dict、set、str 等
一類(lèi)是generator,包括生成器與帶tyield的generator function
可以被迭代的對(duì)象統(tǒng)稱(chēng)叫做Iterable
可以被next()函數(shù)調(diào)用并不斷返回下一個(gè)值的對(duì)象稱(chēng)為迭代器:Iterator。
可以使用isinstance()判斷一個(gè)對(duì)象是否是Iterator對(duì)象:
有趣的是生成器都是Iterator對(duì)象,但list、dict、str雖然是Iterable,但不是Iterator...
把Iterable轉(zhuǎn)換為Iterator轉(zhuǎn)換為可以用到iter()函數(shù) (L = (1,2,3) Liter = iter(L))
轉(zhuǎn)載于:https://www.cnblogs.com/ZaraNet/p/9503796.html
總結(jié)
以上是生活随笔為你收集整理的Python高级特性(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Gym-101466K Random N
- 下一篇: python-基础知识