python(三)高級特性切片迭代等

切片:取一個list或tuple的部分元素是很是常見的操做算法

L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']
 ##取前3個元素
 L[0:3]=['Michael', 'Sarah', 'Tracy'] ##或 L=[:3]
 ##N個元素,也就是索引爲0-(N-1)的元素
## 能夠從索引1開始,取出2個元素出來:
 >>> L[1:3]
['Sarah', 'Tracy']
##L[-1]取倒數第一個元素,那麼它一樣支持倒數切片,倒數第一個元素是-1 不是從零開始
>>> L[-2:]
['Bob', 'Jack']
>>> L[-2:-1]
['Bob']
##前10個數,每兩個取一個:
>>> L[:10:2]
[0, 2, 4, 6, 8]

迭代 for循環來遍歷這個list或tuple,這種遍歷咱們稱爲迭代(Iteration)數組

for ch in 'ABC':
...     print(ch)
...
A
B
C
###字典 dict 迭代(dict迭代的是key。若是要迭代value,能夠用for value in d.values(),若是要同時迭代key和value,能夠用for k, v in d.items())
>>> d = {'a': 1, 'b': 2, 'c': 3}
>>> for key in d:
...     print(key)
...
a
c
b

Python內置的enumerate函數能夠把一個list變成索引-元素對,這樣就能夠在for循環中同時迭代索引和元素自己:app

>>> for i, value in enumerate(['A', 'B', 'C']):
...     print(i, value)
...
0 A
1 B
2 C

請使用迭代查找一個list中最小和最大值,並返回一個tuple:ide

def findMinAndMax(L):
    if L == []:
        return None,None
    # elif len(L) ==1:
    #     max = min = L[0]
    #     return min,max
    else:
        max =L[0]
        min =L[0]
        for i in L:     ### 注意這地方的循環嵌套 要在當前嵌套if裏面 max和min的值纔會生效
            if i > max:
             max = i
        # for i in L:
            if i < min:
                min =i
        return min,max
#####優解
def findMinAndMax(L):
    if not isinstance(L, list):
        raise TypeError('Invalid')
    L_num = [ x for x in L if type(x) is int]  
    if len(L_num) == 0:
        return (None, None)
    min = 0
    max = 0
    for i, value in enumerate(L_num):
        if i == 0:
            min = value
        if value < min:
            min = value
        if value > max:
            max = value
    return (min, max)

列表生成式
用一行語句代替循環生成上面的list函數

>>> [x * x for x in range(1, 11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
##寫列表生成式時,把要生成的元素x * x放到前面,後面跟for循環 判斷條件 寫到循環後面
>>> [x * x for x in range(1, 11) if x % 2 == 0]
[4, 16, 36, 64, 100]

生成器
受到內存限制,列表容量確定是有限,列表元素能夠按照某種算法推算出來,那咱們是否能夠在循環的過程當中不斷推算出後續的元素,沒必要建立完整的list,從而節省大量的空間。一邊循環一邊計算的機制,稱爲生成器。
建立一個generator,有不少種方法:
其中一種方法很簡單,只要把一個列表生成式的[]改爲(),就建立了一個generator:code

>>> L = [x * x for x in range(10)]
>>> L
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> g = (x * x for x in range(10))
>>> g
<generator object <genexpr> at 0x1022ef630>
###generator保存的是算法,每次調用next(g),就計算出g的下一個元素的值,直到計算到最後一個元素,沒有更多的元素時,拋出StopIteration的錯誤。

在好比斐波拉契數列(Fibonacci),除第一個和第二個數外,任意一個數均可由前兩個數相加獲得:索引

def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        print(b)
        a, b = b, a + b
        n = n + 1
    return 'done'
##用生成器表達(要把fib函數變成generator,只須要把print(b)改成yield b就能夠了)
##定義一個generator,依次返回數字1,3,5:
def odd():                      ## 這裏沒有參數變量須要傳入,因此不用命名參數名,每次執行next()函數 生成值
    print('step 1')
    yield 1
    print('step 2')
    yield(3)
    print('step 3')
    yield(5)

練習楊輝三角定義以下:內存

1
     / \
    1   1
   / \ / \
  1   2   1
 / \ / \ / \
1   3   3   1

把每一行看作一個list,試寫一個generator,不斷輸出下一行的list:ci

def triangles():
    L=[1]                               #定義數組並賦初始值
    whiel True:
        yield L                     #生成器每次輸入上次計算的結果 因爲yield 返回的緣由 會繼續執行下去,並查詢上一次的計算結果
        L1=L[1]                         #每次初始化計算器
        for n in range(1,len(L)):       #循環遍歷上次計算結果
            L1.append(L[n-1]+L[n])      #將上次結果的相鄰兩數相加並賦值
        L1.append(1)                    #末尾加1
        L=L1                            #將計算結果賦值
相關文章
相關標籤/搜索