zip()函數可以把多個列表關聯起來,這個例子中,通過zip()可以按順序同時輸出兩個列表對應位置的元素對。有一點需要注意的是,zip()不會自動幫助判斷兩個列表是否長度一樣,所以最終的結果會以短的列表為準,想要以長的列表為準的話可以考慮itertools模塊中的izip_longest()。如果要生成迭代器只需要把方括號換成括號,生成字典也非常容易:
iter_odd = (x for x in [1, 2, 3, 4, 5] if x % 2)
print(type(iter_odd)) #
square_dict = {x: x**2 for x in range(5)} # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
至于列表生成和map/filter應該優先用哪種,這個問題很難回答,不過Python創始人Guido似乎不喜歡map/filter/reduce,他曾在表示過一些從函數式編程里拿來的特性是個錯誤。
字符串
Python中字符串相關的處理都非常方便,來看例子:
a = 'Life is short, you need Python'
a.lower() # 'life is short, you need Python'
a.upper() # 'LIFE IS SHORT, YOU NEED PYTHON'
a.count('i') # 2
a.find('e') # 從左向右查找'e',3
a.rfind('need') # 從右向左查找'need',19
a.replace('you', 'I') # 'Life is short, I need Python'
tokens = a.split() # ['Life', 'is', 'short,', 'you', 'need', 'Python']
b = ' '.join(tokens) # 用指定分隔符按順序把字符串列表組合成新字符串
c = a + '\n' # 加了換行符,注意+用法是字符串作為序列的用法
c.rstrip() # 右側去除換行符
[x for x in a] # 遍歷每個字符并生成由所有字符按順序構成的列表
'Python' in a # True
Python2.6中引入了format進行字符串格式化,相比在字符串中用%的類似C的方式,更加強大方便:
a = 'I’m like a {} chasing {}.'
# 按順序格式化字符串,'I’m like a dog chasing cars.'
a.format('dog', 'cars')
# 在大括號中指定參數所在位置
b = 'I prefer {1} {0} to {2} {0}'
b.format('food', 'Chinese', 'American')
# >代表右對齊,>前是要填充的字符,依次輸出:
# 000001
# 000019
# 000256
for i in [1, 19, 256]:
print('The index is {:0>6d}'.format(i))
# <代表左對齊,依次輸出:
# *---------
# ****------
# *******---
for x in ['*', '****', '*******']:
progress_bar = '{:-<10}'.format(x)
print(progress_bar)
for x in [0.0001, 1e17, 3e-18]:
print('{:.6f}'.format(x)) # 按照小數點后6位的浮點數格式
print('{:.1e}'.format(x)) # 按照小數點后1位的科學記數法格式
print ('{:g}'.format(x)) # 系統自動選擇最合適的格式
template = '{name} is {age} years old.'
c = template.format(name='Tom', age=8)) # Tom is 8 years old.
d = template.format(age=7,)# Jerry is 7 years old.
format在生成字符串和文檔的時候非常有用,更多更詳細的用法可以參考Python官網:
7.1. string – Common string operations – Python 2.7.13 documentation
文件操作和pickle
在Python中,推薦用上下文管理器(with-as)來打開文件,IO資源的管理更加安全,而且不用老惦記著給文件執行close()函數。還是舉例子來說明,考慮有個文件name_age.txt,里面存儲著名字和年齡的關系,格式如下:
Tom,8
Jerry,7
Tyke,3
...
讀取文件內容并全部顯示:
with open('name_age.txt', 'r') as f: # 打開文件,讀取模式
lines = f.readlines() # 一次讀取所有行
for line in lines: # 按行格式化并顯示信息
name, age = line.rstrip().split(',')
print('{} is {} years old.'.format(name, age))
open()的第一個參數是文件名,第二個參數是模式。文件的模式一般有四種,讀取(r),寫入(w),追加(a)和讀寫(r+)。如果希望按照二進制數據讀取,則將文件模式和b一起使用(wb, r+b…)。
再考慮一個場景,要讀取文件內容,并把年齡和名字的順序交換存成新文件age_name.txt,這時可以同時打開兩個文件:
with open('name_age.txt', 'r') as fread, open('age_name.txt', 'w') as fwrite:
line = fread.readline()
while line:
name, age = line.rstrip().split(',')
fwrite.write('{},{}\n'.format(age, name))
line = fread.readline()
有的時候我們進行文件操作是希望把對象進行序列化,那么可以考慮用pickle模塊:
import pickle
lines = [
"I'm like a dog chasing cars.",
"I wouldn't know what to do if I caught one...",
"I'd just do things."
]
with open('lines.pkl', 'wb') as f: # 序列化并保存成文件
pickle.dump(lines, f)
with open('lines.pkl', 'rb') as f: # 從文件讀取并反序列化
lines_back = pickle.load(f)
print(lines_back) # 和lines一樣
注意到,序列化的時候就得使用b模式了。Python2中有個效率更高的pickle叫cPickle,用法和pickle一樣,在Python3中就只有一個pickle。
評論
查看更多