Python 3 學習筆記之——基礎語法

seniusen發表於2018-10-24
1. a, b = a, a + b
  • 先計算右邊表示式,然後再同時賦值給左邊。
2. 條件控制和迴圈語句
  • 條件控制
if condition_1:
    statement_block_1
elif condition_2:
    statement_block_2
else:
    statement_block_3
  • while 迴圈
while condition:
    statement_block
else:  # 可有可無
    statement_block
  • for 迴圈
for <variable> in <sequence>:
    <statements>
else:
    <statements>
  • range() 函式
>>> a = list(range(3))
>>> a
[0, 1, 2]
>>> a = list(range(1, 5, 2))
>>> a
[1, 3]
  • break 語句可以跳出 for 和 while 的迴圈體。如果你從 for 或 while 迴圈中終止,任何對應的迴圈 else 塊將不執行。
  • pass是空語句,是為了保持程式結構的完整性。pass 不做任何事情,一般用做佔位語句。
3. 迭代器和生成器
  • 字串,列表或元組物件都可用於建立迭代器。
>>> a = [1, 2, 3, 4]
>>> it = iter(a)
>>> next(it)
1
>>> next(it)
2
>>> next(it)
3
>>> next(it)
4
>>> next(it)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

>>> it = iter(a)
>>> for i in it:
...     print(i)
... 
1
2
3
4
>>>
  • 建立自己的迭代器,需要在類中實現實現兩個方法 iter() 與 next() 。iter() 方法返回一個特殊的迭代器物件, 這個迭代器物件實現了 next() 方法並通過 StopIteration 異常標識迭代的完成。
class MyNumbers:
    def __iter__(self):
        self.a = 1
        return self
 
    def __next__(self):
        if self.a <= 5:
            x = self.a
            self.a += 1
            return x
        else:
            raise StopIteration


myclass = MyNumbers()
myiter = iter(myclass)

for i in range(5):
    print(next(myiter))

for x in myiter:
    print(x)

>>>
1
2
3
4
5
  • 在 Python 中,使用了 yield 的函式被稱為生成器(generator)。跟普通函式不同的是,生成器是一個返回迭代器的函式,只能用於迭代操作,更簡單點理解生成器就是一個迭代器。在呼叫生成器執行的過程中,每次遇到 yield 時函式會暫停並儲存當前所有的執行資訊,返回 yield 的值, 並在下一次執行 next() 方法時從當前位置繼續執行。
import sys


def fibonacci(n):  # 生成器函式 - 斐波那契
    a, b, counter = 0, 1, 0
    while True:
        if counter > n:
            return
        yield a
        a, b = b, a + b
        counter += 1


f = fibonacci(10)  # f 是一個迭代器,由生成器返回生成

while True:
    try:
        print(next(f), end=" ")
    except StopIteration:
        sys.exit()

>>> 0 1 1 2 3 5 8 13 21 34 55 
4. 函式
  • Python 定義函式使用 def 關鍵字,一般格式如下:
def function_name(args1, args2):
    statement
    return
  • return [表示式] 結束函式,選擇性地返回一個值給呼叫方。不帶表示式的 return 相當於返回 None。

  • 可更改(mutable)與不可更改(immutable)物件

  • 在 Python 中,strings, tuples, 和 numbers 是不可更改的物件,而 list, dict 等則是可以修改的物件。

    • 不可變型別:變數賦值 a = 5 後再賦值 a = 10,這裡實際是新生成一個 int 值物件 10,再讓 a 指向它,而 5 被丟棄,不是改變 a 的值,相當於新生成了 a 。

    • 可變型別:變數賦值 la = [1,2,3,4] 後再賦值 la[2] = 5 則是將 list la 的第三個元素值更改,本身 la 沒有動,只是其內部的一部分值被修改了。

  • Python 函式的引數傳遞:

    • 不可變型別:類似 c++ 的值傳遞,如整數、字串、元組。如 fun(a),傳遞的只是 a 的值,沒有影響 a 物件本身。比如在 fun(a) 內部修改 a 的值,只是修改另一個複製的物件,不會影響 a 本身。

    • 可變型別:類似 c++ 的引用傳遞,如列表,字典。如 fun(la),則是將 la 真正的傳過去,修改後 fun 外部的 la 也會受影響。

  • Python 中一切都是物件,嚴格意義我們不能說值傳遞還是引用傳遞,我們應該說傳不可變物件和傳可變物件。

  • 引數

    • 必需引數。必需引數須以正確的順序傳入函式,呼叫時的數量必須和宣告時的一樣。
    • 關鍵字引數 。關鍵字引數和函式呼叫關係緊密,函式呼叫使用關鍵字引數來確定傳入的引數值。使用關鍵字引數允許函式呼叫時引數的順序與宣告時不一致,因為 Python 直譯器能夠用引數名匹配引數值。
    • 預設引數。呼叫函式時,如果沒有傳遞引數,則會使用預設引數。
    • 不定長引數。你可能需要一個函式能處理比當初宣告時更多的引數,這些引數叫做不定長引數,它們在宣告時不會命名。
    def functionname([formal_args,] *var_args_tuple ):
        "函式_文件字串"
        function_suite
        return [expression]
    
      1. 加了星號 * 的引數會以元組(tuple)的形式匯入,存放所有未命名的變數引數。如果在函式呼叫時沒有指定引數,它就是一個空元組。我們也可以不向函式傳遞未命名的變數。
    def functionname([formal_args,] **var_args_dict ):
        "函式_文件字串"
        function_suite
        return [expression]
    
      1. 加了兩個星號 ** 的引數會以字典的形式匯入。
  • 匿名函式

    • 所謂匿名,意即不再使用 def 語句這樣標準的形式定義一個函式。

    • lambda 只是一個表示式,函式體比 def 簡單很多。

    • lambda 的主體是一個表示式,而不是一個程式碼塊。僅僅能在 lambda 表示式中封裝有限的邏輯進去。

    • lambda 函式擁有自己的名稱空間,且不能訪問自己引數列表之外或全域性名稱空間裡的引數。

    • 雖然 lambda 函式看起來只能寫一行,卻不等同於 C 或 C++ 的行內函數,後者的目的是呼叫小函式時不佔用棧記憶體從而增加執行效率。

       sum = lambda arg1, arg2: arg1 + arg2
       print ("相加後的值為 : ", sum( 10, 20 ))
       print ("相加後的值為 : ", sum( 20, 20 ))
      
       >>>
      相加後的值為 :  30
      相加後的值為 :  40
    
5. 列表推導式
vec = [2, 4, 6]
[3 * x for x in vec if x > 3] 
>>>
[12, 18]

matrix = [ [1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12] ]
[[row[i] for row in matrix] for i in range(4)]
>>>
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
6. 遍歷技巧
  • 在序列中遍歷時,索引位置和對應值可以使用 enumerate() 函式同時得到。
  • 同時遍歷兩個或更多的序列,可以使用 zip() 組合。
  • 要反向遍歷一個序列,首先指定這個序列,然後呼叫 reversed() 函式。
  • 要按順序遍歷一個序列,使用 sorted() 函式返回一個已排序的序列,並不修改原值。
a = [2, 4, 6]
for i, v in enumerate(a):
    print(i, v)
>>>
0 2
1 4
2 6

>>> b = ['sen', 'ius', 'en']
>>> for i, j in zip(a, b):
...     print(i, j)
... 
2 sen
4 ius
6 en

>>> for i in reversed(a):
...     print(i)
... 
6
4
2
>>> for i in sorted(b):
...     print(i)
... 
en
ius
sen
>>> 

參考資料 菜鳥教程

獲取更多精彩,請關注「seniusen」!

相關文章