< 返回索引頁html
<!-- /TOC -->windows
從本章開始,咱們開始學習Python的基本語法。api
在上一章,咱們python環境已經安裝完畢,也選擇好了合適本身的編輯器,如今咱們開始進入python的編程世界。數組
讓咱們來看一個python的簡單程序,HelloWorld
。安全
解釋器運行
打開系統終端輸入python
,啓動python解釋器,錄入以下代碼,回車觀察返回值。
$ python3 Python 3.6.5 (default, Mar 30 2018, 06:42:10) [GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> print('Hello world!')
代碼返回以下:
Hello world!
下面咱們來解釋下這段代碼:
>>>
python的交互環境的提示符print
python 內置的打印方法,它會打印括號中的字符串。代碼文件運行
咱們能夠把以上代碼保存成python的腳本文件,並保存爲hello.py
, python的代碼文件是以py
做爲擴展名的。下面咱們來執行它,在咱們的系統終端執行以下命令:
$python hello.py
代碼返回以下:
Hello world! 你好,世界!
到這,咱們知道了如何在python 解釋器和代碼文件中運行代碼。
定義
咱們在編寫代碼的時候,每每須要添加一些說明以幫助咱們來理解代碼邏輯,在代碼執行的時候,這些說明不會被執行。這些說明叫作註釋
。Python中的註釋,使用井號、單引號或雙引號標識,以下:
# 單行註釋 ''' 我是多行註釋 我是多行註釋 ''' """ 我是多行註釋 我是多行註釋 """
註釋經常使用場景
程序設計中,預留了一些標識符號供語言自己或系統使用,這些標識符被稱爲關鍵字
。每一個關鍵字都有本身的含義,在python中可經過如下方式查看關鍵字:
>>> import keyword >>> keyword.kwlist ['and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'exec', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'not', 'or', 'pass', 'print', 'raise', 'return', 'try', 'while', 'with', 'yield']
咱們能夠經過以下方法判斷字符串是否爲關鍵字:
>>> keyword.iskeyword('and') True >>> keyword.iskeyword('have') False
關鍵字不可做爲變量的名稱使用。
變量中儲存數據的類型能夠是多種多樣的,咱們把變量中存儲數據的類型叫數據類型
。而python 中經常使用的數據類型,有這麼幾種:
整型(int)
: Python3中能夠處理任意大小的整數(Python 2.x中有int和long兩種類型的整數,但這種區分對Python來講意義不大,在python中內存分配是自動的,用戶並不關心這些細節,反而給用戶無限大的使用空間更好,所以在Python 3.x中整數只有int這一種了),並且支持二進制(如0b100,換算成十進制是4)、八進制(如0o100,換算成十進制是64)、十進制(100)和十六進制(0x100,換算成十進制是256)的表示法。複數型(complex)
:形如3+5j,跟數學上的複數表示同樣,惟一不一樣的是虛部的i換成了j。浮點型(float)
:浮點數也就是小數,之因此稱爲浮點數,是由於按照科學記數法表示時,一個浮點數的小數點位置是可變的,浮點數除了數學寫法(如123.456)以外還支持科學計數法(如1.23456e2)。字符串型(str)
:字符串是以單引號或雙引號括起來的任意文本,好比'hello'和"hello",字符串還有原始字符串表示法、字節字符串表示法、Unicode字符串表示法,並且能夠書寫成多行的形式(用三個單引號或三個雙引號開頭,三個單引號或三個雙引號結尾)。布爾型(bool)
:布爾值只有True、False兩種值,要麼是True,要麼是False,在Python中,能夠直接用True、False表示布爾值(請注意大小寫),也能夠經過布爾運算計算出來(例如3 < 5會產生布爾值True,而2 == 1會產生布爾值False)。python中把None、0、'' 都視爲False。空類型
: None
爲空類型。各數據類型之間是能夠相互轉換的,可以使用Python提供的內置函數:
另外2個字符轉化內置函數:
變量
(英語:Variable,scalar),是內存中實際存在的數據或存儲器中存儲數據的一塊內存空間地址,變量的值能夠被讀取和修改。
Python 中的變量是內存中保存數據的地址的一個別稱。變量是沒有類型的,變量對應的值對象是有類型的。變量的類型是跟着值對象走的。嚴格來講,類型是屬於對象的,而不是變量, 變量和對象是分離的,對象是內存中儲存數據的實體,變量則是指向對象的內存地址。
在Python 的語法中,變量無需聲明,可直接使用,區別於其餘語言,有些語言的變量須要先聲明後使用。python中,使用像上邊代碼中的等號‘=’來表示賦值
,即表示將等號右邊的數據賦值給左邊的變量,變量的類型有它存儲的數值來決定。
>>> a = 123 >>> b = '123' >>> c = True >>> print(type(a),type(b),type(c)) (<type 'int'>, <type 'str'>, <type 'bool'>) >>> d, e = 1,2
知識點:
- 咱們可使用內置函數
type
來查看變量的數據類型。- 可同時給多個變量賦值
變量的命令是一個重要的規則,好的命名能夠增長代碼的可讀性,提升代碼的可維護性。python中變量的命名有以下要求:
說明:
- 系統預留字,及系統的函數及模塊的名字。
除了以上這些硬性規定外,變量命名仍是比較寬鬆的。爲了更好的處理命名問題,python 社區指定了一個開發規範 PEP8。其中除了命名規範外,還描述了其餘一些語法的最佳實踐。它可做爲咱們往後編寫代碼及項目開發的規範使用,對咱們提升代碼的質量有很大的好處。
做用域,顧名思義,能夠理解爲在必定範圍內起做用。映射到咱們的編碼中時,即是在必定的代碼範圍內有效。在編碼時,代碼分各類邏輯塊的,相似咱們文章的段落,能夠更好的理解閱讀分類。那麼在這些限定的範圍內,變量的有效性是有影響的。根據有效範圍做用域分爲全局變量(Local)
和局部變量(Global)
。全局變量
是在整個程序系統或文件全局中有效的變量。局部變量
表示在一個代碼邏輯塊中有效的變量。全局和局部變量是相對的,如咱們能夠叫一個相對於文件來講的全局變量,可是在多個文件或者文件包中便成了局部變量。除了全局和局部變量,Python中還有如下做用域:
做用域以 L –> E –> G –>B 的規則查找,即:在局部找不到,便會去局部外的局部找(例如閉包,稍後會講),再找不到就會去全局找,再者去內建中找。
變量中存儲的數值是能夠變更的,那麼有沒有不變的呢?答案是有的,如數學計算使用的PI
。咱們常常把代碼中,存儲不變數據的變量稱之爲常量
。可見,常量是一種特殊的變量。
上節咱們談到變量有許多的數據類型,其中字符串類型比較複雜,這裏單獨講解下。
字符串,故名思意,是零個或多個字符組成的有限序列,以單引號或雙引號包裹。既然是以字符組成,那麼便包括單引號或雙引號自身,以下:
a = 'I'm DeanWu!'
咱們在執行以上語句的時候會報錯:
>>> a = 'I'm DeanWu!' File "<stdin>", line 1 a = 'I'm DeanWu!' ^ SyntaxError: invalid syntax
這是由於字符串中間的單引號把字符串給截斷了,當python解釋器執行到該單引號後,後邊的語法便報錯了。如何解決?這便須要進行轉義,所謂轉義,即是讓python解釋器解釋執行的時候,被轉義的字符不在表示原先的意思,而變爲不解釋執行的字符串。Python中使用 \
進行轉義。上邊的語法能夠寫成這樣:
a = 'I\'m DeanWu!'
在計算機基礎部分,咱們知道了計算機編碼相關知識,歸納以下:
接下來,咱們看下Python中的編碼。Python2中的默認編碼爲ASCII編碼
,Python3中使用的則是UTF-8編碼
。可以使用以下命令查看:
import sys sys.getdefaultencoding()
在Python 編程中,編碼問題每每是新手的一個困擾,咱們來深刻展開說下這個問題。Python2和Python3的默認編碼是不同的,它們處理編碼方式也是不同。
Python2中的編碼
在 Python2中字符串類型有4種:str
、unicode
、basestring
和bytes
。
basestring
是一個基類(稍後會講到此概念,可暫時理解爲父親或基礎便可),str
和unicode
類型在此基礎上構建。str
是Python設計之初的字符串類型,默認使用系統編碼。unicode
是了使Python支持Unicode編碼,在2.0版本以後添加的一種字符串類型。bytes
是字節串,str
自己即是一個字節串,那可認爲bytes
是str
的一個別稱,使用和str
徹底一致。看一實例:
>>> a = '你好' # 使用系統編碼的str 類型 >>> type(a) <type 'str'> >>> print a 你好 >>> a '\xe4\xbd\xa0\xe5\xa5\xbd' # 系統編碼爲 utf-8的字節碼,使用了3個字節表示一個漢字; >>> ua = u'你好' # unicode 編碼 >>> type(ua) <type 'unicode'> >>> print ua 你好 >>> ua u'\u4f60\u597d' # unicode 編碼格式的你好,對應unicode代碼表中代碼 >>> b = b'你好' # bytes 類型的字符串 >>> type(b) <type 'str'> >>> print b 你好 >>> b '\xe4\xbd\xa0\xe5\xa5\xbd' # 使用3個字節表示1個漢字,且字節碼和str類型同樣;
知識點:
- Python 解釋器默認使用系統的編碼方式聲明變量。
- unicode類型以u開頭標識
- bytes 類型以 b 開頭標識
- str類型以16進制的ASCII字節碼錶示,其實是一個字節串,迴應了它的另外一個名字bytes。
- unicode類型以unicode字符碼錶示,是真正的字符串。
str
與unicode
類型之間是能夠相互轉化的,經過 encode
和decode
來實現。來看實例:
>>> a = '你好' >>> a.decode('utf-8') # decode 解碼: str類型(UTF-8) --> unicode類型(Unicode) u'\u4f60\u597d' # 對應的unicode代碼 >>> ua u'\u4f60\u597d' >>> ua.encode('utf-8') # encode 編碼: unicode類型(Unicode) --> str類型(UTF-8) '\xe4\xbd\xa0\xe5\xa5\xbd' # utf-8的編碼的 str字節串 >>> a.decode('gbk') # 嘗試使用 gbk 解碼,結果出現亂碼 u'\u6d63\u72b2\u30bd' >>> print a.decode('gbk') 浣犲ソ >>> a.decode('gbk').encode('gbk') # 使用 gbk 解碼,再編碼,成功還原 '\xe4\xbd\xa0\xe5\xa5\xbd' >>> print a.decode('gbk').encode('gbk') 你好 >>> a.decode('gbk').encode('utf-8') # 使用不一樣的編碼來解碼和編碼, 也出現亂碼 '\xe6\xb5\xa3\xe7\x8a\xb2\xe3\x82\xbd' >>> print a.decode('gbk').encode('utf-8') 浣犲ソ
知識點:
- 使用什麼編碼編碼,就須要使用什麼編碼解碼,不然會出現亂碼。
- 轉爲
unicode
類型要decode解碼。- 轉爲
str
類型要encode編碼。- 區分Unicode類型和Unicode編碼,Unicode編碼是一套編碼集,內容豐富,編碼內容涵蓋了世界各地的語言,實現方式有UTF-八、UTF-1六、UTF-32;Unicode類型只是python字符串的一種類型,使用Unicode編碼做爲其編碼格式,可通過各類編碼方式(UTF、GBK、ASCII)編碼成str類型字符或者叫bytes(字節序列)類型供計算機使用。
- Unicode 編碼的兼容性,可做爲其餘編碼格式的轉碼的中間站。
上邊這些例子是直接在python解釋器中跑的代碼,而python代碼文件在執行時,有所不一樣,會受到文件編碼的影響。
文件的存儲是以二進制流的方式保存在硬盤上。當Python文件被執行時,這些文件會以二進制流的方式加載到內存中,而後按照Python的默認編碼方式解碼成相應的python代碼對應的unicode編碼的字節碼來解釋執行。在python2中,默認編碼爲ASCII碼,那麼當文件中有非ASCII碼時,這個解碼過程便會出錯。Python 爲了解決這個問題,在Python 文件頭部增長了文件的編碼聲明,PEP236就是爲這個問題而建立的改進意見。
Python 文件格式聲明以下:
# coding:utf-8
或
# -*- coding:utf-8 -*-
來看實例 coding_utf.py
:
# -*- coding:utf-8 -*- a = '你好' print(a) print(type(a)) ua = u'你好' print(ua) print(type(ua))
在命令行執行python coding_utf.py
, 返回以下:
你好 <type 'str'> 你好 <type 'unicode'>
ok,沒有問題。來看下執行時都作了些什麼事:
接下來,當咱們把文件編碼和開頭標識改成GBK
後,再次執行:
��� <type 'str'> 你好 你好 <type 'unicode'>
你們看到第一個你好
成爲亂碼,這是爲何? 根據上邊的分析,打印時,a的編碼爲gbk, ua的編碼爲unicode。而我終端的編碼爲utf-8,對gbk的不兼容,因此致使亂碼。一樣的代碼,當放到默認gbk編碼的windows終端中,則會輸出正常。
那麼有沒有辦法讓他輸出正常呢?有的,咱們只要手動顯示的把它解碼成兼容的 unicode 編碼便可。
print(a.decode('gbk'))
到這裏,總結以上說的問題,影響Python 字符編碼的地方主要有如下幾點:
Python3中編碼
在python2中,編碼問題有2個大的問題:
str
和 unicode
兩種類型,讓你們容易混淆;Python3 對以上問題作了很好的修正。Python3 默認編碼改成了 UTF-8
,對於非ASCII碼支持更強大。其次,Python3 合併了str
和 unicode
類型,統一爲 str
類型。使用 bytes
類型來表示字節類型。這樣很好的區分了字符串和字節串,str
即爲字符串,bytes
爲字節串或叫二進制字節。
看下面的例子:
>>> a = '你好' # utf-8 編碼的str類型 >>> type(a) <class 'str'> >>> print(a) 你好 >>> repr(a) "'你好'" >>> a # 顯示爲原字符串 '你好' >>> ua = u'你好' >>> type(ua) # unicode 編碼的 str類型 <class 'str'> >>> print(ua) 你好 >>> repr(ua) "'你好'" >>> ua # 能夠看到,字符串直接顯示並無顯示unicode編碼 '你好' >>> a.decode('utf-8') # unicode 字符串已不能再解碼了 Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'str' object has no attribute 'decode' >>> a.encode('utf-8') # 顯示爲字節串 b'\xe4\xbd\xa0\xe5\xa5\xbd' >>> e = 'Test' >>> e 'Test' >>> e.encode('utf-8') # 顯示爲原字符串 b'Test'
知識點:
- 一、能夠看到Unicode類型的字符串類型爲 str,帶不帶u 是同樣的。
- 二、unicode 字符串編碼成utf-8格式的字節碼,前邊帶 b 說明是bytes 字節類型。
- 三、在Python3中,全部unicode編碼顯示均爲原字符串,非 unicode 編碼的 非ASCII碼範圍的字符 顯示均爲字節串。
字符串中的運算符
>>> a = '你好' >>> b = '世界' >>> print(a+b) 你好世界
>>> print(a*2) 你好你好
len
內建函數,能夠獲取字符串的字節長度>>> a = '你好' >>> a '\xe4\xbd\xa0\xe5\xa5\xbd' # utf-8 編碼,3個字節表明一個漢字。 print(len(a)) >>> e = 'hello' >>> print(len(e)) 5
[]
索引,可經過下標的方式來獲取字符串的某個字節,下標是從 0 開始的,最後一個爲'字符串長度-1'或'-1'。>>> print(a) helloworld >>> a[2] 'l' >>> a[0] 'h' >>> a[9] 'd' >>> a[-1] 'd'
[:]
切片,可以使用字符串下標來截取字符串>>> a = 'helloworld' >>> a[0:5] 'hello'
> 說明:
- 下標從零開始
- 開始能夠省略,默認爲0
- 結束能夠省略,默認爲-1
in
判斷某變量是否在字符串中。>>> a = 'helloworld' >>> 'hello' in a True
格式化
有時候,咱們要將多個變量組成一個咱們須要的字符串來使用,這個過程叫作格式化
。Python中格式化的方式有兩種,一種使用‘%’ ,一種是使用format
內建函數。
%
格式化,格式化變量,依次由左向右對應。>>> c = '%s,%s!'%(a,b) >>> print(c) 你好,世界!
使用 %
來格式化時,%s
中的s
叫作佔位符
,不一樣的類型須要不一樣的佔位符
,以下:
佔位符 | 類型 |
---|---|
%d | 整數 |
%f | 浮點數 |
%s | 字符串 |
%x | 十六進制整數 |
format
格式化,格式化變量,由左向右根據大括號的序號對應。>>> d = '{1},{0}'.format('世界','你好') >>> print(d) 你好,世界
經常使用方法
可以使用內建函數dir
查看某對象的方法:
>>> dir(a) ['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_formatter_field_name_split', '_formatter_parser', 'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill'] >>>
endswith(‘’)
是否以某字符串結尾,是則返回True
,不然返回False
;startswith('')
是否以某字符串開始,是則返回True
,不然返回False
;split()
分隔字符串,返回一個列表(python高級數據結構,稍後講解)。lower()
轉爲小寫。upper()
轉爲大寫。strip('')
2側去除某字符串。lstrip('')
左側去除某字符串。rstrip('')
右側去除某字符串。join()
以某字符串爲鏈接符,合併某列表。ljust(int)
左對齊,並使用空格填充至指定長度的新字符串rjust(int)
右對齊,並使用空格填充至指定長度的新字符串在編程世界中的表達式和咱們數學上的表達式有些相似,都是一種句法,此處意義更純粹,有運算符和操做數組成。例如:2+3
,其中像+
相似的符號即爲運算符
,可經過它對操做數作相應操做。2和3 即爲操做數。
運算符,顧名思義,能夠經過它對一些變量作運算
處理。此處的運算除了簡單的四則運算,還包括比較、賦值等複雜操做。Python中運算符主要包括如下幾種:
下面咱們一一來看。
算數運算符
算數運算符,主要對程序中的變量作四則運算使用。主要包含以下運算符:
比較運算符
比較運算符,用來比較變量是否相等,返回置爲布爾類型。主要包含如下運算符:
注意:
- python2中運行不一樣類型的變量做比較,比較時會自動作類型轉化,由簡單類型向複雜類型轉變。
- python3只容許同類型變量比較。
邏輯運算符
邏輯運算符,將變量按必定邏輯組合成一個新的表達式,該表達式返回一個布爾類型的值。經常用來做爲判斷條件時間,判斷組合的新表達式是否成立。邏輯運算符主要包含如下:
賦值運算符
賦值運算符,即將某個值賦給默一遍量的運算符。主要包含以下:
注意:
//=
與/=
在python2中都爲取整除法
位運算符
位運算符,是針對二進制數據的一種字節位的運算,主要包含如下符號:
成員運算符
成員運算符,判斷某變量是否包含另外一變量。主要包含如下符號:
身份運算符
身份運算符,判斷是否2個變量的值及引用的內存地址是否同樣。
注意:
- 與比較運算符
==
比較,==
爲值相等便可,內存引用地址可不一樣;is
則爲值和內存引用地址均相同。
運算符優先級
各運算符按照優先級由高到低的順序排列以下:
前邊說過,表達式是一種句法,有運算符
和操做數
組成。下面咱們來看一個例子:
# -*- coding:utf-8 -*- length = 10 width = 5 area = length*width print(area)
本例子,使用表達式計算了長方形的面積。變量length
表示長方形的長,變量width
表示長方形的寬,使用算數運算符*
,利用表達式進行了乘法計算。經過賦值運算符=
將表達式的值賦值給了變量 area
。這個過程當中,表達式在其中起了核心邏輯的做用。這個簡單的程序也映射了咱們平時的編碼過程,表達式在其中起了相當重要的做用,咱們要善加利用。
計算機要處理任務,則須要與人交互。那麼python中的輸入輸出是如何實現的呢?
python2 中提供了輸入函數 input
、raw_input
來輸入,函數print
來輸出。python3中raw_input
函數去掉了,功能合併到input
。
輸入
先來看下,python2 中raw_input
。
>>> raw_input('請輸入:') >>> raw_input('請輸入:') 請輸入:123 '123' >>> raw_input('請輸入:') 請輸入:abc 'abc'
可見 raw_input
返回咱們輸入的數據爲一個字符串返回。
再來看下 input
,它除了支持字符串還支持表達式,以下:
>>> input('請輸入:') 請輸入:1+2 3 >>>
可見它輸出了表達式的值,也就是說它執行了表達式。試想,若是這裏放一個破壞咱們系統執行的表達式,咱們系統便會受到安全威脅。在人們衡量後,在python3中,決定去除該函數,並將原來的raw_input
更名爲 input
。
輸出
python2 中使用print
語句來輸出,python3中則改成了 print
函數。
>>> print('你好', end=',') 你好,>>> a = '世界' >>> print('你好,%s'%a) 你好,世界 >>> print('你好', '世界') 你好世界
語法說明:
end=
參數, 傳遞給參數的字符將追加到打印字符串結尾,當省略時默認爲回車換行。print
函數可傳入多個字符串來打印,當傳入多個時,會自動合併連接。print
函數常被用來在調試代碼時,打印變量使用。到此,咱們把Python的基本語法和數據結構過了一遍。那咱們來總結下,咱們都學到了什麼:
這些只是基本語法的組成元素。在程序運行時,可能會有多種狀況,須要對這些結構作判斷或者須要按順序讀取列表的所有元素,那麼這個時候便須要邏輯處理結構。下一章,咱們來說解Python中的邏輯處理的控制流語法。
'Hello'.startswith('H') 'Hello'.endswith('o')
>>> text = 'Hello World' >>> text.ljust(20) 'Hello World ' >>> text.rjust(20) ' Hello World' >>> text.center(20) ' Hello World ' >>>
""" 將華氏溫度轉換爲攝氏溫度公式: F = 1.8C + 32 """ f = float(input('請輸入華氏溫度: ')) c = (f - 32) / 1.8 print('%.1f華氏度 = %.1f攝氏度' % (f, c))
""" 輸入半徑計算圓的周長和麪積 """ import math radius = float(input('請輸入圓的半徑: ')) perimeter = 2 * math.pi * radius area = math.pi * radius * radius print('周長: %.2f' % perimeter) print('面積: %.2f' % area)
""" 輸入年份 若是是閏年輸出True 不然輸出False """ year = int(input('請輸入年份: ')) # 若是代碼太長寫成一行不便於閱讀 可使用\或()折行 is_leap = (year % 4 == 0 and year % 100 != 0 or year % 400 == 0) print(is_leap)