天天看點

Python 小知識點1漢字編碼 URL編碼解碼2 datetime求時間差3 python字元串相關4 list5 range6 zip7 檔案操作8 外部包9 dict10 lambda11 一些常用的函數12 進制轉換一些零散的小知識

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