1. 簡述列舉了解的編程語言與語言間的區(qū)別?

    編程語言:C/C++/java/c#/PHP/GO/python
    編譯方式:編譯型語言:C/C++/GO
    		解釋型語言:python/PHP
    		混合型語言:JAVA
    
  2. 列舉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:只有新式類,不管繼不繼承都是新式類
    
  3. 看代碼寫結(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
    
  4. 比較以下值有什么不同?

    v1 = [1,2,3]     # 列表中是int,單列表
    v2 = [(1),(2),(3)]    # 列表中還是int
    v3 = [(1,),(2,),(3,)]   # 列表中是元組
    
    
  5. 用一行代碼實現(xiàn)數(shù)值交換

    a = 1
    b = 2
    a,b = b,a  
    
  6. python中單引號、雙引號、三引號的區(qū)別?

    三者都是表示字符串格式
    單引號和雙引號的區(qū)別:單引號需要加'\'來讓編譯器判斷目前是轉(zhuǎn)義字符,而雙引號就可以直接使用
    三單引號和三個雙引號:多行字符串/加注釋
    
    ## 在互相嵌套時徐注意:里外不能使用相同的引號
    
  7. is和==的區(qū)別?

    is: 判斷兩邊的內(nèi)存地址是否相同
    == :判斷兩邊的值是否相等
    
  8. pyhton里如何實現(xiàn)tuplelist的轉(zhuǎn)化?

    tuple = tuple(list)
    list = list(tuple)
    
  9. 如何實現(xiàn)字符串name="老男孩"的反轉(zhuǎn)?

    name = name[::-1]
    
  10. 兩個set如何獲取交集、并集、差集?

    差集:set1 - set2
    并集:set1 | set2 
    交集:set1 & set2
    
  11. 那些情況下,y! = x - (x-y)會成立?

    x,y是兩個不相等的非空集合
    # 非空集合且不為子父關(guān)系的兩個集合
    
  12. python中如何拷貝一個對象?

    賦值、淺拷貝、深拷貝
    
  13. 簡述復(fù)制、淺拷貝、深拷貝的區(qū)別?

    賦值:兩個標簽共用同一塊內(nèi)存地址,舉例:一個列表用兩個標簽定義,其實操作的是同一個對象
    淺拷貝:就是只拷貝第一層的元素,對第一層進行修改和添加對元數(shù)據(jù)不會造成影響,對可變數(shù)據(jù)類型進行修改和添加會對源數(shù)據(jù)造成影響
    深拷貝:不可變數(shù)據(jù)類型共用一個內(nèi)存地址,可變數(shù)據(jù)類型新開辟一個內(nèi)存空間
    
  14. pass的作用?

    就是占位的作用,只占一行的位
    
  15. 閱讀代碼寫結(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]
    
  16. 用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
    
  17. 用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))
    
  18. 如何刪除列表中重復(fù)的值?

    lst = [1,2,2,4,7,8,8,14,21]
    print(list(set(lst)))
    
  19. 一個大小為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é)讀取
    
  20. 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"}
    
  21. lambda關(guān)鍵字的作用?

    lambda:匿名函數(shù),一行函數(shù),只有返回值的無名函數(shù)
    格式:lambda  參數(shù):返回值
    
  22. *args**kwargs作用

    *args:動態(tài)位置參數(shù),接收額外的位置參數(shù)(實參)
    **kwargs:動態(tài)關(guān)鍵字參數(shù),接收額外的關(guān)鍵字參數(shù)(形參)
    
  23. 如何在函數(shù)中設(shè)置一個全局變量?

    加關(guān)鍵字:global
    
  24. filter、mapreduce的作用?

    filter:過濾,輸出指定的內(nèi)容   filter(func,iterable) => 可迭代對象
    map:映射:將可迭代對象中的每個元素執(zhí)行指定的函數(shù)    map(func,iterable) => 可迭代對象
    reduce:累計算(累加、累乘)
    
  25. 什么是匿名函數(shù)?匿名函數(shù)有什么作用

    匿名函數(shù):lambda
    作用:配合高階函數(shù)一起使用
    
  26. python遞歸的最大層數(shù)?

    官方說明:1000層,實際998/997
    
  27. 什么是迭代器?什么是可迭代對象?

    具有__itre__()和__next__()兩個方法的就是迭代器
    具有__iter__()方法的就是一個可迭代對象
    
  28. 什么是生成器?

    程序員自己編寫的一種函數(shù),函數(shù)體中出現(xiàn)yield代表要生成一個生成器,在獲取生成器的內(nèi)存地址,生成一個生成器,啟動生成器等一系列的步驟
    
  29. 什么是裝飾器及其應(yīng)用場景?

    裝飾器:在不修改源代碼及調(diào)用調(diào)用方式時,對功能進行額外添加
    應(yīng)用場景:登錄認證、property類、框架(django/flask/@app.route)
    裝飾器的本質(zhì)是閉包
    
  30. 什么是反射及應(yīng)用場景?

    反射:通過字符串操作對象的屬性和方法
    場景:對象的角度、類的角度、當前模塊的角度
    hasattr 
    getattr
    setattr
    delattr
    應(yīng)用: 可以配合用戶的操作或者輸入,調(diào)用其中的成員,api接口中
    
  31. 寫一個普通的裝飾器

    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ā)生綁定,延長該變量的生命周期
    
  32. 寫一個帶參數(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)涵神評論')
    
  33. 求結(jié)果

    def num():
    	return [lambda x:i*x for i in range(4)]
    print([m(2) for m in num()]) 
     6,6,6,6
    
  34. 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ù)的時候就提前開辟了空間
    
  35. 看代碼寫結(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)
     
    
  36. 看代碼寫結(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)
    
  37. 請編寫一個函數(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))
    
  38. 請查找一個目錄下得所有文件(可能存在文件嵌套)

    方法一:遞歸寫法
    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)
    
  39. 求結(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  按正常情況
    
  40. 是否使用過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)
    
  41. rematchsearch區(qū)別?

    search:從任意位置開始查找
    match:從頭開始查找,如果不符合就不繼續(xù)查找了
    
  42. 用python匹配HTML tag的時候,<.><.?>有什么區(qū)別?

    <.>是匹配任意字符(除換行符)
    <.?>匹配0個或者1個任意字符
    
  43. 如何生成一個隨機數(shù)?

    random模塊
    random.random  隨機范圍 0 <= x < 1
    random.randrange  隨機獲取指定范圍中的整數(shù),用法上同range
    random.uniform    隨機獲取指定范圍中的小數(shù)
    
  44. super的作用?

    用來解決多繼承之間復(fù)雜的調(diào)用關(guān)系使用super
    在多繼承中,如果出現(xiàn)了多個同名方法,super在調(diào)用的時候,會按照mro列表的繼承順序依次調(diào)用
    
    類.mro() => lst返回的是順序列表     
    super里的類名是指定查找mro總類名的下一個類
    
  45. 雙下劃線和單下劃線的區(qū)別?

    雙下劃線:私有對象 - 只能在當前這個類里使用,不能再子類或者類外使用
    單下劃線:受保護的(強制繼承) - 可以在當前這個類或者子類中使用,不能在類外使用
    
  46. @staticmethodclassmethod的區(qū)別

    @staticmethod:靜態(tài)方法
    	無論是對象還是類,都可以調(diào)用,不會默認傳遞任何參數(shù)
    @classmethod:類方法
    	無論是對象還是類,都可以調(diào)用,會默認傳遞類這個參數(shù)
    
  47. 實現(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)
    
  48. 棧和隊列的區(qū)別

    棧:先進后出
    隊列:先進先出
    
  49. 以下代碼輸出時候是那么?請給出答案并解釋

    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     
    
    # 繼承父類,自己有就用自己的,自己沒有父類有就用父類的
    
  50. 參考下面代碼片段

    # 考察的是面向?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)
    

可選題

  1. 如何獲取列表中第二大的值

    # 所有的容器類型數(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)
    
    
  2. 簡述Python內(nèi)存管理機制

  3. 簡述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)存中駐留
    
  4. 請用兩個隊列來實現(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
    
  5. 請用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)
    
  6. 請用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)