1-編程基礎及Python環境部署


1 編程基礎

        首先,咱們普及一下編程語言的基礎知識。用任何編程語言來開發程序,都是爲了讓計算機幹活,好比下載一個MP3,編寫一個文檔等等,而計算機幹活的CPU只認識機器指令,因此,儘管不一樣的編程語言差別極大,最後都得'翻譯'成CPU能夠執行的機器指令。而不一樣的編程語言,幹同一個活,編寫的代碼量,差距也很大。
        好比,完成同一個任務,C語言要寫1000行代碼,Java只須要寫100行,而Python可能只要20行。
        因此Python是一種至關高級的語言。
        你也許會問,代碼少還很差?代碼少的代價是運行速度慢,C程序運行1秒鐘,Java程序可能須要2秒,而Python程序可能就須要10秒。
        那是否是越低級的程序越難學,越高級的程序越簡單?表面上來講,是的,可是,在很是高的抽象計算中,高級的Python程序設計也是很是難學的,因此,高級程序語言不等於簡單。可是,對於初學者和完成普通任務,Python語言是很是簡單易用的。連Google都在大規模使用Python,你就不用擔憂學了會沒用。
        用Python能夠作什麼?能夠作平常任務,好比自動備份你的MP3;能夠作網站,不少著名的網站包括YouTube就是Python寫的;能夠作網絡遊戲的後臺,不少在線遊戲的後臺都是Python開發的。總之就是能幹不少不少事啦。下面咱們瞭解一下計算機的基礎概念html

1.1 基本概念

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

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

        注:CPU有運算器和控制器組成,其中還有寄存器以及多級緩存,其中咱們所熟知的L一、L2緩存是每一個CPU核心獨佔的,而L3緩存則是全部核心共享的,緩存的速度依次下降,新版的CPU還會把北橋芯片集成在CPU中。
        計算機語言:人與計算機之間交互的語言,機器語言、彙編語言等屬於早期語言的表明,機器語言由必定位數組成的二進制0和1的序列組成,這中語言很是晦澀,難以理解,難以記錄,而彙編語言則藉助了一些助記符來替代機器指令,雖然好記了一點,但仍是難以學習,後來通過時代的變遷,各大偉人的突出貢獻,慢慢的針對不一樣場景的編程語言共同綻開。python

1.2 語言分類

        從距離機器和人類可讀的兩種方向,主要分爲低級語言高級語言
        從運行方式來看又分爲編譯型語言解釋型語言linux

  • 低級語言:面向的機器的語言,好比機器語言、彙編語言,不一樣的及其不能通用。
  • 高級語言:接近人類可讀的天然和數字結合的計算機語言,由編譯程序轉換成機器指令來進行執行,咱們只須要關注如何書寫源程序,剩下編譯的事情就交給編譯器進行處理。
  • 編譯語言:把代碼轉換成目標及其的CPU指令
  • 解釋語言:解釋後轉換成字節碼,運行在虛擬機上,解釋器執行中間代碼

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

1.3 高級語言的發展

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

  • 非結構化語言:編號或標籤、GOTO、子程序能夠有多個入口和出口,有分支、循環。
  • 結構化語言:任何基本語句只容許是惟一入口和出口,有順序、分支、循環、廢棄GOTO
  • 面向對象的語言:更加接近人類認知世界的方式,萬事萬物抽象成對象,對象間關係抽象成類和繼承。而類具備封裝、繼承、多態等特性
  • 函數式語言:屬於一種古老的編程範式,應用在數據計算、並行處理等場景,在這種語言中,函數是'一等公民',利用函數的特性,還有更高級的好比高階函數等。

2 程序

        什麼是程序呢?通常咱們所說的程序是:算法+數據結構。能夠總結出以下特色:github

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

3 python的語言介紹

        Python是著名的「龜叔」Guido van Rossum在1989年聖誕節期間,爲了打發無聊的聖誕節而編寫的一個編程語言。
        和C語言相比:C語言適合開發那些追求運行速度、充分發揮硬件性能的程序。而Python是用來編寫應用程序的高級編程語言。
Python的優勢:算法

  • 爲咱們提供了很是完善的基礎代碼庫,覆蓋了網絡、文件、GUI、數據庫、文本等大量內容,被形象地稱做「內置電池(batteries included)」。用Python開發,許多功能沒必要從零編寫,直接使用現成的便可,除了內置的庫外,Python還有大量的第三方庫,也就是別人開發的,供你直接使用的東西。固然,若是你開發的代碼經過很好的封裝,也能夠做爲第三方庫給別人使用。

Python的缺點:sql

  • 運行速度慢,和C程序相比很是慢,由於Python是解釋型語言,你的代碼在執行時會一行一行地翻譯成CPU能理解的機器碼,這個翻譯過程很是耗時,因此很慢。而C程序是運行前直接編譯成CPU能執行的機器碼,因此很是快,可是大量的應用程序不須要這麼快的運行速度,由於用戶根本感受不出來。
  • 代碼不能加密。若是要發佈你的Python程序,實際上就是發佈源代碼,這一點跟C語言不一樣,C語言不用發佈源代碼,只須要把編譯後的機器碼(也就是你在Windows上常見的xxx.exe文件)發佈出去。要從機器碼反推出C代碼是不可能的,因此,凡是編譯型的語言,都沒有這個問題,而解釋型的語言,則必須把源碼發佈出去。

另外Python仍是一種動態編譯的、強類型的語言,那麼什麼是動態語言,什麼是強類型語言呢?shell

  • 靜態編譯語言:實現聲明變量類型,類型不能再改變,編譯時檢查
  • 動態編譯語言:不用事先聲明類型,隨時能夠賦值爲其餘類型,但編程時不能準確肯定是什麼類型,很難推斷
  • 強類型語言:不一樣類型之間操做,必須先強制類型轉換爲同一類 好比print(1+'a'),這種是沒法執行的
  • 弱類型語言:不一樣類型間能夠操做,自動隱士轉換,好比javascript中Console
    .log(1+'a')

4 Python的解釋器

        Python這種高級語言須要編譯成字節碼而後由Python虛擬機(解釋器)去執行的,針對解釋器,有多種不一樣的版本。

  • 官方的CPython: C語言開發,最普遍的Python解釋器
  • IPython:一個交互式、功能加強的CPython
  • PyPy:Python語言寫的Python解釋器,而且針對性的進行了優化,好比JIT技術,動態編譯Python代碼
  • Jpython:Python的源碼編譯成Java的字節碼,跑在JVM上
  • IronPython:與Jpython相似運行再.Net平臺上的解釋器,Python代碼被編譯成.Net的字節碼

        雖然列舉了這麼多編譯器,可是目前主流的仍是官方提供的Cpython,但pypi因爲使用Python語言編寫,針對性的進行了許多優化,聽說速度能夠達到Cpython的10倍以上,建議後期能夠研究一下

5 Python版本區別

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

  • 語句函數化。例如print的打印,在3.x中是個函數,要打印的內容會被看成參數傳遞進入,而2.x中的含義是print語句打印元祖
  • 整除。在3.x中,/爲天然除,//爲整除。2.x中/和//都爲整除。
  • input函數。3.x中把2.x中的raw_input捨去,功能合併到input函數中去。
  • round函數。在3.x中的取整變爲距離最近的偶數
  • 字符串統一使用unicode。2.x中若是想要輸入中文,還須要在文件頭顯示聲明(_*_coding:utf-8 _*_)
  • 異常的捕獲、拋出的語法改變

6 Python安裝

不一樣平臺須要安裝不一樣版本的Python,好比windows,須要用exe的應用程序,而Linux能夠有源碼編譯安裝,或者yum安裝。

6.1 windows安裝

安裝方法
  windows因爲都是圖形界面,這裏就不一一截圖了,只文字說明安裝步驟。

一、下載安裝包
訪問 https://www.python.org/ 在 Downloads標籤頁下選擇 windows,而後根據本身需求,下載對應的 `Windows x86-64 executable installer` 版本
 
二、安裝
雙擊下載好的 Windows x86-64 executable installer,一直next便可。
# 安裝路徑默認便可,不要自做聰明修改
 
三、配置環境變量
在安裝程序中選擇 add to PATH,就是把python命令安裝在PATH變量中,讓咱們能夠在任意地方經過命令訪問,若是忘記選擇,也能夠經過下面的方法進行設置
右擊個人電腦 -- 屬性 -- 高級系統設置 -- 環境變量 -- 編輯 PATH 變量 -- 添加 python 的安裝路徑 C:\Python36 (以分號隔開)-- 肯定

四、測試
打開 cmd (命令提示符,快捷鍵windows+r) ,輸入 python ,能夠進入解釋器表示安裝成功

6.2 Linux安裝

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

  1. yum方式
[20:08:40 python@centos7 ~]$yum install -y python36
  1. 編譯安裝
## 安裝Python命令行退格鍵、HTTPS等依賴包(自由選擇能夠不裝)
[20:10:12 root@centos7 Python-3.6.7rc2]#yum install -y readline readline-devel openssl-devel



# 下載Python源碼包
[20:11:49 python@centos7 ~]$wget https://www.python.org/ftp/python/3.6.7/Python-3.6.7rc2.tgz -P /tmp
--2018-12-31 20:12:31--  https://www.python.org/ftp/python/3.6.7/Python-3.6.7rc2.tgz
Resolving www.python.org (www.python.org)... 151.101.72.223, 2a04:4e42:11::223
Connecting to www.python.org (www.python.org)|151.101.72.223|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 22969389 (22M) [application/octet-stream]
Saving to: ‘/tmp/Python-3.6.7rc2.tgz’

100%[===========================================================================================================================================================================================>] 22,969,389   365KB/s   in 33s    

2018-12-31 20:13:04 (678 KB/s) - ‘/tmp/Python-3.6.7rc2.tgz’ saved [22969389/22969389]

[20:13:04 python@centos7 ~]$

# 解壓文件
[20:14:17 root@centos7 tmp]#tar xf /tmp/Python-3.6.7rc2.tgz -C /usr/local/
[20:14:24 root@centos7 tmp]#cd /usr/local/
[20:14:27 root@centos7 local]#ls
bin  etc  games  include  lib  lib64  libexec  Python-3.6.7rc2  sbin  share  src
[20:16:28 root@centos7 local]#cd Python-3.6.7rc2/


# 執行編譯配置檢查
[20:17:20 root@centos7 local]#./configure  --with-ssl --prefix=/usr/local/python3

# 編譯
[20:19:28 root@centos7 Python-3.6.7rc2]#make
 
# 安裝
[20:20:28 root@centos7 Python-3.6.7rc2]#make install

# 環境變量配置(添加/usr/local/python3/bin 到 PATH 路徑中)
[20:22:23 root@centos7 bin]#vim ~/.bash_profile 
  1 # .bash_profile
  2 
  3 # Get the aliases and functions
  4 if [ -f ~/.bashrc ]; then
  5         . ~/.bashrc
  6 fi
  7 
  8 # User specific environment and startup programs
  9 
 10 PATH=$PATH:$HOME/bin:/usr/local/python3/bin                                
 11 
 12 export PATH

 # 測試
[20:24:28 root@centos7 ~]#source .bash_profile 
[20:24:36 root@centos7 ~]#python36
bash: python36: command not found...
[20:24:40 root@centos7 ~]#python3
Python 3.6.7rc2 (default, Dec 31 2018, 20:20:36) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-36)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

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
pyenv官方還提供了便捷的安裝方式,它的項目地址是:https://github.com/pyenv/pyenv-installer,僅須要簡單幾步就能夠完成安裝,下面以這種方式進行說明。

下面的步驟已在CentOS 6.7上測試,並安裝成功

  1. 安裝依賴的包(因爲pyenv默認使用編譯的方式安裝Python,因此它須要的依賴包須要提早安裝)
[root@Python ~]# 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@Python ~]# yum install -y git
  1. 安裝Pyenv
# 執行以下命令安裝pyenv
[root@Python ~]# curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash

# 這裏建議使用普通用戶進行安裝
# 若是遇到 curl: (35) SSL connect error ,嘗試更新nss,若是問題依舊,嘗試更新curl
[python@Python ~]# yum update nss
[python@Python ~]# yum update curl
  1. 修改環境變量
[root@Python ~]# vim /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@Python~]# source /etc/profile.d/pyenv.sh
# PS:這裏直接更新了/etc/profile.d,若是是單個用戶安裝並使用,建議添加到用戶家目錄中的profile文件中去
  1. 驗證
[root@Python ~]# pyenv version
system (set by /root/.pyenv/version)  # 表示當前使用的是系統的Python版本
  1. pyenv命令
pyenv -h                # 便可列出命令信息
pyenv install -l        # 列出安裝的版本信息
pyenv install 3.3.5     # 便可安裝
pyenv versions          # 查看系統python版本(pyenv install 安裝的版本均可以在這裏看到)
pyenv global 3.3.5      # 切換Python默認版本爲3.3.5
pyenv local 3.3.5       # 切換當前目錄下的Python版本爲3.3.5(和目錄綁定,子目錄繼承環境設定)
pyenv shell 3.3.5       # 僅僅針對當前shell環境(會話級別)
  1. 離線安裝python版本
            經過 pyenv install 3.5.3 進行安裝時,它會聯網下載 Python 3.5.3 的源碼包,若是機器不能上網的話,能夠採用離線的方式,預先下載號Python 要安裝的Python的版本包(注意須要gz,xz,bz,三種格式都須要) 在pyenv的安裝目錄下,通常在用戶的家目錄下.pyenv目錄中,進入後新建子目錄cache,而後把三個包考進去便可,而後再次執行 pyenv install 3.5.3 便可
[root@Python ~]$ cd .pyenv
[root@Python ~]$ mkdir cache
[root@Python ~]$ rz    # 上傳三個下載好的Python包
[root@Python ~]$ pyenv install 3.5.3

7.2 virtualenv

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

# 建立一個virtualenv環境,名字爲daxin,基於pyenv管理的3.5.3版本
[python@localhost .pip]$ pyenv virtualenv 3.5.3 daxin     
[python@localhost .pip]$ pyenv versions
* system (set by /home/python/.pyenv/version)
3.5.3
3.5.3/envs/daxin
daxin

# 這時,咱們再對某個項目進行切換時,以下
[python@localhost .pip]$ pyenv versions
* system (set by /home/python/.pyenv/version)
  3.5.3
  3.5.3/envs/dachenzi
  3.5.3/envs/daxin
  dachenzi
  daxin
 
[python@localhost ~]$ mkdir cmdb
[python@localhost ~]$ cd cmdb
[python@localhost cmdb]$ pyenv local daxin
(daxin) [python@localhost cmdb]$ ls                # 最前面多了個virtualenv環境的名稱
# 這樣咱們就能夠放心的安裝和下載依賴包了,

7.3 導出項目依賴包

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

# 使用freeze能夠直接導出當前安裝的依賴包以及
(daxin) [python@localhost cmdb]$ pip freeze > requirement.txt    對應的版本
(daxin) [python@localhost cmdb]$ cat requirement.txt
backcall==0.1.0
decorator==4.3.0
ipython==7.1.1
ipython-genutils==0.2.0
jedi==0.13.1
parso==0.3.1
pexpect==4.6.0
pickleshare==0.7.5
prompt-toolkit==2.0.7
ptyprocess==0.6.0
Pygments==2.2.0
six==1.11.0
traitlets==4.3.2
wcwidth==0.1.7

        注意:再新的項目中,只須要使用pip install -r requirement.txt 便可,讓pip按照requirement.txt文件中標識的包和版本進行安裝了。

7.4 pyenv安裝位置 

        virtualenv建立的虛擬環境都存放在pyenv安裝目錄的versions

[python@localhost versions]$ pwd
/home/python/.pyenv/versions
[python@localhost versions]$ ll
total 4
drwxr-xr-x. 7 python python 4096 Nov  3 18:07 3.5.3
lrwxrwxrwx. 1 python python   48 Nov  3 18:12 dachenzi -> /home/python/.pyenv/versions/3.5.3/envs/dachenzi
lrwxrwxrwx. 1 python python   45 Nov  3 18:07 daxin -> /home/python/.pyenv/versions/3.5.3/envs/daxin
[python@localhost versions]$

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

[python@localhost site-packages]$ pwd
/home/python/.pyenv/versions/3.5.3/envs/daxin/lib/python3.5/site-packages
[python@localhost site-packages]$ ls
backcall                          parso-0.3.1.dist-info           __pycache__
backcall-0.1.0-py3.5.egg-info     pexpect                         pygments
decorator-4.3.0.dist-info         pexpect-4.6.0.dist-info         Pygments-2.2.0.dist-info
decorator.py                      pickleshare-0.7.5.dist-info     setuptools
easy_install.py                   pickleshare.py                  setuptools-28.8.0.dist-info
IPython                           pip                             six-1.11.0.dist-info
ipython-7.1.1.dist-info           pip-18.1.dist-info              six.py
ipython_genutils                  pkg_resources                   traitlets
ipython_genutils-0.2.0.dist-info  prompt_toolkit                  traitlets-4.3.2.dist-info
jedi                              prompt_toolkit-2.0.7.dist-info  wcwidth
jedi-0.13.1.dist-info             ptyprocess                      wcwidth-0.1.7.dist-info
parso                             ptyprocess-0.6.0.dist-info
[python@localhost site-packages]$

8 pip命令

        pip命令對應Python來講,就像Yum和CentOS的關係,它是Python的包管理工具,咱們可使用pip命令安裝幾乎全部的Python第三方包。

8.1 命令說明

(daxin353) [21:01:10 python@centos7 cmdb]$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             # 禁用緩存
(daxin353) [21:01:16 python@centos7 cmdb]$

8.2 配置說明

        pip命名默認是從Python官方提供的Pypi倉庫進行第三方軟件包,因爲官方源在國外,訪問速度可能會很慢,咱們能夠把Pypi源換成國內的阿里源,來增長訪問速度。 配置起來也很簡單,只須要新增pip的配置文件,指定源爲阿里源便可。

  • 建立pip配置文件
[21:14:53 python@centos7 ~]$mkdir ~/.pip
[21:15:21 python@centos7 ~]$cd .pip
[21:15:23 python@centos7 .pip]$vim pip.conf 
   [global]                  # 全局配置段
   index-url=https://mirrors.aliyun.com/pypi/simple/     # pypi倉庫地址
   trusted-host=mirrors.aliyun.com            # 信任主機(防止https輸出煩人的信息)

9 pycharm安裝及基本使用

請參考博文: http://www.cnblogs.com/dachenzi/articles/7684064.html , 安裝過程當中遇到的問題,歡迎郵件諮詢 beyondlee2011@126.com

10 第一個Python程序

        既然Python語言安裝完畢了,那麼小夥伴確定已經躍躍欲試了,那麼咱們就來寫一個吊炸天的Python程序吧
        首先這個程序很牛逼,爲何這麼說呢?由於會用到一個咱們之後幾乎每天用的命令,那就是print。有的同窗英文好,一下就知道是打印的意思。那麼該如何使用呢?

這個吊炸天的例子以下:

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

# 這裏:引號擴起來的就表示要打印到屏幕上的代碼,快去試試吧。

OK,你已經精通Python了!厲害了個人哥。哈哈

相關文章
相關標籤/搜索