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

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 等則是能夠修改的對象。html

    • 不可變類型:變量賦值 a = 5 後再賦值 a = 10,這裏實際是新生成一個 int 值對象 10,再讓 a 指向它,而 5 被丟棄,不是改變 a 的值,至關於新生成了 a 。
    • 可變類型:變量賦值 la = [1,2,3,4] 後再賦值 la[2] = 5 則是將 list la 的第三個元素值更改,自己 la 沒有動,只是其內部的一部分值被修改了。
  • Python 函數的參數傳遞:python

    • 不可變類型:相似 c++ 的值傳遞,如整數、字符串、元組。如 fun(a),傳遞的只是 a 的值,沒有影響 a 對象自己。好比在 fun(a) 內部修改 a 的值,只是修改另外一個複製的對象,不會影響 a 自己。
    • 可變類型:相似 c++ 的引用傳遞,如列表,字典。如 fun(la),則是將 la 真正的傳過去,修改後 fun 外部的 la 也會受影響。
  • Python 中一切都是對象,嚴格意義咱們不能說值傳遞仍是引用傳遞,咱們應該說傳不可變對象和傳可變對象。
  • 參數c++

    • 必需參數。必需參數須以正確的順序傳入函數,調用時的數量必須和聲明時的同樣。
    • 關鍵字參數 。關鍵字參數和函數調用關係緊密,函數調用使用關鍵字參數來肯定傳入的參數值。使用關鍵字參數容許函數調用時參數的順序與聲明時不一致,由於 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. 加了兩個星號 ** 的參數會以字典的形式導入。
  • 匿名函數express

    • 所謂匿名,意即再也不使用 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」!
ui

相關文章
相關標籤/搜索