当前位置: 首页>Python>正文

python面向對象,Python零基礎速成班-第10講-Python面向對象編程(下),Property屬性、特殊方法、設計模式、鏈表應用

python面向對象,Python零基礎速成班-第10講-Python面向對象編程(下),Property屬性、特殊方法、設計模式、鏈表應用

Python零基礎速成班-第10講-Python面向對象編程(下),Property屬性、特殊方法、設計模式、鏈表應用

學習目標

  1. 面向對象編程 接上一講:Property屬性、特殊方法、設計模式
  2. 面向對象示例:鏈表應用
  3. 課后作業(3必做1擴展)

友情提示:將下文中代碼拷貝到JupyterNotebook中直接執行即可,部分代碼需要連續執行。

1、面向對象編程 接上一講

1.1 Property屬性

在面向對象編程時,對于實體類,我們一般需要get或者set方法來對類進行賦值和取值。而Python不需要getter和setter,其內置的@property裝飾器就是負責把一個方法變成屬性調用的,@property本身又創建了另一個裝飾器@state.setter,負責把一個setter方法變成屬性賦值。

1.@property其實就是實現了getter功能; @xxx.setter實現的是setter功能;

2.定義方法的時候 @property必須在 @xxx.setter之前,且二者修飾的方法名相同;

3.如果只實現了 @property(而沒有實現@xxx.setter),那么該屬性為只讀屬性,則該類中的屬性不允許被修改。

@property廣泛應用在類的定義中,可以讓調用者寫出簡短的代碼,同時保證對參數進行必要的檢查,這樣,程序運行時就減少了出錯的可能性。

如下例,我們定義了一個商品類 Goods(),包含商品名稱 name和商品價格 price兩個屬性,常規方式,我們構建了一個get_name()方法用于商品名取值,構建了一個set_name()方法用于商品名稱賦值。

而利用@property我們可以快速實現商品價格取值,@price.setter實現商品價格賦值。在apple = Goods(‘apple’,8.5)實例化后,我們可以直接apple.price用于商品價格取值,apple.price = 9用于商品價格賦值。

class Goods():def __init__(self,name,price):self.name = nameself._price = pricedef get_name(self):#取值return self.namedef set_name(self,name):#賦值self.name = name@property#類似get方法def price(self):return self._price@price.setter#類似set方法def price(self,newprice):self._price = newpriceapple = Goods('apple',8.5)
print("商品名:",apple.get_name())
print("商品原價格:",apple.price)apple.price = 9
print("商品現價格:",apple.price)
商品名: apple
商品原價格: 8.5
商品現價格: 9

python面向對象、進階提示:使用@property時,屬性名與方法名一定要區分開,不然會進入死循環,如上述例子,價格屬性值為_price,方法名為price。

1.2 特殊方法Special Methods

在Python中 ,除了構建函數和析構函數之外,還有大量的特殊方法支持更多的功能,例如,運算符重載就是通過重寫特殊函數來實現的。在自定義類時如果重寫了某個特殊方法即可支持對應的運算符,具體實現什么工作則完全可以根據需要來定義。

接下來我們通過部分運算符重載的案例來詳細講解。

例1:完成一個類,實現字符串忽略大小寫并比較是否相同的功能。w1、w2對象實例化后,w1==w2則會自動調用__eq__方法,對兩個字符串進行比較。

class Word():def __init__(self,text):self.text= textdef __eq__(self,word2):return self.text.lower() == word2.text.lower()
w1 = Word("Test")
w2 = Word("test")
w3 = Word("tes")
print(w1==w2)
print(w2==w3)
True
False

例2:完成一個類,實現兩個數組內元素相加并返回一個新數組的功能。L1、L2實例化后,L1 + L2執行加入運算,實際是調用__add__方法,把兩個列表對應的元素進行相加,并返回一個新的數組。

class ListAdd():def __init__(self,list1):self.data = list1def __add__(self,list2):return list(map(lambda x,y:x+y,self.data,list2.data))
L1 = ListAdd([1,2,3,4,5])
L2 = ListAdd([2,3,4,5,6])
print(L1 + L2)
[3, 5, 7, 9, 11]

特殊方法匯總:

比較運算方法:

__eq__:==
__ne__:!=
__gt__:>
__lt__:<
__le__:<=
__ge__:>=

數字運算方法:

__add__:+
__sub__:-
__mul__:*
__mod__:%
__pow__:**
__truediv__:/
__floordiv__://

其他非常有用的方法:

__str__:str(self) 輸出字符串本身
__repr__:repr(self) 將對象轉化為供解釋器讀取的形式,例如將對象轉化為可讀的字符串,也可以作為對象解釋器
__len__:len(self) 輸出字符串長度
class Word():def __init__(self,text):self.text =textdef __str__(self):return self.textdef __repr__(self):return"這是一個字符串對象:( "+self.text+" )"def __len__(self):return len(self.text)w =Word('明天會更好')print(w)
print(len(w))
w
明天會更好
5這是一個字符串對象:( 明天會更好 )

1.3 面向對象設計模式Design pattern

  1. 單一職責原則:每個類都只有一個職責,修改一個類的理由只有一個。
  2. 開放-封閉遠程(OCP):開放是指可拓展性好,封閉是指一旦一個類寫好了,就盡量不要修改里面的代碼,通過拓展(繼承,重寫等)來使舊的類滿足新的需求,而不是修改一個類里面的代碼。
  3. 依賴倒轉原則:高層模塊不應該依賴底層模塊,兩個都應該依賴抽象;抽象不應該依賴細節,細節應該依賴抽象。底層模塊例如很多工具類,例如專門用于管理sql連接的類,管理文件,管理socket連接的類,高層類指具體實現需求的類。高層類和底層類都不應該相互依賴,不能出現高層類改變了,底層類就不能用了這種情況,兩個都依賴抽象是指連個都依賴與調用的api,即接口,在開發的過程中,一旦接口設計后就不要輕易改變,所以接口的設計是尤為重要的。細節應該依賴抽象,是指一個類里面功能的實現(細節)要依賴于調用該類的接口。
  4. 里氏轉換原則:子類必須能夠替換掉他們的父類,即父類可以實現的功能,子類一定可以實現。

補充知識:線性存儲結構

  1. Queue隊列:先進先出,先來先服務,常用方法為 Put & Get。
  2. Stack棧:先進后出,常用方法為 Push & Pop。
  3. Linked List鏈表:像一條鐵鏈,將數據連接在一起,每一個節點保存了數據以及指向下一個節點的指針,鏈表頭指針指向第一個節點,如果鏈表為空,則頭指針為空或者為 null。
  4. Tree 樹:分層的數據結構,由節點和連接節點的邊組成,被廣泛應用在人工智能和一些復雜算法中,用來提供高效的存儲結構。

2、面向對象示例:鏈表應用Linked List

鏈表的特點:

  • 因為結點的內存地址不需要連續,所以相比順序表,對于內存的利用更高效。
  • 同時管理器只需要存儲第一個結點的地址即可,對于后續結點,也只需要前一個結點有指針即可。
  • 根據下標的查詢操作只能從第一個結點依次往后進行。
  • 越靠近頭部的操作時間復雜度越低,越靠近尾部的時間復雜度越高。

如下圖所示,鏈表中每一個數據結點,除了保存當前結點的基本數據值,還要保存后面相鄰節點的地址,從而形成從頭到尾的一個單向指針結構。而整個單向鏈表的變量名,存儲的是第一個結點的地址。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-26WWJ8UZ-1653894579880)(attachment:image.png)]

2.1 鏈表常用方法

方法名方法說明
isEmpty鏈表是否為空,返回Bool
add(val)鏈表頭部添加節點
remove(val)刪除鏈表某個節點
__str__輸出鏈表節點對象的值
__repr__輸出鏈表節點對象解釋器值
index輸出某個節點在鏈表中的下標位置,如不存在則返回-1
contain輸出某個節點是否在鏈表中,返回布爾Bool
insert(idx,val)在idx位置插入節點
len求鏈表的長度

2.2 節點類Node

節點類包含兩個屬性val和nex,val表示當前節點的內容,nex表示鏈接指針,節點的最后一個位置標識為None。

python從入門到精通第三版?如下例,我們創建一個3節點鏈表,Node1–>Node3–>Node4–>None

class Node():def __init__(self,val,nex):self.val=valself.nex=nex
n1=Node("1",Node("3",Node("4",None)))
print("頭節點值是:",n1.val)
print("第二節點值是:",n1.nex.val)
print("第三節點對象是:",n1.nex.nex)
print("第三節點節點值是:",n1.nex.nex.val)
print("最后一個節點值是:",n1.nex.nex.nex)
頭節點值是: 1
第二節點值是: 3
第三節點對象是: <__main__.Node object at 0x0000020ED76DC910>
第三節點節點值是: 4
最后一個節點值是: None

加入__str__輸出鏈表節點對象的值方法,使用print()則會直接輸出對象的值,如print(n1.nex)。

__repr__輸出鏈表節點對象解釋器值,直接讀取對象則會輸出對象解釋器的值,如n1.nex。

class Node():def __init__(self,val,nex):self.val=valself.nex=nexdef __str__(self):return str(self.val)def __repr__(self):return "節點對象("+self.val+")"
n1=Node("1",Node("3",Node("4",None)))
print(n1)
print(n1.nex)
print(n1.nex.nex)
print(n1.nex.nex.nex)
n1.nex
1
3
4
None節點對象(3)

2.2 鏈表頭部添加節點add(val)方法

從頭部添加節點比較容易,即將新的頭部head指向老的頭部即可。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-hMCFqHUq-1653894579881)(attachment:image.png)]

  1. 我們創建一個鏈表類LinkedList(),包含一個頭部屬性self.head,默認為None最后一個節點。
  2. 我們創建一個鏈表頭部添加節點的方法add(self,val),self.head[新的頭部] = Node(val,self.head[老的頭部])
  3. 在鏈表類初始化方法__init__(self,list1=None)中,用循環的方式將傳入進來數組list1中的值分別設置為鏈表中的節點,如傳入進來為[1,2,3],則鏈表為3->2->1->None。
  4. 鏈表中的__str__方法,則是通過循環的方式將鏈表中的每個節點分別輸出出來,可以清晰的看到整個鏈表的結構。

n2 =LinkedList([“1”,“2”,“3”,“4”,“5”])表示按照數組順序初始化一個鏈表。
print(n2)則會將整個鏈表輸出出來。
print(n2.head.nex.val)表示輸出第二個節點的值。
n2.head.nex.nex表示輸出第三個節點對象解釋器的值。

class Node():def __init__(self,val,nex):self.val=valself.nex=nexdef __str__(self):return str(self.val)def __repr__(self):return "節點對象("+self.val+")"class LinkedList():def __init__(self,list1=None):self.head = Noneif list1 != None:for listval in list1:self.add(listval)def add(self,val):self.head = Node(val,self.head)def __str__(self)->"5->4->3->2->1->None":p=self.heads=''while p != None:s+= p.val+'->'p = p.nexreturn s+'None'n2 =LinkedList(["1","2","3","4","5"])print(type(n2.head))
print(type(n2.head.val))
print(type(n2.head.nex))print(n2)print(n2.head.nex.val)
n2.head.nex.nex
<class '__main__.Node'>
<class 'str'>
<class '__main__.Node'>
5->4->3->2->1->None
4節點對象(3)

2.3 刪除鏈表某個節點remove(val)方法

刪除結點應該算是所有方法中的難點和重點,因為刪除以后要將刪除結點的前后連接起來,所以游標必須停留在說刪除結點的前一個結點,這樣才能對前一個結點的next做賦值操作。此時就得考慮兩種特殊情況,如刪除空鏈表時或者刪除頭部節點時。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-dXMOnIjE-1653894579882)(attachment:image.png)]

  1. 當刪除的是None的時候即空鏈表,直接返回。
  2. 當刪除頭部head節點時,下一個節點設置為頭部self.head即可。
  3. 當刪除中間位置節點時,需要循環遍歷鏈表,如果當前節點的下一級等于要刪除的,則將當前節點指向下下級。

0基礎美術培訓班。n3 =LinkedList([“1”,“2”,“3”,“4”,“5”])表示按照數組順序初始化一個鏈表。
print(n3)則會將整個鏈表輸出出來。
n3.remove(“4”)表示刪除值為4的節點。
print(n3)再將刪除后的鏈表輸出出來。

class Node():def __init__(self,val,nex):self.val=valself.nex=nexdef __str__(self):return str(self.val)def __repr__(self):return "節點對象("+self.val+")"class LinkedList():def __init__(self,list1=None):self.head = Noneif list1 != None:for listval in list1:self.add(listval)def add(self,val):self.head = Node(val,self.head)def remove(self,val):p=self.headif p==None:#當刪除的是None的時候returnif p.val==val:#當刪除的head節點的時候p.nex=self.headwhile p != None and p.val != val:if p.nex.val == val:#如果當前節點的下一級等于要刪除的,則將當前節點指向下下級p.nex = p.nex.nexbreakp = p.nexdef __str__(self)->"5->4->3->2->1->None":p=self.heads=''while p != None:s+= p.val+'->'p = p.nexreturn s+'None'
n3 =LinkedList(["1","2","3","4","5"])
print(n3)
n3.remove("4")
print(n3)
5->4->3->2->1->None
5->3->2->1->None

2.4 isEmpty()方法,index(val)方法,len()方法,insert(index,val)方法,in(contain)方法

  1. isEmpty()鏈表是否為空,這個比較簡單,只需要判斷self.head是否為None即可,如是則為空,如不是則不為空。
  2. index(val)輸出某個節點在鏈表中的下標位置,即循環遍歷鏈表,從0累加,直到找到節點的值為止,如如不存在則返回-1。
  3. len()求鏈表長度,即循環遍歷鏈表,每增加一個結點,中間變量size的值加1,最后得到的總數,就是鏈表的長度。
  4. insert(index,val)在idx位置插入節點,此時就得考慮三種情況:
    1. 當插入位置是0或者空鏈表時,直接調用add方法。
    2. 當插入位置超過鏈表長度時,則直接在尾部節點插入,指向None。
    3. 當在鏈表中插入時,則首先定位到插入值前一位,即index >1(遍歷鏈表,每向后移動一位,index-1),再將前一位的指針p.nex指向當前需要插入的Node對象,插入對象的指針指向原來指針,即插入值前一位的p.nex,語法如下p.nex=Node(val,p.nex)。
  5. contain(val)輸出某個節點是否在鏈表中,返回布爾Bool,這個比較簡單,只需要判斷self.index(val) != -1即可,當為-1時,則表示不在鏈表中。

n4 =LinkedList([“1”,“2”,“3”,“4”,“5”])表示按照數組順序初始化一個鏈表。
print(n4.index(‘3’))表示3在鏈表中的位置;print(n4.index(‘6’)) = -1 則表示沒有在鏈表中找到6。
print(n4.len())則輸出鏈表長度。
n4.insert(3,“7”)表示在鏈表第三個位置插入7;在print(n4)遍歷輸出鏈表,print(n4.contain(“7”))最后判斷7是否在鏈表中。

class Node():def __init__(self,val,nex):self.val=valself.nex=nexdef __str__(self):return str(self.val)def __repr__(self):return "節點對象("+self.val+")"class LinkedList():def __init__(self,list1=None):self.head = Noneif list1 != None:for listval in list1:self.add(listval)def add(self,val):self.head = Node(val,self.head)def isEmpty(self):#1、鏈表是否為空return self.head ==Nonedef index(self,val):#2、輸出某個節點在鏈表中的下標位置p=self.headidx =0 #從0號開始while p != None:if p.val == val:return idxidx+=1p = p.nexreturn -1def len(self):#3、求鏈表長度p=self.headsize=0while p !=None:size+=1p =p.nexreturn sizedef insert(self,index,val):#4、在idx位置插入節點if index ==0 or self.isEmpty():#當位置是0或者空鏈表時,則直接addself.add(val)elif index > self.len():#當插入位置超過長度時,則直接在尾部節點插入,指向Nonep=self.headwhile p.nex != None:#不等于尾部p=p.nexp.nex = Node(val,None)else:p =self.headwhile p!=None and index >1:# >1是因為要定位到插入值的前一位index-=1p=p.nexp.nex=Node(val,p.nex)#插入值的前一位的指針nex指向插入節點對象Node,該None再指向后一位def contain(self,val):#5、求鏈表的長度return self.index(val) != -1def __str__(self)->"5->4->3->2->1->None":p=self.heads=''while p != None:s+= p.val+'->'p = p.nexreturn s+'None'
n4 =LinkedList(["1","2","3","4","5"])
print(n4)
print(n4.index('3'))
print(n4.index('6'))
print(n4.len())
n4.insert(3,"7")
print(n4)
print(n4.contain("7"))
5->4->3->2->1->None
2
-1
5
5->4->3->7->2->1->None
True

3、課后作業,答案在下一講

1、使用以下屬性創建名為Point的類:

x:float
y:float

包含以下四種方法:

 __str__():返回字符串,如:(1.0,2.0)__repr__():返回字符串,如:Point(1.0,2.0)get_x:返回x值get_y:返回y值
您的代碼:

2、使用以下屬性創建名為Circle的類,繼承Point:

center:Point
radius:float

包含以下兩種方法:

__str__():返回字符串,如:Circle at(1.0,2.0),r = 5.0
__repr__():返回字符串,如:Circle(center=Point(1.0,2.0),r = 5.0)
您的代碼:

3、使用以下屬性創建名為Triangle的類,繼承Point:

vertx:tuple of Point

包含以下兩種方法:

__str__():返回字符串,如:Triangle at((0.0,0.0),(0.0,10.0),(5.0,5.0))
__repr__():返回字符串,如Triangle(vertx=(Point(0.0,0.0),Point(0.0,10.0),Point(5.0,5.0)))

和計算方法:

area:area= ∣Ax(By?Cy)+Bx(Cy?Ay)+Cx(Ay?By)2∣\left| \frac{A_x(B_y-C_y)+B_x(C_y-A_y)+C_x(A_y-B_y)}{2} \right|?2Ax?(By??Cy?)+Bx?(Cy??Ay?)+Cx?(Ay??By?)??

提示:

__str__()方法可以使用語法:"Triangle at(%s,%s,%s)" %self.vertx
您的代碼:

*(擴展)4、編程實踐項目

模擬計算器的操作輸出(從小學起大家就知道,先乘除,再加減,有括號先算括號里的內容,那么計算機是如何實現的呢?)

如下例,我們如何實現下面計算式在計算機中的運算呢?我們首先需要將中綴運算式轉化為計算機可以執行的后綴運算式。

2 - (5 + 3 * 2 +1) / 3

簡單介紹一下前綴、中綴、后綴表達式

  1. 前綴表達式(Prefix Notation)是指將運算符寫在前面操作數寫在后面的不包含括號的表達式,而且為了紀念其發明者波蘭數學家Jan Lukasiewicz(盧卡西維茲發明于1929),所以前綴表達式也叫做“波蘭表達式”。
  2. 后綴表達式(Postfix Notation)與之相反,是指運算符寫在操作數后面的不包含括號的算術表達式,也叫做逆波蘭表達式。
  3. 中綴表達式(Infix Notation)就是常用的將操作符放在操作數中間的算術表達式。前綴表達式和后綴表達式相對于中綴表達式最大的不同就是去掉了表示運算符優先級的括號。

任務第一步:將中綴轉化為后綴

模擬一下中綴轉后綴過程:從左到右遍歷中綴表達式,數字則輸出,成為后綴表達式的一部分,若是遇到符號,判斷其余棧頂符號的優先級,是有括號或優先級不高于棧頂符號則棧頂元素依次出棧并輸出,如下例:

2 - (5 + 3*2 +1) / 3
2
2 [-]
2 [-,(]
25 [-,(]
25 [-,(,+]
253 [-,(,+]
253 [-,(,+,*]
2532 [-,(,+,*]
2532*+ [-,(,+]
2532*+1+ [-]
2532*+1+ [-,/]
2532*+1+3 [-,/]
2532*+1+3/-
您的代碼:

任務第二步:計算后綴字符串

會計速成班培訓。模擬一下后綴字符串計算過程 從左到右遍歷后綴表達式,遇到數字就進棧,遇到是符號,就將處于棧頂兩個數字出棧,進行運算,運算結果進棧,一直到最終獲得結果,如下例:

2532*+1+3/-
[2]
[2,5]
[2,5,3]
[2,5,3,2]*
[2,5,6]+
[2,11]
[2,11,1]+
[2,12]
[2,12,3]/
[2,4]-
[-2]
您的代碼:

4、上一講Python零基礎速成班-第9講-Python面向對象編程(上),對象和類、初始化、繼承、重寫、多態、類方法、組合 課后作業及答案

1、創建一個Dog類,再創建一個FlyDog類,FlyDog繼承Dog類中的方法。Dog類擁有方法eat(self)和bark(self),eat方法輸出"我要吃東西!“bark方法輸出"汪汪汪!”,FlyDog類擁有方法fly(self),fly方法輸出"我能飛" ,最后創建一個mydog=FlyDog(),執行mydog.bark()和mydog.fly()

class Dog(object):def eat(self):print("我要吃東西")def bark(self):print("汪汪汪")
class FlyDog(Dog):def fly(self):print("我能飛")mydog = FlyDog()
mydog.bark()
mydog.fly()
汪汪汪
我能飛

2、創建一個Date類,設置year、month、day三種屬性,利用@classmethod創建一個新的類方法new_Date,該方法是將新傳入的日期參數newDate(格式:yyyy-mm-dd,如2024-12-31)拆分成年、月、日,重新賦值一個新的Date類,并分別輸出year、month、day。

提示:日期拆分可以使用year,month,day = map(int,date_from_str.split(‘-’))實現

class Date(object):def __init__(self,day,month,year):self.year = yearself.month = month        self.day = day@classmethoddef new_Date(cls,newDate):year,month,day = map(int,newDate.split('-'))newobject = cls(day,month,year)return newobject
newdate = Date.new_Date("2024-12-31")
print(newdate.year)
print(newdate.month)
print(newdate.day)
2024
12
31

3、創建一個Date類,設置year、month、day三種屬性,利用@staticmethod創建一個新的靜態方法validate_Date,該方法是將新傳入的日期參數newDate(格式:yyyy-mm-dd,如2025-10-30)拆分并進行校驗,當同時滿足year<2999、month<=12、day<=31時,返回True,否則返回False,最后實例化對象并輸出結果。

class Date(object):def __init__(self,day,month,year):self.year = yearself.month = month        self.day = day@staticmethoddef validate_Date(newDate):year,month,day = map(int,newDate.split('-'))return year<2999 and month<=12 and day<=31Date.validate_Date("2025-10-30")
True

https://www.nshth.com/python/338835.html
>

相关文章:

  • python面向對象
  • python從入門到精通第三版
  • 0基礎美術培訓班
  • 會計速成班培訓
  • python如何與其他軟件交互
  • 會計基礎知識培訓班
  • 培訓班學會計
  • 會計培訓班課程
  • 國二python難嗎,python字符串(二)
  • 電腦軟件下載app,在電腦上體驗了 16 款手機 App 后,我很失望
  • elasticsearch中文文檔,Elastic安全分析新利器 —— Event Query Language (EQL) 介紹
  • 數據結構與算法python,[FreeCodeCamp筆記] Python 數據結構和算法1 二分搜索 Binary Search
  • 黑蘋果macOS系統鏡像工具,MacOS Monterey 12.2.1 (21D62) OC 0.7.8 / Cl 5144 / PE 三分區原版黑蘋果鏡像
  • 51單片機畢業設計論文,【畢業設計】基于單片機無線充電的4軸飛行器 -物聯網 嵌入式 stm32
  • 數據庫基礎知識整理,數據庫筆記整理
  • python運行不報錯又無任何結果輸出,linux 正確錯誤輸出_報告錯誤的正確方法
  • 計算機組成原理第六版課后答案,杭電計算機組成原理實驗九R-I,杭電計組實驗9-實現R-I型指令的CPU設計實驗.doc
  • python面向對象,Python零基礎速成班-第10講-Python面向對象編程(下),Property屬性、特殊方法、設計模式、鏈表應用
  • 數據庫視圖是什么,【SpringMVC】SpringMVC模型數據+視圖解析器
  • mp3格式轉換器,FFmpeg支持的音頻和視頻編解碼格式
  • 音樂學校招生要求,學校的音樂樓
  • c語言輸入兩個數輸出較大數,C語言求兩個數的較大值
  • 定義一個函數求三個數的最大值,輸入兩個整數,要求輸出其中值較大者。要求用函數求出最大值
  • MySQL學習 DAY1
  • 一個眼神一個微笑就讓人滿足,看得到的微笑
  • centos7安裝MySQL,centos7下載spark連接mysql數據庫提取數據(pyspark,Scala,python獨立執行)
  • node.js開發,從零開始nodejs系列文章-nodejs到底能干什么
  • python控制軟件自動化,Python實現網站自動登錄---傻瓜教程
  • get all of,resent = msg.get_all('Resent-Date') AttributeError: 'str' object h
  • opencv人體動作識別,torchvision使用keypoint rcnn 進行人體關鍵點定位
  • 深度卷積神經網絡原理與實踐,卷積神經網絡resent網絡實踐
  • 服務器,win服務器系統路由器,Windows server 2012 之路由功能
  • 小青蛙走迷宮的問題
  • 漢諾塔-小青蛙
  • 小青蛙oracle跟蹤,在小青蛙TOAD中用oracle語句寫
  • 音頻頻譜分析儀安卓版,[Android]自定義繪制一個簡易的音頻條形圖,附上對MP3音頻波形數據的采集與展現
  • 連乘符號∏的運算法則,∏這個是什么符號?
  • 用例失敗jenkins卻構建成功,jenkins 構建異常_jenkins構建失敗的原因是什么?