日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python全栈开发之3、数据类型set补充、深浅拷贝与函数

發布時間:2023/12/2 python 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python全栈开发之3、数据类型set补充、深浅拷贝与函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  轉載請注明出處http://www.cnblogs.com/Wxtrkbc/p/5466082.html?

一、基本數據類型補充

  set是一個無序而且不重復的集合,有些類似于數學中的集合,也可以求交集,求并集等,下面從代碼里來看一下set的用法,如果對這些用法不太熟悉的話,可以照著下面的代碼敲一遍。

s1={1,2,3,1} #定義一個set s1 如果s1={}為空則默認定義一個字典 s2=set([2,5,6]) #定義一個set s2 print(s1) #s1={1,2,3} 自動去除重復的元素s1.add(5) #s1={1,2,3,5} 添加一個元素 print(s1)s3=s1.difference(s2) #返回一個s1中存在而不存在于s2的字典s3,s3={1,3},而s1并沒有改變 print(s3)s1.difference_update(s2) #s1跟新成上面的s3 s1={1,3} s1.discard(1) #刪除元素1,不存在的話不報錯 s1={3} print(s1) s1.remove(3) #刪除元素3,不存在的話報錯 s1={} print(s1) s1.update([11,2,3]) #跟新s1中的元素,其實是添加 s1={11,2,3} print(s1) k=s1.pop() #刪除一個元素,并將刪除的元素返回給一個變量,無序的,所以并不知道刪除誰s1={1,2,3,4}          #這里重新定義了集合s1,s2 s2={3,4,5,6} r1=s1.intersection(s2) #取交集,并將結果返回給一個新的集合 r1={3,4} print(r1) print(s1) s1.intersection_update(s2) #取交集,并將s1更新為取交集后的結果 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) #取并集將結果返回給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)

二、三目運算符  

  三目運算符可以簡化條件語句的縮寫,可以使代碼看起來更加簡潔,三目可以簡單的理解為有三個變量,它的形式是這樣的?name= k1 if 條件 else k2 ,如果條件成立,則 name=k1,否則name=k2,下面從代碼里面來加深一下理解,從下面的代碼明顯可以看出三目運算符可以使代碼更加簡潔。

a=1 b=2 if a<b: #一般條件語句的寫法k=a else:k=bc=a if a<b else b    #三目運算符的寫法

三、深拷貝淺拷貝

  拷貝意味著對數據重新復制一份,對于拷貝有兩種深拷貝,淺拷貝兩種拷貝,不同的拷貝有不同的效果。拷貝操作對于基本數據結構需要分兩類進行考慮,一類是字符串和數字,另一類是列表、字典等。如果要進行拷貝的操作話,要import copy。

1、數字和字符串  

  對于數字和字符串而言,深拷貝,淺拷貝沒有什么區別,因為對于數字數字和字符串一旦創建便不能被修改,假如對于字符串進行替代操作,只會在內存中重新生產一個字符串,而對于原字符串,并沒有改變,基于這點,深拷貝和淺拷貝對于數字和字符串沒有什么區別,下面從代碼里面說明這一點。

import copy s='abc' print(s.replace('c','222')) # 打印出 ab222 print(s) # s='abc' s并沒有被修改 s1=copy.deepcopy(s) s2=copy.copy(s)#可以看出下面的值和地址都一樣,所以對于字符串和數字,深淺拷貝不一樣,數字和字符串一樣就不演示了,大家可以去試一下 print(s,id(s2)) # abc 1995006649768 print(s1,id(s2)) # abc 1995006649768 print(s2,id(s2)) # abc 1995006649768

2、字典、列表等數據結構  

對于字典、列表等數據結構,深拷貝和淺拷貝有區別,從字面上來說,可以看出深拷貝可以完全拷貝,淺拷貝則沒有完全拷貝,下面先從內存地址分別來說明,假設?n1?=?{"k1":?"wu",?"k2":?123,?"k3": ["alex",?456]}。

        淺拷貝在內存中只額外創建第一層數據                 深拷貝在內存中將所有的數據重新創建一份

    ?

下面從代碼上來進行說明,

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']))# 從下面打印的值結合上面的圖就可以很好的理解, # {'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

四、函數

  如果我們要計算一個圓的面積,就需要知道它的半徑,然后根據公式S=3.14*r*r算出它的面積,如果我們要算100個圓的面積,則每次我們都需要寫公式去計算,是不是很麻煩,但是有了函數的話,我們就不再每次寫S=3.14 *r*r,而是把計算圓面積的功能寫到一個函數里比如說s=areacircle(r),然后每次求面積的時候,只要把半徑傳遞給函數就可以實現計算圓面積,這樣我們寫代碼就簡單多了。這就是函數的功能。

1、定義函數  

  定義一個函數要使用def語句,依次寫出函數名、括號、括號中的參數和冒號:,然后,在縮進塊中編寫函數體,函數的返回值用return語句返回。比如說定義一個求和函數

def sum(a,b): #定義函數ret=a+b #函數體return ret #函數返回 print(sum(1,2)) #調用函數并打印出結果 #如果沒有return語句,函數執行完畢后也會返回結果,只是結果為None

2、函數的參數  

函數的參數有位置參數、默認參數、可變參數、關鍵字參數等,此外需要注意的是Python里面傳參數的時候傳的是引用,而不是在創建一份新的值,下面分別來說明

# 位置參數 # 函數調用的時候,傳遞的參數必須按順序與定義的函數一一對應 def fun1(name):                     #name為位置參數print(name) fun1('Jason')                     #將Jason 傳遞給func函數作為默認參數# 默認參數 # 需要放在參數列表最后 def fun2(name,age=19):           #age=19是默認參數,如果不傳的話默認為19print('%s:%s' %(name,age)) fun2("Jason",18)           #將Jason和18 傳給name和age# 可變參數 # 可以傳遞任意個參數,自動組裝成元組元素 def fun3(*args):print(args,type(args)) fun3(1,2,3)                #直接傳遞參數 l=list([1,2,3,4]) fun3(*l)               #或者在list或tuple前面加一個*號,把list或tuple的元素變成可變參數傳進去#關鍵字參數 #可傳入任意個含參數名的參數,自動組裝為一個dict def fun4(**kwargs):print((kwargs,type(kwargs))) fun4(k=1)               #定義一個關鍵字參數 l={'k1':1,'k2':2} fun4(**l)               #或者先定義一個字典,在前面加上**變成關鍵字參數傳給函數# 可以定義一個函數 func(*args, **kw) 這樣無論什么樣的參數都可以傳遞給函數#傳遞的是引用 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]

  

五、作業

1.尋找差異

# 數據庫中原有 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 新匯報的數據 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、簡述普通參數、指定參數、默認參數、動態參數的區別  

  普通參數傳遞的個數和順序要明確,默認參數傳遞的時候,如果沒有給默認參數復制的話,會使用默認值,如果給定了的話,就會使用給定值。動態參數的個數不確定,可以傳遞任意個參數,這些參數自動組裝成一個元組,可以在list或tuple前面加一個*號,把list或tuple的元素變成可變參數傳進去,指定參數傳遞的是一個明確的類似鍵值,這些參數自動組裝成一個字典,可以先定義一個字典,在前面加上**變成關鍵字參數傳給函數。

3、寫函數,計算傳入字符串中【數字】、【字母】、【空格] 以及 【其他】的個數 

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、寫函數,判斷用戶傳入的對象(字符串、列表、元組)長度是否大于5  

def fun(s):ret=Falseif isinstance(s,str) or isinstance(s,str) or isinstance(s,tuple):if len(s)>5:ret=Truereturn ret

5、寫函數,檢查用戶傳入的對象(字符串、列表、元組)的每一個元素是否含有空內容

def fun(s):ret=Falseif isinstance(s, str) or isinstance(s, str) or isinstance(s, tuple):for i in s:if i=='':ret=Truebreakreturn ret  

6、寫函數,檢查傳入列表的長度,如果大于2,那么僅保留前兩個長度的內容,并將新內容返回給調用者。 

def fun(s):if isinstance(s,list):if len(s)>2:return s[0:2]return None

7、寫函數,檢查獲取傳入列表或元組對象的所有奇數位索引對應的元素,并將其作為新列表返回給調用者。

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 None

8、寫函數,檢查傳入字典的每一個value的長度,如果大于2,那么僅保留前兩個長度的內容,并將新內容返回給調用者。

def fun(s):if isinstance(s,dict):for i in s:if len(s[i])>2:s[i]=s[i][0:2]return s

9、寫函數,利用遞歸獲取斐波那契數列中的第 10 個數,并將該值返回給調用者。 

def fun(n):if 1==n :return 0elif 2==n:return 1else:return fun(n-1)+fun(n-2)

  

轉載于:https://www.cnblogs.com/Wxtrkbc/p/5466082.html

總結

以上是生活随笔為你收集整理的Python全栈开发之3、数据类型set补充、深浅拷贝与函数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。