Python優雅程式設計技巧

2021-07-10 23:44:03 字數 4570 閱讀 8928

標籤(空格分隔): python

需求:把list所有成員元素加倍。

普通的方式:

bag = [1,2,3,4,5]

for i in range(len(bag)):

bag[i] = bag[i] * 2

優雅的方式:

bag = [1,2,3,4,5]

bag = [elem * 2

for elem in bag]

普通的方式:

bag = [1,2,3,4,5]

for i in range(len(bag)):

print(bag[i])

優雅的方式:

bag = [1,2,3,4,5]

for i in bag:

print(i)

如果需要顯示列表的索引,則可用以下方式:

bag = [1,2,3,4,5]

for index, element in enumerate(bag):

print(index, element)

普通的方式:

a = 5

b = 6

#交換a和b

tmp = a

a = b

b = tmp

優雅的方式:

a = 5

b = 6

#交換a和b

a, b = b, a

普通的方式:

bag = 

for _ in range(10):

優雅的方式:

bag = [0] * 10
注意:如果列表包含的列表,這樣就產生了淺拷貝。

舉個栗子:

bag_of_bags = [[0]] * 5

#[[0], [0], [0], [0], [0]]

bag_of_bags[0][0] = 1

#[[1], [1], [1], [1], [1]]

所有元素都被改變了,而我們只想改變第乙個列表。

正確的方法:

bag_of_bags = [[0] for _ in range(5)]       #[[0], [0], [0], [0], [0]]

bag_of_bags[0][0] = 1

#[[1], [0], [0], [0], [0]]

普通的方式:

name = "raymond"  

age = 22

born_in = "oakland, ca"

string = "hello my name is " + name + "and i'm " + str(age) + " years old. i was born in " + born_in + "."

print(string)

優雅的方式:

name = "raymond"  

age = 22

born_in = "oakland, ca"

string = "hello my name is and i'm years old. i was born in .".format(name, age, born_in)

print(string)

python允許你在乙個函式中返回多個元素,這讓生活更簡單。

普通的方式:

def

binary

():return

0, 1

result = binary()

zero = result[0]

one = result[1]

優雅的方式:

def

binary

():return

0, 1

zero, one = binary()

你也會經常給dicts中寫入key,pair(鍵,值)

如果你試圖訪問乙個不存在的於dictkey,可能會為了避免keyerror錯誤,你會傾向於這樣做:

countr = {}  

bag = [2, 3, 1, 2, 5, 6, 7, 9, 2, 7]

for i in bag:

if i in countr:

countr[i] += 1

else:

countr[i] = 1

for i in range(10):

if i in countr:

print("count of {}: {}".format(i, countr[i]))

else:

print("count of {}: {}".format(i, 0))

優雅的方式:

countr = {}  

bag = [2, 3, 1, 2, 5, 6, 7, 9, 2, 7]

for i in bag:

countr[i] = countr.get(i, 0) + 1

for i in range(10):

print("count of {}: {}".format(i, countr.get(i, 0)))

當然你也可以用setdefault來代替。

還有乙個更簡單卻多費點開銷的辦法:

bag = [2, 3, 1, 2, 5, 6, 7, 9, 2, 7]  

countr = dict([(num, bag.count(num)) for num in bag])

for i in range(10):

print("count of {}: {}".format(i, countr.get(i, 0)))

你也可以用dict推導式

countr =
這兩種方法開銷大,因為它們在每次count被呼叫時都會對列表遍歷。

現有的庫,直接匯入使用好了。

from collections import counter  

bag = [2, 3, 1, 2, 5, 6, 7, 9, 2, 7]

countr = counter(bag)

for i in range(10):

print("count of {}: {}".format(i, countr[i]))

你可以指定start的點和stop點,就像這樣list[start:stop:step]。我們取出列表中的前5個元素:

bag = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]  

for elem in bag[:5]:

print(elem)

這就是切片,我們指定stop點是5,再停止前就會從列表中取出5個元素。

要是最後5個元素怎麼做?

bag = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]  

for elem in bag[-5:]:

print(elem)

如果想對列表中元素間隔操作,你可以這樣做:

bag = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]  

for index, elem in enumerate(bag):

if index % 2 == 0:

print(elem)

更優雅的方式:

bag = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]  

for elem in bag[::2]:

print(elem)

# 或者用 ranges

bag = list(range(0,10,2))

print(bag)

這就是列表中的步進list[::2]意思是遍歷列表同時兩步取出乙個元素。

你可以用list[::-1]很酷的翻轉列表。

英文原文:the python way: 10

其他文件:

the python way part two: 10 more tips

python list comprehensions: explained visually

Python優雅技巧

不要這麼做 i 0 foritem in iterable print i,item i 1而是這樣 for i,item in enumerate iterable print i,itemenumerate可以接受第二個引數,例如 list enumerate abc 0,a 1,b 2,c l...

Go程式設計技巧 Goroutine的優雅控制

原文 go程式設計技巧 goroutine的優雅控制 goroutine是go語言最重要的機制,goroutine將複雜的需要非同步的io呼叫抽象成同步呼叫,符合人類正常的順序思維,極大的簡化了io程式設計的難度。如同執行緒一樣,對goroutine既要掌握基本的用法,更要很好的控制goroutin...

Python程式設計技巧

python 字典中使用了 hash table,因此查詢操作的複雜度為 o 1 而 list 實際是個陣列,在 list 中,查詢需要遍歷整個 list,其複雜度為 o n 因此對成員的查詢訪問等操作字典要比 list 更快。set 的 union,intersection,difference ...