Python开发Day03
生活随笔
收集整理的這篇文章主要介紹了
Python开发Day03
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
基本類型的補充:
-
set集合
-
介紹:
- set集合是一個無序且不重復的元素集合,我們可以使用他來對比,去重,查看重復項(交集),不重復項(差集),a有很多元素,b中有幾個元素但是元素都和a中元素相同這樣可以判斷a是不是b的父集,查看兩個合并后去掉兩個集合中的重復元素。
-
集合元素
- a={1,2,3,4,5,6,7,8,9}
- b={3,4,5,6}
-
方法:
-
?判斷a集合是不是b集合的父集或是不是子集:
print(a.issuperset(b)) #判斷a集合是不是b集合的父集,也就是說b中有的a中都有,使用True或者False返回 print(a.issubset(b)) #判斷a集合是不是b集合的子集,也就是說a中有的b中都有,使用True或者False返回 執行結果: True False 判斷a集合是不是b集合的父集或是不是子集 - 清空集合: a.clear() print(a) 執行結果: set() 清空集合
- 向集合中添加一個元素: a.add(10) print(a) 執行結果: {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} 向集合中添加一個元素
- 向集合中添加多個元素: a.update(['a','b','c','d']) print(a) 執行結果: {1, 2, 3, 4, 5, 6, 7, 8, 9, 'a', 'c', 'd', 'b'} 向集合中添加多個元素
- 刪除a集合中的3元素(這個方法如果集合中不存在這個元素會報錯): a.remove(3) print(a) 執行結果: {1, 2, 4, 5, 6, 7, 8, 9} 刪除a集合中的3元素
- 刪除a集合中的8元素(該方法若是集合中沒有這個元素不會報錯): a.discard(8) print(a) 執行結果: {1, 2, 3, 4, 5, 6, 7, 9} 刪除a集合中的8元素
- 隨機刪除一個元素,因為集合是無序的所以它默認是刪除最后一個可是最后一個不固定: a.pop() print(a) 執行結果: {2, 3, 4, 5, 6, 7, 8, 9} 隨機刪除一個元素
- 輸出兩個集合中都存在的元素,產生一個新的值,如果需要用變量接收,或者直接查看(交集)。 print(a.intersection(b)) 執行結果: {3, 4, 5, 6} 輸出兩個集合中都存在的元素
- 對比兩個集合中都存在的元素,修改原來的元素(交集)。 a.intersection_update(b) print(a) 執行結果: {3, 4, 5, 6} 對比兩個集合中都存在的元素
- 判斷兩個集合中有沒交集。 print(a.isdisjoint(b)) 執行結果: False 判斷沒有交集
- 將兩個集合合并,可以達到去重的效果(并集),如果需要值需要將執行結果給一個變量它不會修改原來的集合。 print(a.union(b)) 執行結果: {1, 2, 3, 4, 5, 6, 7, 8, 9} 將兩個集合合并
- 拿出集合a中存在的b中不存在的,如果需要值需要將執行結果給一個變量它不會修改原來的集合(差集)。 print(a.difference(b)) 執行結果: {8, 1, 2, 9, 7} 集合a中存在b中不存在
- 拿出集合a中存在的b中不存在的,并修改a集合(差集)。 a.difference_update(b) print(a) 執行結果: {1, 2, 7, 8, 9} 拿出集合a中存在b中不存在的值,修改a集合
- 在a集合或b集合中,但不會同時出現在二者中(對稱差集),如果需要值需要將執行結果給一個變量它不會修改原來的集合。。 print(a.symmetric_difference(b)) 執行結果: {1, 2, 7, 8, 9} 在a或b集合中的元素,不會同時出現在另一個集合中的
-
在a集合或b集合中,但不會同時出現在二者中(對稱差集),直接修改a集合:
a.symmetric_difference_update(b) print(a) 執行結果: {1, 2, 7, 8, 9} 對稱差集
-
-
三目運算(三元運算):?
-
介紹:
- 三目運算就是是對簡單的條件語句的縮寫,讓之前需要3-4行的特殊代碼寫成一行:
- 使用方法: c=0 name='Wu' if c== 0 else 'Qi' #先做if判斷如果c等于0那么name的值就是Wu否則值為Qi print(name) 執行結果: Wu
?
深淺拷貝:
-
數字和字符串
- 對于數字和字符串而言深淺拷貝、賦值,沒有是沒意義,因為他們如果相同永遠指向同一個內存地址: a='hello'
b='hello'
c=1
d=1
print(id(a)) #id()查看變量的內存地址
print(id(b))
print(id(c))
print(id(d)) 執行結果: 1902418750296 1902418750296 1521807152 1521807152
- 對于數字和字符串而言深淺拷貝、賦值,沒有是沒意義,因為他們如果相同永遠指向同一個內存地址: a='hello'
b='hello'
c=1
d=1
print(id(a)) #id()查看變量的內存地址
-
其他基本數據類型的深淺拷貝賦值:
-
-
介紹:
- 賦值就是你創建了一個變量然后有值,又創建一個變量給的值指向的就是你之前創建的變量名。 n1 = {"k1": "wu", "k2": 123, "k3": ["alex", 456]} n2 = n1 print(id(n1)) #查看n1字典在內存的位置 print(id(n2)) #查看n2字典在內存的位置 print(id(n1['k1'])) #查看n1字典中k1值的內存位置 print(id(n2['k1'])) #查看n2字典中k1值的內存位置 執行結果: 1961536305736 1961536305736 1961536697040 1961536697040 賦值的拷貝分析
-
?
-
淺拷貝:
-
介紹:在內存中只創建第一層數據結構:
-
分析:
import copy #拷貝模塊 n1 = {"k1": "wu", "k2": 123, "k3": ["alex", 456]} n2 =copy.copy(n1) #淺拷貝n1 print(id(n1)) #輸出n1在內存的位置 print(id(n2)) #輸出n2在內存的位置 print(id(n1['k3'])) #輸出n1中列表在內存的位置 print(id(n2['k3'])) #輸出n2中列表在內存的位置 執行結果: 2162448251464 2162448682888 2162450147144 2162450147144 淺拷貝分析
-
-
?
?
?
-
深拷貝:
-
介紹:
- 在內存中將所有的數據重新創建一遍,除了字符串和數字使用的還是原來的內存地址,因為Python對他們做了優化。
-
深拷貝的分析:
import copy n1 = {"k1": "wu", "k2": 123, "k3": ["alex", 456]} n2 = copy.deepcopy(n1) #深拷貝 print(id(n1)) #查看n1字典的內存地址 print(id(n2)) #查看n2字典的內存地址 print(id(n1['k3'])) #查看n1字典中的k3值的內存地址 print(id(n2['k3'])) #查看n2字典中的k3值的內存地址 print(id(n1['k1'])) #查看n1字典中的k1值的內存地址 print(id(n2['k1'])) #查看n2字典中的k1值的內存地址 執行結果: 2398849710664 2398850108872 2398851605768 2398851575624 2188442383056 2188442383056 Python深拷貝分析
-
函數:
-
背景:
-
在學習函數之前,我們一直遵循:面向過程編程,就是所謂的從上到下的執行實現功能,有時候會有很多重復的代碼我們就需要復制粘貼,這樣就會導致我們的開發效率,而且容易出錯。
-
函數的使用:假設我們有一個腳本在不斷的循環查看服務器的各個狀態是否正常如果不正常就會發送郵件但是郵件發送使用面向過程的大方會有很多重復的代碼既浪費空間還浪費時間。
while True:if cpu利用率 > 90%:#發送郵件提醒連接郵箱服務器發送郵件關閉連接 if 硬盤使用空間 > 90%:#發送郵件提醒連接郵箱服務器發送郵件關閉連接if 內存占用 > 80%:#發送郵件提醒連接郵箱服務器發送郵件關閉連接 面向過程的編寫方式 def 發送郵件(內容)#發送郵件提醒連接郵箱服務器發送郵件關閉連接while True:if cpu利用率 > 90%:發送郵件('CPU報警')if 硬盤使用空間 > 90%:發送郵件('硬盤報警')if 內存占用 > 80%:發送郵件('內存報警') 函數式編程的編寫方式可以看出來上面的兩種方法第二種要比第一種重用性和可讀性要好很多,這就是面向過程和函數式編程的區別
-
解釋:
- 函數式編程:將寫好的某些功能代碼封裝到函數中,以后便不需重復編寫,直接調用函數就可以。(函數式編程最重要的是增強代碼的重用性和可讀性)
- 面向對象:對函數進行分類和封裝,讓開發者開發的效率“更快更好更強...”
- 面向過程:這個代碼從上到下的執行。
-
-
定義和使用
-
函數結構:
def 函數名(參數): ...函數體...返回值 函數結構
-
函數的定義主要有以下幾點:
- def:表示函數的關鍵字。
- 函數名:函數的名稱,以后根據函數名調用函數。
- 函數體:函數中進行一系列的邏輯計算。
- 參數:為函數體提供數據
- 返回值:當函數執行完畢后,給調用者返回需要的數據。
-
-
返回值
-
解釋:
- 函數是一個功能塊,該功能到底執行是否成功,需要通過返回值來告知調用者。
-
列如:
def test():a=0if a == 0 :return '成功'else:return '失敗' print(test()) 執行結果: 成功 Python函數返回值的例子
-
-
參數
-
解釋:
- 參數可以更好、更準確的去執行處理,因為如果沒有參數那么就相當于函數被寫死了。
-
參數例子
- 如果沒有參數將會成為這樣,需要寫很多函數,調用每一個不同的函數,但是函數內部就是改了一個內容而已,這樣就和面向過程變成一樣了。 def CPU報警郵件()#發送郵件提醒連接郵箱服務器發送郵件關閉連接def 硬盤報警郵件()#發送郵件提醒連接郵箱服務器發送郵件關閉連接def 內存報警郵件()#發送郵件提醒連接郵箱服務器發送郵件關閉連接while True:if cpu利用率 > 90%:CPU報警郵件()if 硬盤使用空間 > 90%:硬盤報警郵件()if 內存占用 > 80%:內存報警郵件() 沒有參數的函數
- 加參數函數,這樣我們的可讀性變得會很好,而且可以很好的操作。 def 發送郵件(郵件內容)#發送郵件提醒連接郵箱服務器發送郵件關閉連接while True:if cpu利用率 > 90%:發送郵件("CPU報警了。")if 硬盤使用空間 > 90%:發送郵件("硬盤報警了。")if 內存占用 > 80%:發送郵件("內存報警了。") 加參數的函數
-
函數中三種不同的參數
- 普通參數就和我們上面說的一樣,但是他必須是有幾個形參就要有多少實參,形參就是函數名后面()里的參數個數,實參就是調用函數時的()里寫的內容。 def test(name): #參數name,(形參)return name print(test('Wu')) 執行結果: print(test('Wu')) #執行test函數傳參Wu。(實參) 執行結果: Wu 普通參數
- 默認參數: def test(name='None'): #默認參數必須在形參后面,也可以理解為寫到最后面才可以使用。return name print(test()) 執行結果: None 默認參數
- 動態參數一: def test(*name):return name print(test(1,2,3,4,5,7)) #給test函數傳很多數字 執行結果: (1, 2, 3, 4, 5, 7) #輸入結果為元組類型的。 Python動態參數一
- 動態參數二: def test(**name):return name print(test(name='Wu',age=20)) #給函數test傳實參,多個參數,必須是**=**因為這種動態參數會以字典的形式返回 執行結果: {'name': 'Wu', 'age': 20} Python動態參數二
- 動態參數一和二可以同時使用: def test(*args,**kwargs):#python默認提供的動態參數名稱*args和**kwargsreturn args,kwargs print(test(123,123,234,name='Wu',age=20)) 執行結果: ((123, 123, 234), {'age': 20, 'name': 'Wu'}) Python動態參數同時使用兩個
-
-
-
- 向動態參數傳元組需要加一個*,字典加兩個*。
-
-
練習:
- 簡述普通參數、指定參數、默認參數、動態參數的區別。
- 寫函數,計算傳入字符串中【數字】、【字母】、【空格] 以及 【其他】的個數
- 寫函數,判斷用戶傳入的對象(字符串、列表、元組)長度是否大于5。
- 寫函數,判斷用戶傳入的對象(字符串、列表、元組)長度是否大于5。
- 寫函數,檢查傳入列表的長度,如果大于2,那么僅保留前兩個長度的內容,并將新內容返回給調用者。
- 寫函數,檢查獲取傳入列表或元組對象的所有奇數位索引對應的元素,并將其作為新列表返回給調用者。
- 寫函數,檢查傳入字典的每一個value的長度,如果大于2,那么僅保留前兩個長度的內容,并將新內容返回給調用者。 dic = {"k1": "v1v1", "k2": [11,22,33,44]}
PS:字典中的value只能是字符串或列表
- 寫函數,利用遞歸獲取斐波那契數列中的第 10 個數,并將該值返回給調用者。 def func(arg1,arg2):if arg1 == 0:print arg1, arg2arg3 = arg1 + arg2print arg3func(arg2, arg3) func(0,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 }} 選做提示是否刪除:?
提示是否新建:?
提示是否更新:?
注意:無需考慮內部元素是否改變,只要原來存在,新匯報也存在,就是需要更新,憑自己想法去做。
練習解答在另一篇中出現?!
?
轉載于:https://www.cnblogs.com/WuYongQi/p/5468773.html
總結
以上是生活随笔為你收集整理的Python开发Day03的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 生日蛋糕(DFS)
- 下一篇: html body div height