python面試題彙總

一、and或orpython

 
v= 1 and 3 and 2
print(v)
2

v= 1 and 3 and 0
print(v)
0

v = 1  or  2  or  0
print(v)
1

v = 1  and  2  or  0
print(v)
2

Python中的and從左到右計算表達式,若全部的值均爲真,則返回最後一個值,若存在假,返回第一個假值mysql

or也是從左到右計算表達式,返回第一個爲真的值web

二、GIL鎖ajax

全局解釋器鎖,同一時刻只能有一個線程訪問CPU,鎖的是線程,線程自己能夠在同一時間使用多個CPU,Cpython解釋器防止在解釋代碼的過程當中產生數據不安全問題。sql

三、is和==的區別數據庫

 

Python中包含三個基本元素:ID(身份標識),type(數據類型),value(值)編程

 

其中ID用來惟一標識一個對象,type標識對象類型,value標識對象的一個值json

 

is判斷的是a對象是否就是b對象,是經過ID來判斷跨域

 

==判斷的是a對象的值是否和b對象的值相等,是經過value來判斷,,因此is 就是判斷兩個對象的id是否相同, 而 == 判斷的則是內容是否相同。數組

四、 Python中的可變對象和不可變對象

不可變對象:對象所指向的內存中的值不能被改變,當改變這個變量的時候,原來指向的內存中的值不變,變量再也不指向原來的值,而是開闢一塊新的內存,變量指向新的內存。

通俗來說變量值改變,id值也改變,例如:

a = 'hello'
print(id(a))

a = a+'hi'
print(id(a))


1579546360552
1579547940488

 數值類型int 、float、 字符串str 、元祖tuple、boole 都是不可變對象

可變對象:對象指向的內存中的值會改變,當更改這個變量的時候,仍是指向原來內存中的值,而且在原來的內存值進行原地修改,並無開闢新的內存。

 

dic = {
    'name':'alex',
    'age':18
}
print(id(dic))

dic['hobby']='lanqiu '
print(id(dic))

1579542439176
1579542439176

 

 列表list、集合set、字典dict都是可變對象

五、osi七層協議複習總結

六、TCP與UDP的複習總結

 TCP:傳輸控制協議,是一種面向鏈接的、可靠地字節流服務,當客戶端與服務端交換數據時,首先要創建起一個TCP連接,以後才傳輸數據,TCP提供超市重傳,丟棄重複數據,檢查數據,流量控制等功能。保證數據從一段傳到另外一端。

UDP:用戶數據包協議,是一個簡單的面向數據包的傳輸層協議,盡最大努力交付報文。傳輸速度比較快,容易丟包。

七、阻塞IO,非阻塞IO

IO的操做分爲兩步,等待數據準備和將數據從操做系統內核拷貝至內存,阻塞IO是指一直等待數據準備好拿到數據。非阻塞IO是指當用戶進程發出read操做時,若是kernel中的數據尚未準備好,那麼它並不會block用戶進程,而是馬上返回一個error。從用戶進程角度講 ,它發起一個read操做後,並不須要等待,而是立刻就獲得了一個結果。用戶進程判斷結果是一個error時,它就知道數據尚未準備好,因而它能夠再次發送read操做。一旦kernel中的數據準備好了,而且又再次收到了用戶進程的system call,那麼它立刻就將數據拷貝到了用戶內存,而後返回。

八、同步和異步

 所謂同步就是一個任務的完成須要依賴另一個任務時,只有等待被依賴的任務完成後,依賴的任務才能算完成,這是一種可靠的任務序列。要麼成功都成功,失敗都失敗,兩個任務的狀態能夠保持一致。

 所謂異步是不須要等待被依賴的任務完成,只是通知被依賴的任務要完成什麼工做,依賴的任務也當即執行,只要本身完成了整個任務就算完成了。至於被依賴的任務最終是否真正完成,依賴它的任務沒法肯定,因此它是不可靠的任務序列

九、一行代碼實現九九乘法表

for  i  in  range(1,10):
    for j  in  range(1,i+1):
        print('{}*{}={}'.format(j,i,i*j) ,end='  ')
    print('\n',end='')

 

ret ='\n'.join([ ' '.join(['{}*{}={}'.format(y,x,x*y)  for y  in range(1,x+1) ]) for x  in range(1,10)  ])
print(ret)

 十、類的繼承

十一、*args和**kwargs

*args能夠傳遞任意數量的的位置參數,以元組的形式存儲

**kwargs能夠傳遞任意數量的關鍵字參數,以字典的形式存儲

*args和**kwargs能夠同時定義在函數中,但必須*args放在**kwargs前面

def  foo(*args,**kwargs):
    print('*args',*args,)
    print('args',args)
    print('kwargs',kwargs)

foo(1,x=1,**{'name':'dog'})

結果
*args 1
args (1,)
kwargs {'x': 1, 'name': 'dog'}

12 、lambda函數

lambda函數比較方便,匿名函數,通常用來給filter,map這樣的函數式編程服務,做爲回調函數傳遞給某些應用,好比消息處理

1三、裝飾器

def outer(func,*args):
    def  inner(*args):
        print('先洗蘋果')
        ret = func()
        print('吃完了')
        return ret
    return inner

@outer
def eat():
    print('吃蘋果')

eat()

裝飾器的本質:裝飾器 = 高階函數 + 函數嵌套 + 閉包

高階函數:把函數當作參數傳給另一個函數,返回值中包含函數。

裝飾器的功能:就是在不改變原函數的調用方式的狀況下,在這個函數的先後加上擴展功能

1四、做用域

一、做用域即範圍:全局範圍(內置名稱空間和全局名稱空間屬於該範圍):全局存活,全局有效      局部範圍(局部名稱空間屬於該範圍):臨時存活,局部有效

二、做用域關係是在函數定義階段就已經固定的,與函數調用的位置無關

三、查看做用域 :globals()全局變量,locals()局部變量

當 Python 遇到一個變量的話他會按照這樣的順序進行搜索:
本地做用域(Local)→當前做用域被嵌入的本地做用域(Enclosing locals)→全局/模塊做用域(Global)→內置做用域(Built-in)

 1五、閉包函數

定義:若是在一個內部函數裏,對在外部做用域(但不是在全局做用域)的變量進行引用,那麼內部函數就被認爲是閉包
建立一個閉包必須知足如下幾點:
  1. 必須有一個內嵌函數
  2. 內嵌函數必須引用外部函數中的變量
  3. 外部函數的返回值必須是內嵌函數
def foo():
    name = 'foo'
    def  inner():
        print(name)
    return inner

ret = foo()
ret()

 1六、cookies和session的區別

cookie的由來 :因爲http請求是沒有狀態的,每次請求都是獨立的。

什麼是cookie:就是服務端設置而後保存在瀏覽器上的字符串、鍵值對

服務端控制着響應,在想盈利可讓瀏覽器在本地保存cookie鍵值對,下一次請求時攜帶這個cookie值。

cookie的應用:一、登陸,七天免登陸。二、記錄用戶瀏覽器習慣。3.簡單的投票限制。

session是保存在字典裏的鍵值對,必須依賴於cookie。

優點,相對於cookie安全,存數據多,可是佔用資源。

1七、Django中的MTV分別表明什麼:

M表明什麼model(模型):負責業務對象和數據對象

T表明Template(模板):負責如何把頁面展現給用戶

V表明Views(視圖):負責業務邏輯,並在適當的時候調用model和template

1八、什麼是同源策略

同源策略是一種約定,它是瀏覽器最核心也是最基本的安全功能,若是缺乏同源策略,則瀏覽器的正常功能都會受到影響,能夠說web是構建在同源策略基礎之上的,瀏覽器只是針對同源策略的一種實現。

所謂同源是指,域名,協議,端口相同。

1九、jsonp

jsonp是json用來跨域的一個東西,原理是經過script標籤的跨域特性來繞過同源策略

jsonp必定是GET請求

20、ajax經常使用的參數

URL:發送請求的地址

data:發送到服務器的數據,當前ajax請求要攜帶的數據,是一個json的object對象,ajax方法就會默認地把它編碼成某種格式

processdata:生命當前data數據是否進行轉碼或者預處理,默認爲True

contentType:默認值「application/x-www-form-urlencoded」,發送請求至服務器時內容編碼類型,用來指明當前請求的數據編碼格式,若是想以其餘方式提交數據,即向服務器發送一個json字符串traditional:通常默認爲True,通常是咱們的data數據有數組時會用到 :data:{a:22,b:33,c:["x","y"]},traditional爲false會對數據進行深層次迭代;

2一、csrf

{%  csrf_token   %}

 Django中內置了一個專門處理csrf問題的中間件

一、在render返回頁面的時候,在頁面塞了一個隱藏的input標籤,

二、在提交post數據的時候,進行校驗,若是校驗不經過就拒絕此次請求。

2二、數據庫mysql知識點

mysql是基於一個socket編寫的C/S架構的軟件

視圖:用戶建立的一張虛擬表,用戶只須要使用其名稱便可獲取結果,只能夠作查詢用。

觸發器:對某張表進行增刪改查時,對操做先後自定義操做。

存儲過程:爲了完成特定功能的sql語句集,進過編譯後存儲在數據庫中,用戶經過制定存儲過程的名字並制定參數來調用存儲過程。

存儲過程的優勢:

              a、用於替代程序寫sql語句,實現程序與sql的解耦

              b、基於網絡傳輸,傳別名的數據量小,而直接傳sql的數據量大

事務:事務用於將某些操做的多個SQL做爲原子性操做,一旦有某一個出現錯誤,便可回滾到原來的狀態,從而保證數據庫數據的完整性

mysql的數據基本類型:

       a、數值類型:整數類型,浮點型,位類型,

       b、日期類型

    c、字符串類型:char類型(固定長度),varchar類型(可變長度)

       d、枚舉類型(enum)和集合類型(set)

              枚舉類型(enum):單選,只能在給定的範圍選一個值

              集合類型(set)    :多選,在給定的範圍內選一個或者一個以上的值

 2二、生成器、迭代器和可迭代對象區別和應用?

生成器:1. 列表生成式的[ ]改成( )  2. 函數中包含yield 3.生成器能夠節省內存 4.生成器就是迭代器的一種

迭代器:可迭代對象執行obj.__iter__()獲得的結果就是迭代器對象

爲什麼要有迭代器?
對於序列類型:字符串、列表、元組,咱們可使用索引的方式迭代取出其包含的元素。但對於字典、集合、文件等類型是沒有索引的,若還想取出其內部包含的元素,則必須找出一種不依賴於索引的迭代方式,這就是迭代器
 可迭代對象:可迭代對象指的是內置有__iter__方法的對象

23、with 上下文機制原理?
上下文管理器是能夠在with語句中使用,擁有__enter__和__exit__方法的對象。
# coding:utf-8
class   Foo():
    def __enter__(self):
        print('開始了')
    def __exit__(self, exc_type, exc_val, exc_tb):
        print('結束了')

obj = Foo()


with  obj:
    print('我在中間')

 24、staticmethod、classmethod,property

@property屬性方法,僅有一個self參數,調用時不用加()。

@classmethod把一個方法變成類方法,不須要依託任何對象,當一個方法只使用了累的靜態方法是,就給這個方法加上,默認傳cls參數

@staticmethod在徹底面向對象的過程當中,若是一個函數既和對象沒有關係,也和類沒有關係,那麼就用@staticmethod,將這個函數變成一個靜態方法。類方法和靜態方法都是類調用,類方法有一個默認參數cls,表明這個類,靜態方法沒有默認參數,就像函數同樣。

 

class   Foo():
    @classmethod
    def eat(cls):
        print('吃屎')
    @property
    def play(self):
        print('打籃球')
    @staticmethod
    def get():
        print('name  is  dog')

Foo.eat()
Foo.get()

obj = Foo()
obj.play
相關文章
相關標籤/搜索