此篇指南是針對python中易混淆的知識點和內置的數據類型
1、python是解釋執行的編譯語言,相較於c++這類編譯後執行的語言效率低一些
a = 10 / 3 //3.3.3.3.3
a = 10 / 2 //5.0
a = 10 / -3 //-3.3.3.3.3
b = 10 // 3 //3 (全部向下取整)
b = 10 // -3 //-4
c = int(10 / 3) = 3
c = int(10 / -3) = -3 (全部取整數部分)
Leecode翻轉3位數
def reverse():
num = 123
digit1 = num % 10 //個位
digit2 = num // 10 % 10 //十位
digit3 = num // 100 //百位
newnum = digit1 * 100 + digit2 * 10 + digit3
float並不能精確到具體位,比如計算4.5*2.9=13.049999999999999是錯誤的,所以比較兩個數值是否相等abs(num-13.5)<1e-5
//python實現數據交換
def swap(a, b):
a, b = b, a //多個也可以
2、變量:存儲數據的容器,python可以存儲多種類型數據
python類名是首字母大寫的駝峯命名法
構造函數:一個特殊函數,構造對象時自動調用,不能顯示調用,沒有返回值,名稱固定爲init,每個類默認有一個構造函數
變量或函數前加__則變成私有
def __init__(self, name, age):
self.name = name
self.age = age
self._name = name //_子類/本類可使用,其他處使用不會報錯,只會警告
self.__name = name //只能在本類使用,其他類不可,main也不可
屬性賦值並不一定在構造函數內:
def speak(self):
self.age = 18
只有把所有創建的對象都del之後,纔會調用__del__打印print
class Client:
def __init__(self):
print('我是初始化函數')
def __del__(self):
print('我是垃圾回收函數'))
實例化對象的屬性
① hasattr(實例化對象, 屬性) :檢查對象中是否包含屬性,返回值類型bool
② getattr(實例化對象, 屬性):獲取實例化對象的屬性值
③ getattr(實例化對象, 屬性,參數3) :當對象不包含屬性值,打印第三個參數
④ setattr(實例化對象, 屬性, 值):設置對象的屬性值
⑤delattr(實例化對象, 屬性):刪除對象的屬性,若屬性不存在,報錯
class Ball:
def __init__(self,name): #默認情況下只有self
self.name = name
ball = Ball('喬丹') #init參數的改變相對實例化的參數也跟着改變
hasattr(ball,'name') #檢查對象中是否包含name屬性,返回true
getattr(ball,'name') #獲取對象中name的值
getattr(ball,'age','age不存在') #當屬性不存在時打印第三參數
setattr(ball,'age',23) #給屬性賦值
delattr(ball,'age') #刪除屬性,若屬性不存在則拋出異常
繼承
issubclass(父類, 子類) 若第2參數是第1參數子類,返回true
isinstance(對象,類) 若第1參數是第2參數類的實例化對象,返回true
class Fish:
def __init__(self):
pass
class Shark(Fish):
def __init__(self): #子類會覆蓋父類方法
super().__init__() #將父類方法傳進去
issubclass(Shark,Fish) #若Shark是Fish的子類則返回true
isinstance(fish,Fish) #若fish是Fish類的實例化對象則返回true(若第一個參數傳入的不是對象類型,則永遠返回false,第二個參數可以是一個元祖isinstance(fish,(Fish,Shark))
魔法方法,在賦值的時候會自動調用
def getattribute(self,name):對象屬性訪問攔截器,任何對象想調用屬性都要經過該方法
def getattr(self,name):對象獲取一個不存在的類調用的方法,不重寫直接拋異常,調用順序在getattribute之後
def setattr(self,name,value):設置屬性name的值
def delattr(self,name):刪除name屬性
a = class Animal()
a.x
#x不存在先調用__getattribute__,在調用__getattr__,但是在__getattribute__已經被攔截不會繼續執行__getattr__
舉例1:
class Animal:
def __getattribute__(self,name):
print("get attribute:%s" % name)
def __getattr__(self,name):
print("nothing")
if __name__ == '__main__':
a = Animal()
a.speak
a.x
輸出結果:
舉例2:
class Animal:
def __getattr__(self,name):
print("get not existed attribute %s" % name):
def __setattr__(self, name, value):
print("set attr no matter attr exist %s:%d" % (name, value))
if __name__ == '__main__':
a = Animal()
a.x = 3
輸出結果:沒錯,即使屬性不存在也會執行,並且與getattr沒有任何關係
python輸出默認換行,添加end參數後以指定分隔符分割
for i in range(10):
print(i, end=' ')
enumerate同時取下標和值
scores = {1, 2, 3, 4, 5}
for (i, val) in enumerate(scores):
print(i, val)
python用縮進表示層次關係,縮進的空白沒有嚴格要求,但要保持統一,建議4空格或製表符
python中所有變量都是引用,存儲的是對象的地址
python中常量地址固定
python中所有變量和傳參都是複製地址
a = 10
b = 20
print(id(a))
print(id(b)) //打印地址
if a is b: //判斷變量地址是否相同
3、數據結構:存儲數據的方式
列表:任意對象的有序集合
a = [1, ‘A’]
b = [2, ‘B’]
①數組加和:c = a + b
c = [1, ‘A’,2, ‘B’]
②數組乘法:c = a * 3
a = [1, ‘A’,1, ‘A’,1, ‘A’]
③數組追加元素c = a.append(‘m’) 改變原數組結構
a = [1, ‘A’,‘m’]
④插入元素:a.insert(2, ‘k’)
a = [1, ‘k’ ,‘A’]
⑤合併兩個數組:c = a.extend(b) 改變原數組結構
c = c = [1, ‘A’,2, ‘B’]
⑥刪除指定下標元素:a.pop(1) 不傳參默認刪除最後一個元素
a = [1]
⑦刪除指定元素:a.remove(‘A’) 只刪除遇見的第一個
⑧排序:a.sort(reverse=True) 反序
⑨更改順序:a.reverse()
⑩刪除指定下標元素 :del a[0]
⑾切片組成新數組:a[0:1] ==包含前下標,不包含後下標
⑿查詢下標:a.index(‘A’)
⒀數組轉換:m = “hello” list(m)
m = [‘h’, ‘e’, ‘l’, ‘l’, ‘o’]
列表生成器
result = [ i for i in range(100) if i % 5 == 0]
result = [0, 5, 10, 15, 20, 25, 30, …]
tuple是python自帶的線性數據結構,可以存儲不同類型的值,長度固定不可變,裏面元素不可修改,效率高,可以哈希
tuple = 1,2,3,4 ()可以省略
tuple = (1, ‘a’, [1, 2])
如下圖所示,元組裏存儲的是各元素的地址,且元素內容是不允許修改,但是
tuple[2].append(3)是允許的
string結構固定長度不可變,可用單引號或雙引號
str = “hello”
①查找指定字符下標:str.find(‘e’)
②替換:str.replace(‘h’, ‘m’) 生成新字符串
③字符串長度:len(str)
④拼接:res = ‘/’.join(str)
res = “h/e/l/l/o”
Unicode轉換
⑴將字符轉換爲int型
>>> ord('A')
65
>>> ord('中')
20013
⑵將int轉換爲字符串
>>> chr(66)
'B'
⑶encode和decode(中文無法用ASCII,中文編碼範圍超過ASCII編碼範圍)
#將字符串按指定類型轉碼爲byte
>>> 'ABC'.encode('ascii')
b'ABC'
#將byte轉爲字符串
>>> b'ABC'.decode('ascii')
'ABC'