1. 程式人生 > 實用技巧 >面試基礎02

面試基礎02

1.

請編寫一個函式實現將IP地址轉換成一個整數。

如 10.3.9.12 轉換規則為:
        10            00001010

         3            00000011

         9            00001001

        12            00001100

再將以上二進位制拼接起來計算十進位制結果:00001010 00000011 00001001 00001100 =def ipAddr_union(ip_addr):
    li = ip_addr.split('.')
    new_li = []
    print(li)   # ['10', '3', '9', '12']
    for
i in li: numStr = str(bin(int(i))) binStr = numStr.split('b')[1] # print(binStr) while len(binStr)< 8: binStr = '0'+binStr new_li.append(binStr) print(new_li) res_str = '' for i in new_li: res_str += i print(res_str) # 00001010000000110000100100001100
res_int = int(res_str, 2) print(res_int) # 167971084 ipAddr_union('10.3.9.12')
請編寫一個函式實現將IP地址轉換成一個整數。

2.

import sys
sys.getrecursionlimit()    # 獲取最大遞迴層數  預設是1000(0-999)
sys.setrecursionlimit(2000)    # 設定最大遞迴層數
python遞迴的最大層數?

3.

通過程式碼實現如下轉換:

二進位制轉換成十進位制:v = “0b1111011”

十進位制轉換成二進位制:v 
= 18
 八進位制轉換成十進位制:v = “011”
 十進位制轉換成八進位制:v = 30
 十六進位制轉換成十進位制:v = “0x12”
 十進位制轉換成十六進位制:v = 87 ''' # hex()轉16進位制;oct()轉8進位制;bin()轉二進位制;int()轉十進位制 # 二進位制轉換成十進位制 v = "0b1111011" print(int(v, 2)) # 123 # 十進位制轉換成二進位制 v = 18 print(bin(v)) # 0b10010 # 八進位制轉換成十進位制 v = "011" print(int(v, 8)) # 9 # 十進位制轉換成八進位制: v =30 print(oct(v)) # 0o36 # 十六進位制轉換成十進位制 v = "0x12" print(int(v, 16)) # 18 # 十進位制轉換成十六進位制: v = 87 print(hex(v)) # 0x57 '''
通過程式碼實現進位制轉換:

4.

b 位元bit / 位
B——位元組           1 B = 8b(8個bit/ 位)一個位元組(byte)等於8位(bit)
KB——千位元      1 kB = 1024 B (kB - kilobajt)
MB——兆位元     1 MB = 1024 kB (MB - megabajt)
GB——吉位元     1 GB = 1024 MB (GB - gigabajt)
b、B、KB、MB、GB 的關係?

5.

位:"位(bit)"是電子計算機中最小的資料單位。每一位的狀態只能是0或1。
 
位元組:8個二進位制位構成1個"位元組(Byte)",它是儲存空間的基本計量單位。1個位元組可以儲存1個英文字母或者半個漢字,換句話說,1個漢字佔據2個位元組的儲存空間。
位和位元組的關係?

6.

CPython
官方版本的直譯器:CPython。這個直譯器是用C語言開發的,所以叫CPython。在命令列下執行python就是啟動CPython直譯器。CPython是使用最廣且被的Python直譯器。
 
IPython
IPython是基於CPython之上的一個互動式直譯器,也就是說,IPython只是在互動方式上有所增強,但是執行Python程式碼的功能和CPython是完全一樣的。
CPython用>>>作為提示符,而IPython用In [序號]:作為提示符。
 
PyPy
PyPy是另一個Python直譯器,它的目標是執行速度。PyPy採用JIT技術,對Python程式碼進行動態編譯(注意不是解釋),所以可以顯著提高Python程式碼的執行速度。
 
絕大部分Python程式碼都可以在PyPy下執行,但是PyPy和CPython有一些是不同的,這就導致相同的Python程式碼在兩種直譯器下執行可能會有不同的結果。如果你的程式碼要放到PyPy下執行,就需要了解PyPy和CPython的不同點。
 
Jython
Jython是執行在Java平臺上的Python直譯器,可以直接把Python程式碼編譯成Java位元組碼執行。
 
IronPython
IronPython和Jython類似,只不過IronPython是執行在微軟.Net平臺上的Python直譯器,可以直接把Python程式碼編譯成.Net的位元組碼。
Python直譯器種類以及特點?

7.

編譯型(如C語言):編譯型-------->GCC編譯器-------->機器語言

特點:執行效率高 開發效率低 跨平臺性差 其他(現在大多數語言都是編譯型)

解釋型(python語言)解釋型-------->直譯器(解釋一行執行一行)

特點:執行效率低 開發效率高 跨平臺性高


編譯型語言:
     使用專門的編譯器,針對特定的平臺,將高階語言原始碼一次性的編譯成可被該平臺硬體執行的機器碼,幷包裝成該平臺所能識別的可執行性程式的格式。
   特點:
     在編譯型語言寫的程式執行之前,需要一個專門的編譯過程,把原始碼編譯成機器語言的檔案.
   執行方式:
     原始碼 ———> 編譯(一次編譯) ———>目的碼———>執行(多次執行)———>輸出
 
解釋型語言:
     使用專門的直譯器對源程式逐行解釋成特定平臺的機器碼並立即執行。
  特點:
     解釋型語言不需要事先編譯,其直接將原始碼解釋成機器碼並立即執行,所以只要某一平臺提供了相應的直譯器即可執行該程式。
  執行方式:
    原始碼 ———> 直譯器(每次執行都需要解釋)———>輸出   
 
  編譯型: C c++, c#
  解釋型: python PHP ruby, java
簡述解釋型和編譯型程式語言?

8.

Python是一門優秀的綜合語言, Python的宗旨是簡明、優雅、強大,<br>在人工智慧、雲端計算、金融分析、大資料開發、WEB開發、自動化運維、測試等方向應用廣泛
為什麼學習Python?

9.

Python:輕量級、易學、自由/開放原始碼軟體、可移植性、支援面向物件、豐富的庫、規範的程式碼。
Java:優點:開源性,功能強大,庫多
         缺點:編譯速度 比較慢,不完全
PHP:優點:效能很強,配合簡單,穩定,容易部署。
         缺點:函式命名不規範,駝峰法和下劃線,傳參位置不一。
C:    優點:能操縱底層,能細粒度優化效能。
         缺點:1、是面向過程的,2、執行時型別檢查不可用,3、不提供名稱空間功能,4、構       
         造函式和解構函式不可用。       
C#:  優點: 強大的.NET Framework託管程式碼集合類,較簡單的語言特性。WEB應用程式   
         開發速度快。
         缺點:底層和高效能不合適,Windows平臺以外支援有限。
C++: 優點:效能比較高,可進化型。
         缺點: 難學,門檻高
Python和Java、PHP、C、C#、C++等其他語言的對比?

10.

'''
求結果:
    v1 = 1 or 3

    v2 = 1 and 3

    v3 = 0 and 2 and 1

    v4 = 0 and 2 or 1

    v5 = 0 and 2 or 1 or 4

    v6 = 0 or False and 1
'''


>>>print(1 or 3)
1
>>>print(1 and 3)
3
>>>print(0 and 2 and 1)
0
>>>print(0 and 2 or 1)
1
>>>print(0 and 2 or 1 or 4)
1
>>>print(0 or False and 1)
False
and\or

11.

機器碼(machine code),學名機器語言指令,有時也被稱為原生碼(Native Code),是電腦的CPU可直接解讀的資料。
通常意義上來理解的話,機器碼就是計算機可以直接執行,並且執行速度最快的程式碼。
用機器語言編寫程式,程式設計人員要首先熟記所用計算機的全部指令程式碼和程式碼的涵義。手程式設計序時,程式設計師得自己處理每條指令和每一資料的儲存分配和輸入輸出,還得記住程式設計過程中每步所使用的工作單元處在何種狀態。這是一件十分繁瑣的工作,編寫程式花費的時間往往是實際執行時間的幾十倍或幾百倍。而且,編出的程式全是些0和1的指令程式碼,直觀性差,還容易出錯。現在,除了計算機生產廠家的專業人員外,絕大多數的程式設計師已經不再去學習機器語言了。
機器語言是微處理器理解和使用的,用於控制它的操作二進位制程式碼。8086到Pentium的機器語言指令長度可以從1位元組到13位元組。儘管機器語言好像是很複雜的,然而它是有規律的。存在著多至100000種機器語言的指令。這意味著不能把這些種類全部列出來。總結:機器碼是電腦CPU直接讀取執行的機器指令,執行速度最快,但是非常晦澀難懂,也比較難編寫,一般從業人員接觸不到。
 
 
位元組碼(Bytecode)是一種包含執行程式、由一序列 op 程式碼/資料對 組成的二進位制檔案。位元組碼是一種中間碼,它比機器碼更抽象,需要直譯器轉譯後才能成為機器碼的中間程式碼。
通常情況下它是已經經過編譯,但與特定機器碼無關。位元組碼通常不像原始碼一樣可以讓人閱讀,而是編碼後的數值常量、引用、指令等構成的序列。
位元組碼主要為了實現特定軟體執行和軟體環境、與硬體環境無關。位元組碼的實現方式是通過編譯器和虛擬機器器。編譯器將原始碼編譯成位元組碼,特定平臺上的虛擬機器器將位元組碼轉譯為可以直接執行的指令。位元組碼的典型應用為Java bytecode。
位元組碼在執行時通過JVM(JAVA虛擬機器)做一次轉換生成機器指令,因此能夠更好的跨平臺執行。
總結:位元組碼是一種中間狀態(中間碼)的二進位制程式碼(檔案)。需要直譯器轉譯後才能成為機器碼。
位元組碼和機器碼的區別?

12.

Python2預設的字元編碼是ASCII,預設的檔案編碼也是ASCII ;
python3預設的字元編碼是unicode,預設的檔案編碼是utf-8。
 
在python2裡,將string處理為原生的bytes型別。
python3把字串的編碼改成了unicode, 還把str和bytes做了明確區分, str就是unicode格式的字元,bytes是單純二進位制。
 
print語句沒有了,取而代之的是print()函式。
 
在python 2.x中/除法整數相除的結果是一個整數,把小數部分完全忽略掉,浮點數除法會保留小數點的部分得到一個浮點數的結果。
在python 3.x中/除法不再這麼做了,對於整數之間的相除,結果也會是浮點數。
 
捕獲異常的語法由 except exc, var 改為 except exc as var。
 
Python 2.x 中反引號``相當於repr函式的作用
Python 3.x 中去掉了``這種寫法,只允許使用repr函式
 
Py3.X去除了long型別,現在只有一種整型——int,但它的行為就像2.X版本的long
 
在 Python 2 中 有range()和xrange() ,一般使用xrange()建立迭代物件。
在 Python 3 中,range() 是像 xrange()那樣實現,xrange()內建函式已經刪除。
列舉 Python2和Python3的主要區別?

13.

python2裡,有兩種方法獲得一定範圍內的數字:range(),返回一個列表,還有xrange(),返回一個迭代器。
python3裡,range()返回迭代器,xrange()不再存在。
xrange和range的區別?

14.

'''
用一行程式碼實現數值交換:
     
 a = 1
 
     b = 2
print(a)
print(b)
print(a,b=b,a)





Python3和Python2中 int 和 long的區別?
python2有非浮點數準備的int和long型別。int型別最大值不能超過sys.maxint,而且這個最大值是平臺相關的。
可以通過在數字的末尾附上一個L來定義長整型,顯然,它比int型別表示的數字範圍更大。
python3裡,只有一種整數型別int,大多數情況下,和python2中的長整型類似。





檔案操作時:xreadlines和readlines的區別?(python2.3)
返回型別不同:
readlines()讀取所有行然後把它們作為一個字串列表返回。
xreadlines返回的是生成器
 
readline()方法讀取整行,包括行結束符,並作為字串返回;
        每次讀取一行,返回的是一個字串物件,保持當前行的記憶體






列舉布林值為False的常見值?

bool(0)  
bool(None) 
bool("")
bool(()) 
bool([]) 
bool({})


字串、列表、元組、字典每個常用的5個方法?
字串:索引、查詢find('e')、移除空白strip()、長度len()、替換replace('h', 'H')
列表:切片[1:4]、追加append()、插入insert()、修改li[2]="修改"、刪除remove和pop
元組:索引ages[3]、切片name[0:2]、長度len()、建立tuple、刪除del
字典:keys()返回包含字典所有key的列表;values()返回包含字典所有value列表;items()返回一個包含所有鍵值的列表;get()檢視字典key對應的值;len()檢視字典長度。


''''
View Code

15.

(1))pass的作用?
1、空語句 do nothing
2、保證格式完整
3、保證語義完整



(2))Python中的*arg和**kwarg

*args代表位置引數,它會接收任意多個引數並把這些引數作為元組傳遞給函式。
**kwargs代表的關鍵字引數,允許你使用沒有事先定義的引數名。
位置引數一定要放在關鍵字引數的前面。
 
作用:使用*args和**kwargs可以非常方便的定義函式,同時可以加強擴充套件性,以便日後的程式碼維護。

示例如下:
'''
#args
def fun_var_args(farg, *args):
    print "arg:", farg
    for value in args:
        print "another arg:", value
 
fun_var_args(1, "two", 3) # *args可以當作可容納多個變數組成的list
'''
'''
#**kwargs
def fun_var_kwargs(farg, **kwargs):
    print "arg:", farg
    for key in kwargs:
        print "another keyword arg: %s: %s" % (key, kwargs[key])
 
 
fun_var_kwargs(farg=1, myarg2="two", myarg3=3) # myarg2和myarg3被視為key, 感覺**kwargs可以當作容納多個key和value的dictionary

'''




(3)lambda表示式格式以及應用場景?
lambda函式就是可以接受任意多個引數(包括可選引數)並且返回單個表示式值得函式。
     語法:lambda [arg1 [,arg2,.....argn]]:expression
def calc(x,y):
    return x*y
 
# 將上述一般函式改寫為匿名函式:
lambda x,y:x*y
 
  應用:1.lambda函式比較輕便,即用即仍,適合完成只在一處使用的簡單功能。
     2.匿名函式,一般用來給filter,map這樣的函數語言程式設計服務
     3.作為回撥函式,傳遞給某些應用,比如訊息處理。



(4)is和==的區別
==是python標準操作符中的比較操作符,用來比較判斷兩個物件的value(值)是否相等;
 
is也被叫做同一性運算子,這個運算子比較判斷的是物件間的唯一身份標識,也就是id是否相同。



(5)Python垃圾回收機制?
1、回收計數引用為0的物件,釋放其佔用空間
2、迴圈垃圾回收器。釋放迴圈引用物件



(6)簡述Python的深淺拷貝以及應用場景?
匯入模組:import copy
淺拷貝:copy.copy
深拷貝:copy.deepcopy
    淺拷貝指僅僅拷貝資料集合的第一層資料,深拷貝指拷貝資料集合的所有層。   
所以對於只有一層的資料集合來說深淺拷貝的意義是一樣的,比如字串,數字,還有僅僅一層的字典、列表、元祖等.
 
應用:
  淺拷貝在拷貝大量資料且不需要改變內部元素的值的時候,能大量的減少記憶體的使用;
  深拷貝在拷貝大量資料的時候,需要在前後內部元素的內容進行改變的時候,可以修改拷貝出來的模板 。
View Code

16.

1)Python的可變型別和不可變型別?
可變型別:list、dict、set、可變集合
不可變型別:string、int、float、tuple、不可變集合

2)filter、map、reduce的作用?
filter()    # 將符合條件的值過濾出來
map(lambda x:x*x , [1,2,3,4,5])    # 根據提供的函式對指定序列做對映
reduce(function, iterable[, initializer])   # 對引數序列中元素進行累積

3)re的match和search區別?
re.match 從頭開始匹配
re.search 匹配包含
match與search函式功能一樣,match匹配字串開始的第一個位置,search是在字串全域性匹配第一個符合規則的。

4)至少列舉8個常用模組都有那些?
1、sys:用於提供對直譯器相關的訪問以及維護,並有很強的互動功能
2、time: 時間模組
3、os:用於提供作業系統模組
4、ashlib:用於加密相關的操作
5、random:生成隨機變數
6、pickle:用於python特有的類和pthon的資料型別間進行轉換
7、datetime:date和time的結合體
8、re:正則表示式模組

5)一行程式碼實現9*9乘法表
print("\n".join("\t".join(["%s*%s=%s" %(x,y,x*y) for y in range(1, x+1)]) for x in range(1, 10)))

6)什麼是正則的貪婪匹配?
>>>re.search('ab*c', 'abcaxc')
<_sre.SRE_Match object; span=(0, 3), match='abc'>
>>>re.search('ab\D+c', 'abcaxc')
<_sre.SRE_Match object; span=(0, 6), match='abcaxc'>
貪婪匹配:正則表示式一般趨向於最大長度匹配,也就是所謂的貪婪匹配。
非貪婪匹配:就是匹配到結果就好,就少的匹配字元。

7)求結果:
 a. [ i % 2 for i in range(10) ]
 b. ( i % 2 for i in range(10) )

8)求結果:
 a. 1 or 2
 b. 1 and 2
 c. 1 < (2==2)
 d. 1 < 2 == 2
View Code

17.

18.

19.

20.