python---[列表;字典;集合]*生成式;生成器

<1>列表生成式

[experssion for item in 序列 if 判斷語句]

1>列表生成式的簡單應用
s = '51 5000 10000'
k,a,b = s.split()
print(k,a,b)
print([i for i in range(1, 11) if i % 2 == 0])
print([i + j for i in 'ABC' for j in '123'])
print([i + str(v) for i, v in zip(['A', 'B', 'C'], [1, 2, 3])])
1>列表生成式的應用

應用1:找出1~1000之間的所有質數
在這裏插入圖片描述

應用2:將3x3的矩陣轉換成一堆數組
在這裏插入圖片描述

應用3:列表中所有內容都變成小寫
在這裏插入圖片描述
應用4:找出/var/log目錄中,所有以.log結尾的文件名或者目錄名
在這裏插入圖片描述
應用5:求以1~10之間所有偶數爲半徑所有圓的面積
print([math.pi * r * r for r in range(2, 11, 2)])
應用6:

   給定一個正整數,編寫程序計算有多少對質數的和等於輸入的這個正整數,並輸出結果。
輸入值小於1000。輸入爲10, 程序應該輸出結果爲2。(共有兩對質數的和爲10,分別爲(5,5),(3,7))
- 輸入描述:
輸入包括一個整數n,(3 ≤ n < 1000)
- 輸出描述:
輸出對數
- 示例1 :
輸入:
    10
輸出:
    2

方法一:
方法一:
方法二:
在這裏插入圖片描述

<2>字典生成式

需求1:假設有20個學生,學生分數在60~100之間,篩選出成績在90分以上的學生
在這裏插入圖片描述
需求2:將所有的key值變爲大寫

在這裏插入圖片描述
需求3:大小寫key值合併,統一以小寫輸出
在這裏插入圖片描述
在這裏插入圖片描述

<3>集合生成式

print({i ** 2 for i in {1, 2, 3}})
print({i ** 2 for i in {1, 2, 3, 9, 12} if i % 3 == 0})

<4>生成器

創建生成器的方法1:

In [7]: nums = (x*2 for x in range(10))
In [8]: nums
Out[8]: <generator object <genexpr> at 0x7fb2a6137fc0>

創建生成器的方法2(定義一個函數,讓這個函數變成生成器)

def fib(num):
    a,b,count = 0,1,1
    while count <= num:
        print(b)
        a,b = b,a+b
        count +=1
fib(10)

如果在調用函數的時候,發現這個函數中有yeild
那麼此時,也就不是調用函數了,而是創建了一個生成器對象

<5>生成器的理解和應用

def creat_num(all_num):
    print('~~~~~~~~~~~1~~~~~~~~~~~~~~~~~')
    a,b=0,1
    current_num  = 0
    while current_num < all_num:
        print('~~~~~~~~~2~~~~~~~~~~~~~~~~~')
        yield a # 相當於暫停了程序
        #print(a)
        print('~~~~~~~~~~~~~~3~~~~~~~~~~~~')
        a,b = b,b+a
        current_num += 1
        print('~~~~~~~~~~~4~~~~~~~~~~~~~~~~')

obj = creat_num(5)

此時.我們發現程序會報錯(告訴我們,生成器裏面沒有東西了)

while True:
    try:
        ret = next(obj)
        print('obj:',ret)
    except Exception as red:
        print(red.value)
        break
使用send喚醒程序
使用send()函數來喚醒程序執行,使用send()函數的好處是
可以在喚醒的同時向斷點中傳入一個附加的數據
 

def create_num(all_num):
    a,b = 0,1
    current_num = 0
    while current_num < all_num:
        ret = yield a
        print('>>>>>>>>ret>>>>>>>',ret)
        a,b = b,a+b
        current_num += 1


obj = create_num(100)
red = next(obj)
print(red)
red = obj.send(None)
print(red)


next和send得到的都是yield後面的值
不同的是send傳遞值而next不傳遞值

注意:
不能把send放在第一個,因爲第一次執行程序是從開始執行
並沒有值來接收send
如果你非要把send放在第一個,那麼傳遞的值應該是None

<6>應用題

應用1

羅馬數字包含以下七種字符: I, V, X, L,C,D 和 M
字符          數值
I             1
V             5
X             10
L             50
C             100
D             500
M             1000
例如,羅馬數字2寫做 II,即爲兩個並排放置的的 1,12寫做XII,即爲 X + II ,27寫做XXVII,即爲XX+V+II
在羅馬數字中,小的數字在大的數字的右邊。但 4 不寫作 IIII,而是 IV。
數字 1 在數字 5 的左邊,所表示的數等於大數減小數得到的數值 4 。
*同樣地,數字 9 表示爲 IX。這個規則只適用於以下六種情況:
    I 可以放在 V (5) 和 X (10) 的左邊,來表示 4 和 9
    X 可以放在 L (50) 和 C (100) 的左邊,來表示 40 和 90
    C 可以放在 D (500) 和 M (1000) 的左邊,來表示 400 和 900
給定一個羅馬數字,將其轉換成整數。輸入確保在 1 到 3999 範圍內
示例:
    示例 1:
    輸入: “III”
    輸出: 3

    示例 2:
    輸入: “IV”
    輸出: 4

    示例 3:
    輸入: “IX”
    輸出: 9

    示例 4:
    輸入: “LVIII”
    輸出: 58
    解釋: C = 100, L = 50, XXX = 30 and III = 3.

    示例 5:
    輸入: “MCMXCIV”
    輸出: 1994
    解釋: M = 1000, CM = 900, XC = 90 and IV = 4.

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
應用二:

編寫一個函數來查找字符串數組中的最長公共前綴
如果不存在最長公共前綴,返回空字符串 ''
    示例 1:
    輸入: [“flower”,”flow”,”flight”]
    輸出: “fl”
    示例 2:
    輸入: [“dog”,”racecar”,”car”]
    輸出: “”
    解釋: 輸入不存在最長公共前綴
說明:所有輸入只包含小寫字母 a-z

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章