1漢字編碼 URL編碼解碼
s = u'長春疫苗'
s_code = s.encode('UTF-8')
s_code
# 如何對url連結中的漢字編碼
import urllib
s_code1 = urllib.parse.quote(s)
print(s_code1)
s_code1 = "%25E9%25B9%25BF%25E6%2599%2597"
s_code2 = urllib.parse.unquote(s_code1)
# 解碼
print(urllib.parse.unquote(s_code2))
%E9%95%BF%E6%98%A5%E7%96%AB%E8%8B%97
鹿晗
2 datetime求時間差
import datetime
# 使用scrapy爬取資料,最後顯示的有開始的時間和結束的時間,但是時間格式如下所示,要求時間差可以使用下面的方式。
finish_time = datetime.datetime(2018, 7, 25, 7, 5, 29, 616530)
start_time = datetime.datetime(2018, 7, 25, 7, 4, 57, 580133)
(finish_time-start_time).seconds
32
3 python字元串相關
主要是字元串相關的一些知識點
- 通路字元串的值,字元串拼接,字元串運算
- 字元串格式化相關
3.1 字元串拼接,運算,通路
s1 = "hello world";
print(s1[4]) # 字元串通路
s2 = s1[:6]+"Qiu"; # 字元串拼接
print(s2);
# 重複輸出字元串
s3 = s2*3;
print(s3)
# 原始字元串:所有的字元串都是直接按照字面意思來使用,沒有轉移特殊或者不能列印的字元。
s4 = r'\n\t\r hello world'
print(s4)
o
hello Qiu
hello Qiuhello Qiuhello Qiu
\n\t\r hello world
3.2 字元串格式化
看一些字元串格式化的規則:
%[(name)][flags][width].[precision]typecode
(name) 可選,用于選擇指定的key
flags 可選,可供選擇的值有:
- + 右對齊;正數前加正好,負數前加負号;
- - 左對齊;正數前無符号,負數前加負号;
- 空格 右對齊;正數前加空格,負數前加負号;
- 0 右對齊;正數前無符号,負數前加負号;用0填充空白處
width 可選,占有寬度
.precision 可選,小數點後保留的位數
3.2.1 ASCII 二進制 十進制 八進制 十六進制
d = 97
c1 = "%c" % d
print(c1)
# 轉換成二進制,之後可以使用replace替換掉0b
c2 = bin(d)
print(c2)
c3 = "%o" % d;
print(c3)
# 大小寫x都行,十六進制
c4 = "%X" % d;
print(c4)
# 浮點數
c5 = "%f" % d;
print(c5)
# 科學計數法
c6 = "%e" % d;
print(c6)
# 根據值得大小決定使用%f 還是%e
c7 = "%g" % d;
print(c7)
a
0b1100001
141
61
97.000000
9.700000e+01
97
3.2.2 給變量命名
age = 18;
name = "Q"
greeting = "his name is %(name)s, he is %(age)d years old" % {'name':name, 'age':age}
print(greeting)
# 下面這種既包含命名變量又包含沒命名變量就不會了
# greeting1 = "his name is %(name)s, he is %(age)d years old and he is %s " % ({'name':name, 'age':age}, 'yes')
his name is Q, he is 18 years old
3.2.3 填充0 左右對齊
c = 1234;
# 用0填充空白處,此時需要c為int型才有效,如果這裡的d換成s,那麼不會達到想要的結果
c1 = "%010d" % c;
print(c1)
0000001234
3.2.4 精度
c = 1.234567
# 保留4位小數
c1 = "%.4f" % c;
print(c1)
# 保留四位小數,總長度為10,在左側補0
c2 = "%010.4f" % c
print(c2)
1.2346
00001.2346 看空格
3.3 其他
- 将字元串轉換成清單,元組
s = "1234";
print(list(s), tuple(s))
['1', '2', '3', '4'] ('1', '2', '3', '4')
- 判斷字元串是否包含某個子串
if '12' in '123':
print(True)
else:
print(False)
True
4 list
4.1 擷取清單中最大值所在的索引
index() 函數用于從清單中找出某個值第一個比對項的索引位置。
counts_baidu = [13879,17886,11305,5961,3086,2331,1680]
max_index = counts_baidu.index(max(counts_baidu))
max_index
1
4.2 del remove pop清單元素删除
- remove() 函數用于移除清單中某個值的第一個比對項。該方法沒有傳回值,但是會移除清單中第一個比對項
- pop() 函數用于移除清單中的一個元素(預設最後一個元素),并且傳回該元素的值。
需要注意的是删除元素的時候會改變元素在清單中的位置,是以如果是周遊删除的時候需要注意這個問題,可能下一個删除的元素不是自己想要删除的。
l = [1,2,3,4,3,2,5]
l.remove(2)
l.pop(2)
del l[1]
[1, 3, 2, 5]
4.3 list的拷貝問題
list拷貝存在兩種方式,一種是直接指派,一種是使用切片,具體操作如下:
a = ['wang','lu','love']
b = a
c = a[:]
a.append('Qiu')
print(b)
print(c)
['wang', 'lu', 'love', 'Qiu']
['wang', 'lu', 'love']
可以發現直接指派的時候,當原先的清單發生改變的時候,拷貝的清單也會相應的發生變化。但是使用切片的時候就不會了。可以了解為是引用複制和内容複制。
4.4 list一些切片操作
list[start : end : step]
- 清單元素逆序 a[::-1],該操作同樣适用于字元串,若a=‘1234’,a[::-1] = ‘4321’
a = ['wang','lu','love']
a[::-1]
a[::2]
['love', 'lu', 'wang']
['wang', 'love']
4.5 list周遊
包含對應元素的索引資訊
names = ["Tom",'Mary','Jack']
for i,val in enumerate(names):
print(i,"--",val)
0 -- Tom
1 -- Mary
2 -- Jack
4.6 使用join連接配接清單元素
會報錯,序列不能使整數,隻能是字元串。(S)
a = [1,2,3,4,5]
(",").join(a)
TypeError: sequence item 0: expected str instance, int found
5 range
5.1 生成數字清單
range(start, stop[, step]) 注意傳回的類型,要想看到輸出的結果,可以使用list(),但是在使用的使用,可以不用list()進行轉換
c = range(10)
print(type(c))
print(list(c))
c1 = range(1,10)
print(list(c1))
c2 = range(1,11,2)
print(list(c2))
# generate a reverse-order list
c3 = range(4,0,-1)
print(list(c3))
<class 'range'>
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 3, 5, 7, 9]
[4, 3, 2, 1]
6 zip
zip() 函數用于将可疊代的對象作為參數,将對象中對應的元素打包成一個個元組,然後傳回由這些元組組成的清單。
a = [1,2,3]
b = [4,5,6]
zipped = list(zip(a,b))
print(zipped)
print(list(zip(*zipped)))
[(1, 4), (2, 5), (3, 6)]
[(1, 2, 3), (4, 5, 6)]
7 檔案操作
7.1 按行讀取檔案内容
# delete stopwords
filepath = r"C:\others\doc\teamAndPersonInfo\研究所學生\資源庫\stopwords\stopwords1.txt"
# read stopwords and create stopword set
def read_stopwords(filepath):
sw_set = set()
with open(filepath, 'r', encoding='utf-8') as f:
# traverse file by line
for line in f:
sw_set.add(line.strip("\n"))
print("stopwords set:",sw_set)
return sw_set
sw_set = read_stopwords(filepath)
stopwords set: {'', "'", ':', '九', '嗳', '8', '5', ')', '6', '%', '哎呀', '"', '——', '月', '是', ' ]', '。', '啊', '!', '¥', '八', '>', '俺們', ')', '呗', '七', ']', '>', ',', '唉', '還', '哎喲', '\u3000', '|', '7', '三', '〉', '9', '7', '&', '1', '4', '/', '&', '3', '!', '2', '*', '{', '+', '\\', '9', ';', ':', '·', '[', '嗬', '@', '\ufeff,', '*', '向', '|', '’', '...', '‘', '2', '<', '(', '的', '0', '咚', '—', '%', '喏', '$', '很', '按', '`', '嗯', '在', '日', '>>', '六', '#', '吧哒', '喔唷', '=', '啐', ';', '0', '?', '.', '3', '、', '五', '}', '~', '4', '”', '》', '便', '二', '@', '$', '白', '_', '兮', '..', '哎', '8', '(', '?', '<', '了', '--', '給', '說', '零', '+', '呃', '5', '着', '俺', '“', '#', '年', '…', '按照', '^', '和', '6', '阿', '1', ' [', 'A', '吧', '《', '〈', '到', '-', '︿', '咦', '尼', '~'}
8 外部包
8.1 collections.defaultdict
當鍵的預設值不清楚的時候,可以使用defaultdict,比如下面的這種情況。在key值不存在的時候,預設值為0。參考這裡
from collections import defaultdict
bag = ['apple', 'orange', 'cherry', 'apple','apple', 'cherry', 'blueberry']
count = defaultdict(lambda:0) # count = {};如果這麼寫,會報錯keyerror
for fruit in bag:
count[fruit] += 1
count
{'apple': 3, 'blueberry': 1, 'cherry': 2, 'orange': 1})
8.2 itertools排列組合
itertools.permutations(iterable, r=None) 其中r預設為空,當為空的時候,r的預設值是可疊代對象的長度。傳回值是可疊代對象中元素的排列。
itertools.combinations(iterable, r)
import itertools
l = ['A','B','C']
temp = itertools.permutations(l, 2)
print(list(temp))
temp = itertools.combinations(l,2)
print(list(temp))
[('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'C'), ('C', 'A'), ('C', 'B')]
[('A', 'B'), ('A', 'C'), ('B', 'C')]
9 dict
9.1 字典排序
sorted() 函數對所有可疊代的對象進行排序操作。
sorted(iterable[, key[, reverse]])
參數說明:
- iterable – 可疊代對象。
- key – 主要是用來進行比較的元素,隻有一個參數,具體的函數的參數就是取自于可疊代對象中,指定可疊代對象中的一個元素來進行排序。
- reverse – 排序規則,reverse = True 降序 , reverse = False 升序(預設)
key是一個函數,用于指定進行比較的參數。對字典進行排序還是推薦先将字典轉換成清單(items),之後再進行排序。
top_10_nouns = {'日報': 17, '疫苗': 1405, '記錄': 143, '事': 42, '長生': 866, '狂犬': 89, '社會': 26, '聲明': 14, '法律責任': 11, '教授': 6, '有效期': 11}
# 使用key進行排序
top_5 = sorted(top_10_nouns.items(), key=lambda x:x[1], reverse=True)[:5]
print(top_5)
# 使用key進行排序
top_5 = sorted(top_10_nouns, key=top_10_nouns.get, reverse=True)[:5]
print(top_5)
[('疫苗', 1405), ('長生', 866), ('記錄', 143), ('狂犬', 89), ('事', 42)]
['疫苗', '長生', '記錄', '狂犬', '事']
為什麼會出現上面兩種不同的結果,這個就不是很清楚。可以這裡了解,top_10_nouns是一個字典,周遊的對象是該字典的鍵,鍵通過字典的get函數得到值,然後根據值進行排序,至于最後的傳回值,因為疊代對象是該字典的鍵,是以傳回的也是鍵。
9.2 get()
d1 = {'name': 'egon', 'price': 100}
d1.get('name')
d1.get('height', 'no such key')
'egon'
'no such key'
10 lambda
如果需要,可以檢視這篇文檔
11 一些常用的函數
11.1 max()/min() sort()
max(iterable, key, default)求疊代器的最大值,其中iterable為疊代器,key指定排序規則,key參數是一個可以調用的對象,在Python中,類、自定義函數、内置函數、lambda表達式、帶有特殊方法_call__()的對象都屬于可以條用的函數。将疊代器函數中每一個傳回值作為參數傳給key=func中的func,然後func将執行結果傳回給key,之後再根據key為标準進行大小的判斷。
下面以一些實際的例子說明,同時對于sort() sorted()函數中也存在key這個參數。
x = (11, 9, 23)
print(max(x))
print(max(x, key=str)) # 将可疊代對象中的每一項程式設計字元串之後在進行比較
d1 = {'name': 'egon', 'price': 100}
d2 = {'name': 'rdw', 'price': 666}
d3 = {'name': 'zat', 'price': 1}
l1 = [d1, d2, d3]
a = max(l1, key=lambda x: x['name'])
print(a)
b = max(l1, key=lambda x: x['price'])
print(b)
23
9
{'name': 'zat', 'price': 1}
{'name': 'rdw', 'price': 666}
sort() 函數用于對原清單進行排序,如果指定參數,則使用比較函數指定的比較函數。該方法沒有傳回值,但是會對清單的對象進行排序。
11.2 ord() chr()
ord() 參數是unicode字元串,傳回的是該unicode字元對應的整數
chr()剛好是ord的反函數
ord('a')
chr(20013)
ord('中')
97
中
20013
11.3 lower() upper() capitalize() title()
- upper()字元串中字母由小寫變為大寫
- lower()字元串中字母由大寫變為小寫
- capitalize()字元串中字母首字母大寫其餘小寫(如果有多個單詞,那麼隻有第一個單詞的字母大寫,注意與title的差別)
- title()字元串中字母每個單詞的首字母大寫其餘小寫
判斷字元串是否為數字或者字母
- str.isalnum() 所有字元都是數字或者字母
- str.isalpha() 所有字元都是字母
- str.isdigit() 所有字元都是數字
- str.islower() 所有字元都是小寫
- str.isupper() 所有字元都是大寫
- str.istitle() 所有單詞都是首字母大寫
- str.isspace() 所有字元都是空白字元、\t、\n、\r
11.4 map()
map(func, seq1[, seq2,…])
第一個參數接受一個函數名,後面的參數接受一個或多個可疊代的序列,傳回的是一個集合。
Python函數程式設計中的map()函數是将func作用于seq中的每一個元素,并将所有的調用的結果作為一個list傳回。如果func為None,作用同zip()。
1 當隻有一個seq的時候,将func作用在每一個元素上,然後傳回得到一個新的序列
list(map(lambda x: x%2, range(7)))
# 使用清單解析式也可以達到這種效果
[item % 2 for item in range(7)]
[0, 1, 0, 1, 0, 1, 0]
2 當存在多個seq的時候,map可以并行的處理,也就是将seq中同一位置的元素調去執行函數
print(list(map(lambda x, y: x*y, [1,2,3],[4,5,6])))
print(list(map(lambda x, y: [x,y], [1,2,3],[4,5,6])))
print(list(zip([1,2,3],[4,5,6])))
[4, 10, 18]
[[1, 4], [2, 5], [3, 6]]
[(1, 4), (2, 5), (3, 6)]
12 進制轉換
十進制數轉換成對應的二、八、十六進制可以采用函數 bin() oct() hex()
a = 21
print(bin(a))
print(oct(a))
print(hex(a))
0b10101
0o25
0x15
如果是對應的進制轉換成十進制,使用int(s,decimal=2,8,16),第一個參數是數字字元串,後面的是該字元串對應的進制。
a = 'f'
int(a,16)
15
也就是将a看做是16進制的數,使用int()轉換成十進制數時的值。
一些零散的小知識
1 無窮大和無窮小
無窮大(小)與一個數的和仍然是無窮大(小)
a = float('-inf')
b = float('inf')
a+3
-inf