給深度學習入門者的Python快速教程 - 基礎篇

来源:http://www.cnblogs.com/frombeijingwithlove/archive/2016/12/10/6158323.html
-Advertisement-
Play Games

實在搞不定博客園的排版,排版更佳的版本在:https://zhuanlan.zhihu.com/p/24162430 Life is short, you need Python 人生苦短,我用Python -- Bruce Eckel 5.1 Python簡介 本章將介紹Python的最基本語法, ...


 

實在搞不定博客園的排版,排版更佳的版本在:

https://zhuanlan.zhihu.com/p/24162430 

 

 

Life is short, you need Python

人生苦短,我用Python

-- Bruce Eckel

5.1 Python簡介

本章將介紹Python的最基本語法,以及一些和深度學習還有電腦視覺最相關的基本使用。

5.1.1 Python簡史

Python是一門解釋型的高級編程語言,特點是簡單明確。Python作者是荷蘭人Guido van Rossum1982年他獲得數學和電腦碩士學位後,在荷蘭數學與計算科學研究所(Centrum Wiskunde & Informatica, CWI)謀了份差事。在CWI期間,Guido參與到了一門叫做ABC的語言開發工作中。ABC是一門教學語言,所以擁有簡單,可讀性好,語法更接近自然語言等特點。在那個C語言一統天下的年代,ABC就是一股簡單的清流。不過畢竟是門教學語言,最後沒有流行起來,不過這段經歷影響了Guido1989年的聖誕假期,閑得蛋疼的Guido決定設計一門簡單易用的新語言,要介於CShell之間,同時吸取ABC語法中的優點。Guido用自己喜歡的一部喜劇電視劇來命名這門語言:《Monty Python's Flying Circus》。

1991年,第一版基於C實現的Python編譯器誕生,因為簡單,拓展性好,Python很快就在Guido的同事中大受歡迎,不久Python的核心開發人員就從Guido一人變成了一個小團隊。後來隨著互聯網時代的到來,開源及社區合作的方式蓬勃發展,Python也藉此上了發展的快車道。因為Python非常容易拓展,在不同領域的開發者貢獻下,許多受歡迎的功能和特征被開發出來,漸漸形成了各種各樣的庫,其中一部分被加入到Python的標準庫中,這讓本來就不需要過多思考底層細節的Python變得更加強大好用。在不過多考慮執行效率的前提下,使用Python進行開發的周期相比傳統的C/C++甚至Java等語言都大大縮短,代碼量也大幅降低,所以出bug的可能性也小了很多。因此有了語言專家Bruce Eckel的那句名言:Life is short, you need Python. 後來這句話的中文版“人生苦短,我用Python”被Guido印在了T恤上。發展至今,Python漸漸成了最流行的語言之一,在編程語言排行榜TOBIE中常年占據前5的位置。另外隨著Python的用戶群越來越壯大,慢慢在本身特點上發展出了自己的哲學,叫做Python的禪(The Zen of Python)。遵循Python哲學的做法叫做很PythonPythonic),具體參見:

https://www.python.org/dev/peps/pep-0020/

或者在Python中執行:

>> import this

Python擁有很好的擴充性,可以非常輕鬆地用其他語言編寫模塊供調用,用Python編寫的模塊也可以通過各種方式輕鬆被其他語言調用。所以一種常見的Python使用方式是,底層複雜且對效率要求高的模塊用C/C++等語言實現,頂層調用的APIPython封裝,這樣可以通過簡單的語法實現頂層邏輯,故而Python又被稱為“膠水語言”。這種特性的好處是,無需花費很多時間在編程實現上,更多的時間可以專註於思考問題的邏輯。尤其是對做演算法和深度學習的從業人員,這種方式是非常理想的,所以如今的深度學習框架中,除了MATLAB,或是Deeplearning4j這種擺明瞭給Java用的,其他框架基本上要麼官方介面就是Python,要麼支持Python介面。

5.1.2 安裝和使用Python

Python有兩個大版本,考慮到用戶群數量和庫的各種框架的相容性,本書以Python22.7)為準,語法儘量考慮和Python3的相容。

Unix/Linux下的Python基本都是系統自帶的,一般預設為Python2,使用時在終端直接鍵入python就能進入Python解釋器界面:

在解釋器下就已經可以進行最基本的編程了,比如:

寫程式的話還是需要保存成文件再執行,比如我們寫下麵語句,並且保存為helloworld.py

print("Hello world!")

然後在終端里執行:

安裝更多的python庫一般有兩種方法,第一是用系統的軟體包管理,以Ubuntu 16.04 LTS為例,比如想要安裝numpy庫(後面會介紹這個庫),軟體包的名字就是python-numpy,所以在終端中輸入:

>> sudo apt install python-numpy

Python自己也帶了包管理器,叫做pip,使用如下:

>> pip install numpy

安裝和深度學習相關的框架時,一般來說推薦使用系統自帶的包管理,出現版本錯誤的可能性低一些。另外也可以使用一些提前配置好很多第三方庫的Python包,這些包通常已經包含了深度學習框架中絕大多數的依賴庫,比如最常用的是Anaconda

https://www.continuum.io/downloads

Windows下的Python安裝簡單一些,從官方網站下載相應的安裝程式就可以了,當然也有更方便的已經包含了很全的第三方庫的選擇,WinPython

http://winpython.github.io/

並且是綠色的,直接執行就可以用了。

5.2 Python基本語法

There should be one-- and preferably only one --obvious way to do it.

對於一個特定的問題,應該只用最好的一種方法來解決。

-- Tim Peters

5.2.1 基本數據類型和運算

基本數據類型

Python中最基本的數據類型包括整型,浮點數,布爾值和字元串。類型是不需要聲明的,比如:

a = 1       # 整數

b = 1.2     # 浮點數

c = True    # 布爾類型

d = "False" # 字元串

e = None    # NoneType

其中#是行內註釋的意思。最後一個NoneNoneType,註意不是0,在Python中利用type函數可以查看一個變數的類型:

type(a)     # <type 'int'>

type(b)     # <type 'float'>

type(c)     # <type 'bool'>

type(d)     # <type 'str'>

type(e)     # <type 'NoneType'>

註釋中是執行type()函數後的輸出結果,可以看到None是單獨的一種類型NoneType。在很多API中,如果執行失敗就會返回None

 

變數和引用

Python中基本變數的賦值一般建立的是個引用,比如下麵的語句:

a = 1

b = a

c = 1

a賦值為1後,b=a執行時並不會將a的值複製一遍,然後賦給b,而是簡單地為a所指的值,也就是1建立了一個引用,相當於ab都是指向包含1這個值的這塊記憶體的指針。所以c=1執行的也是個引用建立,這三個變數其實是三個引用,指向同一個值。這個邏輯雖然簡單,不過也還是常常容易弄混,這沒關係,Python內置了id函數,可以返回一個對象的地址,用id函數可以讓我們知道每個變數指向的是不是同一個值:

id(a)   # 35556792L

id(b)   # 35556792L

id(c)   # 35556792L

註釋中表示的仍是執行後的結果。如果這時候我們接下麵兩個語句:

b = 2   # b的引用到新的一個變數上

id(b)   # 35556768L

可以看到b引用到了另一個變數上。

 

運算符

Python中的數值的基本運算和C差不多,字元串的運算更方便,下麵是常見的例子:

a = 2

b = 2.3        

c = 3

a + b            # 2 + 2.3 = 4.3

c – a           # 3 - 2 = 1

a / b            # 整數除以浮點數,運算以浮點數為準,2 / 2.3 = 0.8695652173913044

a / c            # Python2中,整數除法,向下取整 2 / 3 = 0

a ** c          # ac次方,結果為8

a += 1          # Python中沒有i++的用法,自增用+=

c -= 3          # c變成0

d = 'Hello'    

d + ' world!'   # 相當於字元串拼接,結果為'Hello world!'

d += ' "world"!'# 相當於把字元串接在當前字元串尾,d變為'Hello "world"!'

e = r'\n\t\\'  

print(e)        # '\\n\\t\\\\'

需要提一下的幾點:1)字元串用雙引號和單引號都可以,區別主要是單引號字元串中如果出現單引號字元則需要用轉義符,雙引號也是一樣,所以在單引號字元串中使用雙引號,或者雙引號字元串中使用單引號就會比較方便。另外三個雙引號或者三個單引號圍起來的也是字元串,因為換行方便,更多用於文檔。2Python2中兩個數值相除會根據數值類型判斷是否整數除法,Python3種則都按照浮點數。想要在Python2種也執行Python3中的除法只要執行下麵語句:

from __future__ import division     # 使用Python3中的除法

1 / 2                               # 0.5

3)字元串前加r表示字元串內容嚴格按照輸入的樣子,好處是不用轉義符了,非常方便。

Python中的布爾值和邏輯的運算非常直接,下麵是例子:

a = True

b = False

a and b     # False

a or b      # True

not a       # False

基本上就是英語,操作符優先順序之類的和其他語言類似。Python中也有位操作:

~8      # 按位翻轉,1000 --> -(1000+1)

8 >> 3 # 右移3位,1000 --> 0001

1 << 3 # 左移3位,0001 --> 1000

5 & 2   # 按位與,101 & 010 = 000

5 | 2   # 按位或,101 | 010 = 111

4 ^ 1   # 按位異或,100 ^ 001 = 101

 

==, !=is

判斷是否相等或者不等的語法和C也一樣,另外在Python中也常常見到is操作符,這兩者的區別在於==!=比較引用指向的記憶體中的內容,而is判斷兩個變數是否指向一個地址,看下麵的代碼例子:

a = 1

b = 1.0

c = 1

a ==# True,值相等

a is# False,指向的不是一個對象,這個語句等效於 id(a) == id(b)

a is# True,指向的都是整型值1

所以一定要分清要比較的對象應該用那種方式,對於一些特殊的情況,比如None,本著Pythonic的原則,最好用is None / is not None

 

註意關鍵字

Python中,萬物皆對象。不過這並不是這裡要探討的話題,想說的是一定要註意關鍵字,因為所有東西都是對象,所以一個簡簡單單的賦值操作就可以把系統內置的函數給變成一個普通變數,來看下邊例子:

id(type)                    # 506070640L

type = 1                    <

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 問題的提出 昨天在qq群問了一個linq的問題被人鄙視了。題目大概類似於 問from...in...select...中in後面如果接的不是集合,而是一個delegate,會怎麼樣??之後就被人鄙視了,一些人嘲笑我工作年頭是混出來的,in後面當然是數據源了,delegate也可以作為數據源,所以當然 ...
  • 本文版權歸博客園和作者吳雙本人共同所有,轉載和爬蟲請註明原文地址 www.cnblogs.com/tdws 寫在前面 OOM顧名思義,Object-Object-Mapping實體間相互轉換,AutoMapper也是個老生常談了,其意義在於幫助你無需手動的轉換簡單而又麻煩的實體間關係,比如ViewM ...
  • Matlab7.0安裝完成後打開就立即關閉,此時右鍵點擊MATLAB7.0快捷方式-“用圖形處理器運行”-“更改預設圖形處理器”,將“集成圖形”設置成預設: 點擊MATLAB7.0快捷方式將顯示: 然後將視窗關閉,在桌面找到MATLAB快捷方式將游標移動到該快捷方式,右鍵查看該快捷方式的“相容性”, ...
  • Error occurred computing Git commit diffsMissing unknown 0000000000000000000000000000000000000000 commit操作時,出現如上錯誤 ...
  • Java里的攔截器是動態攔截Action調用的對象。它提供了一種機制可以使開發者可以定義在一個action執行的前後執行的代碼,也可以在一個action執行前阻止其執行,同時也提供了一種可以提取action中可重用部分的方式。在AOP(Aspect-Oriented Programming)中攔截器... ...
  • ...
  • 前段時間寫了幾個PHP的腳本,但是因為腳本的項目是基於composer安裝的,給別人使用的時候不太方便,就希望能夠打包成一個能直接使用的文件。 搜索了一下,發現可以使用phar打包。 假設我們有如下一個項目 入口文件是index.php,打包前的命令如下: 再添加打包腳本之前,需要先修改一下PHP的 ...
  • 緩存的意思是中間存儲,相當於中轉站,積累一定的貨物,再往目的地運送。如果沒有中轉站,就會出現一件一件的運送,耗費大量的人力物力。 緩存的基類是:Buffer 緩存的基本子類有:Char/Byte/Short/Int/Long/Float/Double + Buffer 緩存一般用一個數組做存儲,ar ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...