程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python && C++ 面經

編輯:Python

C/C++中面向對象的相關知識

面向對象程序設計(Object-oriented programming,OOP)有三大特征 ——封裝、繼承、多態

封裝:把客觀事物封裝成抽象的類,並且類可以把自己的數據和方法只讓可信的類或者對象操作,對不可信的進行信息隱藏。
關鍵字:public, protected, private。不寫默認為 private。
1.public 成員:可以被任意實體訪問。
2.protected 成員:只允許被子類及本類的成員函數訪問。
3.private 成員:只允許被本類的成員函數、友元類或友元函數訪問。

繼承:基類(父類)——> 派生類(子類)

多態:即多種狀態(形態)。簡單來說,我們可以將多態定義為消息以多種形式顯示的能力。多態是以封裝和繼承為基礎的。
C++ 多態分類及實現:
1.重載多態(Ad-hoc Polymorphism,編譯期):函數重載、運算符重載
2.子類型多態(Subtype Polymorphism,運行期):虛函數
3.參數多態性(Parametric Polymorphism,編譯期):類模板、函數模板
4.強制多態(Coercion Polymorphism,編譯期/運行期):基本類型轉換、自定義類型轉換

Python中生成器的相關知識

我們創建列表的時候,受到內存限制,容量肯定是有限的,而且不可能全部給他一次枚舉出來。Python常用的列表生成式有一個致命的缺點就是定義即生成,非常的浪費空間和效率。

如果列表元素可以按照某種算法推算出來,那我們可以在循環的過程中不斷推算出後續的元素,這樣就不必創建完整的list,從而節省大量的空間。在Python中,這種一邊循環一邊計算的機制,稱為生成器:generator

要創建一個generator,最簡單的方法是改造列表生成式:

a = [x * x for x in range(10)]
print(a)
b = (x * x for x in range(10))
print(b)
print(list(b))
for i in b:
print(i)
--------結果如下--------------
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
<generator object <genexpr> at 0x10557da50>
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
0
1
4
9
16
25
36
49
64
81

還有一個方法是生成器函數,通過def定義,然後使用yield來支持迭代器協議,比迭代器寫起來更簡單。

def spam():
yield"first"
yield"second"
yield"third"
for x in spam():
print(x)
-------結果如下---------
first
second
third

進行函數調用的時候,返回一個生成器對象。在使用next()調用的時候,遇到yield就返回,記錄此時的函數調用位置,下次調用next()時,從斷點處開始。

我們完全可以像使用迭代器一樣使用 generator ,當然除了定義。定義一個迭代器,需要分別實現 iter() 方法和 next() 方法,但 generator 只需要一個小小的yield。

generator還有 send() 和 close() 方法,都是只能在next()調用之後,生成器處於掛起狀態時才能使用的。

python是支持協程的,也就是微線程,就是通過generator來實現的。配合generator我們可以自定義函數的調用層次關系從而自己來調度線程。

Python中裝飾器的相關知識

裝飾器允許通過將現有函數傳遞給裝飾器,從而向現有函數添加一些額外的功能,該裝飾器將執行現有函數的功能和添加的額外功能。

裝飾器本質上還是一個函數,它可以讓已有的函數不做任何改動的情況下增加功能。

接下來我們使用一些例子來具體說明裝飾器的作用:
如果我們不使用裝飾器,我們通常會這樣來實現在函數執行前插入日志:

def foo():
print('i am foo')
def foo():
print('foo is running')
print('i am foo')

雖然這樣寫是滿足了需求,但是改動了原有的代碼,如果有其他的函數也需要插入日志的話,就需要改寫所有的函數,這樣不能復用代碼。
我們可以進行如下改寫:

import logging
def use_log(func):
logging.warning("%s is running" % func.__name__)
func()
def bar():
print('i am bar')
use_log(bar) #將函數作為參數傳入
-------------運行結果如下--------------
WARNING:root:bar is running
i am bar

其中,use_log函數就是裝飾器,它把我們真正想要執行的函數bar()封裝在裡面,返回一個封裝了加入代碼的新函數,看起來就像是bar()被裝飾了一樣。

但是這樣寫還是不夠隱式,我們可以通過@語法糖來起到bar = use_log(bar)的作用。

import logging
def use_log(func):
def wrapper(*args, **kwargs):
logging.warning('%s is running' % func.__name__)
return func(*args, **kwargs)
return wrapper
@use_log
def bar():
print('I am bar')
@use_log
def haha():
print('I am haha')
bar()
haha()
------------結果如下------------
WARNING:root:bar is running
I am bar
WARNING:root:haha is running
I am haha

TCP/IP四層模型的相關概念

TCP/IP四層模型:

1.應用層:負責各種不同應用之間的協議,如文件傳輸協議(FTP),遠程登陸協議(Telnet),電子郵件協議(SMTP),網絡文件服務協議(NFS),網絡管理協議(SNMP)等。

2.傳輸層:負責可靠傳輸的TCP協議、高效傳輸的UDP協議。

3.網絡層:負責尋址(准確找到對方設備)的IP,ICMP,ARP,RARP等協議。

4.數據鏈路層:負責將數字信號在物理通道(網線)中准確傳輸。

四層模型邏輯:
發送端是由上至下,把上層來的數據在頭部加上各層協議的數據(部首)再下發給下層。

接受端則由下而上,把從下層接收到的數據進行解密和去掉頭部的部首後再發送給上層。

層層加密和解密後,應用層最終拿到了需要的數據。

OSI七層模型的相關概念


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved