Python learning:More Types
None
None 對象可以被用來表示值的缺失梗醇。它類似于其他編程語言中的null 捉捅。像一些空值冶匹,如0习劫,[]以及空字符串,當將這些值轉(zhuǎn)變成布爾變量(Boolean variable)的時候為False 嚼隘。
當我們在Python操作面輸入的時候诽里,None 會表現(xiàn)為空的字符串。
>>>None==None
True
>>>None
>>>print(None)
None
>>>
None 對象可以通過任何沒有明確的返回任何值的函數(shù)返回得到
示例一:
def some_fun():
print("Hi!")
var=some_fun()
print(var)
Result:
>>>
Hi!
None
>>>
示例二:
foo=print()
if foo==None:
print(1)
else:
print(2)
Result:
1
Dictionaries(字典)
Dictionaries (字典)是用來將任意鍵映射到值的數(shù)據(jù)結(jié)構(gòu)飞蛹。列表可以被認為是帶有一定范圍內(nèi)的整數(shù)鍵的dictionaries 谤狡。Dictionaries 可以像列表一樣使用同樣的方式進行檢索,使用方括號(square brackets) 將鍵包含在里面:
示例一:
ages={"Dave":24,"Mary":42,"John":58}
print(ages["Dave"])
print(ages["Marry"])
Result:
>>>
24
42
>>>
如果試圖檢索不屬于dictionary 的鍵卧檐,將會返回KeyError
示例一:
primary={
"red":[255,0,0],
"green":[0,255,0],
"blue":[0,0,255],
}
print(primary["red"])
print(primary["yellow"])
Result:
>>>
[255,0,]
KeyError:'yellow'
>>>
==注意==正如你所看到的墓懂,一個dictionary可以存儲任何類型的數(shù)據(jù)作為值,如果是一個空的dictionary可以定義為{}霉囚。
示例二:
test={}
print(test[0])
Result:
KeyError:0 #因為test是空的dictionary捕仔,沒有0這個鍵
只有不變的 對象才能用做字典的鍵。不能改變的對象指的是這些不能夠被改變的對象盈罐。到目前為止榜跌,你遇到的唯一可變的 對象就是lists 和dictionaries 。如果試圖將一個可變的對象作為字典的鍵盅粪,將會產(chǎn)生TypeError钓葫。
bad_dict={
[1,3,4]:"one two four",
}
Result:
TypeError:unhashable type:'list'
和列表一樣,dictionary的鍵可以被指定給任何的值票顾。然而础浮,和列表不同的是,一個新的dictionary鍵可以被賦予一個新的值奠骄,這個值不是之前存在的霸旗。
示例一:
squares={1:1,2:4,3:"error",4:16}
squares[8]=64 #給不存在的鍵賦值
squares[3]=9 #給存在的鍵重新賦值
print(squares)
Result:
{1:1,2:4,3:9,4:16,8:64}
示例二:
primes={1:2,2:3,4:7,7:17}
print(primes[primes[4]])
Result:
17
為了判斷鍵是否在dictionary中,你可以使用in 或者not in 戚揭,就像你在列表中進行的那樣诱告。
示例一:
nums={
1:"one",
2:"two",
3:"three",
}
print(i in nums)
print("three" in nums)# in 和not in都是用來判斷鍵的,不能判斷值
print(4 not in nums)
Result:
True
False
True
一個有用的dictionary方法就是get ,它可以完成索引能做的事情精居,但是如果發(fā)現(xiàn)鍵不在dictionary中锄禽,它就會返回另外一個指定的值(‘None',默認情況下)
示例一:
pairs={1:"apple",
"orange":[2,3,4],
True:False,
None:"True",
}
print(pairs.get("orange"))
print(pairs.get(7))
print(pairs.get(12345,"not in dictionary"))#鍵不在pairs中,但是指定了值靴姿,所以會返回指定的值
Result:
[2,3,4]
None
not in dictionary
示例二:
fib={1:1,2:1,3:2,4:3}
print(fib.get(4,0)+fib.get(7,5))
Result:
8
#因為fib.get(4,0)中鍵4是fib中的沃但,所以返回值3,而fib.get(7,5)中鍵7不是fib中的佛吓,所以返回指定的值宵晚。
Tuples (元組)
元組與列表也是非常類似的,我們希望元組是不可改變的维雇。同樣可以使用括號創(chuàng)建它們淤刃,而不是方括號。
words=("spam","eggs","sausages")
你可以使用它們的索引號來訪問元組中的值吱型,就像在列表中所進行的那樣:
print(words[0])#輸出第一個元素
如果試圖重新給元組賦值將會產(chǎn)生TypeError ,這也是和列表不同的地方逸贾。
words[1]="cheese"
Result:
TypeError:"tuple object dose not support item assignment"
==提示== 和列表以及字典一樣,元組可以相互嵌套
列表津滞,字典和元組創(chuàng)建及訪問方式的比較
#列表
list=["one","two"]
print(list[0])
#字典
dict={1:"one",2:"two",3:"three"}
print(dict[1])
print(dict.get(2))
#元組
tp=("one","two","three")
print(tp[1])
元組可以在沒有括號的情況下創(chuàng)建铝侵,可以通過僅僅將值用逗號分開來進行創(chuàng)建。
示例一:
my_tuple="one","two","three"
print(my_tuple[0])
如果要創(chuàng)建一個空的元組触徐,可以使用空括號:
tpl=()
==注意== 元組的訪問要快于列表咪鲜,但是其缺點在于元組不能夠被改變
List Slices(列表切片)
列表切片List slices 提供了更加高級的方法從列表中檢索值∽拆模基本的列表切片包括使用兩個逗號隔開的整數(shù)來檢索列表嗜诀。這將返回一個新的列表,這個列表包含所有在索引之間的舊列表之間的值孔祸。
squares=[0,1,4,9,16,25,36,49,64,81]
print(squares[2:6])
print(squares[3:8])
print(squares[0:1])
Result:
[4,9,16,25]
[9,16,25,64,81]
[0]
==Tips== 和Range 的參數(shù)一樣,切片提供的第一個所有被包含在結(jié)果中发皿,但是第二個并沒有被包含在結(jié)果中崔慧。
如果切片中的第一個數(shù)字被省略了,它代表的就是列表的開頭穴墅。如果第二個數(shù)字被刪除了惶室,它代表的就是列表的結(jié)尾。
示例一:
squares=[0,1,4,9,16,25,36,49,64,81]
print(squares[:7])
print(squares[7:])
Result:
[0,1,4,9,16,25,36]
[49,64,81]
==Tips== 對元組也可以使用切片
列表切片可以有第三個參數(shù)玄货,代表的是步數(shù)皇钞,在切片中只包含備用值:
squares=[0,1,4,9,16,25,36,49,64,81]
print(squares[::2])
print(squares[2:8:3])
Result:
[0,4,16,36,64]
[4,25]
==Tips== 第三個參數(shù)的通俗意思就是間隔距離,隔幾個數(shù)取一個值
負值也可以在列表切片中使用(以及正常的列表索引)松捉。當切片中的第一個和第二個參數(shù)被使用負值的時候(或者一個正常的索引),它們將會從列表的末尾開始數(shù)起夹界。
squares=[0,1,4,9,16,25,36,49,64,81]
print(squares[1:-1])
Result:
[1,4,16,25,36,49,64]
==Tips== 如果有負值被使用在步驟中,切片將被向后進行切割隘世。使用[::-1]作為一個切片是一個很常見也很慣用的將列表進行倒置的方式可柿,但是如果前面的兩個參數(shù)存在的話鸠踪,切片的返回值為[],也就是一個空列表,如果前面兩個參數(shù)第一個參數(shù)比第二個參數(shù)大,第三個參數(shù)為負值的話复斥,就可以創(chuàng)建一個新的列表营密。
squares=[0,1,4,9,16,25,64,81]
print(squares[::-1])
print(squares[1:8:-1])
print(squares[::-2])
print(squares[7:1:-2])
Result:
[81,64,49,36,25,16,9,4,1,0]
[]
[81,25,9,1]
[81,25,9]
List Comprehensions(列表解析)
列表解析是一種快速創(chuàng)建列表非常有用的方式,其中列表的內(nèi)容要遵循簡單的規(guī)則目锭。例如评汰,我們可以像下面一樣進行:
#一個列表解析
cubes=[i**3 for i in range(5)]
print(cubes)
Result:
[0,1,8,27,64]
==Tips== 列表解析的靈感來自于數(shù)學中的set-builder計數(shù)法,python 計算中痢虹,i2* 表示的是積, **i**2 ** 表示的是平方被去。
列表解析還可以包含if 語句來強制列表中的值的條件。
示例一:
evens=[i**2 for i in range(10) if i**2 % 2 ==0 ]
#下面的代碼和上面的代碼將會得到同樣的結(jié)果
evens=[i**2 for i in range(10) if i%2==0]
print(evens)
Result:
[0,4,16,36,64]
如果試圖創(chuàng)建一個范圍非常極端的列表世分,將會產(chǎn)生MemoryError 编振,下面的代碼展示的就是列表解析超出了內(nèi)存的情況:
even=[2*i for i in range(10**100)]
print(even)
Result:
Memory limit exceeded
==Tips== 這個問題可以由生成器來解決,我們將在下一個模塊講解生成器
String Formatting(字符串格式化)
到目前為止臭埋,為了字符串和非字符串結(jié)合起來踪央,你就得把非字符串轉(zhuǎn)變成字符串然后把它們加在一起。字符串格式化提供了一個更加有效額方式來將非字符串嵌合到字符串中瓢阴。字符串格式化使用一個字符串的format 方法來替換字符串中的一些參數(shù)畅蹂。
示例一:
# 字符串格式化
nums=[4,5,6]
msg="Numbers:{0}{1}{2}".format(nums[0],nums[1],nums[2])
print(msg)
Result:
Numbers:456
==Tips==
format函數(shù)的每個參數(shù)都放在字符串中相應(yīng)的位置,該位置由大括號{}確定荣恐。
示例二:
print("{0}{1}{0}.format("abra","cad"))
Result
abracadabra
字符串格式化也可以使用命名參數(shù)來完成液斜。
示例一:
a="{x},{y}".format(x=5,y=12)
print(a)
Result:
5,12
Python 包含有大量有用額內(nèi)置函數(shù)和方法來完成相同的任務(wù)。
join - 將一個字符串與另外一個作為分隔符的字符串進行連接
replace -將字符串中的一個子字符串替換成另外一個子字符串
startwith和endswith - 分別確定一個子字符串是否在一個字符串的開頭或者是否在字符串的末尾叠穆。
為了改變字符串的狀態(tài)少漆,你可以使用lower 和upper 。
split 方法與join 是相反的硼被,將帶有特定分隔符的字符串轉(zhuǎn)變?yōu)橐粋€列表示损。
示例一:
print(",".join(["spam","eggs","ham"]))#(1)
print("Hello ME".replace("ME","world"))#(2)
print("This is a sentence".startswith("This"))#(3)
print("This is a sentence".endswith("sentence"))#(4)
print("This is a sentence".upper())#(5)
print("AN ALL CAPS SENTENCE".lower())#(6)
print("spam,eggs,ham".split(","))#(7)
Result:
spam,eggs,ham #(1)
Hello world #(2)
True #(3)
True #(4)
THIS IS A SENTENCE #(5)
an all caps sentence #(6)
['spam', 'eggs', 'ham'] #(7)
數(shù)值函數(shù)
為了知道一些數(shù)字或者列表中最大的或者最小的值,你可以使用max 或者min
為了找到一個數(shù)字與零之間的距離(也就是它的絕對值)嚷硫,可以使用 abs
為了把一個小數(shù)四舍五入到一定的位置检访,可以使用round
為了得到整個列表的總和,可以使用sum
示例一:
print(min(1,2,3,4,0,2,1))
print(max(1,4,9,2,5,6,8))
print(abs(-99))
print(abs(42))
print(sum([1,2,3,4,5]))
Result:
0
9
99
42
15
示例二:
a=min([sum([11,22]),max(abs(-30),2)])
print(a)
Result:
a
列表函數(shù)
all 和 any 將一個列表作為聲明仔掸,通常被用在條件語句中洼哎,如果all 和 any 中的分別的聲明等于True 的話碾褂,就返回True ,反之則返回False .
函數(shù)enumerate 可以被用來歷遍這些值法褥,并創(chuàng)建一個實時列表艇挨。
示例一:
nums=[55,44,33,22,11]
if all([i > 5 for i in nums]):
print("All larger than 5")
if any([i % 2 ==0 for i in nums]):
print("At least one is even")
for v in enumerate(nums):
print(V)
Result:
All larger than 5
At least one is even
(0,55)
(1,44)
(2,33)
(3,22)
(4,11)
示例二:
nums=[-1,2,3,4,-5]
if all([abs(i)<3 for i in nums]):
print(1)
else:
print(2)
Result:
2
Text Analyzer(文本分析器)
這是一個示范程序,展示了分析樣本文件來找到文本中每個類型的字符所占的百分比是多少的過程。這部分展示了一個文件如何被打開以及被讀取双泪。
filename=input("Enter a filaname:")
with open(filename) as f:
text=f.read()
print(text)
這部分的程序展示的計算一個字符在一個字符串中出現(xiàn)了多少次的計算函數(shù)持搜。這個函數(shù)采用了文件的內(nèi)容和一個字符作為聲明,返回的是該字符在文件中出現(xiàn)的次數(shù)焙矛。
def count_char(text,char):
count=0
for c in text:
if c==char:
count+=1
return count
filename=input("Enter a filename:")
with.open(filename) as f:
text=f.read()
print(count_char(text,"r"))
==Tips== return 的位置很重要葫盼,它和for 循環(huán)是同一等級的。
下面的這部分程序是找出文本中每個字符所占的百分比村斟。
示例一:
for char in "abcdhowe hfuwqfohqaou":
perc=100*count_char(text,char)/len(text)
print("{0}-{1}%".foramt(char,round(perc,2)))
下面我們把前面的代碼全部放到一起并運行:
def count_char(text,char):
count=0
for c in text:
if c==char:
count+=1
return count
filename=input("Enter a filename:")
with open(filename) as f:
text=f.read()
for char in "dejwo hfowhfowhefoihoKBVKFB":
perc=100*count_char(text,char)/len(text)
print("{0}-{1}%".format(char,round(perc,2)))
示例二:
def count_char(text,char):
count=0
for c in text:
if c==char:
count+=1
return count
text="dhofifbksahfugvlsdhgbvneranak" #隨便輸?shù)?for char in text:
perc=100*count_char(text,char)/len(text)
print("{0}-{1}-{2}%".format(char,count_char(text,char),round(perc,2)))
print(len(text)) #round函數(shù)可以減少小數(shù)位數(shù)的輸出