python面試——基礎數據類型

此篇指南是針對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

輸出結果:
getattribute
舉例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'
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章