some interview question

  1. 合併字典:請合併下面兩個字典 a = {"A":1,"B":2},b = {"C":3,"D":4}python

    dict1 = {"A": 1, "B": 2}
    dict2 = {"C": 3, "D": 4}
    
    # 方式一  **表示打散
    print({**dict1, **dict2})  # *   ** 都表示打散可迭代對象
    
    # 方式二 update方法
    dict1.update(dict2)   # 合併字典
  2. 元組操做:如何把元組 ("a","b") 和元組 (1,2),變爲字典 {"a":1,"b":2}正則表達式

    # zip的使用
    a = ("a", "b")
    b = (1, 2)
    print(dict(zip(a, b)))
  3. 交換字典的鍵和值算法

    dict1 = {"A": 1, "B": 2}
    res = {k: v for v, k in dict1.items()}
    print(res)
  4. 咱們知道對於列表可使用切片操做進行部分元素的選擇,那麼如何對生成器類型的對象實現相同的功能呢?數據庫

  5. Python交換兩個變量的值編程

    a,b=b,a

    這個不是元組解包,在棧的頂端作兩個值的交換。json

  6. read()/readline()/readlines()緩存

    with open('test.txt', 'r', encoding='utf-8') as f:
        text = f.read()
        print(text)
    with open('test.txt', 'r', encoding='utf-8') as f:
        try:
            line = f.readline()
            if line:
                print(line)
        except:
            pass
    with open('test.txt', 'r', encoding='utf-8') as f:
        try:
            lines = f.readlines()  # 所有加載到內存
            for line in lines:
                print(line)
        except:
            pass
  7. json序列化,能夠支持的數據類型是str/int/tuple/dict/bool/None,而datetime不支持json序列化。網絡

  8. json序列化遇到中文會轉換成Unicode,想要保留中文怎麼辦?數據結構

    import json
    
    a = json.dumps({"name": "張三"})
    print(a)
    """
    {"name": "\u5f20\u4e09"}
    """
    import json
    
    a = json.dumps({"name": "張三"}, ensure_ascii=False)
    print(a)
    """
    {"name": "張三"}
    """
  9. AB兩個文件裏面都是字母,讀出來排序好後,寫在C文件裏面app

    with open('test1.txt', 'r') as f1:
        line1 = f1.readline()
    with open('test2.txt', 'r') as f2:
        line2 = f2.readline()
    line = line1 + line2
    line = sorted(line)
    print(line)
    with open("test3.txt", "a+") as f:
        f.write("".join(line))
  10. 求在當前時間的基礎上加N天后的日期

    import datetime
    def datetime_operate(num:int):
        now = datetime.datetime.now()
        _new_date=now+datetime.timedelta(days=num)
        # 再將這個數字轉換爲標準的時間
        new_date = _new_date.strftime("%Y%m%d")
        return new_date
    if __name__=="__main__":
        res = datetime_operate(10)
        print(res)
  11. 下面代碼會存在什麼問題

    def strappend(num):
        str='first'
        for i in range(num):
            str+=str(i)
        return str

    問題以下:

    1. str是內置函數,不該該做爲變量名。
    2. str是不可變對象,每次迭代都會佔用新的空間,num越大,浪費的空間就越大,是yield改爲生成器便可。
    3. 從函數命名規範來說,函數名改用分隔符比較好。
    def str_append(num):
        s = 'first'
        for i in range(num):
            s += str(i)
            yield s
    
    if __name__ == '__main__':
        for i in str_append(3):
            print(i)
  12. with語句的做用,寫一段代碼?

    with語句,即上下文管理協議,這裏麪包含__enter____exit__兩個方法。with語句適用於對資源進行訪問的場合,確保無論使用過程當中是否發生異常都會執行必要的清理操做,釋放資源,好比文件使用後自動關閉、線程中的鎖自動獲取和釋放。

    class Test:
        def __enter__(self):
            print('__enter__() is called!')
            return self
        def dosomething(self):
            print('do something!')
        def __exit__(self,*args,**kwargs):
            print('__exit__() is called!')
    with Test() as sample:
        sample.dosomething()
  13. 統計文件中大寫字母的數量

    with open('A.txt') as f:
        count=0
        for word in f.read():
            if word.isupper():
                count+=1
        print(count)
  14. Redis基本類型

    • string
    • hash
    • list
    • set
    • zset(sorted set:有序集合)
  15. Python 鏈接MySQL/MongoDB/Redis

  16. 數據庫三範式

  17. 分佈式鎖

  18. Redis事務

  19. 裝飾器有什麼做用?舉例說明?

裝飾器就是一個函數,在不改變任何代碼變更的前提下給一個函數增長額外功能,起到裝飾效果。

應用場景:

  • 插入日誌

  • 性能測試

  • 事務處理

  • 緩存

  • 權限校驗

    from functools import wraps
    def log(label):
        def decorate(func):
            @wraps(func)
            def _wrap(*args,**kwargs):
                try:
                    func(*args,**kwargs)
                    print("name",func.__name__)
                except Exception as e:
                    print(e.args)
                return _wrap
            return decorate
    @log("info")
    def foo(a,b,c):
        print(a+b+c)
        print("in foo")
    
    if __name__=="__main__":
        foo(1,2,3)
     # mark一下,這個還須要認真琢磨琢磨。

    ------------------

  1. Python垃圾回收機制

    對於Python語言來說,對象的類型和內存都是在運行時肯定的,這也是咱們稱Python語言爲動態類型的緣由。

    垃圾回收機制:

    • 應用計數機制
    • 標記-清除
    • 分代回收
  2. 魔法函數__call__怎麼使用?

    class Bar:
        def __call__(self,*args,**kwargs):
            print("in call")
    
    if __name__=="__main__":
        b=Bar()
        b()
  3. 判斷一個對象是函數仍是方法?

    from types import MethodType, FunctionType
    
    
    class Bar:
        def foo(self):
            pass
    
    
    def foo1():
        pass
    
    
    print("foo是函數", isinstance(Bar().foo, FunctionType))
    print("foo是方法", isinstance(Bar().foo, MethodType))
  4. python的傳參是傳值仍是傳址?

    Python中傳參既不是傳值也不是傳地址,傳的是對象的應用。

  5. Python中的元類(metaclass)使用舉例。

  6. 什麼是猴子補丁?

  7. 內存管理

  8. 正則表達式

  9. enumerate

    enumerate能夠在迭代一個對象的時候,同時獲取當前對象的索引和值

    from string import ascii_lowercase
    from string import ascii_uppercase
    s = ascii_uppercase
    for index, value in enumerate(s):
        print(index, value)
  10. 列舉五個標準模塊

    • pathlib 路徑操做模塊
    • urllib 網絡請求模塊
    • asyncio Python異步庫
    • re 正則表達式模塊
    • itertools 操做生成器的一些模塊
  11. Python異常處理

    try:
        1 / 0
    except Exception as e:
        print(e)
    '''
    division by zero
    '''
  12. python中遞歸的最大次數

    答:最大次數默認爲1000,通常電腦只能達到998。

    import sys
    sys.setrecursionlimit(1500)
    # 這個只是修改的Python解釋器容許的最大遞歸次數,此外限制還和OS有關。
  13. 面向對象的mro

    調用類對象的mro()方法獲取其繼承關係。

  14. 斷言:

    Python中是斷言語句實現此功能的,通常表達式爲true的狀況下,程序才能經過。

    # assert() 斷言成功,程序繼續執行,斷言失敗,程序報錯。
    # 斷言可以幫助別人活着將來的你理解代碼
    # 找出程序中邏輯不對的地方
    # 一方面,斷言會提醒你某個對象應該處於何種狀態
    # 另外一方面 ,若是某個時候斷言爲假,會拋出異常
    def foo(a):
        assert a==2,Exception('不等於2')
        print('ok',a)
    if __name__=='__main__':
        foo(1)
  15. lambda表達式是一個匿名函數,在函數編程中常常做爲參數使用。

  16. 列舉5個Python中的異常類型以及其含義

    • AttributeError 對象沒有這個屬性
    • NotImplementedError 還沒有實現的方法
    • StopIteration 迭代器沒有更多的值
    • TypeError 對類型無效的操做
    • IndentationError 縮進錯誤
  17. 列舉sort和sorted的區別:

    相同之處 sort 和 sorted 均可以對列表元素排序,sort() 與 sorted() 的不一樣在於,sort 是在原位從新排列列表,而 sorted() 是產生一個新的列表。 sort 是應用在 list 上的方法,sorted 能夠對全部可迭代的對象進行排序操做。list 的 sort 方法返回的是對已經存在的列表進行操做,而內建函數 sorted 方法返回的是一個新的 list,而不是在原來的基礎上進行的操做。

  18. 進制問題

    print(int(0b1010))
    print(bin(0xf))
    print(oct(8))
    print(hex(16))
    '''
    10
    0b1111
    0o10
    0x10
    '''



算法和數據結構:

  1. 用Python實現一個二分查找的函數

    def binary_search(arr, num):
        n = len(arr)
        left = 0
        right = n - 1  # 最右邊的index
        while left <= right:
            mid = (left + right) // 2
            if num == arr[mid]:
                return "index:" + str(mid)
            elif num < arr[mid]:
                right = mid - 1  # 比中間的小
            else:
                left = mid + 1  # 比中間的大
        return False  # 從這個循環裏面跳出來講明木有找到,返回False
    
    
    if __name__ == "__main__":
        lst = [1, 3, 4, 5, 7, 100]
        res = binary_search(lst, 7)
        print(res)
相關文章
相關標籤/搜索