常見面試題https://www.zhangjunbk.com/article/23397
靜態方法https://www.cnblogs.com/Meanwey/p/9788713.html
1、copy 和 deepcopy 的區別是什么?
python中的物件之間的賦值是按參考傳送的,
(1)copy()淺拷貝,只拷貝父物件,不會拷貝物件的內部的子物件,
(2)deepcopy()深拷貝,拷貝父物件及其子物件,
#!/usr/bin/python
## -*-f= coding:utf-8 -*-
import copy
origin=[1,2,[3,4]]
cop1=origin #參考
cop2=copy.copy(origin)#淺拷貝
cop3=copy.deepcopy(origin)#深拷貝
origin[2][0]="hey!"
origin[0]="hey!"
print("原來的值:",origin)
print("參考值:",cop1)
print("淺拷貝:",cop2)
print("深拷貝:",cop3)
print("---------------")
print("初始物件地址",id(origin[0]))
print("參考的物件地址",id(cop1[0]))
print("淺拷貝物件地址",id(cop2[0]))
print("深拷貝物件地址",id(cop3[0]))
print("---------------")
print("初始物件地址",id(origin[2][0]))
print("參考的子物件地址",id(cop1[2][0]))
print("淺拷貝子物件地址",id(cop2[2][0]))
print("深拷貝子物件地址",id(cop3[2][0]))
結果為如下:
原來的值: ['hey!', 2, ['hey!', 4]]
參考值: ['hey!', 2, ['hey!', 4]]
淺拷貝: [1, 2, ['hey!', 4]]
深拷貝: [1, 2, [3, 4]]
---------------
初始物件地址 1497843333168
參考的物件地址 1497843333168
淺拷貝物件地址 1497801451824
深拷貝物件地址 1497801451824
---------------
初始物件地址 1497843333168
參考的子物件地址 1497843333168
淺拷貝子物件地址 1497843333168
深拷貝子物件地址 1497801451888
py沒有賦值,只有參考,py沒有變數,平時說的變數只是標簽,即參考,
不可變物件包括int,float,long,str,tuple等
對于不可變型別的變數,如果要更改變數,則會創建一個新值,把變數系結到新值上,而舊值如果沒有被參考就等待垃圾回收,
2、代碼中經常遇到的*args, **kwargs 含義及用法,
args表示任意位置引數,* kwargs表示任意個關鍵字引數
用法:def 函式名(位置引數,args,默認引數,**kwargs),記得arg在kwargs之前
#!/usr/bin/python
## -*-f= coding:utf-8 -*-
def Func(a,b,*args,**kwargs):
print (a)
print (b)
print (args)
print (kwargs)
Func(0,1,2,3,index1=11,index2=22)
輸出的結果為:
0
1
(2, 3)
{'index1': 11, 'index2': 22}
注意(2,3)是因為不定的引數形式把剩下沒有關鍵字的引數形成為一個tuple,另外后面2個是賦值關系,會變為字典,
3、Python 中會有函式或成員變數包含單下劃線前綴和結尾,和雙下劃線前綴結尾,區別是什么?
單下劃線:
(1)變數為保護變數(只有類物件和子類物件可以訪問這些變數)
(2)函式為不能直接訪問的類屬性,要通過類提供的介面來訪問
雙下劃線:
(1)變數為私有成員(只有類物件自己可以訪問,子類物件不能訪問該成員)
(2)py里的特殊方法專用的標志符,如__ init()__表示類的建構式
4、w、a+、wb 檔案寫入模式的區別
| 模式 | 作用 | 若檔案不存在 | 是否覆寫 |
|---|---|---|---|
| w | 只寫 | 創建 | 是 |
| a+ | 可讀可寫 | 創建 | 否,追加寫 |
| wb | 只寫,以二進制寫方式打開 | 創建 | 是 |
| 其他幾個 | |||
| r+ | 可讀可寫 | 報錯 | 是 |
| w+ | 可讀可寫 | 創建 | 是 |
| a | 只能寫 | 創建 | 否,追加寫 |
5、舉例 sort 和 sorted 的區別
(1)sort是直接應用在list上排序
>>> lst1=[(8,'andy',20),(2,'liu',21),(5,'luo',22)]
>>> lst1.sort()
>>> lst1
[(8, 'andy', 20), (2, 'liu', 21), (5, 'luo', 22)]
(2)sorted可對所有可迭代的物件進行排序,如果對list操作則是產生一個新的串列,
>>> list1=[(8,'andy',20),(2,'liu',21),(5,'luo',22)]
>>> sorted(list1)
[(2, 'liu', 21), (5, 'luo', 22), (8, 'andy', 20)]
>>> list1
[(8, 'andy', 20), (2, 'liu', 21), (5, 'luo', 22)]
6、用python實作快速排序演算法
https://www.jb51.net/article/158963.htm 這里有2種方法
#!/usr/bin/python
## -*-f= coding:utf-8 -*-
def QuickSort(lst1,i,j):#i左,j為右
if i >= j:
return lst1
pivot = lst1[i]
low = i
high = j
# 劃分樞軸
while i < j:
while i < j and lst1[j] >= pivot:
j -= 1
lst1[i]=lst1[j]
while i < j and lst1[i] <=pivot:
i += 1
lst1[j]=lst1[i]
lst1[j] = pivot
QuickSort(lst1,low,i-1)
QuickSort(lst1,i+1,high)
return lst1
if __name__=="__main__":
lst1=[30,24,5,58,18,36,12,42,39]
print("排序前的序列為:")
for i in lst1:
print(i,end =" ")
print("\n排序后的序列為:")
for i in QuickSort(lst1,0,len(lst1)-1):
print(i,end=" ")
注意函式名為駝峰命令,單詞開頭大寫;
注意命名規范:對于區域變數情況,list串列前綴為lst,tuple前綴為t,字典的前綴為d,其他按照開頭第一個小寫字母,如整型i、浮點型f、字串s、布爾型b,
輸出結果為
排序前的序列為:
30 24 5 58 18 36 12 42 39
排序后的序列為:
5 12 18 24 30 36 39 42 58
7、isinstance 作用以及應用場景?
格式為isinstance(p,型別),即判斷p是否為對應型別,
#!/usr/bin/python
## -*-f= coding:utf-8 -*-
p='123'
print(isinstance(p,str))#判斷p是否為字串型別
8、什么是斷言?應用場景?
斷言由assert方法實作,只有成功了程式才繼續執行,否則報錯,
格式為【assert 運算式,回傳資料】,當運算式為false時觸發例外,回傳資料,
#!/usr/bin/python
## -*-f= coding:utf-8 -*-
try:
n=input("請輸入一個數字:")
assert n.isdigit(),"只能輸入數字"
print("你輸入的是:",n)
except Exception as ex:
print("發現錯誤:",ex)
結果為:
請輸入一個數字:4你輸入的是: 4>>> 請輸入一個數字:d發現錯誤: 只能輸入數字
9、Python 中的例外處理,寫一個簡單的應用場景
#!/usr/bin/python
## -*-f= coding:utf-8 -*-
try:
a=open("testfile","r+")
a.write("該為測驗例外的檔案")
except IOErrror:
print("Error:沒有找到檔案或讀取檔案失敗")
else:
print("內容寫入檔案成功")
a.close()
如果一開始沒有testfile檔案則會輸出:Error:沒有找到檔案或讀取檔案失敗,
例外處理https://www.runoob.com/python/python-exceptions.html
10、Python 中遞回的最大次數,那如何突破呢?
默認最大次數為1000次,但可以用sys突破:
#!/usr/bin/python
## -*-f= coding:utf-8 -*-
import sys
sys.setrecursionlimit(1500)
def Recursion(n):
if(n<=0):
return
print(n)
Recursion(n-1)
if __name__ =="__main__":
Recursion(1000000)
11.py2和py3的區別
print從陳述句變為函式,原 print 1,2+3改為print(1,2+3)
range(0,4)結果是串列[0,1,2,3]改為list(range(0,4))
字串以8bit字串存盤改為字串以16bit unicode字串存盤
py2中的utf-8和gbk轉換才要2次
12.gbk和utf-8編碼
GBK編碼方式的編碼是以中國國情而創造的,在國際上的兼容性不好,這也是為什么大多數的網頁是使用UTF-8編碼而不是GBK,
py3中默認編碼是unicode,而py2中默認編碼是ASCII
GBK轉碼:https://www.cnblogs.com/QZrun220/p/13295041.html
13.
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/281644.html
標籤:python
