第二次考試題

=========全棧10期考試題=========
1,Python自帶的數據類型。
#   -- Python3中有六個標準的數據類型
#      -- 數字,字符串,列表,元組,集合,字典
2,簡述深淺拷貝。
#-- 首先咱們知道Python的引用跟對象是分離的,
#     那咱們的直接賦值其實就是對象的引用,也能夠理解爲對象取一個別名
#  -- 淺拷貝  
#         --對於可變對象而言是建立一個具備相同的類型,相同的值但id不一樣的對象
#            若是有子對象,這些對象和原始對象的子對象是同一個引用。
#         --對於不可變對象而言,淺拷貝只拷貝引用。
#   -- 深拷貝是拷貝對象,開闢新的內存空間,包括子對象,互不影響。
3,== 和 is 的區別。
#  -- == 比較的是value 也就是值是否相同。 is 比較的是id (內存地址)也就是是不是同一個對象。
4,*args 和 **kwargs 的區別。
# -- *args 接收n個位置參數,轉化成元組。
#   -- **kwargs 接收n個關鍵字參數,轉化成字典。
5,@staticmethod 和 @classmethod 的區別。
#   -- 二者很是的類似,具體使用上仍是有細微的區別。
#      classmethod 必須使用類對象做爲第一個參數,而 staticmethod 則能夠不傳遞任何參數。
#   -- classmethod 關注對象和對象內部的屬性。
6,什麼是lambda表達式?它的好處?
#   -- lambda是Python的一個匿名函數,表達式爲 lambda argument_list: expression
#   -- 好處是簡單邏輯的時候能夠省去函數定義過程,並且不用思考函數命名問題,讓代碼更加精簡。
7,用過什麼標準庫和三方庫。
#一、python的標準庫是隨着pyhon安裝的時候默認自帶的庫;
#二、python的第三方庫,須要下載後安裝到python的安裝目錄下。不一樣的第三方庫安裝及使用方法不一樣。
#三、它們調用方式是同樣的,都須要用import語句調用。簡單的說,一個是默認自帶不須要下載安裝的庫,一個是須要下載安裝的庫。它們的調用方式是同樣的。
8, range 和 xrange 的區別。
# -- 用法徹底相同,返回對象不一樣。range 返回列表, xrange返回生成器。
9,進程,線程,協程區別。
#   -- 進程 是操做系統進行資源分配和調度的基本單位,是操做系統的結構基礎。每一個進程都獨享系統的一部分資源。
#   -- 線程是進程的一個執行單元,是CPU調度的最小單位,每一個進程至少有一個線程。一個進程下多個線程共享進程全部資源。
#   -- 協程 一個線程能夠開多個協程,一個進程也能夠單獨擁有多個協程。
#   -- 進程和線程都是同步機制,協程是異步機制。協程能夠保留上一次的執行狀態,
#      每次過程重入時,至關於進入上一次調用狀態,協程只有在I/O密集型操做纔會提升效率.
10, 查看下列的輸出結果
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]
   f(3) # [0,1,0,1,4]
11, 查看輸出結果
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
   Child2.x = 3
   print(Parent.x, Child1.x, Child2.x) # 1 2 3
12,如下代碼的輸出是什麼?(3分)

def multipliers():
    return [lambda x:i*x for i in range(4)]
print( [m(2) for m in multipliers() ])html

   def mul():
      return [lambda x:i*x for i in range(4)]
   print [m(2) for m in mul()]  # 6 6 6 6
13, 用盡可能多的方式寫出單例模式。
#-- https://www.cnblogs.com/huchong/p/8244279.html
14,列表去重(不能使用集合)。
 list1 = [9,4,2,5,8,4,5,3]
   new_list = []
   for i in list1:
      if i not in new_list:
         new_list.append(i)

   new_list = {}.fromkeys(list1).keys()
15,

參考下面代碼片斷:(2分)python

請在Context類下添加完成該類的實現。linux

 class Context(object):
      def __enter__(self):
         print("do something before")
         return self
      def __exit__(self,exc_type,exc_val,exc_tb):
         return print("do something after")
      def do_something():
         return print("do something")
   with Context() as ctx:
      ctx.do_something()
#   python執行with-as 的時候 會調用__enter__方法,而後該函數的返回值傳給as後指定的變量,
#   以後會執行with-as 下面的代碼塊,不管該代碼塊中出現了什麼異常,都會在離開時候執行__exit__
 #  __exit__也能夠作一些異常的監控和捕獲。
16, 簡述cookie 和 session。
#    -- cookie機制採用的是在客戶端保持狀態的方案,做用就是爲了解決HTTP無狀態的缺陷。
#    -- session機制採用的是一種在客戶端與服務端之間保持狀態的解決方案,因爲採用服務器端
#      保持狀態的方案在客戶端也要保存標識,session機制也要藉助於cookie機制達到目的。
17, 列舉Linux經常使用命令。
#   -- ls ls-la cd touch mkdir tar rm mv .....
18, 連表查詢時,inner join和left join的區別。
#   -- left/right join 有主表和從表 left join 主表就是左側表
#      主表的數據會所有顯示,從表數據只顯示關聯部分匹配的數據,無匹配的數據用null補全
#   -- inner join 只顯示兩個表關聯條件匹配的數據
19,簡述SQl注入的攻擊原理以及如何在代碼層面防止?
#   -- SQL注入就是把sql命令插入到web表單後提交到所在頁面的請求,從而達到欺騙服務器執行惡意sql目的。
#      SQL注入只對sql語句的準備也就是編譯過程有破壞
#   -- 代碼層面 引發的主要緣由在於後臺寫SQL語句的時候用了字符串拼接
#   -- 解決辦法 1 採用預編譯語句集  2,對傳過來的參數進行過濾 好比正則檢查是否包含非法字符等
20,分別編寫一個或者多個:filter/map/reduce 的使用示例。
#   -- filter 函數是一個篩選函數參數(函數,可迭代對象) 
#      filter將傳入的函數依次做用到序列的每一個元素,True則返回 False則不返回。
#      list1 = [1,2,3,4,5,6,7,8,9]
#      def a(x):
#         return x%2==1
#      print(filter(a, list1)) # 返回值類型是filter對象 生成器對象
#   -- map 函數是一個計算函數 參數(函數,可迭代對象)
#      會將可迭代對象的值通過函數計算後返回
#      my_map = map(lambda x:x+1, range(10))
#      print(list(my_map)) # 返回值類型是map對象 生成器對象
#   -- reduce 函數也是一個計算函數 參數(函數,可迭代對象)
#      會將可迭代對象的值依次在函數中累計運算 Python3中須要導入
#      from functools import reduce
#      my_reduce = reduce(lambda x,y:x+y, range(10))
#      print(my_reduce) # 返回 計算後結果 45
21,django裏queryset的 get,filter,方法的區別。
#   -- get返回一個對象,獲取不到會報錯。
#   -- filter返回一個queryset,獲取不到返回None
22,django內置的緩存機制。
#   -- 緩存機制 每次有請求進來 先去看緩存是否有 是否過時 
#      若是緩存沒有或者已過時 就要走視圖 走數據庫
#   -- django的緩存有六種
#      -- memchched緩存
#      -- 數據庫緩存
#      -- 文件系統緩存
#      -- 本地內存緩存
#      -- 虛擬緩存
#      -- 自定義緩存
#   -- 應用
#      -- 全棧緩存 粒度大 中間件配置
#      -- 單獨視圖緩存 粒度適中 視圖上方加裝飾器或者在路由器配置
#   https://blog.csdn.net/Ayhan_huang/article/details/78042511

23,談談你對Http協議的認識。
#   -- Http 超文本傳輸協議,基於TCP/IP協議來傳輸數據
#   -- 無狀態 無鏈接的 單向的 分爲請求協議和響應協議
24,簡述MVC和MTV。
#MTV,Model  Template   View
#MVC,Model  View       Controller
            
#本質上就是對目錄結構的劃分;
#    - django,MTV
#    - flask,MTV
25,簡述django的請求的生命週期。
#wsgi------>process_request------>process_view------>process_excption------>process_template------>process_responce------>wsgi
26,django中filter和exclude的區別。
#filter是的到符合過濾的信息
#exclude和它正好相反,獲得除了符合的全部信息
27,django中values 和 value_list區別。
#values  返回的是字典
#values  返回的是列表
28,簡述django中間件的流程以及應用場景。
#應用場景認證組件,頻率組件,權限組件

 


29,編寫原生SQL語句:
30,什麼是xss攻擊。 csrf
# -- XSS攻擊是向網頁中注入惡意腳本,用在用戶瀏覽網頁時,在用戶瀏覽器中執行惡意腳本的攻擊。
#   -- XSS分類,反射型xss ,存儲型xss
#   -- 反射型xss又稱爲非持久型xss,攻擊者經過電子郵件等方式將包含注入腳本的連接發送給受害者,
#      受害者經過點擊連接,執行注入腳本,達到攻擊目的。
#   -- 持久型xss跟反射型的最大不一樣是攻擊腳本將被永久的存放在目標服務器的數據庫和文件中,多見於論壇
 #     攻擊腳本連同正常信息一同注入到帖子內容當中,當瀏覽這個被注入惡意腳本的帖子的時候,惡意腳本會被執行
#   -- 防範措施 1 輸入過濾  2 輸出編碼  3 cookie防盜
#      1,輸入過濾 用戶輸入進行檢測 不容許帶有js代碼
#      2,輸出編碼 就是把咱們的腳本代碼變成字符串形式輸出出來
#      3,cookie加密

# 31,flask和django區別。
#django 是大而全,內置不少模塊,能夠拿來就用,比較適合複雜的項目
#flask 是小而精悍,比較簡潔,適合簡單環境的項目,可是第三方模塊比較豐富,經過模塊能夠完成像django同樣複雜的環境

# 32,手寫Falsk的hello world。
# 33,簡述Flask中的before_request 和 after_request的特色以及應用。
#   before_request在視圖函數執行以前執行,after_request是在視圖函數執行以後執行,至關於django中間件的process_request和process_response.
# 34,flask中藍圖是什麼以及做用。
#  1. 目錄結構的劃分(解耦)。
#  2. 單藍圖中應用before_request
#  3. URL劃分
#       app.register_blueprint(account,url_prefix='/user')
#  4. 反向生成URL
#    url_for('藍圖.函數名')
#    url_for('藍圖.endpoint')
#    url_for('藍圖.endpoint',nid=1)
                
#    print(url_for('account.login'))
#    print(url_for('account.logout'))
#    print(url_for('code.index'))
# 35,列舉使用過的Flask組件。
#flask-session,wtforms,DBUtils
# 36,如何查看指定目錄下的全部文件。
# 37,Python如何進行解壓縮文件。
#.gz .tar  .tgz .zip .rar

#簡介
#gz: 即gzip,一般只能壓縮一個文件。與tar結合起來就能夠實現先打包,再壓縮。
#tar: linux系統下的打包工具,只打包,不壓縮
#tgz:即tar.gz。先用tar打包,而後再用gz壓縮獲得的文件
#zip: 不一樣於gzip,雖然使用類似的算法,能夠打包壓縮多個文件,不過度別壓縮文件,壓縮率低於tar。
#rar:打包壓縮文件,最初用於DOS,基於window操做系統。壓縮率比zip高,但速度慢,隨機訪問的速度也慢。
# 38,Python如何讀取excel的內容。
   # xlrd xlwt
# 39,Flask如何控制長傳文件大小。
# 40,websocket,長輪詢,輪詢的區別。
#  1. 輪詢
#    設置一個定時器,自動按照規定時間刷新;
#    缺點:
#    - 延遲 
#    - 浪費資源
                    
#  2. 長輪訓
#    後臺將用戶請求hang住,最多hang 30s;
            
            
#  3. websocket協議 
#    Http協議 
#    websocket協議:鏈接不斷開
# 41,爲何要使用長輪詢或websocket。
#- 長輪訓,後臺將用戶請求hang住,最多hang 30s;相比較輪訓,對服務器的壓力較小;優勢是兼容性好 
#- websocket,鏈接不斷開,對服務器壓力較小服務器能夠向客戶端主動推送消息;缺點是早起瀏覽器不支持;
# 42,flask中如何實現websocket。
#下載第三方模塊 gevent-websocket
# 43,簡述websocket握手流程
#- 獲取用戶請求發來的值, Sec-WebSocket-Key=mnwFxiOlctXFN/DeMt1Amg==
#- 將 "mnwFxiOlctXFN/DeMt1Amg==" + magic_string 
#- 將 "mnwFxiOlctXFN/DeMt1Amg==" + '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'
#- 將 hashlib.sha1("mnwFxiOlctXFN/DeMt1Amg==" + '258EAFA5-E914-47DA-95CA-C5AB0DC85B11')
#- 將 ret = b64encode(hashlib.sha1("mnwFxiOlctXFN/DeMt1Amg==" + '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'))
#- 將加密後的結果 ret 返回給客戶端
#注意: 握手成功以後才能收發數據
# 44,簡述websocket數據解密流程。
#- 解密 
#  - 取第二個字節的後7位
#  - 127
#  - 126 
#  - <=125
# 45,你用websocket作過什麼。
#排行榜
相關文章
相關標籤/搜索