1. 程式人生 > 實用技巧 >Python3語法學習筆記marker

Python3語法學習筆記marker

List(列表)

List(列表) 是 Python 中使用最頻繁的資料型別。

列表可以完成大多數集合類的資料結構實現。列表中元素的型別可以不相同,它支援數字,字串甚至可以包含列表(所謂巢狀)。

列表是寫在方括號 [] 之間、用逗號分隔開的元素列表。

和字串一樣,列表同樣可以被索引和擷取,列表被擷取後返回一個包含所需元素的新列表。

列表擷取的語法格式如下:

變數[頭下標:尾下標]

索引值以 0 為開始值,-1 為從末尾的開始位置。

#!/usr/bin/python3

list = [ 'abcd', 786 , 2.23, 'runoob', 70.2 ]
tinylist = [123, 'runoob']

print (list)            # 輸出完整列表
print (list[0])         # 輸出列表第一個元素
print (list[1:3])       # 從第二個開始輸出到第三個元素
print (list[2:])        # 輸出從第三個元素開始的所有元素
print (tinylist * 2)    # 輸出兩次列表
print (list + tinylist) # 連線列表
['abcd', 786, 2.23, 'runoob', 70.2]
abcd
[786, 2.23]
[2.23, 'runoob', 70.2]
[123, 'runoob', 123, 'runoob']
['abcd', 786, 2.23, 'runoob', 70.2, 123, 'runoob']

Tuple(元組)

元組(tuple)與列表類似,不同之處在於元組的元素不能修改。元組寫在小括號 () 裡,元素之間用逗號隔開。元組中的元素型別也可以不相同。

Set(集合)

集合(set)是由一個或數個形態各異的大小整體組成的,構成集合的事物或物件稱作元素或是成員。

基本功能是進行成員關係測試和刪除重複元素。

可以使用大括號 { } 或者 set() 函式建立集合,注意:建立一個空集合必須用 set() 而不是 { },因為 { } 是用來建立一個空字典。

Dictionary(字典)

字典(dictionary)是Python中另一個非常有用的內建資料型別。

列表是有序的物件集合,字典是無序的物件集合。兩者之間的區別在於:字典當中的元素是通過鍵來存取的,而不是通過偏移存取。

字典是一種對映型別,字典用 { } 標識,它是一個無序的 鍵(key) : 值(value) 的集合。

鍵(key)必須使用不可變型別。

在同一個字典中,鍵(key)必須是唯一的。

#!/usr/bin/python3

dict = {}
dict['one'] = "1 - 菜鳥教程"
dict[2]     = "2 - 菜鳥工具"

tinydict = {'name': 'runoob','code':1, 'site': 'www.runoob.com'}


print (dict['one'])       # 輸出鍵為 'one' 的值
print (dict[2])           # 輸出鍵為 2 的值
print (tinydict)          # 輸出完整的字典
print (tinydict.keys())   # 輸出所有鍵
print (tinydict.values()) # 輸出所有值
1 - 菜鳥教程
2 - 菜鳥工具
{'name': 'runoob', 'code': 1, 'site': 'www.runoob.com'}
dict_keys(['name', 'code', 'site'])
dict_values(['runoob', 1, 'www.runoob.com'])

Python3註釋

Python中的註釋有單行註釋和多行註釋:
Python中單行註釋以 # 開頭
多行註釋用三個單引號 ''' 或者三個雙引號 """ 將註釋括起來,例如:

#!/usr/bin/python3 
'''
這是多行註釋,用三個單引號
這是多行註釋,用三個單引號 
這是多行註釋,用三個單引號
'''
print("Hello, World!")
#!/usr/bin/python3 
"""
這是多行註釋,用三個雙引號
這是多行註釋,用三個雙引號 
這是多行註釋,用三個雙引號
"""
print("Hello, World!")

Python算術運算子

Python比較運算子

Python賦值運算子

Python邏輯運算子

Python身份運算子

Python運算子優先順序

Python3數字(Number)

您可以使用del語句刪除一些數字物件的引用。
del語句的語法是:
del var_a,var_b

Python 支援三種不同的數值型別:

1、整型(Int) - 通常被稱為是整型或整數,是正或負整數,不帶小數點。Python3 整型是沒有限制大小的,可以當作 Long 型別使用,所以 Python3 沒有 Python2 的 Long 型別。
2、浮點型(float) - 浮點型由整數部分與小數部分組成,浮點型也可以使用科學計數法表示(2.5e2 = 2.5 x 102 = 250)
3、複數( (complex)) - 複數由實數部分和虛數部分構成,可以用a + bj,或者complex(a,b)表示, 複數的實部a和虛部b都是浮點型。

Python 數字型別轉換

有時候,我們需要對資料內建的型別進行轉換,資料型別的轉換,你只需要將資料型別作為函式名即可。

int(x) 將x轉換為一個整數。

float(x) 將x轉換到一個浮點數。

complex(x) 將x轉換到一個複數,實數部分為 x,虛數部分為 0。

complex(x, y) 將 x 和 y 轉換到一個複數,實數部分為 x,虛數部分為 y。x 和 y 是數字表達式。

Python3字串

Python 不支援單字元型別,單字元在 Python 中也是作為一個字串使用。

Python中的轉義字元

在需要在字元中使用特殊字元時,python 用反斜槓 \ 轉義字元。

Python中的字串運算子

Python三引號

python三引號允許一個字串跨多行,字串中可以包含換行符、製表符以及其他特殊字元。例項如下

#!/usr/bin/python3
 
para_str = """這是一個多行字串的例項
多行字串可以使用製表符
TAB ( \t )。
也可以使用換行符 [ \n ]。
"""
print (para_str)
這是一個多行字串的例項
多行字串可以使用製表符
TAB (    )。
也可以使用換行符 [ 
 ]。

Python列表指令碼操作符

Python3元組

Python 的元組與列表類似,不同之處在於元組的元素不能修改。

元組使用小括號 ( ),列表使用方括號 [ ]。

元組建立很簡單,只需要在括號中新增元素,並使用逗號隔開即可。

元組中只包含一個元素時,需要在元素後面新增逗號,否則括號會被當作運算子使用:

>>> tup1 = (50)
>>> type(tup1)     # 不加逗號,型別為整型
<class 'int'>

>>> tup1 = (50,)
>>> type(tup1)     # 加上逗號,型別為元組
<class 'tuple'>

Python3字典

字典是另一種可變容器模型,且可儲存任意型別物件。

字典的每個鍵值 key=>value 對用冒號 : 分割,每個對之間用逗號(,)分割,整個字典包括在花括號 {} 中 ,格式如下所示:

d = {key1 : value1, key2 : value2, key3 : value3 }

鍵必須是唯一的,但值則不必。

值可以取任何資料型別,但鍵必須是不可變的,如字串,數字。

一個簡單的字典例項:

dict = {'name': 'runoob', 'likes': 123, 'url': 'www.runoob.com'}

字典的特性

字典值可以是任何的 python 物件,既可以是標準的物件,也可以是使用者定義的,但鍵不行。

兩個重要的點需要記住:

1)不允許同一個鍵出現兩次。建立時如果同一個鍵被賦值兩次,後一個值會被記住,如下例項:

#!/usr/bin/python3
 
dict = {'Name': 'Runoob', 'Age': 7, 'Name': '小菜鳥'}
 
print ("dict['Name']: ", dict['Name'])
dict['Name']:  小菜鳥

2)鍵必須不可變,所以可以用數字,字串或元組充當,而用列表就不行,如下例項:

#!/usr/bin/python3
 
dict = {['Name']: 'Runoob', 'Age': 7}
 
print ("dict['Name']: ", dict['Name'])
Traceback (most recent call last):
  File "test.py", line 3, in <module>
    dict = {['Name']: 'Runoob', 'Age': 7}
TypeError: unhashable type: 'list'

Python3集合

集合(set)是一個無序的不重複元素序列。

可以使用大括號 { } 或者 set() 函式建立集合,注意:建立一個空集合必須用 set() 而不是 { },因為 { } 是用來建立一個空字典。

while迴圈使用else語句

在 while … else 在條件語句為 false 時執行 else 的語句塊。

語法格式如下:

while <expr>:
    <statement(s)>
else:
    <additional_statement(s)>

for語句

Python for迴圈可以遍歷任何序列的專案,如一個列表或者一個字串。

for迴圈的一般格式如下:

for <variable> in <sequence>:
    <statements>
else:
    <statements>
#!/usr/bin/python3
 
for n in range(2, 10):
    for x in range(2, n):
        if n % x == 0:
            print(n, '等於', x, '*', n//x)
            break
    else:
        # 迴圈中沒有找到元素
        print(n, ' 是質數')
2  是質數
3  是質數
4 等於 2 * 2
5  是質數
6 等於 2 * 3
7  是質數
8 等於 2 * 4
9 等於 3 * 3

Python3迭代器和生成器

迭代是Python最強大的功能之一,是訪問集合元素的一種方式。

迭代器是一個可以記住遍歷的位置的物件。

迭代器物件從集合的第一個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會後退。

迭代器有兩個基本的方法:iter() 和 next()。

字串,列表或元組物件都可用於建立迭代器:

#!/usr/bin/python3
 
list=[1,2,3,4]
it = iter(list)    # 建立迭代器物件
for x in it:
    print (x, end=" ")
1 2 3 4

建立一個迭代器

把一個類作為一個迭代器使用需要在類中實現兩個方法 iter() 與 next() 。

如果你已經瞭解的面向物件程式設計,就知道類都有一個建構函式,Python 的建構函式為 init(), 它會在物件初始化的時候執行。

更多內容查閱:Python3 面向物件

iter() 方法返回一個特殊的迭代器物件, 這個迭代器物件實現了 next() 方法並通過 StopIteration 異常標識迭代的完成。

next() 方法(Python 2 裡是 next())會返回下一個迭代器物件。

建立一個返回數字的迭代器,初始值為 1,逐步遞增 1:

class MyNumbers:
  def __iter__(self):
    self.a = 1
    return self
 
  def __next__(self):
    x = self.a
    self.a += 1
    return x
 
myclass = MyNumbers()
myiter = iter(myclass)
 
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
1
2
3
4
5

Python3函式

定義一個函式

你可以定義一個由自己想要功能的函式,以下是簡單的規則:

1、函式程式碼塊以 def 關鍵詞開頭,後接函式識別符號名稱和圓括號 ()。
2、任何傳入引數和自變數必須放在圓括號中間,圓括號之間可以用於定義引數。
3、函式的第一行語句可以選擇性地使用文件字串—用於存放函式說明。
4、函式內容以冒號 : 起始,並且縮排。
5、return [表示式] 結束函式,選擇性地返回一個值給呼叫方,不帶表示式的 return 相當於返回 None。

關鍵字引數

關鍵字引數和函式呼叫關係緊密,函式呼叫使用關鍵字引數來確定傳入的引數值。

使用關鍵字引數允許函式呼叫時引數的順序與宣告時不一致,因為 Python 直譯器能夠用引數名匹配引數值。

以下例項在函式 printme() 呼叫時使用引數名:

#!/usr/bin/python3
 
#可寫函式說明
def printme( str ):
   "列印任何傳入的字串"
   print (str)
   return
 
#呼叫printme函式
printme( str = "菜鳥教程")
菜鳥教程

不定長引數

你可能需要一個函式能處理比當初宣告時更多的引數。這些引數叫做不定長引數,和上述 2 種引數不同,宣告時不會命名。基本語法如下:

def functionname([formal_args,] *var_args_tuple ):
   "函式_文件字串"
   function_suite
   return [expression]

加了星號 * 的引數會以元組(tuple)的形式匯入,存放所有未命名的變數引數

def functionname([formal_args,] **var_args_dict ):
   "函式_文件字串"
   function_suite
   return [expression]

加了兩個星號 ** 的引數會以字典的形式匯入。

Python3資料結構

列表

Python中列表是可變的,這是它區別於字串和元組的最重要的特點,一句話概括即:列表可以修改,而字串和元組不能。

Python3模組

在前面的幾個章節中我們指令碼上是用 python 直譯器來程式設計,如果你從 Python 直譯器退出再進入,那麼你定義的所有的方法和變數就都消失了。

為此 Python 提供了一個辦法,把這些定義存放在檔案中,為一些指令碼或者互動式的直譯器例項使用,這個檔案被稱為模組。

模組是一個包含所有你定義的函式和變數的檔案,其後綴名是.py。模組可以被別的程式引入,以使用該模組中的函式等功能。這也是使用 python 標準庫的方法。

support.py程式碼:

#!/usr/bin/python3
# Filename: support.py
 
def print_func( par ):
    print ("Hello : ", par)
    return

test.py 引入 support 模組:

#!/usr/bin/python3
# Filename: test.py
 
# 匯入模組
import support
 
# 現在可以呼叫模組裡包含的函數了
support.print_func("Runoob")
$ python3 test.py 
Hello :  Runoob

Python3輸入輸出

舊字串格式化

% 操作符也可以實現字串格式化。 它將左邊的引數作為類似 sprintf() 式的格式化字串, 而將右邊的代入, 然後返回格式化後的字串,例如:

>>> import math
>>> print('常量 PI 的值近似為:%5.3f。' % math.pi)
常量 PI 的值近似為:3.142。

讀取鍵盤輸入

Python提供了 input() 內建函式從標準輸入讀入一行文字,預設的標準輸入是鍵盤。

input 可以接收一個Python表示式作為輸入,並將運算結果返回。

#!/usr/bin/python3

str = input("請輸入:");
print ("你輸入的內容是: ", str)

Python3錯誤和異常

異常處理

try/except

try/except...else

try-finally 語句

Python3面向物件

類物件

#!/usr/bin/python3
 
class MyClass:
    """一個簡單的類例項"""
    i = 12345
    def f(self):
        return 'hello world'
 
# 例項化類
x = MyClass()
 
# 訪問類的屬性和方法
print("MyClass 類的屬性 i 為:", x.i)
print("MyClass 類的方法 f 輸出為:", x.f())

類有一個名為 init() 的特殊方法(構造方法),該方法在類例項化時會自動呼叫,像下面這樣:

def __init__(self):
    self.data = []

self代表類的例項,而非類

類的方法與普通的函式只有一個特別的區別——它們必須有一個額外的第一個引數名稱, 按照慣例它的名稱是 self。

class Test:
    def prt(self):
        print(self)
        print(self.__class__)
 
t = Test()
t.prt()
<__main__.Test instance at 0x100771878>
__main__.Test

從執行結果可以很明顯的看出,self 代表的是類的例項,代表當前物件的地址,而 self.class 則指向類。

self 不是 python 關鍵字,我們把他換成 runoob 也是可以正常執行的。

類的方法

在類的內部,使用 def 關鍵字來定義一個方法,與一般函式定義不同,類方法必須包含引數 self, 且為第一個引數,self 代表的是類的例項。

繼承

派生類的定義如下所示:

class DerivedClassName(BaseClassName1):
    <statement-1>
    .
    .
    .
    <statement-N>
#!/usr/bin/python3
 
#類定義
class people:
    #定義基本屬性
    name = ''
    age = 0
    #定義私有屬性,私有屬性在類外部無法直接進行訪問
    __weight = 0
    #定義構造方法
    def __init__(self,n,a,w):
        self.name = n
        self.age = a
        self.__weight = w
    def speak(self):
        print("%s 說: 我 %d 歲。" %(self.name,self.age))
 
#單繼承示例
class student(people):
    grade = ''
    def __init__(self,n,a,w,g):
        #呼叫父類的構函
        people.__init__(self,n,a,w)
        self.grade = g
    #覆寫父類的方法
    def speak(self):
        print("%s 說: 我 %d 歲了,我在讀 %d 年級"%(self.name,self.age,self.grade))
 
 
 
s = student('ken',10,60,3)
s.speak()

多繼承

Python同樣有限的支援多繼承形式。多繼承的類定義形如下例:

class DerivedClassName(Base1, Base2, Base3):
    <statement-1>
    .
    .
    .
    <statement-N>

需要注意圓括號中父類的順序,若是父類中有相同的方法名,而在子類使用時未指定,python從左至右搜尋 即方法在子類中未找到時,從左到右查詢父類中是否包含方法。

#!/usr/bin/python3
 
#類定義
class people:
    #定義基本屬性
    name = ''
    age = 0
    #定義私有屬性,私有屬性在類外部無法直接進行訪問
    __weight = 0
    #定義構造方法
    def __init__(self,n,a,w):
        self.name = n
        self.age = a
        self.__weight = w
    def speak(self):
        print("%s 說: 我 %d 歲。" %(self.name,self.age))
 
#單繼承示例
class student(people):
    grade = ''
    def __init__(self,n,a,w,g):
        #呼叫父類的構函
        people.__init__(self,n,a,w)
        self.grade = g
    #覆寫父類的方法
    def speak(self):
        print("%s 說: 我 %d 歲了,我在讀 %d 年級"%(self.name,self.age,self.grade))
 
#另一個類,多重繼承之前的準備
class speaker():
    topic = ''
    name = ''
    def __init__(self,n,t):
        self.name = n
        self.topic = t
    def speak(self):
        print("我叫 %s,我是一個演說家,我演講的主題是 %s"%(self.name,self.topic))
 
#多重繼承
class sample(speaker,student):
    a =''
    def __init__(self,n,a,w,g,t):
        student.__init__(self,n,a,w,g)
        speaker.__init__(self,n,t)
 
test = sample("Tim",25,80,4,"Python")
test.speak()   #方法名同,預設呼叫的是在括號中排前地父類的方法

執行以上程式輸出結果為:

我叫 Tim,我是一個演說家,我演講的主題是 Python

方法重寫

#!/usr/bin/python3
 
class Parent:        # 定義父類
   def myMethod(self):
      print ('呼叫父類方法')
 
class Child(Parent): # 定義子類
   def myMethod(self):
      print ('呼叫子類方法')
 
c = Child()          # 子類例項
c.myMethod()         # 子類呼叫重寫方法
super(Child,c).myMethod() #用子類物件呼叫父類已被覆蓋的方法

類的屬性和方法

類的私有屬性

__private_attrs:兩個下劃線開頭,宣告該屬性為私有,不能在類的外部被使用或直接訪問。在類內部的方法中使用時 self.__private_attrs。

類的方法

在類的內部,使用 def 關鍵字來定義一個方法,與一般函式定義不同,類方法必須包含引數 self,且為第一個引數,self 代表的是類的例項。

self 的名字並不是規定死的,也可以使用 this,但是最好還是按照約定是用 self。

類的私有方法

__private_method:兩個下劃線開頭,宣告該方法為私有方法,只能在類的內部呼叫 ,不能在類的外部呼叫。self.__private_methods。