Python 教程:從零到大師!你一定可以學會


首先, 什麼是Python? 用python作者

Guido van Rossum自己的話來說,Python是這樣的一門語言:
"它是一門高級編程語言, 它的核心設計理念是讓所有代碼變得更易閱讀,並給開發者們提供一種“僅僅幾行代碼就能編寫編程邏輯”的語法。

Python 教程:從零到大師!你一定可以學會

python對抗綠色像素螺旋

那麼,對我來說,讓我學習Python的第一個理由,就是它漂亮而優雅,能夠順暢自然地實現我的想法。
另一個理由,就是Python支持多種編程領域,如:
數據科學
web開發
機器學習
比如,Quora、Pinterest、Spotify,這些項目,都是使用python開發他們的後端。
注:想學習Python的小夥伴們可以關注小編私信回覆“資料”領取免費的學習資料。
那麼,接下來,就開始學習Python吧!
基礎
1. 變量
可以把變量簡單理解為一個存儲值的單詞。
講道理,變量是什麼就不用特地解釋了…大家都懂。
在Python裡面,定義變量、給變量賦值都非常簡單。比如你想把數字1存儲到一個變量裡面,而這個變量名叫one,那麼,你只需要這樣:


<code>one = 1/<code>


非常簡單吧? 舉一反三,完全可以自由發揮,就像下面,把2賦值給two,把10000賦值給some_number:

<code>two = 2some_number = 10000/<code>


當然,除了整型以外,我們也可以設置布爾類型、字符串、單精度,以及一些其他數據類型。如下:

<code># booleanstrue_boolean = Truefalse_boolean = False# stringmy_name = "Leandro Tk"# floatbook_price = 15.80/<code>


2.流程控制: 分支語句
if,這個語句用來判斷是否符合條件,它的後面緊跟著邏輯表達式,表達式最後的值為True或False,如果是true,則執行if裡面的語句。如下:

<code>if True:print("Hello Python If")if 2 > 1:print("2 is greater than 1")/<code>


因為2大於1,條件成立,所以print語句就會被執行
當然,如果不滿足條件,那麼else就派上用場了!
如果,if後面跟著的邏輯表達式最終值是false,則會運行else裡面的程序,如下:


<code>if 1 > 2:print("1 is greater than 2")else:print("1 is not greater than 2")/<code>


你也可以使用elif,是else if的縮寫,但千萬別寫錯~

<code>if 1 > 2:print("1 is greater than 2")elif 2 > 1:print("1 is not greater than 2")else:print("1 is equal to 2")/<code>


3. 循環 / 迭代器
在Python中,我們有多種迭代的方式,我在這裡說兩種:
While 循環: 當邏輯表達式為true的時候,while下縮進的代碼塊就會被循環執行. 所以下面的代碼片段,將會從1打印到10。

<code>num = 1while num <= 10:print(num)num += 1/<code>


上面這種循環方式,需要一個循環條件,如果循環條件是true,就會繼續進行迭代,在上面的例子中,當num變成11的時候,循環條件就會等於False"
再看看下面的基礎代碼塊,以便於理解:

<code>loop_condition = Truewhile loop_condition:print("Loop Condition keeps: %s" %(loop_condition))loop_condition = False/<code> 


只要循環條件為True,就會被一直循環執行,直到循環條件變成False
For循環: 與其他語言一樣,這用於計次循環,它循環的次數,取決於後面那個range方法。
range,代表從在循環裡,它用於表示從x到n,如下,就是從1到11,第三個參數可空,意思是每次遞進的加數,默認每循環一次給i加1,填2的話,就給i加2

<code>for i in range(1, 11):print(i)/<code>


列表: 集合 | 數組 | 數據結構
想象一下,你想把整數1存儲在一個變量中。 但也許現在你想要存儲 2 和 3,4,5 。。。
我是否有另一種方法來存儲我想要的所有整數,但不是以百萬計的變量? 你猜對了 —— 確實有另一種方法來存儲它們。
List 是一個可以用來存儲一列值的集合(比如你想要的這些整數)。 那麼讓我們使用它:

<code>my_integers = [1, 2, 3, 4, 5]/<code>


這真的很簡單,我們創建了一個數組並將其存儲到my_integer裡。
但是也許你在問: 『 我怎樣才能從這個列表中獲得值? 』


很好的問題。 List 有一個叫做索引的概念。 第一個元素獲取索引 0 (零)。 第二個取 1 ,依此類推。 明白了吧。
為了使其更清楚,我們可以用它的索引來表示數組和每個元素。 我可以畫出來:

Python 教程:從零到大師!你一定可以學會

使用 Python 語法,它也很容易理解:

<code>my_integers = [5, 7, 1, 3, 4]print(my_integers[0]) # 5print(my_integers[1]) # 7print(my_integers[4]) # 4/<code>


想象一下現在你不想存儲整數了。你只是想存儲字符串,就像你親戚名字的列表一樣。 看起來像這樣:

<code>relatives_names = ["Toshiaki","Juliana","Yuji","Bruno","Kaio"]print(relatives_names[4]) # Kaio/<code>


它的工作方式與整數相同,漂亮。
我們剛剛瞭解到 Lists 索引是如何工作的。 但是我仍然需要告訴你如何將一個元素添加到 List 數據結構(一個項目到列表)。
添加一個值到 List 最常見的方法是 append 。讓我們看看他是如何工作的:

<code>bookshelf = []bookshelf.append("The Effective Engineer")bookshelf.append("The 4 Hour Work Week")print(bookshelf[0]) # The Effective Engineerprint(bookshelf[1]) # The 4 Hour Work Week/<code>


append 非常的簡單。您只需要將元素(例如『 The Effective Engineer 』)作為『 append 』參數應用即可。
那麼,關於 Lists 到這裡就結束了,讓我們來談談另一個數據結構。
字典: 鍵-值 數據結構
現在我們知道 Lists 使用整數來索引. 但是如果我們不想使用整數來索引呢? 一些其他的數據結構可以使用數字,字符串或者其他的類型來做索引.


讓我們來學習 Dictionary 數據結構. Dictionary 是一個鍵值對集合. 它長下面這樣:

<code>dictionary_example = {"key1": "value1","key2": "value2","key3": "value3"}/<code>


鍵用來索引到值. 那麼我們如何訪問 Dictionary的值呢? 你猜對啦?---?使用鍵. 試一下吧:

<code>dictionary_tk = {"name": "Leandro","nickname": "Tk","nationality": "Brazilian"}print("My name is %s" %(dictionary_tk["name"])) # My name is Leandroprint("But you can call me %s" %(dictionary_tk["nickname"])) # But you can call me Tkprint("And by the way I'm %s" %(dictionary_tk["nationality"])) # And by the way I'm Brazilian/<code>


我創建了一個關於我的 Dictionary. 我的名字, 暱稱和國籍. 這些屬性是Dictionary 的鍵.
我們知道訪問 List 使用下標, 我們在這也使用下標 ( Dictionary 中的鍵的內容) 來訪問存在 Dictionary中的值.
在例子中, 我打印出了存在 Dictionary中的所有關於我的短語. 非常簡單滴~?
另一件關於 Dictionary非常帥氣的事情就是我們可以使用任何東西來做為字典的值.在我創建的Dictionary中, 我想添加鍵為 "age" 且值為我的整數年齡進去:

<code>dictionary_tk = {"name": "Leandro","nickname": "Tk","nationality": "Brazilian","age": 24}print("My name is %s" %(dictionary_tk["name"])) # My name is Leandroprint("But you can call me %s" %(dictionary_tk["nickname"])) # But you can call me Tkprint("And by the way I'm %i and %s" %(dictionary_tk["age"], dictionary_tk["nationality"])) # And by the way I'm Brazilian/<code>


這裡我們有一個鍵 (age) 值 (24) 對 使用字符串來作為鍵,整數來作為值.
像我們學習 Lists一樣,讓我們來學習如何在 Dictionary中添加元素.在Dictionary中, 一個鍵指向一個值是很重要的. 這就是為什麼我們在添加元素的時候討論它:


<code>dictionary_tk = {"name": "Leandro","nickname": "Tk","nationality": "Brazilian"}dictionary_tk['age'] = 24print(dictionary_tk) # {'nationality': 'Brazilian', 'age': 24, 'nickname': 'Tk', 'name': 'Leandro'}/<code>


我們只需要指定一個值到 Dictionary的鍵上. 一點也不復雜,484啊?
迭代:循環Python中的數據結構
當我們在學習 Python基礎時, 會發現列表的迭代是一件十分簡單的事情 ,通常我們Python開發者會使用For來循環迭代它. 現在讓我們嘗試一下:

<code>bookshelf = ["The Effective Engineer","The 4 hours work week","Zero to One","Lean Startup","Hooked"]for book in bookshelf:print(book)/<code>


如你所見我們已經對書架中的書進行了for操作,我們輸出打印了其中的書(當然你可以在循環中對它們做任何事情)。簡單而又直觀,這就是Python。
同樣對於哈希類型的數據結構,比如像是Python中的字典,我們同樣也可以對其使用for循環進行迭代操作,但是此時我們則需要用到key:

<code>dictionary = { "some_key": "some_value" }for key in dictionary:print("%s --> %s" %(key, dictionary[key]))# some_key --> some_value/<code>


這是一個循環字典類型變量的小例子,對於dictionary變量我們使用for循環操作其中的key,接著我們打印輸出他的key以及其相對應匹配的value值。

<code>當然我們還有另外一種方法去實現它,就是去使用iteritems:dictionary = { "some_key": "some_value" }for key, value in dictionary.items():print("%s --> %s" %(key, value))# some_key --> some_value/<code>


你看我們已經命名了兩個參數key,value,但這並不是必須的,你甚至可以給它們起任何一個名字^.^,讓我們來看一下:

<code>dictionary_tk = {"name": "Leandro","nickname": "Tk","nationality": "Brazilian","age": 24}for attribute, value in dictionary_tk.items():print("My %s is %s" %(attribute, value))# My name is Leandro# My nickname is Tk# My nationality is Brazilian# My age is 24/<code>


哈哈,可以看到我們已經使用了attribute作為了Dictionary的key參數,代碼運行十分正確。贊!
類型與對象
一點基礎理論:
對象代表現實世界中像轎車、狗、自行車這些事物。對象具有數據和行為兩個主要特徵。
在面向對象編程中,我們把數據當作屬性,把行為當作方法。即:
數據 → 屬性 和 行為 → 方法
類型是創造單個對象實例的藍本。在現實世界中,我們經常發現很多對象實例擁有相同的類型,比如轎車。他們都具有相同的構造和模型(具有發動機,輪子,門等等)。每輛車都是根據同一張設計圖製作的,並且具有相同的組成部分。

Python 的面向對象編程模式:ON
Python,作為一門面向對象編程的語言,具有類和對象的概念。
類是藍圖,對象是模型。
同樣,一個類,它只是一個模型,或者一種定義屬性和行為的方法(正如我們在理論部分所討論的)。例如,車輛類有自己的屬性,定義什麼是車輛。車輪的數量、能源的類型、座位容量和最大速度都是車輛的屬性。
考慮到這一點,讓我們看看類的Python語法:

<code>class Vehicle:pass/<code>


我們用一個類聲明來定義類?,僅此而已。很簡單,不是嗎?
對象是一個類的實例,我們用命名類來創建一個實例。

<code>car = Vehicle()print(car) # <__main__.vehicle instance="" at=""/>/<code>


這裡 ‘car’ 是 ‘Vehicle’ 類的一個對象(或者說實例)。
記住,我們的 ‘Vehicle’ 類有四個屬性:輪子數量,能源類型,座位容量,和最大速度。我們創建一個 ‘Vehicle’ 對象時設置所有這些屬性 。所以在這裡,我們定義我們的類初始化時要接收數據時:


<code>class Vehicle:def __init__(self, number_of_wheels, type_of_tank, seating_capacity, maximum_velocity):self.number_of_wheels = number_of_wheelsself.type_of_tank = type_of_tankself.seating_capacity = seating_capacityself.maximum_velocity = maximum_velocity/<code>


我們使用了 ‘init’方法。我們稱它為構造方法。所以創建 ‘vehicle’ 對象時可以定義這些屬性。假設我們喜歡Tesla Model S,我們要創建這種對象。它有4個輪子,使用電能,有5個座位,最大時速250km/h (155mph)

<code>tesla_model_s = Vehicle(4, 'electric', 5, 250)/<code>


4個“輪子”+電能“能源”+5個“座位”+250km/h“最大速度”。
所有屬性都設置完成了。但是我們如何獲取這些屬性值?我們發送一個消息到對象來問他們。 我們稱之為方法. 方法是對象的行為. 讓我們來實現它:

<code>class Vehicle:def __init__(self, number_of_wheels, type_of_tank, seating_capacity, maximum_velocity):self.number_of_wheels = number_of_wheelsself.type_of_tank = type_of_tankself.seating_capacity = seating_capacityself.maximum_velocity = maximum_velocitydef number_of_wheels(self):return self.number_of_wheelsdef set_number_of_wheels(self, number):self.number_of_wheels = number/<code>


這裡創建了兩個方法: number_of_wheels 和 set_number_of_wheels. 我們稱它為 獲取 & 設置. 因為第一個獲取了屬性值,然後第二個設置了一個新的屬性值。
Python 中,我們可以用 “@property” (“decorator”) 去定義 "getters" 和 “setters”。請看以下代碼:

<code>class Vehicle:def __init__(self, number_of_wheels, type_of_tank, seating_capacity, maximum_velocity):self.number_of_wheels = number_of_wheelsself.type_of_tank = type_of_tankself.seating_capacity = seating_capacityself.maximum_velocity = maximum_velocity@propertydef number_of_wheels(self):return self.number_of_wheels@number_of_wheels.setterdef number_of_wheels(self, number):self.number_of_wheels = number/<code>


同時,我們可以使用這些方法作為屬性:


<code>tesla_model_s = Vehicle(4, 'electric', 5, 250)print(tesla_model_s.number_of_wheels) # 4tesla_model_s.number_of_wheels = 2 # setting number of wheels to 2print(tesla_model_s.number_of_wheels) # 2/<code>


這個與定義方法有些許不同。這些方法的工作機制與屬性不同。例如,當我們設置輪子數量時,我們需要把2賦值給一個變量,只需要設置 “number_of_wheels” 的值為2。這是一種寫 “pythonic”、 ”getter“、“setter” 代碼的方法。
而且同時我們也可以使用其他方法,比如 “make_noise” 方法。請看下面的例子。

<code>class Vehicle:def __init__(self, number_of_wheels, type_of_tank, seating_capacity, maximum_velocity):self.number_of_wheels = number_of_wheelsself.type_of_tank = type_of_tankself.seating_capacity = seating_capacityself.maximum_velocity = maximum_velocitydef make_noise(self):print('VRUUUUUUUM')/<code>


當我們調用這個方法時,它返回字符串 ”VRRRRUUUUM“。

<code>tesla_model_s = Vehicle(4, 'electric', 5, 250)tesla_model_s.make_noise() # VRUUUUUUUM/<code>


封裝:信息隱藏
封裝是一種限制直接訪問對象數據和方法的機制。但是它加快了對象方法中數據的訪問。
"封裝可以在定義中隱藏數據和函數成員,意味著從外部隱藏了對象定義中的內部描述“--- Wikipedia
對象從外部隱藏了其內部描述。只有對象可以與它的內部數據進行交互。
首先,我們需要了解 “public” 和 “non-public” 變量實例的工作機制。


Public 變量實例
對於一個 Python 類型,我們可以使用構造方法初始化一個公共變量實例。我們看這個:
通過構造方法:

<code>class Person:def __init__(self, first_name):self.first_name = first_name/<code>


這裡我們使用 “first_name” 的值作為一個參數傳遞給公共變量實例。

<code>tk = Person('TK')print(tk.first_name) # => TK在類中:class Person:first_name = 'TK'/<code>


這裡,我們不需要使用 “first_name” 作為一個參數,所有的對象實例都有一個用 “TK” 初始化的類屬性。

<code>tk = Person()print(tk.first_name) # => TK/<code>


漂亮。我們已經學習到可以使用公共變量實例和類型屬性。另一件關於 “public” 部分有趣的事情是我們可以管理它的變量的值。我的意思是什麼呢?我們的對象可以管理它的變量值:獲取和設置變量值。
記住 “Person” 類,我們想要設置另一個值給它的 “first_name” 變量:

<code>tk = Person('TK')tk.first_name = 'Kaio'print(tk.first_name) # => Kaio/<code>


好了,我們剛剛設置了另一個值("kaio")給對象變量 “first_name”,並且它更新了它的值。就是這麼簡單,因為這個 “public” 變量,我們可以這樣做。
Non-public 變量實例
“在這裡,我們不用‘私有‘來形容 ,因為在Python中沒有真正“私有”的屬性(避免了一般情況下不必要的工作)。”---?PEP 8
和公共變量實例一樣,我們可以在構造函數或類內部定義非公共變量實例。語法上的差異是: 對於非公共變量實例,我們在變量名前加一道下劃線(_)。
“在Python中,無法從內部訪問‘私有’變量實例的對象是不存在的。但是,大多數Python代碼遵循一個慣例:一個名字前有一道下劃線的對象應該被認為是API中非公共的部分,例如_spam,無論它是一個函數、方法或是數據成員。”?---?Python Software Foundation
這是一個例子:

<code>class Person:def __init__(self, first_name, email):self.first_name = first_nameself._email = email/<code>


看到email變量了嗎?這就是定義一個非公共變量的方法。

<code>tk = Person('TK', '[email protected]')print(tk._email) # [email protected]/<code>


所謂非公共變量只是一個慣例,沒有機制禁止我們從外部訪問並更新它。但按照慣例,我們應該把它作為API中非公共的部分來對待。


在類內部,我們通常使用方法來操作“非公共變量”,讓我們實現兩個方法(email和update_email)來理解。

<code>class Person:def __init__(self, first_name, email):self.first_name = first_nameself._email = emaildef update_email(self, new_email):self._email = new_emaildef email(self):return self._email/<code>


現在,我們可以通過這些方法來訪問、更新非公共變量。

<code>tk = Person('TK', '[email protected]')print(tk.email()) # => [email protected]._email = '[email protected]'print(tk.email()) # => [email protected]_email('[email protected]')print(tk.email()) # => [email protected]/<code>


我們以first_name TK 和 email [email protected] 初始化一個Person對象。
通過方法訪問非公共變量 email,並打印出來。
從類外部直接設置一個新的email。
我們應該把非公共變量作為API中非公共的部分來對待。
通過實例方法更新非公共變量 email。
成功!我們可以通過預設的方法來更新它。
公共方法
通過 公共方法, 我們也可以在我們類的外部使用這些方法了:

<code>class Person:def __init__(self, first_name, age):self.first_name = first_nameself._age = agedef show_age(self):return self._age/<code>


讓我們來試下:

<code>tk = Person('TK', 25)print(tk.show_age()) # => 25/<code>


贊——用起來沒有任何問題。
非公共方法
但是通過 非公共方法 我們卻無法做到這一點。 我們先來實現一個同樣的 Person 類,不過這回我們加個下劃線(_)來定義一個 show_age 的非公共方法。

<code>class Person:def __init__(self, first_name, age):self.first_name = first_nameself._age = agedef _show_age(self):return self._age/<code>


那麼現在,我們來試著通過我們的對象調用這個 非公共方法:

<code>tk = Person('TK', 25)print(tk._show_age()) # => 25/<code>


我們可以訪問並且更新它。 非公共方法 只是一類約定俗成的規定,並且應當被看做接口中的非公共部分。
關於我們該怎麼使用它,這有個例子:

<code>class Person:def __init__(self, first_name, age):self.first_name = first_nameself._age = agedef show_age(self):return self._get_age()def _get_age(self):return self._agetk = Person('TK', 25)print(tk.show_age()) # => 25/<code>


這裡我們有一個 _get_age 非公共方法和一個show_age 公共方法。show_age可以由我們的對象調用(在類的外部)而_get_age只能在我們類定義的內部使用(內部show_age方法)。但是再次強調下,這只是個約定俗成的規定。


封裝總結
通過封裝我們可以從外部隱藏對象的內部表示。
繼承:行為和特徵
某些對象具有共同點:如行為和特徵。
例如,我從我父親那裡繼承了一些特徵和行為。我繼承了他的眼睛和頭髮作為特徵,繼承了他的急躁和內向作為行為。
在面向對象編程中,類能夠從其他類中繼承特徵(數據)和行為(方法)。
讓我們看另外一個例子。
假定一輛車。輪子的數量、載客量和最高時速是車的所有屬性。那麼我們可以認為ElectricCar類從這個Car類中繼承了這些屬性。

<code>class Car:def __init__(self, number_of_wheels, seating_capacity, maximum_velocity):self.number_of_wheels = number_of_wheelsself.seating_capacity = seating_capacityself.maximum_velocity = maximum_velocity/<code>


我們的Car類實現之後:

<code>my_car = Car(4, 5, 250)print(my_car.number_of_wheels)print(my_car.seating_capacity)print(my_car.maximum_velocity)/<code>


一旦初始化後,我們可以使用所有已創建的實例變量。很好。
在Python中我們可以將父類作為子類定義時的參數。一個ElectricCar類能從之前的Car類中繼承。


<code>class ElectricCar(Car):def __init__(self, number_of_wheels, seating_capacity, maximum_velocity):Car.__init__(self, number_of_wheels, seating_capacity, maximum_velocity)/<code>


簡單如上。我們不需要實現任何其他的方法,因為這個類已經有了(繼承自Car類)。讓我們確認一下:

<code>my_electric_car = ElectricCar(4, 5, 250)print(my_electric_car.number_of_wheels) # => 4print(my_electric_car.seating_capacity) # => 5print(my_electric_car.maximum_velocity) # => 250/<code>


漂亮。
就到這裡!
關於Python基礎,我們學會了很多:
變量
分支語句
循環語法
列表:集合 | 數組
字典:鍵值對的集合
如何迭代這些數據結構
對象和類
用屬性作為對象的數據
用方法作為對象的行為
getters、setters 和 property 裝飾器
封裝:信息隱藏
繼承:行為和特徵
恭喜!你完成了Python的這段密集的內容。
堅持學習,堅持編程,祝你玩得開心!
最後小編還為大家準備了一些Python以及其他編程的學習教程(免費),有想學習編程的小夥伴可以關注私信我回復“資料”領取哦,每天拿出2-3個小時自學就可以,學的時間長了,也一下子消化不了,如果你想學習的話,不如就從現在開始學習編程語言吧!




2019年最新Python教程


如果你處於想學Python或者正在學習Python,Python的教程不少了吧,但是是最新的嗎?
2019Python自學教程全新升級為《Python+數據分析+機器學習》,九大階段能力逐級提升,打造技能更全面的全棧工程師。

Python 教程:從零到大師!你一定可以學會

Python 教程:從零到大師!你一定可以學會

以上這Java和Python自學教程小編已經為大家打包準備好了,希望對正在學習的你有所幫助!

獲取方式:轉發此文+關注 並 私信小編關鍵詞 “ 資料 ”,即可免費獲取哦!


分享到:


相關文章: