文章目錄
- 1、python和其他語言的區別
- 2、解釋性語言和編譯性語言
- 3、python幾種解釋器的特點
- 4、位和字節的關係
- 5、PEP8(python代碼規範)
- 6、列舉布爾值爲false的常見值
- 7、python遞歸的最大層數
- 8、ascii、unicode、utf-8、gbk 區別
- 9、字節碼和機器碼的區別
- 10、三元運算規則以及應用場景
- 11、Python2和3的區別
- 12、is和==
- 13、python裏有哪些數據類型(可變、不可變)
- 14、賦值、深淺拷貝
- 15、python垃圾回收機制(cpython)
- 16、列舉常見內置函數
- 17、列舉常用模塊
- 18、生成器、迭代器、可迭代對象
- 19、re的match和search區別
- 20、什麼是正則的貪婪匹配
1、python和其他語言的區別
-
python是一種解釋性語言與C語言和C的衍生語言不同,Python代碼在運行之前不需要編譯。其他解釋型語言還包括PHP和Ruby。
-
Python是動態類型語言,指的是你在聲明變量時,不需要說明變量的類型。你可以直接編寫類似x=111和x="I’m a string"這樣的代碼,程序不會報錯。
2、解釋性語言和編譯性語言
-
解釋性語言:源代碼—>中間代碼—>機器語言,源代碼不能直接翻譯成機器語言,而是先翻譯成中間代碼,再由解釋器對中間代碼進行解釋運行。
-
編譯性語言:只須編譯一次就可以把源代碼編譯成機器語言,後面的執行無須重新編譯,直接使用之前的編譯結果就可以;因此其執行的效率比較高;
解釋性語言 | 編譯性語言 |
---|---|
Python、JavaScript、Shell、Ruby、MATLAB | C、C++、Pascal/Object Pascal(Delphi) |
每執行一次都要翻譯一次 | 只須編譯一次 |
執行效率一般 | 執行效率比較高 |
依賴解釋器,跨平臺性好 | 依賴編譯器,跨平臺性差 |
其中java比較獨特,它是先編譯成.class文件再通過 jvm解釋運行
3、python幾種解釋器的特點
解釋器 | 特點 |
---|---|
cpython | C語言編寫、標準python、垃圾回收利用引用計數 |
jpython | java編寫、編譯從jvm字節碼由jvm執行、利用JVM的垃圾回收和JIT |
IronPython | c#編寫、在CLR上實現了Python、面向.NET平臺、可以利用.NET框架的JIT、垃圾回收等功能 |
PyPy | 使用RPython實現,利用Tracing JIT技術實現的Python、PyPy可以選擇多種垃圾回收方式,如標記清除、標記壓縮、分代等、pypy性能提升非常明顯但第三方庫支持不夠 |
4、位和字節的關係
1字=2字節 (1 word = 2 byte)
1字節=8位 (1 byte = 8bit 或簡寫爲:1B=8b)
術語 | 區別 |
---|---|
位 bit | 計算機基本儲存單元、只能容納0或1 |
字節 byte | 常用的計算機存儲單位、一個字節均爲8位,每個位是0或1 |
字 word | 自然儲存單元、計算機進行數據處理時,一次存取、加工和傳送的數據長度稱爲字 |
一個英文字符和英文標點佔一個字節,一箇中文字符和中文標點佔用2個字節
一個字通常由一個或多個(一般是字節的整數位)字節構成。例如 286 微機的字由 2 個字節組成,它的字長爲 16;486 微機的字由 4 個字節組成,它的字長爲 32 位。
計算機的字長決定了其 CPU 一次操作處理實際位數的多少,由此可見計算機的字長越大,其性能越優越。
5、PEP8(python代碼規範)
縮進 | 每一級縮進使用4個空格 |
每行長度 | 每行最大長度79 |
import | 按照以下順序分組導入:標準庫、相關第三方庫、本地應用/庫特定 |
類名 | 首字母大寫 |
函數名 | 小寫 |
函數方法和參數 | 始終要將 self 作爲實例方法的的第一個參數、cls 作爲類靜態方法的第一個參數 |
… | … |
6、列舉布爾值爲false的常見值
print("1. ", bool(0)) # 零
print("2. ", bool(-0))
print("3. ", bool(None)) # None
print("4. ", bool()) # 空
print("5. ", bool(False)) # false
print("6. ", bool([])) # 空列表
print("7. ", bool(())) # 空元組
print("8. ", bool({})) # 空字典
print("9. ", bool(0j)) # 複數0 在Python中,複數的虛部以j或者J作爲後綴
print("10. ", bool(0.0)) # 浮點0
7、python遞歸的最大層數
默認的在window上的最大遞歸層數是998
# 驗證
def foo(n):
print(n)
n += 1
foo(n)
if __name__ == '__main__':
foo(1)
#得到的最大數爲998,以後就是報錯了:RecursionError: maximum recursion depth exceeded while calling a Python object
8、ascii、unicode、utf-8、gbk 區別
編碼 | 區別 |
---|---|
ascii | 美標、僅字母和符號等、1個字節 |
unicode | 國際通用、所有文字、python默認字符編碼(二進制) |
utf-8 | unicode的一種實現方式、1~4字節、第一個字節和ascii兼容 |
gbk | 國標、字母和中文、2個字節 |
需要注意的是,Unicode只是一個符號集,它只規定了符號的二進制代碼,卻沒有規定這個二進制代碼應該如何存儲。
比如,漢字“嚴”的unicode是十六進制數4E25,轉換成二進制數足足有15位(100111000100101),也就是說這個符號的表示至少需要2個字節。表示其他更大的符號,可能需要3個字節或者4個字節,甚至更多。
9、字節碼和機器碼的區別
機器碼 | 字節碼 |
---|---|
學名機器語言指令 | 相當於2進制代碼 |
由cpu直接執行 | 直譯器轉譯後成爲機器碼 |
10、三元運算規則以及應用場景
三元運算:https://blog.csdn.net/a__int__/article/details/104981310?utm_source=po_vip
規則
應用場景
在賦值變量的時候,可以直接加判斷
11、Python2和3的區別
來源1:https://www.runoob.com/python/python-2x-3x.html
來源2:https://www.cnblogs.com/kendrick/p/7478304.html
python2 | python3 |
---|---|
print語句 | print()函數 |
ASCII str() 類型,unicode() 是單獨的,不是 byte 類型 | Unicode (utf-8) 字符串,以及一個字節類:byte 和 bytearrays。 |
除法:整數相除的結果是一個整數 | 除法:整數之間的相除,結果也會是浮點數 |
異常: except e, var | 異常:except e as var |
range()和xrange() | 只有range(),用法同之前的xrange() |
八進制數可以寫成0o777或0777 | 只能寫成0o777 |
不等運算符: != 和 <> | 不等運算符:!= |
整型:int、long | 整型:只有int(但它的行爲就像2.X版本的long),新增了bytes類型,對應於2.X版本的八位串 |
打開文件:file( … )或 open(…) | 打開文件:open(…) |
鍵盤錄入:raw_input( “提示信息” )、input( “提示信息” ) | 鍵盤錄入:僅保留input( “提示信息” ) |
老式類和新式類 | 統一採用新式類 |
新式類和老式類的區別:https://www.jianshu.com/p/eaa4d2371e2e
需要注意的是python2.6、2.7兼容部分python3語言
django1.5開始支持python3,django2.0以後僅支持python3
django2 | django3 |
---|---|
路由: url() | path() |
{% load staticfiles %} | {% load static %} |
lxml的使用:
python2
python3
12、is和==
- ==是python標準操作符中的比較操作符,用來比較判斷兩個對象的value(值)是否相等
- is也被叫做同一性運算符,這個運算符比較判斷的是對象間的唯一身份標識,也就是id是否相同
13、python裏有哪些數據類型(可變、不可變)
可變對象:當有需要改變對象內部的值的時候,這個對象的id不發生變化。
不可變對象:當有需要改變對象內部的值的時候,這個對象的id會發生變化。
數據類型 | |
---|---|
可變 | 字典(dict), 集合(set), 列表(list) |
不可變 | 整型(int), 字符串(string), 浮點型(float), 元組(tuple) |
14、賦值、深淺拷貝
導入模塊:import copy
淺拷貝:copy.copy
深拷貝:copy.deepcopy
賦值 | 指向同一內存 |
淺拷貝 | 僅拷貝數據集合的第一層數據 |
深拷貝 | 指拷貝數據集合的所有層 |
淺拷貝的時候,python僅僅將最外層的內容在內存中新建了一份出來,字典第二層的列表並沒有在內存中新建,所以你修改了新模版,默認模版也被修改了。
深拷貝的時候python將字典的所有數據在內存中新建了一份,所以如果你修改新的模版的時候老模版不會變。
15、python垃圾回收機制(cpython)
Python垃圾回收主要以引用計數爲主,分代回收爲輔。
原始的引用計數法也有明顯的缺點:
爲了解決這兩個致命弱點,Python又引入兩種GC機制:
gc的邏輯:(重點)
分配內存
-> 發現超過閾值了
-> 觸發垃圾回收
-> 將所有可收集對象鏈表放到一起
-> 遍歷, 計算有效引用計數
-> 分成 有效引用計數=0 和 有效引用計數 > 0 兩個集合
-> 大於0的, 放入到更老一代
-> =0的, 執行回收
-> 回收遍歷容器內的各個元素, 減掉對應元素引用計數(破掉循環引用)
-> 執行-1的邏輯, 若發現對象引用計數=0, 觸發內存回收
-> python底層內存管理機制回收內存
分代回收:Python將內存分爲了3“代”,分別爲年輕代(0代)、中年代(1代)、老年代(2代),對應的是3個鏈表,年輕代鏈表的總數達到上限時,垃圾收集機制被觸發,把可以被回收的對象回收掉,把不會回收移到中年代去,依此類推,老年代中的對象是存活時間最久的對象。
16、列舉常見內置函數
函數 | 作用 |
---|---|
abs(a) | 返回數字a的絕對值 |
all([0, 1,2]) | 判斷給定的可迭代參數 iterable 中的所有元素是否都不爲 0,沒0返回True |
any( [ ] ) | 判斷給定的可迭代參數 iterable 是否全部爲空對象,全0或空返回False |
bin(10) | int變2進制 |
bool() | 判斷爲True或false |
type()、id()、int()、str()、long()。。。。
17、列舉常用模塊
os模塊,路徑
re模塊,正則表達式
sys模塊,標準輸入輸出
math模塊,數學公式
json模塊,字符串與其他數據類型轉換;pickle模塊,序列化
random模塊,生成隨機數
time模塊,時間模塊
datatime模塊,datetime 基於 time 進行了封裝
request模型,HTTP請求庫
lxml, 處理XML和HTML文件
18、生成器、迭代器、可迭代對象
可迭代對象:
- 可迭代對象和容器一樣是一種通俗的叫法,並不是指某種具體的數據類型
- 列表、元組、字典、set等都是可迭代對象,也可以自定義一個可迭代對象(類)
- 可迭代對象實現了__iter__方法,該方法返回一個迭代器對象。
迭代器:
- 用iter() 函數來生成迭代器。例:iter([1,2,3])。
- 任何實現了__iter__和__next__()(python2中實現next())方法的對象都是迭代器,__iter__返回迭代器自身,__next__返回容器中的下一個值,如果容器中沒有更多元素了,則拋出StopIteration異常
生成器:
- 生成器是一種特殊的迭代器。
- 它不需要再像上面的類一樣寫__iter__()和__next__()方法了,只需要一個yiled關鍵字。
yield就是return返回的一個值,並且記住這個返回的位置.下一次迭代就從整個位置開始
例:
# 一個普通的函數
def something():
result = []
for ... in ...:
result.append(x)
return result
# 生成器
def iter_something():
for ... in ...:
yield x
例:
# 用生成器來實現斐波那契數列
def fib():
prev, curr = 0, 1
while True:
yield curr
prev, curr = curr, curr + prev
>>> f = fib()
>>> list(islice(f, 0, 10))
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
生成器表達式例:
a = (x*x for x in range(10))
# 返回生成器對象
列表推導式例:
b = [x*x for x in range(10)]
# 返回列表對象
參考源:https://foofish.net/iterators-vs-generators.html
19、re的match和search區別
match()函數只檢測RE是不是在string的開始位置匹配,search()會掃描整個string查找匹配
20、什麼是正則的貪婪匹配
貪婪匹配:正則表達式一般趨向於最大長度匹配。
非貪婪匹配:匹配到結果就好。
默認是貪婪模式。在量詞後面直接加一個問號?就是非貪婪模式。