1. 程式人生 > >Python-列表解析和生成表示式

Python-列表解析和生成表示式

先看一道比較簡單的題目:列出小於10,並且能被3或者5整除的數字,並求和。如果是10000,10000000呢?

  • 一般的程式碼
nums = []
for i in range(1, 10):
    if i%3 == 0 or i%5 == 0:
        nums.append(i)
print(sum(nums))
  • 使用列表解析
nums = [i for i in range(1, 10) if i%3==0 or i%5==0]
print(sum(nums))
  • 列表解析的一般形式
[expr for iter_var in iterable] #expr:表示式
[expr for
iter_var in inerable if cond_expr] #if後面的語句為判斷語句

例如求一個列表為[0, 10, 20,…, 80, 90]可以這樣寫

nums = [i*10 for i in range(0, 10)]

注意我上面寫的雖然是正確的,但是在python裡面是不科學的,因為列表解析通常用在需要改變列表從而返回改變後的列表值,而不應該用在新建一個列表上。

  • 生成器表示式
(expr for iter_var in iterable) #expr:表示式
(expr for iter_var in inerable if cond_expr) #if後面的語句為判斷語句

可以看成生成表示式與列表解析不同的是‘[]’變為‘()’,但是列表解析返回的是一個列表,而生成表示式返回的是一個生成器物件(generator object)。生成器使用了“惰性計算”,只有在檢索時才被賦值,所以在列表比較長的情況下使用,記憶體上更有效。
這裡寫圖片描述

這裡寫圖片描述

  • 用生成表示式寫那個題:
s = 0
nums = (i for i in range(1, 10000000) if i%3==0 or i%5==0)
for i in nums:
    s += i
print(s)