Python小知識 | 這些技能你不會?(三)
Python小知識
最近在看《零壓力學Python》,鞏固一下基礎知識,意外收穫到很多常用卻不一定被注意的小知識,分享給大家,學到東西了點贊支援哦~
第一篇:點選這裡檢視第一篇python小技能
第二篇:點選這裡檢視第二篇python小技能
個人微信公眾號,歡迎關注領取學習資源
一、字典和集合
(1)字典
Python裡字典(dict)是一種比較常用的資料結構,基本格式{key : values}
,key
和values
可以為任意型別,比如int
,str
等。
# 根據鍵可以輕鬆的索引獲取的鍵值
dict_test = {'name':'XksA', 'age':22}
print('姓名:'+dict_test['name'])
print('年齡:'+str(dict_test['age']))
'''
result:
姓名:XksA
年齡:22
'''
# 字典遍歷
dict_test = {'name':'XksA','age':22}
for k,v in dict_test.items():
print(k + ':' + str(v))
'''
result:
name:XksA
age:22
'''
dict_test = {'name':'XksA','age':22}
# 只取鍵
for k in dict_test. keys():
print(k)
print('-------------------')
# 只取鍵值
for v in dict_test.values():
print(str(v))
'''
result:
name
age
-------------------
XksA
22
'''
(2)集合
Python裡集合(set),可以使用大括號 { } 或者 set() 函式建立,可以稱為特殊列表,不能包含重複元素,另外需要注意:建立一個空集合必須用 set() 而不是 { },因為只用 { } 是用來建立,系統會預設為空字典。
# 集合基本操作
set_test = {1,2,3,4,5,6}
# 新增
set_test.add('XksA')
print('新增後:'+str(set_test))
# 刪除
set_test.remove(2)
print('刪除後:'+str(set_test))
# 求交、並、差集
set_a = {1,2,3,4}
set_b = {3,4,5,6}
print('a/b的交集:'+str(set_a & set_b))
print('a/b的並集:'+str(set_a | set_b))
print('a/b的差集:'+str(set_a - set_b))
'''
result:
新增後:{1, 2, 3, 4, 5, 6, 'XksA'}
刪除後:{1, 3, 4, 5, 6, 'XksA'}
a/b的交集:{3, 4}
a/b的並集:{1, 2, 3, 4, 5, 6}
a/b的差集:{1, 2}
'''
特別提醒: 集合(set)是無序的,不支援排序,也不支援索引,如下面操作:
# 期望打印出集合set_b的第三個元素
print(set_b[2])
執行報錯:TypeError: 'set' object does not support indexing
(3)小技能,模糊查詢
# 基於字典的模糊查詢
dict_txl = {'Mr.Zhang':'15799991234','Mr.XksA':'85320211','Miss.極簡':'5220502'
,'WangW':'121331331','ZhangS':'121331331'}
while(True):
str_name = input("輸入要查詢人姓名(可模糊查詢):")
for k,v in dict_txl.items():
if k.startswith(str_name):
print(k + ':' + v)
i = input("是否繼續查詢(y/n?):")
if i == 'n':
break
'''
result:
輸入要查詢人姓名(可模糊查詢):Z
ZhangS:121331331
是否繼續查詢(y/n?):y
輸入要查詢人姓名(可模糊查詢):Miss
Miss.極簡:5220502
是否繼續查詢(y/n?):y
輸入要查詢人姓名(可模糊查詢):M
Mr.Zhang:15799991234
Mr.XksA:85320211
Miss.極簡:5220502
是否繼續查詢(y/n?):n
'''
startswith 函式
startswith函式用於檢查字串是否是以指定子字串開頭,如果是則返回 True,否則返回 False。如果引數 beg 和 end 指定值,則在指定範圍內檢查。
引數介紹
startswith(str, beg,end)
str -- 檢測的字串。
beg -- 可選引數用於設定字串檢測的起始位置。
end -- 可選引數用於設定字串檢測的結束位置。
二、類和物件
(1)基本介紹
書上是這樣說的“信不信由你,從開始閱讀本書起,你就一直在使用Python物件”,我覺得,完全沒毛病,你有物件嗎?
差點忘了,我這個是小技能,就不太細的去講這些理論性的東西了,下面圖片簡單介紹一下類與物件,覺得不錯點個贊哦~
(2)建立類,建立物件,呼叫類方法
# 建立類
class Myclass():
# 建立類變數
my_variable = '極簡XksA'
# 建立類函式
def my_function(self):
print("hello world!")
# 建立類物件
my_object = Myclass()
# 呼叫類變數
print(my_object.my_variable)
# 呼叫類函式
my_object.my_function()
'''
result :
極簡XksA
hello world!
'''
(3)最重要的__init__()函式
Python裡由“__”開始的和結尾的為保留字。
方法__init__是類最重要的方法之一,根據名字可以看出來,表示初始化,建立類物件的同時會自動呼叫這個方法,傳參給類變數,通過__init__函式是個不錯的選擇或者說唯一選擇。
# 建立類
class Myclass():
# 建立類變數
my_variable = '極簡XksA'
# 初始化函式
def __init__(self,input_variable):
# 修改類變數my_variable值
self.my_variable = input_variable
print("hello world!")
# 建立類物件,傳遞引數
my_object = Myclass('老表')
# 呼叫類變數
print(my_object.my_variable)
'''
result :
hello world!
老表
'''
三、生成器
在Python中,一邊迴圈一邊計算的機制,稱為生成器(Generator)。
也可以這樣理解,生成器就是一個可以自動迭代的物件,類似於for迴圈,又比for迴圈靈活。
# 一般生成Fibonacci sequence
def get_fibos(n):
'''
根據n生成Fibonacci數,生成量由n決定
比如:n = 10,就會生成10個Fibonacci數,一次性
'''
a = b = 1
i = 0
while i < n :
i = i + 1
a,b = a+b , a
print(a)
# 修改成生成器
def get_fibos(n):
'''
把上面的print改成關鍵字:yield
函式執行到yield語句,就會停止本次執行,返回yield後的引數或語句
'''
a = b = 1
i = 0
while i < n:
i = i + 1
a, b = a + b, a
yield a
t0 = get_fibos(10)
print(t0)
for i in t0:
print(i)
result :
<generator object get_fibos at 0x0000021D112FC5C8>
2
3
5
8
13
'''
可以很明顯看出t0是一個生成器,可迭代
'''
根據上面,我們大致瞭解到生成器就是一個可迭代的物件,用yield關鍵字可以實現,上面已經說了函式執行到yield語句,就會停止本次執行,返回yield後的引數或語句,等下次呼叫該函式時,會從上次暫停的地方開始繼續執行迭代,你肯定會想,那生成器到底有什麼用呢?
我們再來看一個例項:
# 生成整數範圍內的奇數
def get_odd_num():
i = 1
while True:
yield i
i += 2
生成整數範圍內的奇數,很多人會覺得,我直接也可以生成啊,為什麼要用yield改成生成器呢?你有沒有想過,整數內的奇數,雖然有一個範圍,但是,也還是很多的哈,你用什麼儲存呢?生成器的好處就是,你需要多少個,或者說你需要哪一個,需要第幾個,我就給你找到這個數,只要到了這個數,我就停下來休息,等你下次想找別的了,我再接著繼續找,一樣的找到就休息,所以這樣我們就不用考慮,這麼多數放哪個地方了。
再來一個高階例項收尾:
# 自己生成隨機數
from time import time
def get_rand():
# 隨機選擇兩個比較大的素數
p1 = 1200556037
p2 = 2444555677
# 限定最大隨機數範圍
max_rand = 2**32
# 獲取隨機數種子
r0 = int(time()*1000)
while True:
# 迴圈產生隨機數
n = r0
n *= p2
n %= p1 # 第一次增強隨機性
n += r0
n *= p2
n %= p1 # 第二次增強隨機性
n %= max_rand # 控制隨機數範圍
r0 = n
yield n
思路比較簡單,生成隨機數,首先要有個隨機數種子(初始值),然後對初始值進行一些隨機操作,這裡採用了擴大(與一個質數相乘),回原(與另一個質數取餘),這樣反覆做了兩次,最後與max_rand 取餘,得出最終隨機數,這樣一頓騷操作保證了資料的隨機性,中間操作要設計到恰到好處,比較難,像密碼學老師說的“你加密,又加密,再加密,又再加密···很可能最後出來的就是明文了”。
最後介紹一下__next__()
函式,第一個例項就說了,生成器可以用for迴圈迭代,另外還有一個內建函式__next__
也是可以的,從名字可以看出就是調出下一個,示例如下:
# fibos數
def get_fibos(n):
a = b = 1
i = 0
while i < n:
i = i + 1
a, b = a + b, a
yield a
t0 = get_fibos(5)
print(t0.__next__())
print(t0.__next__())
'''
result :
2
3
'''
生成器給我最大的感受就是,我在使用的過程中,不用過多的考慮,這些資料可能會溢位,或者怎麼樣,讓我更多的想我實現的功能怎麼設計會漂亮一點,多看看,敲一下上面的例項程式碼,就理解了,別妄想著看一遍就能懂,也不要邊看邊抓頭髮,有閒時候多出去走走,多敲敲程式碼,看看電影,聊聊天,聽聽歌,看看書。。。(說多了,下次見:裝飾器)
靈活應用這些基本操作,讓你的工作學習事半功倍。