亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

[python] 關(guān)于 python 的一些高級(jí)特性

Pines_Cheng / 2438人閱讀

摘要:開始本文主要記錄廖大教程中高級(jí)特性這一節(jié)的內(nèi)容,并寫下我的一些理解。廖大的教程中是這樣說的函數(shù)是順序執(zhí)行,遇到語句或者最后一行函數(shù)語句就返回。

前言

用 python 差不多半年多了,從去年暑假開始接觸,從開始的懵逼,到寫了一些小爬蟲總算入門之后,許多作業(yè)也是能用 python 就用 python,基本拋棄了 C++。但是還是有些過于急躁了,能夠?qū)懸恍┖喍痰拇a,但是對(duì)于 python 的很多特性都不知道或者忘記了,這里回去廖大教程復(fù)習(xí)一下,順便記錄下我覺得比較重要的地方。

開始

本文主要記錄廖大教程中高級(jí)特性這一節(jié)的內(nèi)容,并寫下我的一些理解。在我看來,這些特性是很 pythonic 的,用在代碼中很有 bigger 啊~

列表生成式(List Comprehensions)

切片和迭代就不說了,這里直接先看一下列表生成式吧,從名字就能大概猜出這是生成列表的一些方法,比如:如何生成[1*1, 2*2, ... ,10*10]?可以用循環(huán)不斷向列表尾部添加元素,如果使用 pythonic 的方法,也就是列表生成式,則是:

>>> [x * x for x in range(1, 11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

后面還能跟上 if 判斷,例如:

>>> [x * x for x in range(1, 11) if x%2==0]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

這樣,本來需要使用循環(huán)寫4,5行的代碼,使用一行就解決了,直觀明了。

還能使用兩個(gè) for 循環(huán)生成全排列:

>>> [m + n for m in "ABC" for n in "XYZ"]
["AX", "AY", "AZ", "BX", "BY", "BZ", "CX", "CY", "CZ"]

這樣如何添加 if 判斷呢?可以在每個(gè) for 語句后添加,或者在最后添加:

>>> [m + n for m in "ABC" if m < "C" for n in "XYZ" if n < "Z"]
["AX", "AY", "BX", "BY"]
>>> [m + n for m in "ABC" for n in "XYZ" if n < "Z" and m < "C"]
["AX", "AY", "BX", "BY"]

也可以同時(shí)在一個(gè) for 語句中迭代多個(gè)變量,比如dict的items()可以同時(shí)迭代key和value:

>>> d = {"x": "A", "y": "B", "z": "C" }
>>> [k + "=" + v for k, v in d.items()]
["y=B", "x=A", "z=C"]

差不多就是這樣了~

但是以前總是寫 C++ ,這種思維模式很難改過來,只能慢慢在使用中熟悉這種語法,習(xí)慣了就能夠在下意識(shí)中寫出來了。

生成器(Generator)

為什么要使用生成器?廖大的教程中說得很詳細(xì),這里再簡述一下:

因?yàn)榱斜淼膬?nèi)容放在內(nèi)存中,而受到內(nèi)存限制,列表的容量有限。

如果我們只訪問極少的元素,那么存在極大的空間浪費(fèi)。

而生成器可以一邊迭代一邊計(jì)算下一個(gè)值,理論上,該過程可以無限進(jìn)行下去,并且不會(huì)占用大量內(nèi)存。

這里只是簡單介紹一下,更詳細(xì)的請(qǐng) Google 哈~

如何創(chuàng)建生成器?第一種方法類似于前面講到的列表生成式,只需要將[]改為()即可:

>>> L = [x * x for x in range(10)]
>>> L
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> g = (x * x for x in range(10))
>>> g
 at 0x1022ef630>

可以看到,方法上大致相同,[]得到的是一個(gè)已經(jīng)得到所有值的列表,()得到的是一個(gè)生成器,它們都能使用 for 循環(huán)來迭代,但是生成器不能使用下標(biāo)訪問,并且只能被迭代一次,再次迭代則會(huì)有 StopIteration 的異常:

>>> for i in g:
...     print(i)
...
0
1
4
9
16
25
36
49
64
81
>>> for i in g:
...     print(i)
...
>>> next(g)
Traceback (most recent call last):
  File "", line 1, in 
StopIteration

不過當(dāng)我們創(chuàng)建了一個(gè)generator后,基本上永遠(yuǎn)不會(huì)調(diào)用next(),而是通過for循環(huán)來迭代它,并且不需要關(guān)心StopIteration的錯(cuò)誤。

如果推算的算法比較復(fù)雜,用類似列表生成式的for循環(huán)無法實(shí)現(xiàn)的時(shí)候,還可以用函數(shù)來實(shí)現(xiàn),比如,著名的斐波那契數(shù)列:

def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b
        a, b = b, a + b
        n = n + 1
    return "done"

關(guān)于 yield 這個(gè)關(guān)鍵字,我在剛學(xué) python 的時(shí)候也糾結(jié)了很久,直到看到生成器的時(shí)候才大致明白,大家搜索一下就能大致明白了,我覺得這東西說起來麻煩,只說一兩句又怕說錯(cuò)。廖大的教程中是這樣說的:

函數(shù)是順序執(zhí)行,遇到return語句或者最后一行函數(shù)語句就返回。而變成generator的函數(shù),在每次調(diào)用next()的時(shí)候執(zhí)行,遇到y(tǒng)ield語句返回,再次執(zhí)行時(shí)從上次返回的yield語句處繼續(xù)執(zhí)行。

可能有點(diǎn)難理解,不過明白了就很好說了。

當(dāng)然,函數(shù)中還可以添加 return,在一個(gè) generator function 中,如果沒有 return,則默認(rèn)執(zhí)行至函數(shù)完畢,如果在執(zhí)行過程中 return,則直接拋出 StopIteration 終止迭代。

例如上面的例子,我們?cè)诘鷷r(shí)發(fā)現(xiàn)并沒有出現(xiàn) "done" 這串字符,是因?yàn)?return 的值被當(dāng)作 Exception Value 了,如果要顯示出來,則可以這樣:

>>> g = fib(6)
>>> while True:
...     try:
...         x = next(g)
...         print("g:", x)
...     except StopIteration as e:
...         print("Generator return value:", e.value)
...         break
...
g: 1
g: 1
g: 2
g: 3
g: 5
g: 8
Generator return value: done
迭代器(Iterator)

可直接作用于 for 循環(huán)的對(duì)象被稱為可迭代對(duì)象,可以用 isinstance() 函數(shù)判斷是否為可迭代對(duì)象:

>>> from collections import Iterable
>>> isinstance([], Iterable)
True
>>> isinstance({}, Iterable)
True
>>> isinstance("abc", Iterable)
True
>>> isinstance((x for x in range(10)), Iterable)
True
>>> isinstance(100, Iterable)
False

而可以被next()函數(shù)調(diào)用并不斷返回下一個(gè)值的對(duì)象稱為迭代器:Iterator。當(dāng)然,仍然可以使用isinstance()判斷一個(gè)對(duì)象是否是Iterator對(duì)象:

>>> from collections import Iterator
>>> isinstance((x for x in range(10)), Iterator)
True
>>> isinstance([], Iterator)
False
>>> isinstance({}, Iterator)
False
>>> isinstance("abc", Iterator)
False

通過上面兩個(gè)例子,可以這樣理解:生成器和 list,tuple,str 等都是 Iterable 對(duì)象,生成器同時(shí)還是 Iterator 對(duì)象,而 list 等不是。那么能否直接將 Iterable 對(duì)象轉(zhuǎn)換成 Iterator 對(duì)象呢?

可以使用iter()函數(shù):

>>> isinstance(iter([]), Iterator)
True
>>> isinstance(iter("abc"), Iterator)
True

其實(shí),Iterator 對(duì)象表示的是一個(gè)數(shù)據(jù)流,我們可以把這個(gè)數(shù)據(jù)流看做是一個(gè)有序序列,但卻不能提前知道序列的長度,只能不斷通過next()函數(shù)實(shí)現(xiàn)按需計(jì)算下一個(gè)數(shù)據(jù),所以 Iterator 的計(jì)算是惰性的,只有在需要返回下一個(gè)數(shù)據(jù)時(shí)它才會(huì)計(jì)算。Iterator甚至可以表示一個(gè)無限大的數(shù)據(jù)流,但 list,tuple 什么的是不可能這樣的。

總結(jié)

過了個(gè)寒假?zèng)]碰代碼,相當(dāng)于復(fù)習(xí)了一遍啊,其實(shí)這里說到的特性是很淺顯的,理解起來不難,等全部差不多復(fù)習(xí)完還得再深入一點(diǎn),理解更多才行。

以上~

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/38411.html

相關(guān)文章

  • 學(xué)習(xí)Python編程書籍Top7

    摘要:關(guān)于作者是軟件基金會(huì)的成員,也是巴西第一個(gè)黑客空間的聯(lián)合創(chuàng)始人。他曾在巴西媒體,銀行和政府部門教授開發(fā),并在,,和上發(fā)表演講。他是一位自學(xué)成才的程序員,也是使用學(xué)習(xí)編程一系列書的作者。 showImg(https://segmentfault.com/img/remote/1460000018926735); 來源 | 愿碼(ChainDesk.CN)內(nèi)容編輯 愿碼Slogan | ...

    ccj659 評(píng)論0 收藏0
  • Python入門到實(shí)踐-了解Python

    摘要:但是相對(duì)于開發(fā)者來說語言提供了更加強(qiáng)大的支持。自身的強(qiáng)類型的機(jī)制異常處理垃圾自動(dòng)收集等是其程序健壯性的重要保證。框架的設(shè)計(jì)理念也遵循了優(yōu)雅明確簡單,并具有簡潔易讀及可拓展性。 關(guān)于Python的發(fā)展,及Python的歷史概述我這里將不會(huì)浪費(fèi)時(shí)間和大家介紹,因?yàn)槲矣X得能夠借用搜索引擎搜索到的知識(shí)大家就竟可能的自己動(dòng)手動(dòng)腦去了解和認(rèn)知,我主要就講講Python的一些基本的特性及版本的選擇相...

    alighters 評(píng)論0 收藏0
  • 趣味Python入門(一):初識(shí)Python

    摘要:盡管如此,還具有高級(jí)的數(shù)據(jù)類型和靈活性。它配備了大量的標(biāo)準(zhǔn)模塊,可用于程序庫。一些模塊提供如下功能通過這些很贊的特性,瞬時(shí)化身為面向過程的語言。開發(fā)者可以便捷地將解釋器連接到一個(gè)使用編寫的應(yīng)用程序,并能隨時(shí)用作擴(kuò)展。下一部分會(huì)繼續(xù)分享。 【編者按】本文作者是 Abhishek Jaiswal ,擅長 .NET、C#、Python 等多種語言的技術(shù)控。本文中,作者通過活潑有趣的口吻向大家...

    sutaking 評(píng)論0 收藏0
  • Python高級(jí)特性,模塊和IO操作

    摘要:所以如果像上述這樣引入模塊的時(shí)候,調(diào)用函數(shù)必須加上模塊名通常情況下鼓勵(lì)每個(gè)語句只導(dǎo)入一個(gè)包方便理解和閱讀代碼。 今天我們學(xué)習(xí)Python的高級(jí)特性、模塊和IO操作,通過學(xué)習(xí)這些,我們可以更快的了解Python,使用Python。 高級(jí)特性中會(huì)講述列表生成式、生成器、和一些高級(jí)函數(shù),學(xué)習(xí)這些方便我們快速的生成列表,節(jié)省我們使用Python的時(shí)間,更快的使用Python達(dá)成我們的目的。 模...

    WelliJhon 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<