日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

Python 筆記(一)

系統(tǒng) 1914 0

Python 編碼

  • Unicode把所有語(yǔ)言都統(tǒng)一到一套編碼里,這樣就不會(huì)再有亂碼問題了。如果統(tǒng)一成Unicode編碼,亂碼問題從此消失了。但是,如果文本基本上全部是英文的話,用Unicode編碼比ASCII編碼需要多一倍的存儲(chǔ)空間,在存儲(chǔ)和傳輸上就十分不劃算。所以,本著節(jié)約的精神,又出現(xiàn)了把Unicode編碼轉(zhuǎn)化為“可變長(zhǎng)編碼”的UTF-8編碼。UTF-8編碼把一個(gè)Unicode字符根據(jù)不同的數(shù)字大小編碼成1-6個(gè)字節(jié),常用的英文字母被編碼成1個(gè)字節(jié),漢字通常是3個(gè)字節(jié),只有很生僻的字符才會(huì)被編碼成4-6個(gè)字節(jié)。如果你要傳輸?shù)奈谋景罅坑⑽淖址肬TF-8編碼就能節(jié)省空間。

  • 在計(jì)算機(jī)內(nèi)存中,統(tǒng)一使用Unicode編碼,當(dāng)需要保存到硬盤或者需要傳輸?shù)臅r(shí)候,就轉(zhuǎn)換為UTF-8編碼。用記事本編輯的時(shí)候,從文件讀取的UTF-8字符被轉(zhuǎn)換為Unicode字符到內(nèi)存里,編輯完成后,保存的時(shí)候再把Unicode轉(zhuǎn)換為UTF-8保存到文件。

  • 在最新的Python 3版本中,字符串是以Unicode編碼的,也就是說,Python的字符串支持多語(yǔ)言,

  • 對(duì)于單個(gè)字符的編碼,Python提供了ord()函數(shù)獲取字符的整數(shù)編碼表示,chr()函數(shù)把編碼轉(zhuǎn)換為對(duì)應(yīng)的字符。

List

  • Python內(nèi)置的一種數(shù)據(jù)類型是列表:list。list是一種有序的集合,可以隨時(shí)添加和刪除其中的元素。

  • 當(dāng)索引超出了范圍時(shí),Python會(huì)報(bào)一個(gè)IndexError錯(cuò)誤,如果要取最后一個(gè)元素,除了計(jì)算索引位置外,還可以用-1做索引,直接獲取最后一個(gè)元素.

  • insert(index,元素)可以把元素插入到指定的位置,該位置及其后的元素會(huì)往后移動(dòng)一位

tuple

  • 另一種有序列表叫元組:tuple。tuple和list非常類似,但是tuple一旦初始化就不能修改,比如同樣是列出同學(xué)的名字.

  • 要定義一個(gè)只有1個(gè)元素的tuple;如果你這么定義t = (1); 定義的不是tuple,是1這個(gè)數(shù)!這是因?yàn)槔ㄌ?hào)()既可以表示tuple,又可以表示數(shù)學(xué)公式中的小括號(hào),這就產(chǎn)生了歧義,因此,Python規(guī)定,這種情況下,按小括號(hào)進(jìn)行計(jì)算,計(jì)算結(jié)果自然是1。所以,只有1個(gè)元素的tuple定義時(shí)必須加一個(gè)逗號(hào),,來消除歧義t = (1,)。

  • tuple的不變指的是引用不變,比如里面存的是對(duì)象,改變對(duì)象的某些屬性,但這個(gè)對(duì)象沒有變,即tuple的元素未變。

dict

  • Python內(nèi)置了字典:dict的支持,dict全稱dictionary,在其他語(yǔ)言中也稱為map,使用鍵-值(key-value)存儲(chǔ),具有極快的查找速度。

  • 為什么dict查找速度這么快?因?yàn)閐ict的實(shí)現(xiàn)原理和查字典是一樣的。假設(shè)字典包含了1萬(wàn)個(gè)漢字,我們要查某一個(gè)字,一個(gè)辦法是把字典從第一頁(yè)往后翻,直到找到我們想要的字為止,這種方法就是在list中查找元素的方法,list越大,查找越慢。第二種方法是先在字典的索引表里(比如部首表)查這個(gè)字對(duì)應(yīng)的頁(yè)碼,然后直接翻到該頁(yè),找到這個(gè)字。無(wú)論找哪個(gè)字,這種查找速度都非常快,不會(huì)隨著字典大小的增加而變慢。dict就是第二種實(shí)現(xiàn)方式,給定一個(gè)名字,比如'Michael',dict在內(nèi)部就可以直接計(jì)算出Michael對(duì)應(yīng)的存放成績(jī)的“頁(yè)碼”,也就是95這個(gè)數(shù)字存放的內(nèi)存地址,直接取出來,所以速度非常快。

set

  • 集合(set)是一個(gè)無(wú)序的不重復(fù)元素序列。

  • 可以使用大括號(hào) { } 或者 set() 函數(shù)創(chuàng)建集合,注意:創(chuàng)建一個(gè)空集合必須用 set() 而不是 { },因?yàn)?{ } 是用來創(chuàng)建一個(gè)空字典。

  • 創(chuàng)建格式:parame = {value01,value02,...} 或者 set(value)

函數(shù)

函數(shù)的參數(shù)

  • 位置參數(shù),power(x, n)函數(shù)有兩個(gè)參數(shù):x和n,這兩個(gè)參數(shù)都是位置參數(shù),調(diào)用函數(shù)時(shí),傳入的兩個(gè)值按照位置順序依次賦給參數(shù)x和n。

  • 默認(rèn)參數(shù),設(shè)置有默認(rèn)值的參數(shù)

  • 可變參數(shù),定義可變參數(shù)和定義一個(gè)list或tuple參數(shù)相比,僅僅在參數(shù)前面加了一個(gè)*號(hào)。在函數(shù)內(nèi)部,參數(shù)numbers接收到的是一個(gè)tuple,因此,函數(shù)代碼完全不變。但是,調(diào)用該函數(shù)時(shí),可以傳入任意個(gè)參數(shù),包括0個(gè)參數(shù)。如def calc(*numbers):

  • 關(guān)鍵字參數(shù),可變參數(shù)允許你傳入0個(gè)或任意個(gè)參數(shù),這些可變參數(shù)在函數(shù)調(diào)用時(shí)自動(dòng)組裝為一個(gè)tuple。而關(guān)鍵字參數(shù)允許你傳入0個(gè)或任意個(gè)含參數(shù)名的參數(shù),這些關(guān)鍵字參數(shù)在函數(shù)內(nèi)部自動(dòng)組裝為一個(gè)dict。如def person(name, age, **kw):

迭代

  • 判斷一個(gè)對(duì)象是可迭代對(duì)象。方法是通過collections模塊的Iterable類型判斷
            
              from collections import Iterable
isinstance('abc', Iterable) # str是否可迭代

            
          
  • 如果要對(duì)list實(shí)現(xiàn)類似Java那樣的下標(biāo)循環(huán)。Python內(nèi)置的enumerate函數(shù)可以把一個(gè)list變成索引-元素對(duì),這樣就可以在for循環(huán)中同時(shí)迭代索引和元素本身
            
              for i, value in enumerate(['A', 'B', 'C']):
     print(i, value)

            
          

列表生成式

  • 列表生成式即List Comprehensions,是Python內(nèi)置的非常簡(jiǎn)單卻強(qiáng)大的可以用來創(chuàng)建list的生成式。

  • 如果要生成[1x1, 2x2, 3x3, ..., 10x10]怎么做?方法一是循環(huán):

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

            
          
  • 但是循環(huán)太繁瑣,而列表生成式則可以用一行語(yǔ)句代替循環(huán)生成上面的list:寫列表生成式時(shí),把要生成的元素x * x放到前面,后面跟for循環(huán),就可以把list創(chuàng)建出來,十分有用,多寫幾次,很快就可以熟悉這種語(yǔ)法。
            
              >>> [x * x for x in range(1, 11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

            
          
  • for循環(huán)后面還可以加上if判斷,這樣我們就可以篩選出僅偶數(shù)的平方:
            
              >>> [x * x for x in range(1, 11) if x % 2 == 0]
[4, 16, 36, 64, 100]

            
          
  • 還可以使用兩層循環(huán),可以生成全排列:
            
              >>> [m + n for m in 'ABC' for n in 'XYZ']
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']

            
          

生成器

  • 如果列表元素可以按照某種算法推算出來,那我們是否可以在循環(huán)的過程中不斷推算出后續(xù)的元素呢?這樣就不必創(chuàng)建完整的list,從而節(jié)省大量的空間。在Python中,這種一邊循環(huán)一邊計(jì)算的機(jī)制,稱為生成器:generator。

  • 要?jiǎng)?chuàng)建一個(gè)generator,有很多種方法。第一種方法很簡(jiǎn)單,只要把一個(gè)列表生成式的[]改成(),就創(chuàng)建了一個(gè)generator:

            
              >>> 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>

                
              
            
          
  • 可以通過next()函數(shù)獲得generator的下一個(gè)返回值,generator保存的是算法,每次調(diào)用next(g),就計(jì)算出g的下一個(gè)元素的值,直到計(jì)算到最后一個(gè)元素,沒有更多的元素時(shí),拋出StopIteration的錯(cuò)誤。

  • 當(dāng)然,不斷調(diào)用next(g)實(shí)在是太變態(tài)了,正確的方法是使用for循環(huán),因?yàn)間enerator也是可迭代對(duì)象:

            
              >>> g = (x * x for x in range(10))
>>> for n in g:
...     print(n)

            
          
  • 如果一個(gè)函數(shù)定義中包含yield關(guān)鍵字,那么這個(gè)函數(shù)就不再是一個(gè)普通函數(shù),而是一個(gè)generator,如
            
              def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b
        a, b = b, a + b
        n = n + 1
    return 'done'

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

迭代器

  • 凡是可以被next()函數(shù)調(diào)用并不斷返回下一個(gè)值的對(duì)象稱為迭代器:Iterator。

  • 凡是可作用于for循環(huán)的對(duì)象都是Iterable類型;

  • 可以使用isinstance()判斷一個(gè)對(duì)象是否是Iterator對(duì)象

  • 生成器都是Iterator對(duì)象,但list、dict、str雖然是Iterable,卻不是Iterator。

  • 把list、dict、str等Iterable變成Iterator可以使用iter()函數(shù)

  • 為什么list、dict、str等數(shù)據(jù)類型不是Iterator?這是因?yàn)镻ython的Iterator對(duì)象表示的是一個(gè)數(shù)據(jù)流,Iterator對(duì)象可以被next()函數(shù)調(diào)用并不斷返回下一個(gè)數(shù)據(jù),直到?jīng)]有數(shù)據(jù)時(shí)拋出StopIteration錯(cuò)誤。可以把這個(gè)數(shù)據(jù)流看做是一個(gè)有序序列,但我們卻不能提前知道序列的長(zhǎng)度,只能不斷通過next()函數(shù)實(shí)現(xiàn)按需計(jì)算下一個(gè)數(shù)據(jù),所以Iterator的計(jì)算是惰性的,只有在需要返回下一個(gè)數(shù)據(jù)時(shí)它才會(huì)計(jì)算。Iterator甚至可以表示一個(gè)無(wú)限大的數(shù)據(jù)流,例如全體自然數(shù)。而使用list是永遠(yuǎn)不可能存儲(chǔ)全體自然數(shù)的。

  • Python的for循環(huán)本質(zhì)上就是通過不斷調(diào)用next()函數(shù)實(shí)現(xiàn)的


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 和田市| 资阳市| 娄底市| 诸城市| 汕尾市| 旅游| 曲阳县| 墨江| 彭阳县| 都匀市| 瑞金市| 泰安市| 阳泉市| 阿瓦提县| 邵阳县| 高清| 怀集县| 元朗区| 咸宁市| 玉田县| 南丰县| 蒙自县| 逊克县| 星子县| 瓮安县| 潜江市| 兴业县| 荥经县| 疏勒县| 都兰县| 铁岭县| 黄平县| 西昌市| 景东| 天全县| 金湖县| 金秀| 红河县| 延吉市| 香港| 武安市|