- 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.迭代器
任何對象只要定義了iter和next方法再榄,那就是迭代器對象狡刘;迭代器使得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迭代對象、迭代器该押、生成器