Python全栈开发之3、数据类型set补充、深浅拷贝与函数
轉(zhuǎn)載請(qǐng)注明出處http://www.cnblogs.com/Wxtrkbc/p/5466082.html?
一、基本數(shù)據(jù)類型補(bǔ)充
set是一個(gè)無序而且不重復(fù)的集合,有些類似于數(shù)學(xué)中的集合,也可以求交集,求并集等,下面從代碼里來看一下set的用法,如果對(duì)這些用法不太熟悉的話,可以照著下面的代碼敲一遍。
s1={1,2,3,1} #定義一個(gè)set s1 如果s1={}為空則默認(rèn)定義一個(gè)字典 s2=set([2,5,6]) #定義一個(gè)set s2 print(s1) #s1={1,2,3} 自動(dòng)去除重復(fù)的元素s1.add(5) #s1={1,2,3,5} 添加一個(gè)元素 print(s1)s3=s1.difference(s2) #返回一個(gè)s1中存在而不存在于s2的字典s3,s3={1,3},而s1并沒有改變 print(s3)s1.difference_update(s2) #s1跟新成上面的s3 s1={1,3} s1.discard(1) #刪除元素1,不存在的話不報(bào)錯(cuò) s1={3} print(s1) s1.remove(3) #刪除元素3,不存在的話報(bào)錯(cuò) s1={} print(s1) s1.update([11,2,3]) #跟新s1中的元素,其實(shí)是添加 s1={11,2,3} print(s1) k=s1.pop() #刪除一個(gè)元素,并將刪除的元素返回給一個(gè)變量,無序的,所以并不知道刪除誰s1={1,2,3,4} #這里重新定義了集合s1,s2 s2={3,4,5,6} r1=s1.intersection(s2) #取交集,并將結(jié)果返回給一個(gè)新的集合 r1={3,4} print(r1) print(s1) s1.intersection_update(s2) #取交集,并將s1更新為取交集后的結(jié)果 s1={3,4} print(s1)k1=s1.issubset(s2) #s1是否是s2的的子序列是的話返回True,否則False 這里k1=true print(k1) k2=s1.issuperset(s2) #s1是否是s2的父序列 k2=Falsek3=s2.isdisjoint(s1) #s1,s2,是否有交集,有的話返回False,沒有的話返回True print(k3) s1.update([1,2]) #s1={1,2,3,4} r3=s1.union(s2) #取并集將結(jié)果返回給r3 r3={1,2,3,4,5,6} print(r3) r2=s1.symmetric_difference(s2) #r2=s1并s2-s1交s2 r2={1,2,5,6} print(r2) s1.symmetric_difference_update(s2) #s1更新為 s1并s2 - s1交s2 s1={1,2,5,6} print(s1)二、三目運(yùn)算符
三目運(yùn)算符可以簡(jiǎn)化條件語(yǔ)句的縮寫,可以使代碼看起來更加簡(jiǎn)潔,三目可以簡(jiǎn)單的理解為有三個(gè)變量,它的形式是這樣的?name= k1 if 條件 else k2 ,如果條件成立,則 name=k1,否則name=k2,下面從代碼里面來加深一下理解,從下面的代碼明顯可以看出三目運(yùn)算符可以使代碼更加簡(jiǎn)潔。
a=1 b=2 if a<b: #一般條件語(yǔ)句的寫法k=a else:k=bc=a if a<b else b #三目運(yùn)算符的寫法三、深拷貝淺拷貝
拷貝意味著對(duì)數(shù)據(jù)重新復(fù)制一份,對(duì)于拷貝有兩種深拷貝,淺拷貝兩種拷貝,不同的拷貝有不同的效果??截惒僮鲗?duì)于基本數(shù)據(jù)結(jié)構(gòu)需要分兩類進(jìn)行考慮,一類是字符串和數(shù)字,另一類是列表、字典等。如果要進(jìn)行拷貝的操作話,要import copy。
1、數(shù)字和字符串
對(duì)于數(shù)字和字符串而言,深拷貝,淺拷貝沒有什么區(qū)別,因?yàn)閷?duì)于數(shù)字?jǐn)?shù)字和字符串一旦創(chuàng)建便不能被修改,假如對(duì)于字符串進(jìn)行替代操作,只會(huì)在內(nèi)存中重新生產(chǎn)一個(gè)字符串,而對(duì)于原字符串,并沒有改變,基于這點(diǎn),深拷貝和淺拷貝對(duì)于數(shù)字和字符串沒有什么區(qū)別,下面從代碼里面說明這一點(diǎn)。
import copy s='abc' print(s.replace('c','222')) # 打印出 ab222 print(s) # s='abc' s并沒有被修改 s1=copy.deepcopy(s) s2=copy.copy(s)#可以看出下面的值和地址都一樣,所以對(duì)于字符串和數(shù)字,深淺拷貝不一樣,數(shù)字和字符串一樣就不演示了,大家可以去試一下 print(s,id(s2)) # abc 1995006649768 print(s1,id(s2)) # abc 1995006649768 print(s2,id(s2)) # abc 19950066497682、字典、列表等數(shù)據(jù)結(jié)構(gòu)
對(duì)于字典、列表等數(shù)據(jù)結(jié)構(gòu),深拷貝和淺拷貝有區(qū)別,從字面上來說,可以看出深拷貝可以完全拷貝,淺拷貝則沒有完全拷貝,下面先從內(nèi)存地址分別來說明,假設(shè)?n1?=?{"k1":?"wu",?"k2":?123,?"k3": ["alex",?456]}。
淺拷貝在內(nèi)存中只額外創(chuàng)建第一層數(shù)據(jù) 深拷貝在內(nèi)存中將所有的數(shù)據(jù)重新創(chuàng)建一份
?
下面從代碼上來進(jìn)行說明,
import copy n1 = {"k1": "wu", "k2": 123, "k3": ["alex", 456]} n2=copy.copy(n1) # 淺拷貝 n3=copy.deepcopy(n1) # 深拷貝 print(n1,id(n1),id(n1['k1']),id(n1['k3'])) print(n2,id(n2),id(n2['k1']),id(n2['k3'])) print(n3,id(n3),id(n3['k1']),id(n3['k3']))# 從下面打印的值結(jié)合上面的圖就可以很好的理解, # {'k3': ['alex', 456], 'k2': 123, 'k1': 'wu'} 2713748822024 2713753080528 2713755115656 # {'k3': ['alex', 456], 'k2': 123, 'k1': 'wu'} 2713755121416 2713753080528 2713755115656 # {'k3': ['alex', 456], 'k2': 123, 'k1': 'wu'} 2713753267656 2713753080528 2713754905800四、函數(shù)
如果我們要計(jì)算一個(gè)圓的面積,就需要知道它的半徑,然后根據(jù)公式S=3.14*r*r算出它的面積,如果我們要算100個(gè)圓的面積,則每次我們都需要寫公式去計(jì)算,是不是很麻煩,但是有了函數(shù)的話,我們就不再每次寫S=3.14 *r*r,而是把計(jì)算圓面積的功能寫到一個(gè)函數(shù)里比如說s=areacircle(r),然后每次求面積的時(shí)候,只要把半徑傳遞給函數(shù)就可以實(shí)現(xiàn)計(jì)算圓面積,這樣我們寫代碼就簡(jiǎn)單多了。這就是函數(shù)的功能。
1、定義函數(shù)
定義一個(gè)函數(shù)要使用def語(yǔ)句,依次寫出函數(shù)名、括號(hào)、括號(hào)中的參數(shù)和冒號(hào):,然后,在縮進(jìn)塊中編寫函數(shù)體,函數(shù)的返回值用return語(yǔ)句返回。比如說定義一個(gè)求和函數(shù)
def sum(a,b): #定義函數(shù)ret=a+b #函數(shù)體return ret #函數(shù)返回 print(sum(1,2)) #調(diào)用函數(shù)并打印出結(jié)果 #如果沒有return語(yǔ)句,函數(shù)執(zhí)行完畢后也會(huì)返回結(jié)果,只是結(jié)果為None2、函數(shù)的參數(shù)
函數(shù)的參數(shù)有位置參數(shù)、默認(rèn)參數(shù)、可變參數(shù)、關(guān)鍵字參數(shù)等,此外需要注意的是Python里面?zhèn)鲄?shù)的時(shí)候傳的是引用,而不是在創(chuàng)建一份新的值,下面分別來說明
# 位置參數(shù) # 函數(shù)調(diào)用的時(shí)候,傳遞的參數(shù)必須按順序與定義的函數(shù)一一對(duì)應(yīng) def fun1(name): #name為位置參數(shù)print(name) fun1('Jason') #將Jason 傳遞給func函數(shù)作為默認(rèn)參數(shù)# 默認(rèn)參數(shù) # 需要放在參數(shù)列表最后 def fun2(name,age=19): #age=19是默認(rèn)參數(shù),如果不傳的話默認(rèn)為19print('%s:%s' %(name,age)) fun2("Jason",18) #將Jason和18 傳給name和age# 可變參數(shù) # 可以傳遞任意個(gè)參數(shù),自動(dòng)組裝成元組元素 def fun3(*args):print(args,type(args)) fun3(1,2,3) #直接傳遞參數(shù) l=list([1,2,3,4]) fun3(*l) #或者在list或tuple前面加一個(gè)*號(hào),把list或tuple的元素變成可變參數(shù)傳進(jìn)去#關(guān)鍵字參數(shù) #可傳入任意個(gè)含參數(shù)名的參數(shù),自動(dòng)組裝為一個(gè)dict def fun4(**kwargs):print((kwargs,type(kwargs))) fun4(k=1) #定義一個(gè)關(guān)鍵字參數(shù) l={'k1':1,'k2':2} fun4(**l) #或者先定義一個(gè)字典,在前面加上**變成關(guān)鍵字參數(shù)傳給函數(shù)# 可以定義一個(gè)函數(shù) func(*args, **kw) 這樣無論什么樣的參數(shù)都可以傳遞給函數(shù)#傳遞的是引用 def fun5(s):s.append(333) #這里s指向 l l=[11,22] fun5(l) print(l) #l=[11,22,333]#注意與上一種情況比較 def fun6(s):s=112 #這里s指向 112 l=[1,2,3] fun6(l) print(l) #l=[1,2,3]
五、作業(yè)
1.尋找差異
# 數(shù)據(jù)庫(kù)中原有 old_dict = {"#1":{ 'hostname':'c1', 'cpu_count': 2, 'mem_capicity': 80 },"#2":{ 'hostname':'c1', 'cpu_count': 2, 'mem_capicity': 80 },"#3":{ 'hostname':'c1', 'cpu_count': 2, 'mem_capicity': 80 } } # cmdb 新匯報(bào)的數(shù)據(jù) new_dict = {"#1":{ 'hostname':'c1', 'cpu_count': 2, 'mem_capicity': 800 },"#3":{ 'hostname':'c1', 'cpu_count': 2, 'mem_capicity': 80 },"#4":{ 'hostname':'c2', 'cpu_count': 2, 'mem_capicity': 80 } } old_set=set(old_dict) new_set=set(new_dict)del_set=old_set.difference(new_set) add_set=new_set.difference(old_set) flush_set=old_set.intersection(new_set)for i in del_set:old_dict.pop(i)for i in add_set:old_dict[i]=new_dict[i]for i in flush_set:old_dict[i] = new_dict[i] print(old_dict)2、簡(jiǎn)述普通參數(shù)、指定參數(shù)、默認(rèn)參數(shù)、動(dòng)態(tài)參數(shù)的區(qū)別
普通參數(shù)傳遞的個(gè)數(shù)和順序要明確,默認(rèn)參數(shù)傳遞的時(shí)候,如果沒有給默認(rèn)參數(shù)復(fù)制的話,會(huì)使用默認(rèn)值,如果給定了的話,就會(huì)使用給定值。動(dòng)態(tài)參數(shù)的個(gè)數(shù)不確定,可以傳遞任意個(gè)參數(shù),這些參數(shù)自動(dòng)組裝成一個(gè)元組,可以在list或tuple前面加一個(gè)*號(hào),把list或tuple的元素變成可變參數(shù)傳進(jìn)去,指定參數(shù)傳遞的是一個(gè)明確的類似鍵值,這些參數(shù)自動(dòng)組裝成一個(gè)字典,可以先定義一個(gè)字典,在前面加上**變成關(guān)鍵字參數(shù)傳給函數(shù)。
3、寫函數(shù),計(jì)算傳入字符串中【數(shù)字】、【字母】、【空格] 以及 【其他】的個(gè)數(shù)
def fun(s):digitnum, alphanum, sapcenum, othernum=0,0,0,0for i in s:if i.isdigit():digitnum+=1elif i.isalpha():alphanum+=1elif i.isspace():sapcenum+=1else:othernum+=1return (digitnum,alphanum,sapcenum,othernum)4、寫函數(shù),判斷用戶傳入的對(duì)象(字符串、列表、元組)長(zhǎng)度是否大于5
def fun(s):ret=Falseif isinstance(s,str) or isinstance(s,str) or isinstance(s,tuple):if len(s)>5:ret=Truereturn ret5、寫函數(shù),檢查用戶傳入的對(duì)象(字符串、列表、元組)的每一個(gè)元素是否含有空內(nèi)容
def fun(s):ret=Falseif isinstance(s, str) or isinstance(s, str) or isinstance(s, tuple):for i in s:if i=='':ret=Truebreakreturn ret6、寫函數(shù),檢查傳入列表的長(zhǎng)度,如果大于2,那么僅保留前兩個(gè)長(zhǎng)度的內(nèi)容,并將新內(nèi)容返回給調(diào)用者。
def fun(s):if isinstance(s,list):if len(s)>2:return s[0:2]return None7、寫函數(shù),檢查獲取傳入列表或元組對(duì)象的所有奇數(shù)位索引對(duì)應(yīng)的元素,并將其作為新列表返回給調(diào)用者。
def fun(s):if isinstance(s,list) or isinstance(s,tuple):l=[]for i in range(1,len(s),2):l.append(s[i])return lreturn None8、寫函數(shù),檢查傳入字典的每一個(gè)value的長(zhǎng)度,如果大于2,那么僅保留前兩個(gè)長(zhǎng)度的內(nèi)容,并將新內(nèi)容返回給調(diào)用者。
def fun(s):if isinstance(s,dict):for i in s:if len(s[i])>2:s[i]=s[i][0:2]return s9、寫函數(shù),利用遞歸獲取斐波那契數(shù)列中的第 10 個(gè)數(shù),并將該值返回給調(diào)用者?!?/h3> def fun(n):if 1==n :return 0elif 2==n:return 1else:return fun(n-1)+fun(n-2)
轉(zhuǎn)載于:https://www.cnblogs.com/Wxtrkbc/p/5466082.html
總結(jié)
以上是生活随笔為你收集整理的Python全栈开发之3、数据类型set补充、深浅拷贝与函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第三章 SQL
- 下一篇: 1003 阶乘后面0的数量