成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Python面試題總結(jié)

bingchen / 3056人閱讀

摘要:線程是程序執(zhí)行時(shí)的最小單位,它是進(jìn)程的一個(gè)執(zhí)行流。經(jīng)過(guò)這一道關(guān)卡處理,會(huì)增加執(zhí)行的開(kāi)銷。每個(gè)對(duì)象都會(huì)被分配一個(gè)代,而被分配更年輕代的對(duì)象是優(yōu)先被處理的。引用循環(huán)垃圾回收器會(huì)定時(shí)尋找這個(gè)循環(huán),并將其回收。

您可以關(guān)注公眾號(hào)《Python數(shù)據(jù)結(jié)構(gòu)》了解更多知識(shí)。
i = i+1 和 i += 1

對(duì)于不可變數(shù)據(jù)類型(str、int、tuple)

由于本身是不可變數(shù)據(jù)類型,執(zhí)行后都會(huì)生產(chǎn)新的對(duì)象
x = 1
print(id(x))  # 1510566928
x += 1
print(id(x))  # 1510566960
---------------------------
x = 1
print(id(x))  # 1510566954
x = x + 1
print(id(x)) # # 1510566998

可變數(shù)據(jù)類型情況(list、dict)

可以看到 使用 += 并不會(huì)改變對(duì)象的內(nèi)存地址
x = [1, 2]
print(id(x))  # 2701823038387
x = x + [3, 4]
print(id(x))  # 2701823038334
------------------
x = [1, 2]
print(id(x))  # 2701823038344
x += [3, 4]
print(id(x))  # 2701823038344

注意

n = n + n 作用域問(wèn)題內(nèi)部為[1, 2, 1, 2], 外部仍為[1, 2]
def num(n):
    n = n + n
x = [1, 2]
num(x)
print(x)  # [1, 2]
--------------------
def num(n):
    n += n
x = [1, 2]
num(x)
print(x)  # [1, 2, 1, 2]
內(nèi)建函數(shù) zip
key = [key for key in dict(zip(("a","b","c","d","e"),(1,2,3,4,5))) ]
print(key)
--------------------------------------------------------
["a", "b", "c", "d", "e"]
A0 = dict(zip(("a","b","c","d","e"),(1,2,3,4,5)))
A1 = range(10)
A2 = [i for i in A1 if i in A0]
A3 = [A0[s] for s in A0]
A4 = [i for i in A1 if i in A3]
A5 = {i:i*i for i in A1}
A6 = [[i,i*i] for i in A1]
-------------------------------------------------------------
A0 = {"a": 1, "c": 3, "b": 2, "e": 5, "d": 4}
A1 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
A2 = []
A3 = [1, 3, 2, 5, 4]
A4 = [1, 2, 3, 4, 5]
A5 = {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
A6 = [[0, 0], [1, 1], [2, 4], [3, 9], [4, 16], [5, 25], [6, 36], [7, 49], [8, 64], [9, 81]]
閉包
作用——保存局部信息不被銷毀。
def num2(n):
    i = 1
    def num_in():
        nonlocal i
        i = i + n
        print(i)
    return num_in

i = 0
start = num2(3)
while i<5:
    start()
    i += 1
匿名函數(shù)(lambda)
與正常寫(xiě)法相比,使用匿名函數(shù)相當(dāng)簡(jiǎn)潔

map() 遍歷所有

a = [1, 2, 3]
x = []
for each in a:
    x.append(each+1)

print(x)
### 使用map(func, iterable)
print(list(map(lambda x: x+1, a)))

reduce(func, seq) 積累每次計(jì)算的值

def num(x, y):
    return x + y
print(reduce(num, [1, 2, 3, 4]))
--------------------------
print(reduce(lambda x, y: x*y, [1, 2, 3, 4]))

filter(func, iterable) 過(guò)濾滿足條件的值

print(list(filter(lambda x: x%2==0,range(10))))
進(jìn)程和線程的區(qū)別

進(jìn)程是資源(CPU、內(nèi)存等)分配的基本單位,它是程序執(zhí)行時(shí)的一個(gè)實(shí)例。

線程是程序執(zhí)行時(shí)的最小單位,它是進(jìn)程的一個(gè)執(zhí)行流。

進(jìn)程有自己的獨(dú)立地址空間,每啟動(dòng)一個(gè)進(jìn)程,系統(tǒng)就會(huì)為它分配地址空間,建立數(shù)據(jù)表來(lái)維護(hù)代碼段、堆棧段和數(shù)據(jù)段,這種操作非常昂貴

線程是共享進(jìn)程中的數(shù)據(jù)的,使用相同的地址空間,因此CPU切換一個(gè)線程的花費(fèi)遠(yuǎn)比進(jìn)程要小很多,同時(shí)創(chuàng)建一個(gè)線程的開(kāi)銷也比進(jìn)程要小很多

進(jìn)程實(shí)現(xiàn)

from multiprocessing import Pool
import time
import random
import os


def work(msg):
    start = time.time()
    print("work{}開(kāi)始執(zhí)行,id為{}".format(msg, os.getpid()))
    time.sleep(random.random()*2)
    stop = time.time()
    print("work{}耗時(shí){}.".format(msg, stop-start))

p = Pool()
for i in range(10):
    # 非堵塞運(yùn)行
    p.apply_async(work, args=(i,))
    # 堵塞進(jìn)行
    # p.apply(work, args=(i,))


print("開(kāi)始")
p.close()
p.join()
print("結(jié)束")

線程實(shí)現(xiàn)

import threading
import os
from time import sleep

def sorry(i):
    print("say sorry  {}".format(i))
    sleep(1)

if __name__ == "__main__":
    for i in range(1,10):
        t = threading.Thread(target=sorry, args=(i,))
        t.start()
協(xié)程
協(xié)程之前我們明白Python的進(jìn)程和線程,這里我們來(lái)說(shuō)一下協(xié)程

子程序切換不是線程切換,而是由程序自身控制

沒(méi)有線程切換的開(kāi)銷,和多線程比,線程數(shù)量越多,協(xié)程的性能優(yōu)勢(shì)就越明顯

不需要多線程的鎖機(jī)制,因?yàn)橹挥幸粋€(gè)線程,也不存在同時(shí)寫(xiě)變量沖突,在協(xié)程中控制共享資源不加鎖

協(xié)程實(shí)現(xiàn)

def custumer():
    r = ""
    while True:
        n = yield r  # 接受send的值  返出yield的值
        if not n:
            return
        print("custer {}".format(n))
        r = "done"

def produce(c):
    c.send(None)  # 啟動(dòng)
    n = 0
    while n < 5:
        n += 1
        print("custer {}".format(n))
        r = c.send(n)
        print("custer return {}".format(r))
    c.close()

c = custumer()
produce(c)
GIL
Python并不支持真正意義上的多線程。Python中提供了多線程包,但是如果你想通過(guò)多線程提高代碼的速度,使用多線程包并不是個(gè)好主意。Python中有一個(gè)被稱為Global Interpreter Lock(GIL)的東西,它會(huì)確保任何時(shí)候你的多個(gè)線程中,只有一個(gè)被執(zhí)行。線程的執(zhí)行速度非常之快,會(huì)讓你誤以為線程是并行執(zhí)行的,但是實(shí)際上都是輪流執(zhí)行。經(jīng)過(guò)GIL這一道關(guān)卡處理,會(huì)增加執(zhí)行的開(kāi)銷。這意味著,如果你想提高代碼的運(yùn)行速度,使用threading包并不是一個(gè)很好的方法。
不過(guò)還是有很多理由促使我們使用threading包的。如果你想同時(shí)執(zhí)行一些任務(wù),而且不考慮效率問(wèn)題,那么使用這個(gè)包是完全沒(méi)問(wèn)題的,而且也很方便。但是大部分情況下,并不是這么一回事,你會(huì)希望把多線程的部分外包給操作系統(tǒng)完成(通過(guò)開(kāi)啟多個(gè)進(jìn)程),或者是某些調(diào)用你的Python代碼的外部程序(例如Spark或Hadoop),又或者是你的Python代碼調(diào)用的其他代碼(例如,你可以在Python中調(diào)用C函數(shù),用于處理開(kāi)銷較大的多線程工作)。
copy
Python拷貝分為深拷貝和淺拷貝

淺拷貝對(duì)子對(duì)象不拷貝,深拷貝全部拷貝

l1 = [1, 2, [3, 4]]
l2 = copy.copy(l1)
l1.append(5)
l1[2].append(5)  # 子對(duì)象 改變
print(l1)
print(l2)
--------------
[1, 2, [3, 4, 5], 5]
[1, 2, [3, 4, 5]]

深拷貝完是兩個(gè)完全不相干的對(duì)象

l1 = [1, 2, [3, 4]]
l2 = copy.deepcopy(l1)
l1.append(5)
l1[2].append(5)
print(l1)
print(l2)
--------------
[1, 2, [3, 4, 5], 5]
[1, 2, [3, 4]]
垃圾回收機(jī)制

引用計(jì)數(shù)

import sys
# 請(qǐng)?jiān)赑ython解釋器下運(yùn)行  為 2  創(chuàng)建一次 調(diào)用一次
str1 = "hello world"
print(sys.getrefcount(str1))

分代技術(shù)

Python默認(rèn)定義了三代對(duì)象集合,索引數(shù)越大,對(duì)象存活時(shí)間越長(zhǎng)
Python中使用了某些啟發(fā)式算法(heuristics)來(lái)加速垃圾回收。例如,越晚創(chuàng)建的對(duì)象更有可能被回收。對(duì)象被創(chuàng)建之后,垃圾回收器會(huì)分配它們所屬的代(generation)。每個(gè)對(duì)象都會(huì)被分配一個(gè)代,而被分配更年輕代的對(duì)象是優(yōu)先被處理的。

引用循環(huán)

垃圾回收器會(huì)定時(shí)尋找這個(gè)循環(huán),并將其回收。舉個(gè)例子,假設(shè)有兩個(gè)對(duì)象o1和o2,而且符合o1.x == o2和o2.x == o1這兩個(gè)條件。如果o1和o2沒(méi)有其他代碼引用,那么它們就不應(yīng)該繼續(xù)存在。但它們的引用計(jì)數(shù)都是1。
is和==
# is 比較的是內(nèi)存地址   == 比較內(nèi)容和數(shù)據(jù)類型
a = [1, 2, 3]
b = a
print(a is b)
print(a == b)

c = copy.deepcopy(a)
print(a is c)
print(a == c)
-------------
True
True
False
True
文件操作 read,readline和readlines
read 讀取整個(gè)文件
readline 讀取下一行,使用生成器方法
readlines 讀取整個(gè)文件到一個(gè)迭代器以供我們遍歷
遞歸輸出文件
import os

def print_directory_contents(sPath):
    for sChild in os.listdir(sPath):
        sChildPath = os.path.join(sPath, sChild)
        if os.path.isdir(sChildPath):
            print_directory_contents(sChildPath)
        else:
            print(sChildPath)
print_directory_contents("F:GZmxgController")
Fibonacci數(shù)列
def fab(n):
    a, b = 0, 1
    while n:
        yield b
        a, b = b, a+b
        n -= 1
內(nèi)存管理

小整數(shù)緩存池

a = 1
b = 1
print(a is b) # True

短字符串

# True
a = "good"
b = "good"
print(a is b)

# False
a = "very good morning"
b = "very good morning"
print(a is b)

# False
a = []
b = []
print(a is b)
函數(shù)調(diào)用
函數(shù)賦值會(huì)開(kāi)辟新空間,即[] 和 [3, 2, 1]內(nèi)存地址不一樣,前者引用,后者覆蓋
def f(x, l=[]):
    for i in range(x):
        l.append(i*i)
    print(l)

f(2) # [0, 1]
f(3,[3,2,1]) # [3, 2, 1, 0, 1, 4]  # 自己多帶帶開(kāi)辟
f(3) # [0, 1, 0, 1, 4]  # 和f(2)共用
三目 if/else
# 若果 a>b 成立  就輸出  a-b  否則 a+b
h = a-b if a>b else a+b
and/or
### and 所有值都為真,返回最后一個(gè)真;若有一個(gè)假,返回第一個(gè)假
print(2 and 1 and 3)  # 3
print(1 and 3 and 0 and 4) # 0
print(1 and  0 and 3/0) # 0
### or  所有值都為假,返回最后一個(gè)假;若有一個(gè)真,返回第一個(gè)真
print(0 or 1 or 1/0)
print(0 or "")
### 如果 a
設(shè)計(jì)模式
單例---類方法方式
class Single():
    def __init__(self, name):
        self.name = name
    @classmethod
    def instance(cls, *args, **kwargs):
        if not hasattr(Single, "_instance"):
            Single._instance = Single(*args, **kwargs)
        return Single._instance
s1 = Single.instance("Gage")
s2 = Single.instance()
print(s1)
print(s2)
單例---new方式
class Single(object):
    __isstance = None
    __first_init = False
    def __new__(cls, *args, **kwargs):
        if not cls.__isstance:
            cls.__isstance = object.__new__(cls)
        return cls.__isstance
    def __init__(self, name):
        if not self.__first_init:
            self.name = name
            Singleton.__first_init = True
a = Single("a")
b = Single("b")
print(id(a))
print(id(b))
工廠模式
# 首先定義一個(gè)抽象基類
class CarStore(object):

    # 定義生產(chǎn)汽車的方法
    def createcar(self, name):
        pass

    # 根據(jù)類型去生產(chǎn)車
    def order(self, name):
        self.car = self.createcar(name)
        self.car.move()


# 定義4s店  實(shí)現(xiàn)抽象類
class AoDiCarStore(CarStore):

    def createcar(self, name):
        self.factory = CarFactory()
        return self.factory.createcar(name)


# 創(chuàng)建一個(gè)車
class AoDi():
    def move(self):
        print("移動(dòng)")
# 定義一個(gè)工廠
class CarFactory():
    def createcar(self, name):
        self.name = name
        if self.name == "AoDi":
            self.car = AoDi()
        return self.car
aodi = AoDiCarStore()
aodi.order("AoDi")
數(shù)據(jù)結(jié)構(gòu) 鏈表成對(duì)調(diào)換
class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

class Solution:
    # @param a ListNode
    # @return a ListNode
    def swapPairs(self, head):
        if head != None and head.next != None:
            next = head.next
            head.next = self.swapPairs(next.next)
            next.next = head
            return next
        return head
單鏈表反轉(zhuǎn)
class Node(object):
    def __init__(self, data=None, next=None):
        self.data = data
        self.next = next

link = Node(1, Node(2, Node(3, Node(4, Node(5, Node(6, Node(7, Node(8, Node(9)))))))))

def rev(link):
    pre = link
    cur = link.next
    pre.next = None
    while cur:
        tmp = cur.next
        cur.next = pre
        pre = cur
        cur = tmp
    return pre

root = rev(link)
while root:
    print root.data
    root = root.next
快速排序
def quicksort(list):
    if len(list)<2:
        return list
    else:
        midpivot = list[0]
        lessbeforemidpivot = [i for i in list[1:] if i<=midpivot]
        biggerafterpivot = [i for i in list[1:] if i > midpivot]
        finallylist = quicksort(lessbeforemidpivot)+[midpivot]+quicksort(biggerafterpivot)
        return finallylist

print quicksort([2,4,6,7,1,2,5])
二分搜索
#coding:utf-8
def binary_search(list,item):
    low = 0
    high = len(list)-1
    while low<=high:
        mid = (low+high)/2
        guess = list[mid]
        if guess>item:
            high = mid-1
        elif guess

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/42994.html

相關(guān)文章

  • 字節(jié)跳動(dòng)Python后端開(kāi)發(fā)崗,已拿offer

    摘要:今年歲,畢業(yè)之后進(jìn)入一家小型的互聯(lián)網(wǎng)公司工作,名字就不說(shuō)了,算是熟知的,在這家公司呆了兩年,直至今年才有了跳槽的想法。在眾多大廠中,最終選擇了字節(jié)跳動(dòng)。這樣的調(diào)整,一方面對(duì)自己學(xué)習(xí)有幫助,另一方面讓自己應(yīng)對(duì)面試更從容,更順利。 ...

    JasonZhang 評(píng)論0 收藏0
  • 分享一下 軟件測(cè)試面試歷程和套路,真的很實(shí)在

    摘要:軟件測(cè)試自學(xué)秘訣面試失敗一天,心態(tài)穩(wěn)的一批,因?yàn)槊嬖嚨娜峭獍耸聨臀衣?lián)系的公司,工資全都是一萬(wàn)以上,之前只有四五千的自己根本不覺(jué)得自己能勝任。 個(gè)人是去年年底零基礎(chǔ)轉(zhuǎn)行,兩三千培訓(xùn)費(fèi)學(xué)出來(lái),學(xué)完后也是稀里糊涂,僅是知道功能測(cè)試就是找問(wèn)題,其他接口,性能,數(shù)據(jù)庫(kù),python基礎(chǔ),虛擬機(jī)搭建網(wǎng)站都實(shí)現(xiàn)了課程展示那樣。面試資...

    Lyux 評(píng)論0 收藏0
  • Python面試經(jīng)驗(yàn)總結(jié)面試一時(shí)爽,一直面試一直爽!

    摘要:面試的心得體會(huì)簡(jiǎn)歷制作我做了兩份簡(jiǎn)歷,用兩個(gè)手機(jī)賬號(hào),兩個(gè)簡(jiǎn)歷名字,分別在各個(gè)招聘網(wǎng)站投了雙份簡(jiǎn)歷,一個(gè)是數(shù)據(jù)分析的簡(jiǎn)歷一個(gè)是全棧開(kāi)發(fā)的簡(jiǎn)歷,我真正接觸快年,不管是學(xué)習(xí)還是工作學(xué)到的東西,這兩年大概掌握了前端爬蟲(chóng)數(shù)據(jù)分析機(jī)器學(xué)習(xí)技術(shù), showImg(https://upload-images.jianshu.io/upload_images/13090773-b96aac7e974c...

    gxyz 評(píng)論0 收藏0
  • Python 爬蟲(chóng)面試 170 道:2019 版

    摘要:下面代碼會(huì)存在什么問(wèn)題,如何改進(jìn)一行代碼輸出之間的所有偶數(shù)。簡(jiǎn)述進(jìn)程之間如何通信多路復(fù)用的作用模型的區(qū)別什么是并發(fā)和并行解釋什么是異步非阻塞的作用面試題說(shuō)說(shuō)你知道的命令如何查看某次提交修改的內(nèi)容答案掃碼下面的二維碼訂閱即可獲取。 引言 最近在刷面試題,所以需要看大量的 Python 相關(guān)的面試題,從大量的題目中總結(jié)了很多的知識(shí),同時(shí)也對(duì)一些題目進(jìn)行拓展了,但是在看了網(wǎng)上的大部分面試題不...

    trigkit4 評(píng)論0 收藏0
  • 2017年3月份前端資源分享

    平日學(xué)習(xí)接觸過(guò)的網(wǎng)站積累,以每月的形式發(fā)布。2017年以前看這個(gè)網(wǎng)址:http://www.kancloud.cn/jsfron... 03月份前端資源分享 1. Javascript 175453545 Redux compose and middleware 源碼分析 深入 Promise(二)——進(jìn)擊的 Promise Effective JavaScript leeheys blog -...

    ermaoL 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<