-
簡述列舉了解的編程語言與語言間的區(qū)別?
編程語言:C/C++/java/c#/PHP/GO/python 編譯方式:編譯型語言:C/C++/GO 解釋型語言:python/PHP 混合型語言:JAVA -
列舉python2和python3的區(qū)別?
1.源碼:python2源碼不統(tǒng)一,源碼重復(fù)(多人編寫出現(xiàn)的現(xiàn)象) python3源碼統(tǒng)一,源碼不重復(fù)(龜叔一人編寫) 2.在除法顯示:pyhton2返回的是整數(shù)(向下取整) Python3返回的是小數(shù)(浮點數(shù)) 3.input:python2中input獲取到的是數(shù)據(jù)本身 Python3中input獲取的是字符串 4.整型:python2是整型、長整型(long) python3全部都是整型 5.range:Python2打印range獲取到的是一個列表,列表元素是1-9 Python3打印的是range本身 6.編碼:Python2默認ascii碼 Python3默認是utf-8 7.迭代器:Python2中__iter()和iter()都有,只有__next__() python3中__iter__()和iter()都有,__next__()和next()都有 8.經(jīng)典類和新式類:Python2:在py2.2之前,都是經(jīng)典類,在py2.2之后,經(jīng)典類和新式類共存,繼承使用object的就是新式類,不繼承使用object的就是經(jīng)典類 pyhton3:只有新式類,不管繼不繼承都是新式類 -
看代碼寫結(jié)果
v1 = 1 or 2 # 1 布爾值為假的情況:0,0.0,F(xiàn)alse,,"",[],{},(),set(),None,0j v2 = 3 and 7 or 9 and 0 # 7 -
比較以下值有什么不同?
v1 = [1,2,3] # 列表中是int,單列表 v2 = [(1),(2),(3)] # 列表中還是int v3 = [(1,),(2,),(3,)] # 列表中是元組 -
用一行代碼實現(xiàn)數(shù)值交換
a = 1 b = 2 a,b = b,a -
python中單引號、雙引號、三引號的區(qū)別?
三者都是表示字符串格式 單引號和雙引號的區(qū)別:單引號需要加'\'來讓編譯器判斷目前是轉(zhuǎn)義字符,而雙引號就可以直接使用 三單引號和三個雙引號:多行字符串/加注釋 ## 在互相嵌套時徐注意:里外不能使用相同的引號 -
is和==的區(qū)別?
is: 判斷兩邊的內(nèi)存地址是否相同 == :判斷兩邊的值是否相等 -
pyhton里如何實現(xiàn)
tuple和list的轉(zhuǎn)化?tuple = tuple(list) list = list(tuple) -
如何實現(xiàn)字符串
name="老男孩"的反轉(zhuǎn)?name = name[::-1] -
兩個set如何獲取交集、并集、差集?
差集:set1 - set2 并集:set1 | set2 交集:set1 & set2 -
那些情況下,
y! = x - (x-y)會成立?x,y是兩個不相等的非空集合 # 非空集合且不為子父關(guān)系的兩個集合 -
python中如何拷貝一個對象?
賦值、淺拷貝、深拷貝 -
簡述復(fù)制、淺拷貝、深拷貝的區(qū)別?
賦值:兩個標簽共用同一塊內(nèi)存地址,舉例:一個列表用兩個標簽定義,其實操作的是同一個對象 淺拷貝:就是只拷貝第一層的元素,對第一層進行修改和添加對元數(shù)據(jù)不會造成影響,對可變數(shù)據(jù)類型進行修改和添加會對源數(shù)據(jù)造成影響 深拷貝:不可變數(shù)據(jù)類型共用一個內(nèi)存地址,可變數(shù)據(jù)類型新開辟一個內(nèi)存空間 -
pass的作用?就是占位的作用,只占一行的位 -
閱讀代碼寫結(jié)果
import copy a = [1,2,4,5,['b','c']] b = a c = copy.copy(a) d = copy.deepcopy(a) a.append(5) a[4].append('d') print(b) # [1,2,4,5,['b','c','d'],5] print(c) # [1,2,4,5,['b','c','d']] print(a) # [1,2,4,5,['b','c','d'],5] -
用pyhton實現(xiàn)9*9乘法表
for i in range(1, 10): for j in range(1, 10): if j == i: print(f"{j}*{i}={i * j}") break print(f"{j}*{i}={i*j}", end="\t") while循環(huán): i = 1 while i<= 9: j = 1 while j <= i: print("%d%d=%2d" %(i,j,ij),end="") j+=1 -
用python顯示一個斐波那契數(shù)列
方法一: num1 = 1 num2 = 1 sum = 0 count = 2 while num1 + num2 < 3: sum = num1 + num2 num1 = num2 num2 = sum count += 1 print(num1,num2) 方法二: lst = [1,1] for i in range(10): lst.append(lst[-1]+lst[-2]) print(lst) 方法三: a,b = 0,1 for i in range(10): print(b) a,b = b,a+b 方法四: def fib(n): if n<=2: return 1 return fib(n-1) + fib(n-2) print(fib(6)) -
如何刪除列表中重復(fù)的值?
lst = [1,2,2,4,7,8,8,14,21] print(list(set(lst))) -
一個大小為100G的文件etl_log.txt,要讀取文件中的內(nèi)容,寫出具體過程代碼
with open('a3','r',encoding-'utf-8')as f1: for f in f.read(10): print(f,end="") # 一行一行讀取,或者按固定字節(jié)讀取 -
a = dict(zip(("a","b","c","d","e"),(1,2,3,4,5)))請問a是什么?a = {"a":1,"b":2,"c":3,"d":4,"e":5} # 枚舉的作用如上: a = dict(enumerate(["a","b"])) # {1:"a",2:"b"} a = dict(enumerate(["a","b"],start=10)) # {10:"a",11:"b"} -
lambda關(guān)鍵字的作用?lambda:匿名函數(shù),一行函數(shù),只有返回值的無名函數(shù) 格式:lambda 參數(shù):返回值 -
*args和**kwargs作用*args:動態(tài)位置參數(shù),接收額外的位置參數(shù)(實參) **kwargs:動態(tài)關(guān)鍵字參數(shù),接收額外的關(guān)鍵字參數(shù)(形參) -
如何在函數(shù)中設(shè)置一個全局變量?
加關(guān)鍵字:global -
filter、map、reduce的作用?filter:過濾,輸出指定的內(nèi)容 filter(func,iterable) => 可迭代對象 map:映射:將可迭代對象中的每個元素執(zhí)行指定的函數(shù) map(func,iterable) => 可迭代對象 reduce:累計算(累加、累乘) -
什么是匿名函數(shù)?匿名函數(shù)有什么作用
匿名函數(shù):lambda 作用:配合高階函數(shù)一起使用 -
python遞歸的最大層數(shù)?
官方說明:1000層,實際998/997 -
什么是迭代器?什么是可迭代對象?
具有__itre__()和__next__()兩個方法的就是迭代器 具有__iter__()方法的就是一個可迭代對象 -
什么是生成器?
程序員自己編寫的一種函數(shù),函數(shù)體中出現(xiàn)yield代表要生成一個生成器,在獲取生成器的內(nèi)存地址,生成一個生成器,啟動生成器等一系列的步驟 -
什么是裝飾器及其應(yīng)用場景?
裝飾器:在不修改源代碼及調(diào)用調(diào)用方式時,對功能進行額外添加 應(yīng)用場景:登錄認證、property類、框架(django/flask/@app.route) 裝飾器的本質(zhì)是閉包 -
什么是反射及應(yīng)用場景?
反射:通過字符串操作對象的屬性和方法 場景:對象的角度、類的角度、當前模塊的角度 hasattr getattr setattr delattr 應(yīng)用: 可以配合用戶的操作或者輸入,調(diào)用其中的成員,api接口中 -
寫一個普通的裝飾器
def wrapper(func): def inner(*args,**kwargs): '''執(zhí)行被裝飾函數(shù)之前的操作''' ret = func '''執(zhí)行被裝飾函數(shù)之后的操作''' return ret return inner 閉包:內(nèi)函數(shù)使用了外函數(shù)的局部變量,外函數(shù)把內(nèi)函數(shù)返回出來的過程就叫做閉包,這個內(nèi)函數(shù)就叫做閉包函數(shù) 特點:如果內(nèi)函數(shù)使用了外函數(shù)的局部變量,那么該變量于內(nèi)函數(shù)發(fā)生綁定,延長該變量的生命周期 -
寫一個帶參數(shù)的裝飾器
def auth2(func): def inner(*args, **kwargs): if login_status['status']: ret = func() return ret if 微信: username = input('請輸入用戶名:').strip() password = input('請輸入密碼:').strip() if username == '太白' and password == '123': login_status['status'] = True ret = func() return ret elif 'qq': username = input('請輸入用戶名:').strip() password = input('請輸入密碼:').strip() if username == '太白' and password == '123': login_status['status'] = True ret = func() return ret return inner @auth2 def jitter(): print('記錄美好生活') @auth2 def pipefish(): print('期待你的內(nèi)涵神評論') -
求結(jié)果
def num(): return [lambda x:i*x for i in range(4)] print([m(2) for m in num()]) 6,6,6,6 -
def(a,b=[])這種寫法有什么陷阱?b身上的默認值是列表,如果使用原來默認的參數(shù),調(diào)用func函數(shù)會把幾次調(diào)用的值都存放在同一個默認列表里 默認參數(shù): 如果調(diào)用時,用戶給實參了,那么就使用用戶的,如果調(diào)用時,用戶沒有給實參,那么就是用默認的(早已經(jīng)存在內(nèi)存中的這個列表) 默認值會提前在內(nèi)存中駐留,在使用時,才能調(diào)取,在定義函數(shù)的時候就提前開辟了空間 -
看代碼寫結(jié)果
def fun(a,b=[]): b.append(a) return b v1 = func(1) #[1,3] v2 = func(2,[10,20]) #[10,20,2] v3 = func(3) # [1,3] print(v1,v2,v3) -
看代碼寫結(jié)果
def fun(a,b=[]): b.append(a) return b v1 = func() print(v1) # [1] v2 = func(2,[10,20]) # [10,20,2] print(v2) v3 = func(3) # [1,3] print(v3) -
請編寫一個函數(shù)實現(xiàn)將ip地址轉(zhuǎn)換成一個整數(shù)
如10.3.9.12 轉(zhuǎn)換規(guī)則為: 10 00001010 3 00000011 9 00001001 12 00001100 再將以上二進制拼接起來計算十進制結(jié)果:00001010 00000011 00001001 00001100 方法一: for i in ip.spilt('.'): bin_str = str(bin(int(i)))[2:] # 1010 11 1001 1100 strvar += bin_str.rjust(8,"0") # rjust源字符串居右,填充符號 # ljust原字符串居左,填充符號 print(strvar) 方法二: strvar = "" for i in ip.split("."): # format將證書轉(zhuǎn)化成二進制,不夠8位的拿0補位 strvar += format(int(i),"08b") print(int(strvar,2)) -
請查找一個目錄下得所有文件(可能存在文件嵌套)
方法一:遞歸寫法 import os def gettallsize(pathvar): size = 0 lst = os.listdir(pathvar) print(lst) for i in lst; pathvar2 = os.path.join(patgvar,i) print(pathvar2) # 判斷是否是文件 if os.path.isfile(pathvar2): size += os.path.getsize(pathvar2) # 判斷是否是文件夾 elif os.path.isdir(pathvar2): size += getallsize(pathvar2) print(size) return size pathvar = r"D:\老男孩python25視頻\學(xué)習(xí)資料\Linux" res = getallsise(pathvar) 方法二:os.walk() => 生成器 import os pathvar = r"D:\老男孩python25視頻\學(xué)習(xí)資料\Linux" gen = os.walk(pathvar) for root,dirs,files in gen: for name in files: pathvar = os.path.join(root,name) print(pathvar) -
求結(jié)果
import math print(math.floor(5.5)) # 補充 floor:地板除 向下取整 ceil:天花板除 向上取整 round:四舍五入取整 round n.5 奇進偶不進(對n來說) round(4.5) 4 round(5.5) 5 round(4.52) 5 按正常情況 -
是否使用過
functools中的函數(shù)?其作用時什么?from functools import reduce # 累計算 from functools import wraps # 在裝飾器中使用,如果想要保留原來函數(shù)的屬性,加上wraps def wrapper(func): @wraps(func) def inner(args,**kwargs): res = func(args,**kwargs) print("and you") return res return inner @wrapper def func(): print("i am fine think you") func() print(func) -
re的match和search區(qū)別?search:從任意位置開始查找 match:從頭開始查找,如果不符合就不繼續(xù)查找了 -
用python匹配HTML tag的時候,
<.>和<.?>有什么區(qū)別?<.>是匹配任意字符(除換行符) <.?>匹配0個或者1個任意字符 -
如何生成一個隨機數(shù)?
random模塊 random.random 隨機范圍 0 <= x < 1 random.randrange 隨機獲取指定范圍中的整數(shù),用法上同range random.uniform 隨機獲取指定范圍中的小數(shù) -
super的作用?
用來解決多繼承之間復(fù)雜的調(diào)用關(guān)系使用super 在多繼承中,如果出現(xiàn)了多個同名方法,super在調(diào)用的時候,會按照mro列表的繼承順序依次調(diào)用 類.mro() => lst返回的是順序列表 super里的類名是指定查找mro總類名的下一個類 -
雙下劃線和單下劃線的區(qū)別?
雙下劃線:私有對象 - 只能在當前這個類里使用,不能再子類或者類外使用 單下劃線:受保護的(強制繼承) - 可以在當前這個類或者子類中使用,不能在類外使用 -
@staticmethod和classmethod的區(qū)別@staticmethod:靜態(tài)方法 無論是對象還是類,都可以調(diào)用,不會默認傳遞任何參數(shù) @classmethod:類方法 無論是對象還是類,都可以調(diào)用,會默認傳遞類這個參數(shù) -
實現(xiàn)一個單例模式(加鎖)
單例模式:這個類無論實例化多少次,都有且只有只有一個對象 import threading import time class Singleton: instance = None lock = threading.Rlock() def __init__(self,name): self.name = name def __new__(cls,*args,**kwargs): if cls.instance: return cls.instance with cls.lock: if cls.instance: return cls.instance time.sleep(0.1) cls.instance = object.__new__(cls) return cls.instance def task(): obj = Singleton('x') print(obj) for i in range(10): t = threading.Thread(traget = task) t.start() data = Singleton('adbABXJDK') print(data) -
棧和隊列的區(qū)別
棧:先進后出 隊列:先進先出 -
以下代碼輸出時候是那么?請給出答案并解釋
class Parent(object): x = 1 class Child1(Parent): pass class Child2(Parent): pass print(Parent.x,Child1.x,Child2.x) # 1 1 1 Child1.x = 2 print(Parent.x,Child1.x,Child2.x) # 1 2 1 Parent.x = 3 print(Parent.x,Child1.x,Child2.x) # 3 2 3 # 繼承父類,自己有就用自己的,自己沒有父類有就用父類的 -
參考下面代碼片段
# 考察的是面向?qū)ο蟮纳舷挛墓芾恚瑆ith語法的具體實現(xiàn) clss Context: pass with Context() as ctx: ctx.do_something() 請在Context類下添加代碼完成該類的實現(xiàn) 實現(xiàn): clss Context: def __enter__(self): return self def __exit__(self,exc_type,exc_val,exc_tb): # 相當于在最后執(zhí)行了文件的關(guān)閉操作,fp.close() print("abc123") def do_something(self): print(111) with Context() as ctx: ctx.do_something() # do_something()是一個方法的調(diào)用 print(ctx)
可選題
-
如何獲取列表中第二大的值
# 所有的容器類型數(shù)據(jù)都可以通過sorted進行排序(sort只局限于列表進行排序) sorted_lst = set([lst]) # 對列表中的數(shù)據(jù)進行去重,防止有重復(fù)數(shù)據(jù)對結(jié)果有影響 res = sorted(sorted_lst) res_new = res[-2] # 默認是升序,取索引的倒數(shù)第二位 print(res_new) -
簡述Python內(nèi)存管理機制
-
簡述Python的垃圾回收機制
# 2.3以下講解為一道 內(nèi)存管理機制:計數(shù)器、垃圾回收、內(nèi)存池 (1).計數(shù)器 # 當一個對象的引用被創(chuàng)建或者復(fù)制時,對象的引用計數(shù)+1;當一個對象的引用被銷毀時-1;當一個對象引用計數(shù)為0時,就意味著對象已經(jīng)沒有被使用了,可以釋放其內(nèi)存了 eg:a = 100 b = a print(b) del b # 刪除b但是a的內(nèi)存空間不會刪除,a的內(nèi)存指向100 # 缺點:在維護引用計數(shù)時,又可能數(shù)據(jù)產(chǎn)生循環(huán)引用,造成數(shù)據(jù)不能刪除,造成內(nèi)存泄露 lst1 = [1,2] lst2 = [5,6] lst1.append(lst2) lst2.append(lst1) # 交叉循環(huán)使用 del lst1 print(lst1) # 報錯:顯示lst1不存在,沒有被定義 print(lst2) # lst2的列表信息可以顯示 (2)垃圾回收:引用計數(shù)為主,標記清除和分帶回收為輔 標記清除:檢測標記該對象,避免出現(xiàn)循環(huán)引用不能刪除的對象 分帶回收:把內(nèi)存中的數(shù)據(jù)分成三個區(qū)域:新生代0、老年代1、永久代2 ? 新生代0數(shù)據(jù)超過700 , 或者老年代1,永久代2數(shù)據(jù)超過10,自動觸發(fā)內(nèi)存中的垃圾回收機制 ? 新生代0觸發(fā)將清除所有三代的區(qū)域 ? 老年代1觸發(fā)會清理1,2代 ? 永久代2觸發(fā)只會清理自己 (3).內(nèi)存池 # 在同一個文件當中 (python3.6) # -->Number 部分 1.對于整型而言,-5~正無窮范圍內(nèi)的相同值 id一致 2.對于浮點數(shù)而言,非負數(shù)范圍內(nèi)的相同值 id一致 3.布爾值而言,值相同情況下,id一致 4.復(fù)數(shù)在 實數(shù)+虛數(shù) 這樣的結(jié)構(gòu)中永不相同(只有虛數(shù)的情況例外) # -->容器類型部分 5.字符串 和 空元組 相同的情況下,地址相同 6.列表,元組,字典,集合無論什么情況 id標識都不同 [空元組例外] # 在不同的文件當中 小數(shù)據(jù)池 ; 比如整型默認開辟 -5~256 這么多數(shù)據(jù)提前在內(nèi)存中駐留 -
請用兩個隊列來實現(xiàn)一個棧
from queue import Queue class Stack(): def __init__(self): self.master_queue = Queue() # 定義兩個空隊列 self.minor_queue = Queue() def push(self.val): # 入棧 self.master_queue.put(val) def pop(self): # 出棧,如果隊列中沒有任何值,直接返回None if self.master_queue.qsize() == 0: return None while True: # 當隊列總長度為1的時候,循環(huán)終止,直接把最后一個拿出來,為了滿足棧先進后出的特點 if self.master_queue.qsize() == 1: value = self.master_queue.get() break # 這種情況就是隊列中有至少一個元素,將每次循環(huán)沒有拿出來的元素,暫時放在2號隊列中存儲 self.minor_queue.put(self.master_queue.get()) self.master_queue,self.minor_queue = self.minor_queue,self.master_queue # 交換隊列,重新循環(huán),繼續(xù)取最后一個元素,如法炮制 return value obj = Stack() obj.push("a") obj.push("b") obj.push("c") obj.push("d") # 依次入棧 print(obj.pop()) # d print(obj.pop()) # c print(obj.pop()) # b print(obj.pop()) # a -
請用Python實現(xiàn)一個鏈表
class Node(): def __init__(self,value,next): self.value = value self.next = next head = Node("頭",None) last = head for i in range(5): node = Node("v%s" %i,None) last.next = node last = node print(head.value) print(head.next.value) print(head.next.next.value) print(head.next.next.next.value) print(head.next.next.next.next.value) print(head.next.next.next.next.next.value) -
請用Python實現(xiàn)鏈表的逆轉(zhuǎn)
def reverse_link_list(head): if not head or not head.next: # 要是空的,或者None,直接返回head return head prev_node = None # 獲取上一個節(jié)點對象 next_node = head.next # 獲取下一個節(jié)點對象 current_node = head # 獲取當前節(jié)點對象 while True: current_node.next = prev_node # 修改next的指向 if not next_node: break # 如果下一個階段對象是None prev_node = current_node # 重新弄獲取上一個對象,即把當前指向單獨存一份,已準備后面循環(huán)時插入next屬性 current_node = next_node # 重新獲取當前對象,即把下一個對象單獨存儲起來 next_node = current_node.next # 重新獲取下一個對象,即把下一個對象單獨存儲起來,所指向的下一個新對象賦值給next_node head = reverse_link_list(head) print(head.value) print(head.next.value) print(head.next.next.value) print(head.next.next.next.value) print(head.next.next.next.next.value) print(head.next.next.next.next.next.value)
浙公網(wǎng)安備 33010602011771號