Python_1_基礎概念及環境部署

1. 編程基礎

??用任何編程語言來開發程序,都是為了讓計算機干活,而計算機干活的 CPU 只認識機器指令,所以,盡管不同的編程語言差異極大,最后都得 翻譯 成 CPU 可以執行的機器指令。而不同的編程語言,干同一個活,編寫的代碼量,差距也很大。
??比如,完成同一個任務,可能 C 語言要寫 1000 行代碼,Java 需要寫 100 行,而 Python 卻只要 10 行。
??所以 Python 是一種高級語言。
??那是不是越低級的程序越難學,越高級的程序越簡單?表面上來說,是的,但是,在非常高的抽象計算中,高級的 Python 程序設計也是非常難學的,所以,高級程序語言不等于簡單。即便如此,對于初學者和完成普通任務,Python 語言還是非常簡單易用的。連 Google 都在大規模使用 Python,別擔心學了會沒用。

1.1. 基本概念

??程序:是一組能讓計算機識別和執行的指令。
??計算機五大部件:輸入設備輸出設備運算器控制器存儲器,各部件的主要作用:

  • 運算器:完成各種算數運算、邏輯運算、數據傳輸等數據加工處理
  • 控制器:控制程序的執行
  • 存儲器:用于記憶程序和數據,例如內存
  • 輸入設備:將數據或者程序輸入到計算機中,例如鼠標、鍵盤
  • 輸出設備:將數據或程序的處理結果展示給用戶,例如顯示器、打印機等

??CPU 由運算器和控制器組成,其中還有寄存器以及多級緩存,其中我們所熟知的 L1、L2 緩存是每個 CPU 核心獨占的,而 L3 緩存則是所有核心共享的。寄存器、多級緩存、內存、硬盤的讀取速度依次降低。

??計算機語言: 人與計算機之間交互的語言,機器語言、匯編語言等屬于早期語言的代表,機器語言由一定位數組成的二進制 0 和 1 的序列組成,這種語言非常晦澀,難以理解,難以記錄,而匯編語言則借助了一些助記符來替代機器指令,雖然好記了一點,但還是難以學習,后來經過時代的變遷,牛人們的不斷貢獻,慢慢的針對不同場景的編程語言逐漸出現、百花齊放。

1.2. 語言分類

??從距離機器和人類可讀的兩種方向,主要分為 低級語言高級語言

  • 低級語言:面向的機器的語言,比如機器語言、匯編語言,不同的機器不能通用。
  • 高級語言:接近人類可讀的自然和數字結合的計算機語言,由編譯程序轉換成機器指令來進行執行,我們只需要關注如何書寫源程序,剩下編譯的事情就交給編譯器進行處理。

??從運行方式來看又分為 編譯型語言解釋型語言

  • 編譯語言:把代碼轉換成目標機器的 CPU 指令
  • 解釋語言:解釋后轉換成字節碼,運行在虛擬機上,解釋器執行中間代碼

??語言越高級,越接近人類的自然語言和數學語言,越低級則越能讓機器理解,高級語言和低級語言之間需要的一個轉換的工具:編譯器、解釋器,例如 C、C++ 等語言的源代碼需要本地編譯,而 Java、Python、C# 的源代碼需要被解釋器編譯成中間代碼,在虛擬機上運行。

low-and-high.png

1.3. 高級語言的發展

??高級語言根據發展歷程主要分為四個階段或者說是四種類型:非結構化結構化面向對象函數式

  • 非結構化語言:編號或標簽、GOTO、子程序可以有多個入口和出口,有分支、循環。

  • 結構化語言:任何基本語句只允許是唯一入口和出口,有順序、分支、循環、廢棄 GOTO

  • 面向對象的語言:更加接近人類認知世界的方式,萬事萬物抽象成對象,對象間關系抽象成類和繼承。而類具有封裝、繼承、多態等特性

  • 函數式語言:屬于一種古老的編程范式,應用在數據計算、并行處理等場景,在這種語言中,函數是 ' 一等公民 ',利用函數的特性,還有更高級的比如高階函數等。

2. 程序

??程序 = 算法 + 數據結構程序 有如下特點:

  1. 數據是一切程序的核心
  2. 數據結構是數據在計算機中的類型和組織方式
  3. 算法是處理數據的方式,算法有優劣之分

??寫程序難點:

  1. 理不清數據
  2. 搞不清處理方法
  3. 無法把數據設計轉換成數據結構,無法把處理方法轉換成算法
  4. 無法用設計范式來進行程序設計
  5. 世間程序皆有 bug,但不會 debug

3. Python 的語言介紹

??Python 是著名的 “龜叔” Guido van Rossum 在 1989 年圣誕節期間,為了打發無聊的圣誕節而編寫的一門編程語言。
??Python 作為一門高級編程語言,相比于其他語言,初學者很容易入門,除此之外,Python 還具有以下優點:

  1. 簡單:Python 奉行簡潔主義,易于讀寫,它使你能夠專注于解決問題而不是去搞明白語言本身。
  2. 兼容性:Python 兼容眾多平臺,所以開發者不會遇到使用其他語言時常會遇到的困擾。
  3. 面向對象:Python 既支持面向過程,也支持面向對象編程。在面向過程編程中,程序員復用代碼,在面向對象編程中,使用基于數據和函數的對象。
  4. 豐富的庫:Python 標準庫確實很龐大。它可以幫助你處理各種工作,包括正則表達式、文檔生成、單元測試、線程、數據庫、網頁瀏覽器、CGI、FTP、電子郵件、XML、XML-RPC、HTML、WAV 文件、密碼系統、GUI (圖形用戶界面)、Tk 和其他與系統有關的操作。
  5. 規范的代碼:Python 采用強制縮進的方式使得代碼具有極佳的可讀性。
  6. 可擴展性和可嵌入性。如果你需要你的一段關鍵代碼運行得更快或者希望某些算法不公開,你可以把你的部分程序用 C 或 C++ 編寫,然后在你的 Python 程序中使用它們。你可以把 Python 嵌入你的 C/C++ 程序,從而向你的程序用戶提供腳本功能。

??Python 的學習強度相對于其他的一些編程語言普遍公認更簡單,零基礎也可輕松學會,而且發展前景好,在人工智能、大數據、云計算、運維自動化等領域均得到了廣泛的應用,且現階段人才緊缺,薪資普遍高于其他編程語言,因此,是 IT 轉型的好選擇!

??此外 Python 還是一種 動態編譯的、強類型的 語言,那么什么是動態編譯語言,什么是強類型語言呢?

  • 靜態編譯語言:實現聲明變量類型,類型不能再改變,編譯時檢查,如 C、C++、Java
  • 動態編譯語言:不用事先聲明類型,隨時可以賦值為其他類型,但編程時不知道是什么類型,很難推斷,如 Python、PHP、JavaScript
  • 強類型語言:不同類型之間操作,必須先強制類型轉換為同一類型,比如 print('a'+1), 將字符串和數字直接相加將拋出異常,無法正常執行,如 Python、Java
  • 弱類型語言:不同類型間可以操作,自動隱式轉換,比如 JavaScript 中 Console.log(1+'a')
program_language_type.png

4. Python 的解釋器

??Python 這種高級語言需要編譯成字節碼然后由 Python 虛擬機(解釋器) 去執行,針對解釋器,有多種不同的版本。

  • 官方的 CPython:C 語言開發,最廣泛的 Python 解釋器
  • IPython:一個交互式、功能增強的 CPython,其典型應用是 jupyter notebook,常用于學習 Python、數據分析、機器學習等領域
  • PyPy:Python 語言寫的 Python 解釋器,并且針對性的進行了優化,比如 JIT 技術,動態編譯 Python 代碼
  • JPython:Python 的源碼編譯成 Java 的字節碼,跑在 JVM 上
  • IronPython:與 Jython 類似,運行在.Net 平臺上的解釋器,Python 代碼被編譯成.Net 的字節碼

?? 雖然列舉了這么多編譯器,但是目前主流的還是官方提供的 CPython,但 PyPy 由于使用 Python 語言編寫,針對性的進行了許多優化,據說速度可以達到 CPython 的 5 倍以上,建議后期可以研究一下

5. Python 版本區別

??Python 是很多 Linux 系統默認安裝的語言,以 CentOS 為例由于其 yum 包管理工具使用的是 Python 開發,所以其內置了 Python 2.x 版本,但是 Python 目前已經發展到了 3.7 版本了,并且 Python 官方對 2.x 的支持也快到期,所以建議學習 Python 的 3.x 版本。
??Python 3.x 的在本質上和 Python 2.x 有很大的變化,2.x 的程序是不能直接在 3.x 的版本上運行的,它們的主要區別有:

  • 語句函數化。例如 print(1,2) 打印出 1 2,但是 2.x 中意思是 print 語句打印元組,3.x 中意思是函數的 2 個參數
  • 整除。在 3.x 中,/ 為自然除,// 為整除。2.x 中 / 和 // 都為整除。
  • input 函數。3.x 中把 2.x 中的 raw_input 舍去,功能合并到 input 函數中去。
  • round 函數。在 3.x 中的取整變為距離最近的偶數
  • 3.x 字符串統一使用 unicode。2.x 中如果想要輸入中文,還需要在文件頭顯示聲明 (_*_coding:utf-8 _*_)
  • 異常的捕獲、拋出的語法改變

6. Python 安裝

??不同平臺需要安裝不同版本的 Python,比如 windows,需要用 exe 應用程序,而 Linux 可以下載源碼編譯安裝,或者 yum 安裝。

6.1. windows 安裝

??安裝方法:由于 windows 是圖形界面,這里就不一一截圖了,只文字說明安裝步驟。

  1. 下載安裝包
    訪問 https://www.Python.org/ 在 Downloads 標簽頁下選擇 windows,然后根據自己需求,下載對應的 Windows x86-64 executable installer 版本

  2. 安裝
    ??雙擊下載好的 Windows x86-64 executable installer,一直 next 即可。

??安裝路徑默認即可,不要自作聰明修改

  1. 配置環境變量
    ??在安裝程序中選擇 add to PATH,就是把 Python 命令安裝在 PATH 變量中,讓我們可以在任意地方通過命令訪問,如果忘記選擇,也可以通過下面的方法進行設置:
    ??右擊我的電腦 --> 屬性 --> 高級系統設置 --> 環境變量 --> 編輯 PATH 變量 --> 添加 Python 的安裝路徑 C:\Python36 (以分號 ; 隔開)--> 確定

  2. 測試
    ??打開 cmd (命令提示符,快捷鍵 windows+r) ,輸入 Python ,可以進入解釋器表示安裝成功

6.2. Linux 安裝

??Linux 的安裝有 yum 和編譯安裝兩種方式:

  1. yum 方式
[root@centos7 ~]# yum install -y Python36
  1. 編譯安裝
    ??編譯安裝稍微麻煩一些,詳細操作步驟請參考我的另一篇博客《CentOS 7 系統編譯安裝 Python 3 環境》:https://blog.csdn.net/colinlee19860724/article/details/88856657

7. pyenv 多版本管理

??在實際工作情況下,由于每個項目用的可能不是一個版本的 Python,并且不同應用程序所以來的第三方程序包都不同,如何讓多版本 Python 進行共存,并且保證每個項目依賴的第三方包。想要讓多個 Python 版本共存,有如下兩種方法:

  • 編譯安裝新版本至某一個路徑
  • 多版本 Python 管理工具

??如果每添加一個新的 Python 版本就編譯一次的話,大大增加了環境切換的成本,并且還需要區分命令(Python3.5, Python 2.7) 等等,所以就凸顯出了多版本管理工具的優點

7.1. pyenv 介紹及安裝

??pyenv 是一個多版本 Python 管理工具,它可以幫我們安裝想要的 Python 版本,并且可以一鍵切換。pyenv 是一個開源的項目,其代碼托管在 github 上,我們可以訪問它的 github 站點來根據 install 的步驟進行安裝。pyenv 的 github 地址:https://github.com/pyenv/pyenv,使用此方法的詳細安裝說明還可以參考我的另一篇博客《CentOS 7 系統下使用 Pyenv 安裝 Python 環境》:https://blog.csdn.net/colinlee19860724/article/details/89095650
??pyenv 官方還提供了便捷的安裝方式,它的項目地址是:https://github.com/pyenv/pyenv-installer,僅需要簡單幾步就可以完成安裝,下面以這種方式進行說明。

??下面的步驟已在 CentOS 7.6 上測試,并安裝成功:

  1. 安裝依賴包 (由于 pyenv 默認使用編譯的方式安裝 Python,所以它需要的依賴包需要提前安裝)
[root@centos7 ~]# yum install -y gcc make patch gdbm-devel openssl-devel sqlite-devel readline-devel zlib-devel bzip2-devel
  1. 安裝 GIT (由于 pyenv-installer 中調用 git 使用 clone 的方式拉取 pyenv 的代碼,所以這里需要進行安裝)
[root@centos7 ~]# yum install -y git
  1. 安裝 Pyenv
# 執行如下命令安裝 pyenv
[root@centos7 ~]# curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash
  1. 修改環境變量
[root@centos7 ~]# vim /etc/profile.d/pyenv.sh
[root@centos7 ~]# cat /etc/profile.d/pyenv.sh
#!/bin/bash
# Define environment variable
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
  
[root@centos7 ~]# source /etc/profile.d/pyenv.sh
# PS:這里直接更新了 /etc/profile.d,如果是單個用戶安裝并使用,建議添加到用戶家目錄中的 profile 文件中去
  1. 驗證
[root@centos7 ~]# pyenv version
system (set by /root/.pyenv/version)  # 表示當前使用的是系統的 Python 版本
  1. pyenv 命令
pyenv -h                # 即可列出命令幫助信息
pyenv install -l        # 列出安裝的版本信息
pyenv install 3.6.6     # 安裝 3.6.6 版本
pyenv versions          # 查看系統 Python 版本(pyenv install 安裝的版本都可以在這里看到)
pyenv global 3.6.6      # 切換 Python 默認版本為 3.6.6
pyenv local 3.6.6       # 切換當前目錄下的 Python 版本為 3.6.6 (和目錄綁定,子目錄繼承環境設定)
pyenv shell 3.6.6       # 僅僅針對當前 shell 環境 (會話級別)
  1. 離線安裝 Python 版本

??通過 pyenv install 3.6.6 進行安裝時,它會聯網下載 Python 3.6.6 的源碼包,如果機器不能上網的話,可以采用離線的方式,預先下載好 Python 要安裝的 Python 的版本包(注意需要 gz,xz,bz,三種格式都需要) 在 pyenv 的安裝目錄下,一般在用戶的家目錄下 .pyenv 目錄中,進入后新建子目錄 cache,然后把三個包考進去即可,然后再次執行 pyenv install 3.6.6 即可

[root@centos7 ~]# cd .pyenv
[root@centos7 ~]# mkdir cache
[root@centos7 ~]# rz                   # 通過仿真終端上傳三個下載好的 Python 包
[root@centos7 ~]# pyenv install 3.6.6

7.2. virtualenv

??當多個項目公用一臺主機的時候,就會產生很多問題,當你的項目和其他人的項目共用 Python 3.6.6 時,假如每個項目都安裝了很多依賴包,你如何區分哪些包是你的項目需要的?這時 virtualenv 就很重要了,它可以在 pyenv 的環境中,再造一個虛擬環境,這個環境是基于 pyenv 中管理的某個主環境,派生出來的獨立子環境,你對 virtualenv 進行的操作,和其他的 virtualenv 沒有任何關聯。

 # 創建一個 virtualenv 環境,名字為 colin,基于 pyenv 管理的 3.6.6 版本
[root@centos7 ~]# pyenv virtualenv 3.6.6 colin     
[root@centos7 ~]# pyenv versions
* system (set by /root/.pyenv/version)
  3.6.6
  3.6.6/envs/colin
  colin
[root@centos7 ~]# mkdir lxl_test
[root@centos7 ~]# cd lxl_test
[root@centos7 lxl_test]# pyenv local colin
[root@centos7 lxl_test]# pyenv versions
  system
  3.6.6
  3.6.6/envs/colin
* colin (set by /root/lxl_test/.python-version)   # 該目錄 virtualenv 環境已切換,這樣我們就可以放心的安裝和下載依賴包了

7.3. pyenv 安裝位置

??virtualenv 創建的虛擬環境都存放在 .pyenv 安裝目錄的 versions 下:

[root@centos7 versions]# pwd
/root/.pyenv/versions
[root@centos7 versions]# ll
total 0
drwxr-xr-x. 7 root root 68 Apr  1 15:17 3.6.6
lrwxrwxrwx. 1 root root 38 Apr  1 15:17 colin -> /root/.pyenv/versions/3.6.6/envs/colin

?? 而你在virtualenv中安裝的包,則存放在virtualenv環境中對應的site-packages目錄下

[root@centos7 site-packages]# pwd
/root/.pyenv/versions/3.6.6/envs/colin/lib/python3.6/site-packages
[root@centos7 site-packages]# ls
attr                                pangu-4.0.6.1.dist-info
attrs-19.1.0.dist-info              pangu.py
ipykernel                           prompt_toolkit-2.0.9.dist-info
ipykernel-5.1.0.dist-info           ptyprocess
ipykernel_launcher.py               ptyprocess-0.6.0.dist-info
IPython                             pvectorc.cpython-36m-x86_64-linux-gnu.so
ipython-7.4.0.dist-info             __pycache__
ipython_genutils                    pygments
ipython_genutils-0.2.0.dist-info    Pygments-2.3.1.dist-info
ipywidgets                          pyrsistent
ipywidgets-7.4.2.dist-info          pyrsistent-0.14.11-py3.6.egg-info

7.4. 導出項目依賴包

??如果某一天我要導出我當前環境安裝的所有依賴包,該怎么辦呢?Python 已經提供了一個工具,供我們導出當前 Python 版本安裝的所有依賴包及名稱,它就是 pip 命令 (Python 3.x 中已經內置該命令), 使用它的 freeze 參數即可。

# 使用 freeze 可以直接導出當前安裝的依賴包以及
[root@centos7 lxl_test]# pip freeze > requirement.txt    # 對應的版本
[root@centos7 lxl_test]# cat requirement.txt
pangu==4.0.6.1

??注意:在新的項目中,只需要使用pip install -r requirement.txt 即可,讓 pip 按照 requirement.txt 文件中標識的包和版本進行安裝了。pip 命令還有很多強大的功能,下面我們來做個簡要介紹。

8. pip 命令

??pip 命令對應 Python 來說,就像 Yum 和 CentOS 的關系,它是 Python 的包管理工具,我們可以使用 pip 命令安裝幾乎所有的 Python 第三方包。

8.1. 命令說明

[root@centos7 lxl_test]# pip -h

Usage:   
  pip <command> [options]

Commands:
  install                    # 安裝第三方包
  download                   # 下載第三方包
  uninstall                  # 卸載第三方包
  freeze                     # 輸出包的名稱和版本信息,可以重定向到文件中去
  list                       # 顯示已安裝的第三方包
  show                       # 顯示安裝包信息
  search                     # 在 Pypi 庫中查找第三方包
  help                       # 查看幫助信息

General Options:
  -h, --help                 # 顯示幫助
  -v, --verbose              # 顯示詳細信息
  -V, --version              # 顯示版本信息
  -q, --quiet                # 安靜模式,不輸出任何提示信息
  --log <path>               # 把輸出信息追加 log 文件中
  --proxy <proxy>            # 使用代理,格式為: [user:passwd@] proxy.server:port.
  --retries <retries>        # 最大連接失敗重試次數,默認 5 次
  --timeout <sec>            # 設置最大超時時間,默認是 15 秒
  --cache-dir <dir>          # 指定緩存目錄
  --no-cache-dir             # 禁用緩存

8.2. 配置說明

??pip 命名默認是從 Python 官方提供的 Pypi 倉庫進行第三方軟件包,由于官方源在國外,訪問速度可能會很慢,我們可以把 Pypi 源換成國內的阿里源,來增加訪問速度。 配置起來也很簡單,只需要新增 pip 的配置文件,指定源為阿里源即可。
??創建 pip 配置文件:

[root@centos7 ~]# mkdir ~/.pip
[root@centos7 ~]# cd .pip
[root@centos7 .pip]# vim pip.conf 
[root@centos7 .pip]# cat pip.conf
[global]                                           # 全局配置段
index-url=https://mirrors.aliyun.com/pypi/simple/  # pypi 倉庫地址
trusted-host=mirrors.aliyun.com                    # 信任主機

9. Pycharm 安裝及基本使用

??PyCharm 是一種 Python IDE,帶有一整套可以幫助用戶在使用 Python 語言開發時提高其效率的工具,比如調試、語法高亮、Project 管理、代碼跳轉、智能提示、自動完成、單元測試、版本控制。此外,該 IDE 提供了一些高級功能,以用于支持 Django 框架下的專業 Web 開發。
??一句話總結:幫助我們將代碼自動格式化(優雅的空格),關鍵字提示,以及一鍵執行、調試等功能,對于敏捷開發有很大的幫助。所以 Pythoner 請使用 Pycharm 吧。
??具體安裝方法這里不再贅述,請大家自行上網搜索,安裝過程中遇到的問題,歡迎郵件咨詢 517999276@qq.com

10. 第一個 Python 程序

??Python 語言已經安裝完畢,環境也已經配置好,那我們就來寫一個簡單的 Python 程序吧
??例子如下:

# Python 2.x
print 'hello world'
 
# Python 3.x
print('hello world')

# 這里:引號內的是要打印到屏幕上的字符,快去試試吧。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容