第一部分 必答題 1,簡述列舉瞭解的編程語言及語言間的區別? Python 解釋型語言,代碼簡潔,易懂 C語言 編譯型語言,底層語言 c++ 編譯型語言,在C語言基礎上加了面向對象 Java 混合型語言,可拓展性高 Golang 編譯型語言,強類型,代碼規範,高併發 語言特點: 靈活簡潔,語言優美 ...
第一部分 必答題
Python 解釋型語言,代碼簡潔,易懂 C語言 編譯型語言,底層語言 c++ 編譯型語言,在C語言基礎上加了面向對象 Java 混合型語言,可拓展性高 Golang 編譯型語言,強類型,代碼規範,高併發 語言特點: 靈活簡潔,語言優美 可讀性強, 語言類型: 解釋型:逐行轉化,運行效率低,性能差,開發效率高。相容性好,跨平臺 編譯型 :一次性編譯成二進位文件,執行效率高,相容性差, 動態語言:不用聲明變數的數據類型(腳本類語言) 靜態語言:需要聲明變數的數據類型 第三方庫:python定位是任其發展,開源庫很多,應用領域廣
2,列舉Python2和Python3的區別?
python2只更新支持到2020年 print:2不加括弧,3加括弧 input:2中用戶輸入解析為int類型,raw_input為字元串類型,3直接是字元串類型 range:2是列表,xrange是可迭代對象;3是可迭代對象 繼承關係:2是新式類+經典類;3是新式類 數字表示:2,int和long(長整形,超出2**63-1,數字末尾有一個L);3所有整型都是int
3,看代碼寫結果
v1 = 1 or 2 v2 = 3 and 3 or 9 and 0 # v1 = 1 # v2 = 7
# 邏輯運算符優先順序 () > not > and > or # 邏輯短路 and 全真則真,一假則假 or 一真則真,全假則假 True or 表達式 => True (單個運算符和多個運算符的情況,都可以直接判定結果) False and 表達式 => False(單個運算符的時候可以) # 布爾值為假的十種情況: bool() => False 0,0.0,False,0j,'',[],(),set(),{},None詳解
4,以下的值有什麼不同?
v1 = [1,2,3] v2 = [(1),(2),(3)] v3 = [(1,),(2,),(3,)] """ # 逗號才是區分是否是元組的標識符 v1 = [1,2,3] # 列表[int , int , int] v2 = [(89),(2.12),("abc")] # [int , float , str] v3 = [(1,),(2,),(3,)] # [tuple,tuple,tuple,tuple] res = () # 表達空元組 """
5,用一行代碼實現數值交換。
a = 1 b = 2 a,b = b,a # 通用 tmp = a a = b b = tmp
6,Python中單引號、雙引號、三引號的區別?
單雙引號沒有區別,三引號可以支持跨行
在互相嵌套時需註意:裡外不能使用相同的引號
7,is和==的區別?
is 是判斷記憶體地址是否一致 == 是判斷兩個對象的值是否相等
8,python里如何實現tuple和list的轉化?
list(數據) tuple(數據)
9,如何實現字元串 st='愛吃大西瓜'的反轉?
st = st[::-1]
10,兩個set如何獲取交集、並集、差集?
交集 & intersection 差集 - difference 並集 | union 對稱差集 ^ symmetric_difference
11,那些情況下, y != x - (x-y)會成立?
非空集合且不為子父關係的兩個集合
12,Python中如何拷貝一個對象?
# copy模塊 [:] import copy copy.copy() # 淺拷貝 copy.deepcopy() # 深拷貝
13,簡述 賦值、淺拷貝、深拷貝的區別?
賦值:將變數和值在記憶體中形成映射指向關係
淺拷貝:只拷貝第一層元素地址copy.copy
深拷貝:為所有層級的元素都單獨開闢新空間 copy.deepcopy() (地址:原不可變數據只是暫時的指向,可變的數據獨立開闢新空間)
可變數據: list set dict
不可變數據: int float bool complex str tuple
pass 占位符 與 ...的用法一樣
15,閱讀代碼寫結果:
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]
16,用Python實現9 * 9 乘法表。
# while i = 1 while i<=9: # 這個位置寫代碼 j = 1 while j<= i: # "誰"*"誰"="誰" print("%d*%d=%2d" % (i,j,i*j),end=" ") j+=1 # 列印換行 print() i+=1 # for for i in range(1, 10): for x in range(1, i + 1): print(f"{i} * {x} = {i * x}",end=" ") print("")
17,用Python顯示一個斐波那契數列。
# 1 1 2 3 5 8 13 21 ... # 方法一 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))
18,如何刪除列表中重覆的值?
list(set(list))
19,一個大小為100G的文件etl_log.txt, 要讀取文件中的內容, 寫出具體過程代碼?
with open(r'etl_log.txt','r',enconding='utf-8') as f: for i in f: info = f.readlines() print(info) fp = open("文件名","模式","編碼集") """ fp 是迭代器 from collections import Iterator,Iterable # 在遍歷fp時,文件按照一行一行進行讀取; for i in fp: code ... """
20,a = dict(zip(("a","b","c","d","e"),(1,2,3,4,5))) 請問a是什麼?
a為字典
強轉字典的條件:等長的二級容器,配合強轉字典的兩個函數 zip , enumerate # zip 拉鏈 a = dict( zip( ("a","b") , [1,2] ) ) print(a) # enumerate 枚舉 a = dict( enumerate( ["a","b"] )) a = dict( enumerate( ["a","b"] ,start = 10 )) print(a)詳解
21,lambda關鍵字的作用?
lambda 匿名函數 : 用一句話表達只有返回值的無名函數 lambda 參數 : 返回值
22,*arg和**kwarg作用?
*args 接收多餘的位置參數
**kwargs 接收多餘的關鍵字參數
23,如何在函數中設置一個全局變數 ?
global 有該全局變數,修改當前變數,沒有改全局變數,定義一個全局變數; """ def func(): global a a = 90 func() print(a) """
24,filter、map、reduce的作用?
三目(元)運算符 True if 條件表達式 else False filter => 過濾數據 iterable : 可迭代對象(range ,容器類型數據 , 迭代器) filter(func,iterable) => 返回迭代器 lst = [1,2,3,4,5] it = filter(lambda x : True if x % 2 == 0 else False , lst ) print(list(it))
25,什麼是匿名函數?匿名函數有什麼作用?
lambda 匿名函數 : 用一句話表達只有返回值的無名函數 lambda 參數 : 返回值
26,Python遞歸的最大層數?
官方:1000 實測:994 ~ 1000 import sys sys.setrecursionlimit(999999) # 修改遞歸的最大深度,mac能達到30000
27,什麼是迭代器?什麼是可迭代對象?
迭代器:具有__iter__()和__next__()方法
可迭代對象:具有__iter__()方法
dir(數據) 可以查看該數據的內部系統成員
可迭代對象 => 迭代器 把不能直接被next獲取 => 可直接獲取到該數據的一個過程
28,什麼是生成器?
生成器的本質就是迭代器,可以自定義迭代的邏輯 創建方式兩種: (1)生成器表達式 (推導式) (i for i in range(3)) (2)生成器函數 (含有yield關鍵字)
29,什麼是裝飾器及應用場景?
裝飾器的本質就是閉包 在不修改原有代碼的前提下,額外增加新功能就是裝飾器 應用:登錄認證,property類,框架(django,flask,@app.route("/",methdos=["GET","POST"]))
30,什麼是反射及應用場景?
# 通過字元串去操作類對象 或者 模塊中的屬性方法 hasattr getattr setattr delattr 應用: 可以配合用戶的操作或者輸入,調用其中的成員,api介面中
31,寫一個普通的裝飾器。
def wrapper(func): def inner(*args,**kwargs): res = func(*args,**kwargs) print("and you") return res return inner @wrapper def func(): print("i am fine 3q") func()
32,寫一個帶參數的裝飾器。
def outer(n): def wrapper(func): def inner1(*args,**kwargs): res = func(*args,**kwargs) print("我是大王") return res def inner2(*args,**kwargs): res = func(*args,**kwargs) print("大王叫我來巡山") return res if n == "alex": return inner1 else: return inner2 return wrapper @outer("alex123") # outer("alex123") => wrapper =>@wrapper def func(): print("i am fine 3q") func()
33,求結果:
def num(): return [lambda x:i*x for i in range(4)] print([m(2) for m in num()])
[6,6,6,6]
""" def出現的位置是函數的定義處 函數() 出現的位置是函數的調用處 (1)調用的時候,才會把函數中的代碼,從上到下執行一遍,否則不執行 (2)裡面的func是一個閉包函數,延長了當前變數i的生命周期,最後一次i的值3,所以再去調用時候拿的3 """詳解
34,def(a, b=[])這種寫法有什麼陷阱?
b身上的預設值是列表,如果使用原來預設的參數,調用func函數
會把幾次調用的值都存放在同一個預設列表裡
""" 預設參數: 如果調用時,用戶給實參了,那麼使用用戶的 如果調用時,用戶沒給實參,那麼使用預設的(早已存在記憶體中的這個列表) 預設值會提前在記憶體中駐留,在使用時,才能調取,在定義函數的時候就提前開闢了空間 """詳解
35,看代碼寫結果
def func(a,b=[]): b.append(a) return b v1 = func(1) v2 = func(2,[10,20]) v3 = func(3) print(v1,v2,v3)
[1,3],[10,20,2],[1,3]
36,看代碼寫結果
def func(a,b=[]): b.append(a) return b v1 = func(1) print(v1) v2 = func(2,[10,20]) print(v2) v3 = func(3) print(v3)
[1] [10,20,2] [1,3]
37,請編寫一個函數實現將ip地址換成一個整數。
如 10.3.9.12 轉換規則為: 10 00001010 3 00000011 9 00001001 12 00001100 再將以上二進位拼接起來計算十進位結果:00001010 00000011 00001001 00001100 = ?
# ljust 原字元串居左,填充符號 # rjust 原字元串居右,填充符號 # 方法一 ip = "10.3.9.12" strvar = "" for i in ip.split("."): bin_str = str(bin(int(i)))[2:] # 總長度是8 原字元串居右 strvar += bin_str.rjust(8,"0") print(strvar) # 把二進位字元串轉換成十進位,預設轉換時,是十進位 print(int(strvar,2)) # 方法二 ip = "10.3.9.12" strvar = "" for i in ip.split("."): # format 將整型轉化成二進位,不夠8位的拿0補位 strvar += format(int(i) , "08b") print(int(strvar,2))
38,請查找一個目錄下的所有文件(可能存在文件嵌套)。
39,求結果:
import math print (math.floor(5.5))
5
40,是否使用過functools中的函數?其作用是什麼?
from functools import reduce reduce 累計算
41,re的match和search區別?
match: 從開頭進行查找,查找到就停止,找不到返回None
search: 查找全文,找到就停止,找不到就返回None
42,用Python匹配HTML tag的時候,<.*>和<.*?>有什麼區別?
.* 貪婪匹配 匹配多個任意字元
.*? 非貪婪 只匹配一次
43,如何生成一個隨機數?
import random random.random() # 生成隨機小數
44,super的作用?
按照mro的順序進行繼承當前類的下一類
45,雙下劃線和單下劃線的區別?
雙線劃線:__ 是Python中強制定義為私有
單下劃線:_ 是程式員約定的私有方法
46,@staticmethod和@classmethod的區別?
47,實現一個單例模式(加鎖)。
import threading class Singleton(): state = None lock = threading.RLock() def __init__(self,name): self.name = name def __new__(cls,*args,**kwargs): if cls.state: return cls.state with cls.lock: if cls.state: return cls.state cls.state = object.__new__(cls) return cls.state
48,棧和隊列的區別?
棧:先進後出
隊列:先進先出
49,一下代碼輸出是什麼?請給出答案並解釋。
class Parent(object): x = 1 class Child1(Parent): pass class Child2(Parent): pass print Parent.x, Child1.x, Child2.x Child1.x = 2 print Parent.x, Child1.x, Child2.x Parent.x = 3 print Parent.x, Child1.x, Child2.x
""" 1,1,1 兩個child都繼承了parent,並沒有自己的屬性或方法 1,2,1 child1添加了屬性,就近原則使用自己x的值,child2沒有,繼承父類 3,2,3 parent和chile1有自己的x方法,就近使用自己的,chiild2沒有自己的x,繼承父類中的x """
50,參考下麵代碼片段:
class Context: pass with Content() as ctx: ctx.do_something() 請在Context類下添加代碼完成該類的實現
第二部分 可選題
1,如何獲取列表中第二大的值?
2,簡述Python記憶體管理機制。
3,簡述Python的垃圾回收機制。
4,請用兩個隊列來實現一個棧。
5,請用Python實現一個鏈表。
6,請用Python實現鏈表的逆轉。