天天看點

Python成長之路——清單推導式和生成器表達式

閑話就不多說了,直接上代碼吧

  • 清單解析
    v_list = [ "擷取到第 %s 個元素"%i for i in range(10)]
    print(v_list)
    // 執行的結果  ['擷取到第 0 個元素', '擷取到第 1 個元素', '擷取到第 2 個元素', '擷取到第 3 個元素', '擷取到第 4 個元素', '擷取到第 5 個元素', '擷取到第 6 個元素', '擷取到第 7 個元素', '擷取到第 8 個元素', '擷取到第 9 個元素']
               
  • 生成器表達式
    v_list = ( "擷取到第 %s 個元素"%i for i in range(10))
    print(v_list)
    // 執行的結果  ['擷取到第 0 個元素', '擷取到第 1 個元素', '擷取到第 2 個元素', '擷取到第 3 個元素', '擷取到第 4 個元素', '擷取到第 5 個元素', '擷取到第 6 個元素', '擷取到第 7 個元素', '擷取到第 8 個元素', '擷取到第 9 個元素']
               
  • 總結下:
  1. 把清單解析的[]換成()達到的就是生成器表達式
  2. 清單解析與生成器表達式都是一種便利的程式設計方式,隻不過是生成器表達式更節省記憶體
  3. python不但使用疊代器協定,讓for循環更加通用,大部分内置函數,也是使用疊代器協定通路對象
  • 推導式公式

    上面我們已經簡單介紹了清單推導式和生成器表達式,除此之外,還有字典推導式,集合推導式等等

    下面以清單推導式來介紹通過公式,其他的推導式對于這個公式也是适用的

    variable = [out_exp_res for out_exp in input_list if out_exp == 2]
    out_exp_res:  清單生成元素表達式,可以是有傳回值的函數。
    for out_exp in input_list:  疊代input_list将out_exp傳入out_exp_res表達式中。
    if out_exp == 2:  根據條件過濾哪些值可以。
               
  • 清單推導式

    30以内所有能被4整除的數

    list = [i for i in range(30) if i % 4 is 0]
    print(list)
    //執行結果 [0, 4, 8, 12, 16, 20, 24, 28]
               
    30以内所有能被3整除的數的平方
    list = [i ** 2 for i in range(30) if i % 4 is 0]
    print(list)
    //執行結果 [0, 16, 64, 144, 256, 400, 576, 784]
               
    找到嵌套清單中名字含有兩個‘e’的所有名字
    names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
         ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
    list = [name for lst in names for name in lst if name.count('e') >= 2]
    print(list)
    // 執行的結果 ['Jefferson', 'Wesley', 'Steven', 'Jennifer']
               
  • 字典推導式

    将一個字典的key和value對調

    param = {"a":10,"b":20}
    list = {param[key]:key for key in param}
    print(list)
    //執行結果 {10: 'a', 20: 'b'}
               
  • 集合推導式

    計算清單中每個值的平方,并自帶去重功能

    list = {i ** 2 for i in [1,-1,2,-2,8,6,5]}
    print(list)
    //執行結果 {64, 1, 4, 36, 25}