Python學習記錄1

  • if 條件之后要加冒號
  • 強制類型轉化是int()
  • 如果要計算1-100的整數(shù)之和圣贸,從1寫到100有點困難挚歧,幸好Python提供一個range()函數(shù),可以生成一個整數(shù)序列吁峻,再通過list()函數(shù)可以轉換為list滑负。比如range(5)生成的序列是從0開始小于5的整數(shù):
list(range(5))
[0, 1, 2, 3, 4]
  • 列表用[],元組是不能改變的列表用()用含,字典采用鍵值對存儲橙困,這里list是動詞!8汀!
>>> d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
>>> d['Michael']
95
  • 字典為什么查找這么快辟狈?

為什么dict查找速度這么快肠缔?因為dict的實現(xiàn)原理和查字典是一樣的夏跷。假設字典包含了1萬個漢字,我們要查某一個字明未,一個辦法是把字典從第一頁往后翻槽华,直到找到我們想要的字為止,這種方法就是在list中查找元素的方法趟妥,list越大猫态,查找越慢。

第二種方法是先在字典的索引表里(比如部首表)查這個字對應的頁碼披摄,然后直接翻到該頁亲雪,找到這個字。無論找哪個字疚膊,這種查找速度都非骋逶快,不會隨著字典大小的增加而變慢寓盗。

dict就是第二種實現(xiàn)方式灌砖,給定一個名字,比如'Michael'傀蚌,dict在內部就可以直接計算出Michael對應的存放成績的“頁碼”基显,也就是95這個數(shù)字存放的內存地址,直接取出來善炫,所以速度非沉糜模快。

你可以猜到销部,這種key-value存儲方式摸航,在放進去的時候,必須根據(jù)key算出value的存放位置舅桩,這樣酱虎,取的時候才能根據(jù)key直接拿到value。

  • 字典的操作
    二是通過dict提供的get方法擂涛,如果key不存在读串,可以返回None,或者自己指定的value:
>>> d.get('Thomas')
>>> d.get('Thomas', -1)
-1
  • 要刪除一個key撒妈,用pop(key)方法恢暖,對應的value也會從dict中刪除

  • list和dic的區(qū)別

和list比較,dict有以下幾個特點:
查找和插入的速度極快狰右,不會隨著key的增加而變慢杰捂;
需要占用大量的內存,內存浪費多棋蚌。
而list相反:
查找和插入的時間隨著元素的增加而增加嫁佳;
占用空間小挨队,浪費內存很少。
所以蒿往,dict是用空間來換取時間的一種方法盛垦。

  • 字典的key不能變化,所以不能是變量

dict可以用在需要高速查找的很多地方瓤漏,在Python代碼中幾乎無處不在腾夯,正確使用dict非常重要,需要牢記的第一條就是dict的key必須是不可變對象蔬充。
這是因為dict根據(jù)key來計算value的存儲位置蝶俱,如果每次計算相同的key得出的結果不同,那dict內部就完全混亂了娃惯。這個通過key計算位置的算法稱為哈希算法(Hash)跷乐。
要保證hash的正確性,作為key的對象就不能變趾浅。在Python中愕提,字符串、整數(shù)等都是不可變的皿哨,因此浅侨,可以放心地作為key。而list是可變的证膨,就不能作為key:

>>> key = [1, 2, 3]
>>> d[key] = 'a list'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
  • 集合的定義
    要創(chuàng)建一個set如输,需要提供一個list作為輸入集合:
>>> s = set([1, 2, 3])
>>> s
{1, 2, 3}
  • 函數(shù)名其實就是指向一個函數(shù)對象的引用,完全可以把函數(shù)名賦給一個變量央勒,相當于給這個函數(shù)起了一個“別名”:
>>> a = abs # 變量a指向abs函數(shù)
>>> a(-1) # 所以也可以通過a調用abs函數(shù)
1
  • 函數(shù)定義

在Python中不见,定義一個函數(shù)要使用def語句,依次寫出函數(shù)名崔步、括號稳吮、括號中的參數(shù)和冒號:,然后井濒,在縮進塊中編寫函數(shù)體灶似,函數(shù)的返回值用return語句返回。

def my_abs(x):
    if x >= 0:
        return x
    else:
        return -x
  • python參數(shù)

Python的函數(shù)定義非常簡單瑞你,但靈活度卻非常大酪惭。除了正常定義的必選參數(shù)外,還可以使用默認參數(shù)者甲、可變參數(shù)和關鍵字參數(shù)春感,使得函數(shù)定義出來的接口,不但能處理復雜的參數(shù)虏缸,還可以簡化調用者的代碼甥厦。

默認參數(shù)

def power(x, n=2):
    s = 1
    while n > 0:
        n = n - 1
        s = s * x
    return s

更多請見廖雪峰教程

  • 切片

這種經(jīng)常取指定索引范圍的操作纺铭,用循環(huán)十分繁瑣,因此刀疙,Python提供了切片(Slice)操作符,能大大簡化這種操作扫倡。

對應上面的問題谦秧,取前3個元素,用一行代碼就可以完成切片:

>>> L[0:3]
['Michael', 'Sarah', 'Tracy']

L[0:3]表示撵溃,從索引0開始取疚鲤,直到索引3為止,但不包括索引3缘挑。即索引0集歇,1,2语淘,正好是3個元素诲宇。

  • tuple也是一種list,唯一區(qū)別是tuple不可變惶翻。因此姑蓝,tuple也可以用切片操作,只是操作的結果仍是tuple:

  • 在很多編程語言中吕粗,針對字符串提供了很多各種截取函數(shù)(例如纺荧,substring),其實目的就是對字符串切片颅筋。Python沒有針對字符串的截取函數(shù)宙暇,只需要切片一個操作就可以完成,非常簡單议泵。

  • 迭代

Python的for循環(huán)抽象程度要高于Java的for循環(huán)占贫,因為Python的for循環(huán)不僅可以用在list或tuple上,還可以作用在其他可迭代對象上肢簿。
list這種數(shù)據(jù)類型雖然有下標靶剑,但很多其他數(shù)據(jù)類型是沒有下標的,但是池充,只要是可迭代對象桩引,無論有無下標,都可以迭代收夸,比如dict就可以迭代:

>>> d = {'a': 1, 'b': 2, 'c': 3}
>>> for key in d:
...     print(key)
...
a
c
b

所以坑匠,當我們使用for循環(huán)時,只要作用于一個可迭代對象卧惜,for循環(huán)就可以正常運行厘灼,而我們不太關心該對象究竟是list還是其他數(shù)據(jù)類型夹纫。
那么,如何判斷一個對象是可迭代對象呢设凹?方法是通過collections模塊的Iterable類型判斷:

>>> from collections import Iterable
>>> isinstance('abc', Iterable) # str是否可迭代
True
>>> isinstance([1,2,3], Iterable) # list是否可迭代
True
>>> isinstance(123, Iterable) # 整數(shù)是否可迭代
False

  • 最后一個小問題舰讹,如果要對list實現(xiàn)類似Java那樣的下標循環(huán)怎么辦?Python內置的enumerate函數(shù)可以把一個list變成索引-元素對闪朱,這樣就可以在for循環(huán)中同時迭代索引和元素本身:
>>> for i, value in enumerate(['A', 'B', 'C']):
...     print(i, value)
...
0 A
1 B
2 C

上面的for循環(huán)里月匣,同時引用了兩個變量,在Python里是很常見的奋姿,比如下面的代碼:

>>> for x, y in [(1, 1), (2, 4), (3, 9)]:
...     print(x, y)
...
1 1
2 4
3 9
  • python幾個關鍵的技術總結
    1.切片
    就是取出一個列表锄开,字典等的一部分
    2.迭代
    簡單說就一句:for的花樣使用
    3.列表生成器
    很方便地生成一個列表,花樣生成列表
    4.生成器
    列表是查表的方式称诗,但當數(shù)據(jù)量太大萍悴,且可以推算的時候,我們就用生成器寓免。
    每一個生成器都是一個迭代器癣诱,自動生成迭代器協(xié)議,
    5.迭代器
    任何對象只要定義了iternext方法再榄,那就是迭代器對象狡刘;迭代器使得for循環(huán)更加通用,

直接作用于for循環(huán)的對象統(tǒng)稱為可迭代對象:Iterable困鸥。
可以被next()函數(shù)調用并不斷返回下一個值的對象稱為迭代器:Iterator嗅蔬。
你可能會問,為什么list疾就、dict澜术、str等數(shù)據(jù)類型不是Iterator?
這是因為Python的Iterator對象表示的是一個數(shù)據(jù)流猬腰,Iterator對象可以被next()函數(shù)調用并不斷返回下一個數(shù)據(jù)鸟废,直到?jīng)]有數(shù)據(jù)時拋出StopIteration錯誤」煤桑可以把這個數(shù)據(jù)流看做是一個有序序列盒延,但我們卻不能提前知道序列的長度,只能不斷通過next()函數(shù)實現(xiàn)按需計算下一個數(shù)據(jù)鼠冕,所以Iterator的計算是惰性的添寺,只有在需要返回下一個數(shù)據(jù)時它才會計算。

好像迭代器更加像一種協(xié)議懈费,而生成器就是一種迭代器的實體计露。

如果把迭代器比作 Android 系統(tǒng),那么生成器就是 iOS,二者功能上差不多票罐,但是生成器更優(yōu)雅叉趣。

理解Python迭代對象、迭代器该押、生成器


Paste_Image.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末疗杉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蚕礼,更是在濱河造成了極大的恐慌乡数,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件闻牡,死亡現(xiàn)場離奇詭異,居然都是意外死亡绳矩,警方通過查閱死者的電腦和手機罩润,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來翼馆,“玉大人割以,你說我怎么就攤上這事∮γ模” “怎么了严沥?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長中姜。 經(jīng)常有香客問我消玄,道長,這世上最難降的妖魔是什么丢胚? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任翩瓜,我火速辦了婚禮,結果婚禮上携龟,老公的妹妹穿的比我還像新娘兔跌。我一直安慰自己,他們只是感情好峡蟋,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布坟桅。 她就那樣靜靜地躺著,像睡著了一般蕊蝗。 火紅的嫁衣襯著肌膚如雪仅乓。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天匿又,我揣著相機與錄音方灾,去河邊找鬼。 笑死,一個胖子當著我的面吹牛裕偿,可吹牛的內容都是我干的洞慎。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼嘿棘,長吁一口氣:“原來是場噩夢啊……” “哼劲腿!你這毒婦竟也來了?” 一聲冷哼從身側響起鸟妙,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤焦人,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后重父,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體花椭,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年房午,在試婚紗的時候發(fā)現(xiàn)自己被綠了矿辽。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡郭厌,死狀恐怖袋倔,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情折柠,我是刑警寧澤宾娜,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站扇售,受9級特大地震影響前塔,放射性物質發(fā)生泄漏。R本人自食惡果不足惜缘眶,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一嘱根、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧巷懈,春花似錦该抒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至涌攻,卻和暖如春欧引,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背恳谎。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工芝此, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留憋肖,地道東北人。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓婚苹,卻偏偏與公主長得像岸更,于是被迫代替她去往敵國和親膊升。 傳聞我的和親對象是個殘疾皇子怎炊,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內容

  • 最近在慕課網(wǎng)學習廖雪峰老師的Python進階課程,做筆記總結一下重點廓译。 基本變量及其類型 變量 在Python中非区,...
    victorsungo閱讀 1,692評論 0 5
  • 一、python 變量和數(shù)據(jù)類型 1.整數(shù) Python可以處理任意大小的整數(shù)歹垫,當然包括負整數(shù),在Python程序...
    績重KF閱讀 1,707評論 0 1
  • http://python.jobbole.com/85231/ 關于專業(yè)技能寫完項目接著寫寫一名3年工作經(jīng)驗的J...
    燕京博士閱讀 7,579評論 1 118
  • 個人筆記颠放,方便自己查閱使用 Py.LangSpec.Contents Refs Built-in Closure ...
    freenik閱讀 67,711評論 0 5
  • 本文翻譯自Functional Programming Howto 本文將介紹Python中函數(shù)式編程的特性排惨。在對...
    大蟒傳奇閱讀 2,617評論 4 14