[Python 實戰] - No.13 Python高級編程

Python高級編程

記錄一下python中幾種比較高效、簡潔的編程方法

變量交換:

在其他語言中,我們進行變量交換一般都是使用一個臨時存儲變量tmp,然後將a,b的變量值進行交換。但是python獨有一種超級簡單的變量交換的方法。

a = 5
b = 10
print(a,b)

b,a = a,b
print(a,b)

'''
5 10
10 5
'''

還有幾種其他的有有趣的方式進行變量交換,但並非python特有。

加和方法:

a = 5
b = 10
print(a,b)
a = a + b #15
b = a - b #5
a = a - b #10
print(a,b)

異或方法:

a = 5   #0101
b = 10  #1010
print(a,b)
a = a^b #1111
b = a^b #0101
a = a^b #1010
print(a,b)
遍歷兩個列表:

zip() 函數用於將可迭代對象作爲參數,將對象中對應的元素打包成一個個元組,然後


teamA = ['Alice','Bob','Cindy']
teamB = ['David','Frank','Gale']

for t1,t2 in zip(teamA,teamB):
    print(t1+" likes " +t2)
    
'''
Alice likes David
Bob likes Frank
Cindy likes Gale
'''
推導式(comprehensions):

python推導式又稱解析式,是python的一種特性。推導式能讓python開發者,根據已有的數據集合快速構建另一個數據集合。我們常用的有以下三種推導式:列表推導式、字典推導式和集合推導式。

列表推導式:

# 快速創建 20以內的奇數數組
odd = [i for i in range(20) if i%2==1]
print(odd)

'''
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
'''

我們還可以將列表生成元素表達式用函數代替,如下所示:

def func(i):
    return "Odd_Num:" + str(i)
odd_num = [func(i) for i in range(20) if i%2==1]
print(odd_num)

'''
['Odd_Num:1', 'Odd_Num:3', 'Odd_Num:5', 'Odd_Num:7', 'Odd_Num:9', 'Odd_Num:11', 'Odd_Num:13', 'Odd_Num:15', 'Odd_Num:17', 'Odd_Num:19']
'''

集合推導式:

集合推導式和列表推導式形式是很相似的,只不過集合推導式需要使用**{}**

odd = {i for i in range(20) if i%2==1}
print(odd)

字典推導式:

# 獲取所有的英文名以'A'開頭的員工姓名和ID字典

names = ['Alice','Abby','Alex','Bob','Cindy']
ids = ['0312','0315','0396','1256','2357']
name_dict = {Name:Id for Name,Id in zip(names,ids) if Name[0]=='A'}
print(name_dict)

'''
{'Alice': '0312', 'Abby': '0315', 'Alex': '0396'}
'''

利用字典推導式,我們可以在python中實現快速的key,value互換

id_name = {v:k for k,v in name_dict.items() }
print(id_name)

'''
{'0312': 'Alice', '0315': 'Abby', '0396': 'Alex'}
'''
Counter計數器

python的collections模塊提供了一些特殊容器,Counter就是其中很有用的一個類,可以很方便地計算列表和字符串中的詞頻等。

from collections import Counter

sentence_set = """When forty winters shall besiege thy brow,
And dig deep trenches in thy beauty's field,
Thy youth's proud livery so gazed on now,
Will be a totter'd weed of small worth held:
Then being asked, where all thy beauty lies,
Where all the treasure of thy lusty days;
To say, within thine own deep sunken eyes,
Were an all-eating shame, and thriftless praise.
How much more praise deserv'd thy beauty's use,
If thou couldst answer 'This fair child of mine
Shall sum my count, and make my old excuse,'
Proving his beauty by succession thine!
This were to be new made when thou art old,
And see thy blood warm when thou feel'st it cold.""".split()

cnt = Counter(sentence_set)
print(cnt.most_common(5))

'''
[('thy', 6), ('of', 3), ('thou', 3), ('And', 2), ('deep', 2)]
'''

另外,由於Counter是dict的子類,所以很多dict上的操作同樣適用於Counter

print(cnt.items()) #(k,v)格式列表,可以很方便遍歷
list(cnt)  # 將cnt中的鍵轉爲列表
set(cnt)  # 將cnt中的鍵轉爲set
dict(cnt)  # 將cnt中的鍵值對轉爲字典
行內if語句
gender = 'male'
likes = "toy" if gender=='female' else 'bike'
print(likes)

python中的行內if語句有點像c++中的三元表達式,都是很簡單的一種if方法。我們可以使用行內if語句來非常簡單的實現一個經典問題"fizzbuzz"

**FizzBuzz:**寫一個程序,打印數字1到100,3的倍數打印“Fizz”來替換這個數,5的倍數打印“Buzz”,對於既是3的倍數又是5的倍數的數字打印“FizzBuzz”。

for i in range(1,101):
    print('fizz'*(i%3==0)+'buzz'*(i%5==0) if i%3==0 or i%5==0 else i)
    
'''
1
2
fizz
4
buzz
fizz
7
8
fizz
buzz
11
fizz
13
14
fizzbuzz
......
'''
數值比較:

python中的數值比較語法顯得特別的優秀!

for i in range(20):
    if 3 < i <10:
        print(i,end=',')
    if 10 < i > 15:
        print(i,end=',')     
		
'''
4,5,6,7,8,9,16,17,18,19,
'''
字典索引:

在python中,我們經常用下列方法獲取dict元素:

d = {'Alice': '0312', 'Abby': '0315', 'Alex': '0396'}
key1 = 'Alice'
try:
    id1 = d[key1]
except KeyError:
    print("No such key")
    id1 = None

使用索引,如果索引不存在拋出異常,然後進行賦值。也可以使用get()方法來獲取並設置鍵值不存在時候的默認值。

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