博文位址
我的GitHub | 我的部落格 | 我的微信 | 我的郵箱 |
---|---|---|---|
baiqiantao | bqt20094 | [email protected] |
目錄
- Python 簡介
- 特點、适合場景
- 常用指令
- python 指令
- pip 指令
- 同時配置兩個 python 版本
- 方案一
- 方案二
- 兩個版本的差別
- 解決 pip 編碼報錯問題
- 兩種運作模式
- Python 雜談
- 人生苦短,我用 Python
- Python 的設計哲學
- 可變對象與不可變對象
- 變量在記憶體中的表示
- 字典 dict 的實作原理
- Python 官網
- 參考教程:廖雪峰
Python是
荷蘭
計算機程式員
Guido van Rossum
(
吉多·範羅蘇姆
,
龜叔
,1956年生)于
1989
年創立的一門
解釋型腳本語言
,1991年初公布了第一個公開發行版。
Python 是 大蟒蛇
的意思。
特點
-
:Python用獨特的文法
(而非常用的大括号或小括号)來區分語句關系,這給很多初學者帶來了極其嚴重的困惑。即便是很有經驗的Python程式員,也可能陷入陷阱當中縮進
-
:Python是一種代表簡單
思想的語言,它使你能夠簡單主義
專注于解決問題而不是去搞明白語言本身
- 易于學習、易于閱讀
-
免費、開源
-
解釋性
-
:可以運作在Windows、Mac和各種Linux/Unix系統上跨平台
- 便攜式
- 面向對象
- GUI程式設計:Python支援GUI可以建立和移植到許多系統調用
- 可擴充性:可以部分程式用C或C++編寫,然後在Python程式中使用它們
- 可嵌入性:可以把Python嵌入C/C++程式,進而向程式使用者提供腳本功能
- 豐富的庫:Python有龐大的标準庫以及許多其他高品質的庫
- 規範的代碼:Python采用強制縮進的方式使得代碼具有較好可讀性
- 腳本語言、膠水語言
适合場景
-
:包括網站、背景服務、網絡爬蟲等網絡應用
-
、機器學習人工智能
- 科學計算和統計:
的大部分常用功能都可以在Python中找到相應的擴充庫MATLAB
- 日常需要的
:腳本任務、Python通常被稱為膠水語言小工具
缺點
-
:因為Python是運作速度慢
解釋型語言
- 假如運作 C 程式隻需1秒,Java 需要2秒,則 Python 可能需要10秒
- 但是 Python 代碼量少很多,假如 C 語言要寫1000行,Java 隻需100行,而 Python 可能隻要20行
-
:編譯型的語言不用釋出源代碼,隻需要把編譯後的機器碼不能加密
或位元組碼.exe
釋出出去,反推出C代碼是不可能的(反推Java代碼也沒那麼簡單);而.class
的語言,必須把源碼釋出出去解釋型
參考
python # 進入 python 環境,進入後通過 exit() 指令退出
python --version # 版本資訊【-V】
python --help # 幫助資訊【-h】
python -m ensurepip # 安裝 pip
python -m pip install --upgrade pip # 更新 pip【-U】
python -m pip uninstall pip # 解除安裝 pip
pip --version # 版本資訊【-V】
pip --help # 幫助資訊【-h】
pip install -h # 顯示指定指令的使用說明
pip list # 列出已安裝的包
pip list -o # 檢視可更新的包
pip search SomePackage # 搜尋包
pip show SomePackage # 顯示安裝包資訊
pip install SomePackage # 最新版本
pip install SomePackage==1.0.4 # 指定版本
pip install 'SomePackage>=1.0.4' # 最小版本
pip install --upgrade SomePackage # 更新包,可通過使用== >= <= > < 指定版本
pip uninstall SomePackage # 解除安裝包
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple SomePackage # 臨時使用鏡像站
pip config get global.index-url # 檢視目前設定的鏡像站,沒設定時會報錯
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple # 設定鏡像站
pip config list --user # 檢視使用者目前的設定
目前,Python 有兩個版本,一個是
2.x
版,一個是
3.x
版,要注意這兩個版本是 不相容 的。
- Python 3.8.3
- Python 2.7.18
安裝時注意手動勾上 Add Python 3.8 to PATH
對于 Windows 環境,不論
python2
還是
python3
,python 可執行檔案都叫
python.exe
,在 cmd 下輸入
python
得到的版本号
取決于環境變量 Path 裡哪個版本的 Python 路徑更靠前
,因為 Windows 是按照順序查找的。
1、将 Python2 和 Python3 都加入環境變量 Path 中
注意也要包括目錄,因為
\Python\Scripts\
等指令在這個目錄下
pip.exe

2、把原先的
python.exe
和
pythonw.exe
改名,比如 Python2 目錄下的改成
python2.exe
pythonw2.exe
個人建議不需要更改 python3,這樣使用 python 時預設就是 python3
3、我們按照上述改名後如果使用 pip 會報錯,解決方法是:分别在 python2 和/或 python3 下重新安裝(更新)一下 pip
python2 -m pip install --upgrade pip
pip2 -V
pip3 -V
用哪個版本的 Python 運作安裝腳本,pip 就被關聯到哪個版本
借用
py
指令的一個參數來調用不同版本的Python:
py -2
調用python2,
py -3
調用的是python3
py -2 test.py
py -3 test.py
py -2 -m pip install xxx
py -3 -m pip install xxx
Python 2 和 Python 3 的差別非常多,這裡僅僅選2個代表性的做一下記錄。
1、編碼的差別
Python2 的預設編碼是
asscii
,有中文時必須在檔案頂部寫
# coding=utf-8
,Python 3 預設為
utf-8
import sys
print(sys.getdefaultencoding())
2、True 和 False 的差別
在 Python2 中,True 和 False 是兩個
全局變量
的名字,在數值上分别對應 1 和 0,既然是變量,那麼他們就可以指向其它對象,例如:
True = False
print(True) # False
而 Python3 上 True 和 False 變為兩個
關鍵字
,永遠指向兩個固定的對象,不允許再被重新指派,是以以上代碼在 Python3 上會報錯:SyntaxError: cannot assign to True
如果執行 pip 指令時報
UnicodeDecodeError: 'ascii' codec can't decode byte 0xb0 in position 7: ordinal not in range(128)
,解決方法如下。
打開
python2.7\Lib\
目錄下的
mimetypes.py
檔案,在
import
下面添加如下幾行代碼:
if sys.getdefaultencoding() != 'gbk':
reload(sys)
sys.setdefaultencoding('gbk')
添加完成并儲存,重新執行以上指令即可。
--------------------------- 最新解決方案 ---------------------------
python2 -m pip uninstall pip # 先解除安裝掉 pip
python2 -m ensurepip # 再重新安裝
python2 -m pip install --upgrade pip # 或者更新
pip2 install six # 然後就可以愉快的使用了
Python 互動式模式
在指令行模式下,可以執行
python
指令進入 Python 互動式環境
- 在 Python 互動式模式下,可以直接輸入代碼,然後執行,并立刻得到結果
- Python 互動式環境會把每一行 Python 代碼的結果自動列印出來
指令行模式
在指令行模式下,可以直接運作一個
.py
檔案
在 Python 開發領域流傳着這樣一句話:
人生苦短,我用Python
,這句話出自
Bruce Eckel
,原文是:
Life is short,you need Python
。使用過Python語言的程式員,或者從别的語言轉換到Python開發的程式員或許對這句話的了解更加深刻。
但是
人生苦短,我用 Python
這句話是Python之父
Guido van Rossum
穿的t恤上印的話。
Python 的設計哲學是:
Beautiful優雅、Explicit明确、Simple簡單
The Zen of Python, by Tim Peters
Python 的設計哲學,作者:Tim Peters
Beautiful is better than ugly.
優雅勝于醜陋。
Explicit is better than implicit.
明确勝于含糊。
Simple is better than complex.
簡單勝于複雜。
Complex is better than complicated.
複雜勝于繁瑣。
Flat is better than nested.
扁平勝于嵌套。
Sparse is better than dense.
間隔勝于緊湊。
Readability counts.
可讀性很重要。
Special cases aren’t special enough to break the rules.
即使假借特殊之名,也不應打破這些原則。
Although practicality beats purity.
盡管實踐大于理論。
Errors should never pass silently.
錯誤不可置之不理。
Unless explicitly silenced.
除非另有明确要求。
In the face of ambiguity, refuse the temptation to guess.
面對模棱兩可,拒絕猜測。
There should be one– and preferably only one –obvious way to do it.
用一種方法,最好是隻有一種方法來做一件事。
Although that way may not be obvious at first unless you’re Dutch.
雖然這種方式開始時并不容易,除非你是 Python 之父。
Now is better than never.
但從現在就開始這麼做,總比永遠都不做好。
Although never is often better than right now.
盡管經常有時 “沒有做” 反倒比 “現在立馬做“ 結果要好。
If the implementation is hard to explain, it’s a bad idea.
如果一個實作不容易解釋,那麼它肯定是個壞主意。
If the implementation is easy to explain, it may be a good idea.
如果一個實作很容易解釋,那麼它也許是個好主意。
Namespaces are one honking great idea – let’s do more of those!
就像命名空間就是一個絕妙的想法,應當多加利用。
我們知道,
str
是不變對象,而
list
是可變對象。
對于可變對象,比如list,對list進行操作,list内部的内容是會變化的,比如:
a = ['c', 'b', 'a']
a.sort()
print(a) # ['a', 'b', 'c']
而對于不可變對象,比如str,對str進行操作呢:
a = 'abc'
a.replace('a', 'A')
print(a) # abc
雖然字元串有個
replace()
方法,也确實變出了
'Abc'
,但變量
a
最後仍是
'abc'
,應該怎麼了解呢?
我們先把代碼改成下面這樣:
a = 'abc'
b = a.replace('a', 'A')
print(a, b) # abc Abc
要始終牢記的是,
a
是變量,而
'abc'
才是字元串對象!有些時候,我們經常說,對象
a
的内容是
'abc'
,但其實是指:
a
本身是一個變量,它指向的對象的内容才是
'abc'
:
┌───┐ ┌───────┐
│ a │─────────────────>│ 'abc' │
└───┘ └───────┘
當我們調用
a.replace('a', 'A')
時,實際上調用方法
replace
是作用在字元串對象
'abc'
上的,而這個方法雖然名字叫
replace
,但卻沒有改變字元串
'abc'
的内容。相反,
replace
方法建立了一個新字元串
'Abc'
并傳回,如果我們用變量
b
指向該新字元串,就容易了解了,變量
a
仍指向原有的字元串
'abc'
b
卻指向新字元串
'Abc'
了:
┌───┐ ┌───────┐
│ a │─────────────────>│ 'abc' │
└───┘ └───────┘
┌───┐ ┌───────┐
│ b │─────────────────>│ 'Abc' │
└───┘ └───────┘
是以,
對于不變對象來說,調用對象自身的任意方法,也不會改變該對象自身的内容
。相反,
這些方法會建立新的對象并傳回
,這樣,就保證了不可變對象本身永遠是不可變的。
當我們寫:
a = 'ABC'
時,Python解釋器幹了兩件事情:
- 在記憶體中建立了一個
的字元串'ABC'
- 在記憶體中建立了一個名為
的變量,并把它指向a
'ABC'
也可以把一個變量
a
指派給另一個變量
b
,這個操作實際上是把變量
b
指向變量
a
所指向的資料,例如下面的代碼:
a = 'ABC'
b = a
a = 'XYZ'
print(b)
最後一行列印出變量
b
的内容到底是
'ABC'
呢還是
'XYZ'
?
讓我們一行一行地執行代碼,就可以看到到底發生了什麼事:
執行
a = 'ABC'
:解釋器建立了字元串
ABC
和變量
a
,并把
a
指向
ABC
b = a
:解釋器建立了變量
b
b
a
指向的字元串
ABC
a = 'XYZ'
:解釋器建立了字元串'XYZ',并把
a
的指向改為
XYZ
,但
b
并沒有更改,是以,最後列印變量
b
的結果自然是
ABC
了
核心邏輯:代碼 b = a
不是将 b 指向了 a,而是 a 指向的内容(記憶體位址,堆記憶體位址)
如果是 Java,上述解釋也是适用的,但是 Java 也有一些特殊之處
String a = "ABC";
String b = a;
a = "XYZ";
System.out.println(b); //ABC
int a2 = 1;
int b2 = a2;
a2 = 2;
System.out.println(b2); //1
Date a3 = new Date(1);
Date b3 = a3;
a3 = new Date(a3.getTime());
a3.setTime(2);
System.out.println(a3.getTime() + "," + b3.getTime()); //2,1
Date a4 = new Date(1);
Date b4 = a4;
a4.setTime(2);
System.out.println(a4.getTime() + "," + b4.getTime()); //2,2
Python内置了字典
dict
的支援,dict全稱
dictionary
,在其他語言中也稱為
map
,使用
鍵-值
存儲,
具有極快的查找速度
。
舉個例子,假設要根據同學的名字查找對應的成績,如果用list實作,需要兩個list:
names = ['Michael', 'Bob', 'Tracy']
scores = [95, 75, 85]
給定一個名字,要查找對應的成績,就先要在names中找到對應的位置,再從scores取出對應的成績,
list越長,耗時越長
如果用dict實作,隻需要一個
name-score
的對照表,直接根據名字查找成績,
無論這個表有多大,查找速度都不會變慢
。用Python寫一個dict如下:
d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
d['Michael']
為什麼dict查找速度這麼快?因為dict的實作原理和
查字典
是一樣的。假設字典包含了1萬個漢字,我們要查某一個字,一個辦法是把字典從第一頁往後翻,直到找到我們想要的字為止,這種方法就是在list中查找元素的方法,list越大,查找越慢。
第二種方法是先在字典的
索引表
裡(比如部首表)查這個字對應的頁碼,然後直接翻到該頁,找到這個字。無論找哪個字,這種查找速度都非常快,不會随着字典大小的增加而變慢。
dict就是第二種實作方式,給定一個名字,比如
'Michael'
,dict在内部就可以直接計算出
Michael
對應的存放成績的“頁碼”,也就是
95
這個數字存放的
記憶體位址
,直接取出來,是以速度非常快。
請務必注意,dict内部
存放的順序
和key
放入的順序
是沒有關系的。
和list比較,dict有以下幾個特點:
- 查找和插入的速度極快,不會随着key的增加而變慢
- 需要占用大量的記憶體,記憶體浪費多
而list相反:
- 查找和插入的時間随着元素的增加而增加
- 占用空間小,浪費記憶體很少
是以,dict是
用空間來換取時間
的一種方法。
dict可以用在需要
高速查找
的很多地方,在Python代碼中幾乎無處不在,正确使用dict非常重要,需要牢記的第一條就是 dict的key必須是不可變對象。
這是因為dict
根據key來計算value的存儲位置
,如果每次計算相同的key得出的結果不同,那dict内部就完全混亂了。這個通過key計算位置的算法稱為
雜湊演算法
(Hash)。
要保證hash的正确性,作為key的對象就不能變。在Python中,
字元串、整數
等都是不可變的,是以,可以放心地作為key。
2020-05-13
本文來自部落格園,作者:白乾濤,轉載請注明原文連結:https://www.cnblogs.com/baiqiantao/p/12879853.html