Python基礎:Hello World!
Python命令行
假設你已經安裝好了Python, 那麼在命令提示符輸入:
python
將直接進入python。然後在命令行提示符>>>後面輸入:
>>>print('Hello World!')
可以看到,隨後在屏幕上輸出:
print是一個常用函數,其功能就是輸出括號中得字符串。
(在Python 2.x中,print還可以是一個關鍵字,可寫成print 'Hello World!',但這在3.x中行不通)
寫一段小程序
另一個使用Python的方法,是寫一個Python程序。用文本編輯器寫一個.py結尾的文件,比如說hello.py
在hello.py中寫入如下,並保存:
print('Hello World!')
$python hello.py
來運行hello.py。可以看到Python隨後輸出
Hello World!
Python基礎: 基本數據類型
Python的變量不需要聲明,你可以直接輸入:
那麼你的內存裡就有了一個變量a, 它的值是10,它的類型是integer (整數)。 在此之前你不需要做什麼特別的聲明,而數據類型是Python自動決定的。
>>>print(a)
>>>print(type(a))
那麼會有如下輸出:
10
這裡,我們學到一個內置函數type(), 用以查詢變量的類型。
回收變量名
如果你想讓a存儲不同的數據,你不需要刪除原有變量就可以直接賦值。
>>>a = 1.3
>>>print(a,type(a))
會有如下輸出
1.3
我們看到print的另一個用法,也就是print後跟多個輸出,以逗號分隔。
基本數據類型
a=10# int 整數
a=1.3# float 浮點數
a=True # 真值 (True/False)
a='Hello!' # 字符串。字符串也可以用雙引號。
以上是最常用的數據類型。此外還有分數,字符,複數等其他類型,有興趣的可以學習一下。
變量不需要聲明,不需要刪除,可以直接回收使用。
type(): 查詢數據類型
整數,浮點數,真值,字符串
Python基礎:序列
sequence 序列
sequence(序列)是一組有順序的元素的集合
(嚴格的說,是對象的集合,但鑑於我們還沒有引入“對象”概念,暫時說元素)
序列可以包含一個或多個元素,也可以沒有任何元素。
我們之前所說的基本數據類型,都可以作為序列的元素。元素還可以是另一個序列,以及我們以後要介紹的其他對象。
序列有兩種:tuple(定值表; 也有翻譯為元組) 和 list (表)
>>>s1 = (2, 1.3, 'love', 5.6, 9, 12, False)# s1是一個tuple
>>>s2 = [True, 5, 'smile']# s2是一個list
>>>print(s1,type(s1))
>>>print(s2,type(s2))
tuple和list的主要區別在於,一旦建立,tuple的各個元素不可再變更,而list的各個元素可以再變更。
一個序列作為另一個序列的元素
>>>s3 = [1,[3,4,5]]
空序列
>>>s4 = []
元素的引用
序列元素的下標從0開始:
>>>print(s1[0])
>>>print(s2[2])
>>>print(s3[1][2])
由於list的元素可變更,你可以對list的某個元素賦值:
>>>s2[1] = 3.0
>>>print(s2)
如果你對tuple做這樣的操作,會得到錯誤提示。
所以,可以看到,序列的引用通過s[]實現, int為下標
其他引用方式
範圍引用: 基本樣式[下限:上限:步長]
>>>print(s1[:5])# 從開始到下標4 (下標5的元素 不包括在內)
>>>print(s1[2:])# 從下標2到最後
>>>print(s1[0:5:2])# 從下標0到下標4 (下標5不包括在內),每隔2取一個元素 (下標為0,2,4的元素)
>>>print(s1[2:0:-1])# 從下標2到下標1
從上面可以看到,在範圍引用的時候,如果寫明上限,那麼這個上限本身不包括在內。
尾部元素引用
>>>print(s1[-1])# 序列最後一個元素
>>>print(s1[-3])# 序列倒數第三個元素
同樣,如果s1[0:-1], 那麼最後一個元素不會被引用 (再一次,不包括上限元素本身)
字符串是元組
字符串是一種特殊的元組,因此可以執行元組的相關操作。
>>>str = 'abcdef'
>>>print(str[2:4])
tuple元素不可變,list元素可變
序列的引用 s[2], s[1:8:2]
字符串是一種tuple
Python基礎04 運算
數學運算
>>>print 1+9# 加法
>>>print 1.3-4# 減法
>>>print 3*5# 乘法
>>>print 4.5/1.5# 除法
>>>print 3**2# 乘方
>>>print 10%3# 求餘數
判斷
判斷是真還是假,返回True/False
>>>print 5==6# =, 相等
>>>print 8.0!=8.0# !=, 不等
>>>print 3
>>>print 4>5, 4>=0# >, 大於; >=, 大於等於
>>>print 5 in [1,3,5]# 5是list [1,3,5]的一個元素
(還有is, is not等, 暫時不深入)
邏輯運算
True/False之間的運算
>>>print True and True, True and False# and, “與”運算, 兩者都為真才是真
>>>print True or False# or, '或'運算, 其中之一為真即為真
>>>print not True# not, “非”運算, 取反
可以和上一部分結合做一些練習,比如:
>>>print 5==6 or 3>=3
數學+, -, *, /, **, %
判斷==, !=, >, >=,
邏輯and, or, not
Python基礎:縮進和選擇
縮進
Python最具特色的是用縮進來標明成塊的代碼。我下面以if選擇結構來舉例。if後面跟隨條件,如果條件成立,則執行歸屬於if的一個代碼塊。
先看C語言的表達方式(注意,這是C,不是Python!)
如果i > 0的話,我們將進行括號中所包括的兩個賦值操作。括號中包含的就是塊操作,它隸屬於if。
在Python中,同樣的目的,這段話是這樣的
在Python中, 去掉了i > 0周圍的括號,去除了每個語句句尾的分號,表示塊的花括號也消失了。
多出來了if ...之後的:(冒號), 還有就是x = 1 和 y =2前面有四個空格的縮進。通過縮進,Python識別出這兩個語句是隸屬於if。
Python這樣設計的理由純粹是為了程序好看。
if語句
寫一個完整的程序,命名為ifDemo.py。這個程序用於實現if結構。
$python ifDemo.py# 運行
程序運行到if的時候,條件為True,因此執行x = x+1,。
print x語句沒有縮進,那麼就是if之外。
如果將第一句改成i = -1,那麼if遇到假值 (False), x = x+1隸屬於if, 這一句跳過。 print x沒有縮進,是if之外,不跳過,繼續執行。
這種以四個空格的縮進來表示隸屬關係的書寫方式,以後還會看到。強制縮進增強了程序的可讀性。
複雜一些的if選擇:
這裡有三個塊,分別屬於if, elif, else引領。
Python檢測條件,如果發現if的條件為假,那麼跳過後面緊跟的塊,檢測下一個elif的條件; 如果還是假,那麼執行else塊。
通過上面的結構將程序分出三個分支。程序根據條件,只執行三個分支中的一個。
整個if可以放在另一個if語句中,也就是if結構的嵌套使用:
if i > 2 後面的塊相對於該if縮進了四個空格,以表明其隸屬於該if,而不是外層的if。
if語句之後的冒號
以四個空格的縮進來表示隸屬關係, Python中不能隨意縮進
if :
statement
elif :
statement
elif :
statement
else:
statement
Python基礎: 函數
函數最重要的目的是方便我們重複使用相同的一段程序。
將一些操作隸屬於一個函數,以後你想實現相同的操作的時候,只用調用函數名就可以,而不需要重複敲所有的語句。
函數的定義
首先,我們要定義一個函數, 以說明這個函數的功能。
defsquare_sum(a,b): c = a**2 + b**2returnc
這個函數的功能是求兩個數的平方和。
首先,def,這個關鍵字通知python:我在定義一個函數。square_sum是函數名。
括號中的a, b是函數的參數,是對函數的輸入。參數可以有多個,也可以完全沒有(但括號要保留)。
我們已經在循環和選擇中見過冒號和縮進來表示的隸屬關係。
c = a**2 + b**2# 這一句是函數內部進行的運算
return c# 返回c的值,也就是輸出的功能。Python的函數允許不返回值,也就是不用return。
return可以返回多個值,以逗號分隔。相當於返回一個tuple(定值表)。
return a,b,c# 相當於 return (a,b,c)
在Python中,當程序執行到return的時候,程序將停止執行函數內餘下的語句。return並不是必須的,當沒有return, 或者return後面沒有返回值時,函數將自動返回None。None是Python中的一個特別的數據類型,用來表示什麼都沒有,相當於C中的NULL。None多用於關鍵字參數傳遞的默認值。
函數調用和參數傳遞
定義過函數後,就可以在後面程序中使用這一函數
printsquare_sum(3,4)
Python通過位置,知道3對應的是函數定義中的第一個參數a, 4對應第二個參數b,然後把參數傳遞給函數square_sum。
(Python有豐富的參數傳遞方式,還有關鍵字傳遞、表傳遞、字典傳遞等,基礎教程將只涉及位置傳遞)
函數經過運算,返回值25, 這個25被print打印出來。
我們再看下面兩個例子
第一個例子,我們將一個整數變量傳遞給函數,函數對它進行操作,但原整數變量a不發生變化。
第二個例子,我們將一個表傳遞給函數,函數進行操作,原來的表b發生變化。
對於基本數據類型的變量,變量傳遞給函數後,函數會在內存中複製一個新的變量,從而不影響原來的變量。(我們稱此為值傳遞)
但是對於表來說,表傳遞給函數的是一個指針,指針指向序列在內存中的位置,在函數中對錶的操作將在原有內存中進行,從而影響原有變量。 (我們稱此為指針傳遞)
Python基礎: 面向對象的進一步拓展
調用類的其它信息
上一講中提到,在定義方法時,必須有self這一參數。這個參數表示某個對象。對象擁有類的所有性質,那麼我們可以通過self,調用類屬性。
這裡有一個類屬性laugh。在方法show_laugh()中,通過self.laugh,調用了該屬性的值。
還可以用相同的方式調用其它方法。方法show_laugh(),在方法laugh_100th中()被調用。
通過對象可以修改類屬性值。但這是危險的。類屬性被所有同一類及其子類的對象共享。類屬性值的改變會影響所有的對象。
__init__()方法
__init__()是一個特殊方法(special method)。Python有一些特殊方法。Python會特殊的對待它們。特殊方法的特點是名字前後有兩個下劃線。
如果你在類中定義了__init__()這個方法,創建對象時,Python會自動調用這個方法。這個過程也叫初始化。
這裡繼承了Bird類,它的定義見上一講。
屏幕上打印:
We are happy birds.Happy,Happy!
我們看到,儘管我們只是創建了summer對象,但__init__()方法被自動調用了。最後一行的語句(summer = happyBird...)先創建了對象,然後執行:
summer.__init__(more_words)
'Happy,Happy!' 被傳遞給了__init__()的參數more_words
對象的性質
我們講到了許多屬性,但這些屬性是類的屬性。所有屬於該類的對象會共享這些屬性。比如說,鳥都有羽毛,雞都不會飛。
在一些情況下,我們定義對象的性質,用於記錄該對象的特別信息。比如說,人這個類。性別是某個人的一個性質,不是所有的人類都是男,或者都是女。這個性質的值隨著對象的不同而不同。李雷是人類的一個對象,性別是男;韓美美也是人類的一個對象,性別是女。
當定義類的方法時,必須要傳遞一個self的參數。這個參數指代的就是類的一個對象。我們可以通過操縱self,來修改某個對象的性質。比如用類來新建一個對象,即下面例子中的li_lei, 那麼li_lei就被self表示。我們通過賦值給self.attribute,給li_lei這一對象增加一些性質,比如說性別的男女。self會傳遞給各個方法。在方法內部,可以通過引用self.attribute,查詢或修改對象的性質。
這樣,在類屬性的之外,又給每個對象增添了各自特色的性質,從而能描述多樣的世界。
在初始化中,將參數input_gender,賦值給對象的性質,即self.gender。
li_lei擁有了對象性質gender。gender不是一個類屬性。Python在建立了li_lei這一對象之後,使用li_lei.gender這一對象性質,專門儲存屬於對象li_lei的特有信息。
對象的性質也可以被其它方法調用,調用方法與類屬性的調用相似,正如在printGender()方法中的調用。
Python基礎: 反過頭來看看
最初的“Hello World”,走到面向對象。該回過頭來看看,教程中是否遺漏了什麼。
我們之前提到一句話,'Everything is Object'. 那麼我們就深入體驗一下這句話。
需要先要介紹兩個內置函數,dir()和help()
dir()用來查詢一個類或者對象所有屬性。你可以嘗試一下
>>>print dir(list)
help()用來查詢的說明文檔。你可以嘗試一下
>>>print help(list)
(list是Python內置的一個類,對應於我們之前講解過的列表)
list是一個類
在上面以及看到,表是Python已經定義好的一個類。當我們新建一個表時,比如:
>>>nl = [1,2,5,3,5]
實際上,nl是類list的一個對象。
實驗一些list的方法:
>>>print nl.count(5)# 計數,看總共有多少個5
>>>print nl.index(3)# 查詢 nl 的第一個3的下標
>>>nl.append(6)# 在 nl 的最後增添一個新元素6
>>>nl.sort()# 對nl的元素排序
>>>print nl.pop()# 從nl中去除最後一個元素,並將該元素返回。
>>>nl.remove(2)# 從nl中去除第一個2
>>>nl.insert(0,9)# 在下標為0的位置插入9
總之,list是一個類。每個列表都屬於該類。
Python補充中有list常用方法的附錄。
運算符是特殊方法
使用dir(list)的時候,能看到一個屬性,是__add__()。從形式上看是特殊方法(下劃線,下劃線)。它特殊在哪呢?
這個方法定義了'+'運算符對於list對象的意義,兩個list的對象相加時,會進行的操作。
>>>print [1,2,3] + [5,6,9]
運算符,比如+, -, >,
嘗試一下
>>>print [1,2,3] - [3,4]
會有錯誤信息,說明該運算符“-”沒有定義。現在我們繼承list類,添加對'-'的定義
內置函數len()用來返回list所包含的元素的總數。內置函數__sub__()定義了“-”的操作:從第一個表中去掉第二個表中出現的元素。如果__sub__()已經在父類中定義,你又在子類中定義了,那麼子類的對象會參考子類的定義,而不會載入父類的定義。任何其他的屬性也是這樣。
(教程最後也會給出一個特殊方法的清單)
定義運算符對於複雜的對象非常有用。舉例來說,人類有多個屬性,比如姓名,年齡和身高。我們可以把人類的比較(>,
下一步
希望你已經對Python有了一個基本瞭解。你可能躍躍欲試,要寫一些程序練習一下。這會對你很有好處。
但是,Python的強大很大一部分原因在於,它提供有很多已經寫好的,可以現成用的對象。我們已經看到了內置的比如說list,還有tuple等等。它們用起來很方便。在Python的標準庫裡,還有大量可以用於操作系統互動,Internet開發,多線程,文本處理的對象。而在所有的這些的這些的基礎上,又有很多外部的庫包,定義了更豐富的對象,比如numpy, tkinter, django等用於科學計算,GUI開發,web開發的庫,定義了各種各樣的對象。對於一般用戶來說,使用這些庫,要比自己去從頭開始容易得多。我們要開始攀登巨人的肩膀了。
最後,小編想說:我是一名python開發工程師,
整理了一套最新的python系統學習教程,
想要這些資料的可以關注私信小編“01”即可(免費分享哦)希望能對你有所幫助