<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