1. 程式人生 > >Python小知識 | 這些技能你不會?(三)

Python小知識 | 這些技能你不會?(三)

Python小知識

最近在看《零壓力學Python》,鞏固一下基礎知識,意外收穫到很多常用卻不一定被注意的小知識,分享給大家,學到東西了點贊支援哦~
第一篇:點選這裡檢視第一篇python小技能
第二篇:點選這裡檢視第二篇python小技能
個人微信公眾號,歡迎關注領取學習資源
極簡XksA

一、字典和集合

(1)字典
Python裡字典(dict)是一種比較常用的資料結構,基本格式{key : values},keyvalues可以為任意型別,比如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
'''

生成器給我最大的感受就是,我在使用的過程中,不用過多的考慮,這些資料可能會溢位,或者怎麼樣,讓我更多的想我實現的功能怎麼設計會漂亮一點,多看看,敲一下上面的例項程式碼,就理解了,別妄想著看一遍就能懂,也不要邊看邊抓頭髮,有閒時候多出去走走,多敲敲程式碼,看看電影,聊聊天,聽聽歌,看看書。。。(說多了,下次見:裝飾器)

靈活應用這些基本操作,讓你的工作學習事半功倍。