目錄
設(shè)計(jì)模式
單例模式
具體用法?
工廠模式
優(yōu)點(diǎn)
閉包
案例
修改閉包外部變量?
閉包優(yōu)缺點(diǎn)
裝飾器
裝飾器原理
裝飾器寫(xiě)法
遞歸
遞歸的調(diào)用過(guò)程
遞歸的優(yōu)缺點(diǎn)
用遞歸計(jì)算階乘
設(shè)計(jì)模式
含義:設(shè)計(jì)模式是一種編程套路,通過(guò)這種編程套路可以極大的方便程序的開(kāi)發(fā)
除了面向?qū)ο笸猓诰幊讨幸灿泻芏嗉榷ǖ奶茁房梢苑奖汩_(kāi)發(fā),我們稱之為設(shè)計(jì)模式
- 單例、工廠模式
- 建造者、責(zé)任鏈、狀態(tài)、備忘錄、解釋器、訪問(wèn)者、觀察者、中介、模板、代理模式等
單例模式
含義:保證一個(gè)類(lèi)只有一個(gè)實(shí)例,并提供一個(gè)訪問(wèn)他的全局訪問(wèn)點(diǎn)
使用場(chǎng)景:當(dāng)一個(gè)類(lèi)只能有一個(gè)實(shí)例,而客戶可以從一個(gè)眾所周知的訪問(wèn)點(diǎn)訪問(wèn)他時(shí)
具體用法?
#str_tools.py文件
class StrTools:
pass
str_tool=StrTools()
import str_tools
s1=str_tools.str_tool
s2=str_tools.str_tool
print(id(s1))#2396069558544
print(id(s2))#2396069558544
結(jié)果:這樣得到的對(duì)象始終是同一個(gè)
工廠模式
前言:當(dāng)需要大量創(chuàng)建一個(gè)類(lèi)的實(shí)例時(shí),可以使用工廠模式,即從原生的使用類(lèi)的構(gòu)造去創(chuàng)建對(duì)象的形式遷移到基于工廠提供的方法去創(chuàng)建對(duì)象的形式。
優(yōu)點(diǎn)
- 大批量創(chuàng)建對(duì)象的時(shí)候有統(tǒng)一的入口,易于代碼維護(hù)
- 當(dāng)發(fā)生修改時(shí),僅修改工廠類(lèi)的創(chuàng)建方法即可
- 符合現(xiàn)實(shí)世界的模式,即由工廠來(lái)制作產(chǎn)品(對(duì)象)
class Person:
pass
class Worker(Person):
pass
class Student(Person):
pass
class Teacher(Person):
pass
class PersonFactory:
def get_person(self,p_type):
if p_type=="worker":
return Worker()
elif p_type=="student":
return Student()
else:
return Teacher()
#構(gòu)造工廠實(shí)例
pf=PersonFactory()
#獲取對(duì)象
worker=pf.get_person("worker")
student=pf.get_person("student")
teacher=pf.get_person("teacher")
閉包
含義:在函數(shù)嵌套的前提下,內(nèi)部函數(shù)使用了外部函數(shù)的變量,并且外部函數(shù)返回了內(nèi)部函數(shù),我們把這個(gè)使用外部函數(shù)變量的內(nèi)部函數(shù)稱為閉包
案例
#簡(jiǎn)單閉包
def outer(logo):
def inner(msg):
print(f"<{logo}>{msg}<{logo}>")
return inner
#調(diào)用outer
fn1=outer("圖標(biāo)")
#調(diào)用函數(shù)fn1
fn1("大家好")#<圖標(biāo)>大家好<圖標(biāo)>
fn2=outer("圖片")
fn2("大家好")#<圖片>大家好<圖片>
修改閉包外部變量?
注意:在內(nèi)部函數(shù)修改閉包所引入的外部變量的話,那么該變量需要被nonlocal關(guān)鍵字修飾
def outer(num1):
def inner(num2):
#通過(guò)nonlocal關(guān)鍵字修飾就可以修改外部函數(shù)傳來(lái)的變量
nonlocal num1
num1+=num2
print(f"num1={num1}")
return inner
fn=outer(10)
fn(20)#num1=30
閉包優(yōu)缺點(diǎn)
- 無(wú)需定義全局變量即可實(shí)現(xiàn)通過(guò)函數(shù),持續(xù)訪問(wèn)、修改某個(gè)值(得到內(nèi)部函數(shù)后,外部變量值就確定了,可以通過(guò)nonlocal關(guān)鍵字修改)
- 閉包使用的變量位于外部函數(shù)內(nèi)的,難以被錯(cuò)誤的調(diào)用更改
- 缺點(diǎn):由于內(nèi)部函數(shù)會(huì)持續(xù)引用外部函數(shù)的值,所以會(huì)導(dǎo)致這一部分內(nèi)存空間不被釋放,一直占用內(nèi)存
裝飾器
含義:裝飾器其實(shí)也是一種閉包,其功能就是在不破壞目標(biāo)函數(shù)原有代碼和功能的前提下,為目標(biāo)函數(shù)增加新功能
理解:創(chuàng)建一個(gè)閉包函數(shù),在閉包函數(shù)內(nèi)調(diào)用目標(biāo)函數(shù),可以達(dá)到不改變目標(biāo)函數(shù)的同時(shí),增加額外功能
裝飾器原理
def sleep():
import random
import time
print("睡眠中……")
time.sleep(random.randint(1,5))
#為目標(biāo)函數(shù)增加功能(在原功能前加我睡覺(jué)了,功能后加我起床了)
def outer(func):
def inner():
print("我睡覺(jué)了")
func()
print("我起床了")
return inner
fn=outer(sleep)
fn()
#我睡覺(jué)了
#睡眠中……
#我起床了
裝飾器寫(xiě)法
過(guò)程:使用@符號(hào)來(lái)@添加功能的函數(shù),并且將其定義在目標(biāo)函數(shù)上就會(huì)為目標(biāo)函數(shù)增添固定的功能
#為目標(biāo)函數(shù)增加功能(在原功能前加我睡覺(jué)了,功能后加我起床了)
def outer(func):
def inner():
print("我睡覺(jué)了")
func()
print("我起床了")
return inner
#目標(biāo)函數(shù)
@outer
def sleep():
import random
import time
print("睡眠中……")
time.sleep(random.randint(1,5))
sleep()
# 我睡覺(jué)了
# 睡眠中……
# 我起床了
遞歸
含義:若在一個(gè)函數(shù)的函數(shù)體內(nèi)調(diào)用了該函數(shù)本身,那么這個(gè)函數(shù)就稱為遞歸函數(shù)
遞歸的組成部分:遞歸調(diào)用與遞歸終止條件文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-627517.html
遞歸的調(diào)用過(guò)程
- 每遞歸調(diào)用一次函數(shù),都會(huì)在棧內(nèi)存分配一個(gè)棧幀
- 每執(zhí)行完一次函數(shù),都會(huì)釋放相應(yīng)的空間
遞歸的優(yōu)缺點(diǎn)
- 優(yōu)點(diǎn):思路和代碼簡(jiǎn)單
- 缺點(diǎn):占用內(nèi)存多,效率低下
用遞歸計(jì)算階乘
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-627517.html
def fac(n):
if n==1:
return 1
else:
return n*fac(n-1)
#計(jì)算6的階乘
print(f"六的階乘為:{fac(6)}")#六的階乘為:720
到了這里,關(guān)于python高階技巧的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!