python動(dòng)態(tài)函數(shù),python動(dòng)態(tài)函數(shù)名

python的類(lèi)中怎么實(shí)現(xiàn)動(dòng)態(tài)化函數(shù)?

給你這樣一個(gè)例子吧,這個(gè)例子里面有動(dòng)態(tài)增加類(lèi)的函數(shù)。

成都創(chuàng)新互聯(lián)是一家專(zhuān)注于成都網(wǎng)站建設(shè)、成都做網(wǎng)站與策劃設(shè)計(jì),京口網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)做網(wǎng)站,專(zhuān)注于網(wǎng)站建設(shè)10余年,網(wǎng)設(shè)計(jì)領(lǐng)域的專(zhuān)業(yè)建站公司;建站業(yè)務(wù)涵蓋:京口等地區(qū)。京口做網(wǎng)站價(jià)格咨詢(xún):18982081108

聲明一個(gè)類(lèi),類(lèi)初始化的時(shí)候讀取配置文件,根據(jù)配置列表加載特定目錄下的模塊下的函數(shù),函數(shù)和模塊同名,將此函數(shù)動(dòng)態(tài)加載為類(lèi)的成員函數(shù)。

代碼如下所示:

class WinBAS(Bas):

def __init__(self):

self.__baslist = {}

self.__Init_Modules()

pass

def __Init_Modules(self):

import modplugs

for m in modplugs.__moduleset__:

mh = __import__('modules.' + m)# + '.' + m)

ma = getattr(mh, m)# + '.' + m)

ma = getattr(ma, m)

setattr(self.__class__, m, ma)

modplugs.py是模塊配置文件如下:

__moduleset__ = [

'BAS_GetUserList',

]

然后建立目錄modules下面建立一個(gè)空的__init__.py文件,把目錄變?yōu)橐粋€(gè)包,在modules目錄下建立真正的BAS_GetUserList實(shí)現(xiàn):BAS_GetUserList文件中有個(gè)BAS_GetUserList函數(shù)如下:

def BAS_GetUserList(self, strs):

return [0, strs]

這樣WinBAS類(lèi)就可以動(dòng)態(tài)加入了BAS_GetUserList函數(shù)。

Python怎么根據(jù)不同的字符串動(dòng)態(tài)選擇函數(shù)?

#可以用函數(shù)字典,看看是否滿(mǎn)足你的要求

def?text_func(self):

print?"this?is?text?func"

def?int_func(self):

print?"this?is?int_func"

gen_func={'text':text_func,?'int':int_func}

def?choose(a='text'):

return?gen_func[a]

python動(dòng)態(tài)規(guī)劃及編輯距離計(jì)算實(shí)例

動(dòng)態(tài)規(guī)劃的三要素:最優(yōu)子結(jié)構(gòu),邊界和狀態(tài)轉(zhuǎn)移函數(shù),最優(yōu)子結(jié)構(gòu)是指每個(gè)階段的最優(yōu)狀態(tài)可以從之前某個(gè)階段的某個(gè)或某些狀態(tài)直接得到(子問(wèn)題的最優(yōu)解能夠決定這個(gè)問(wèn)題的最優(yōu)解),邊界指的是問(wèn)題最小子集的解(初始范圍),狀態(tài)轉(zhuǎn)移函數(shù)是指從一個(gè)階段向另一個(gè)階段過(guò)度的具體形式,描述的是兩個(gè)相鄰子問(wèn)題之間的關(guān)系(遞推式)

重疊子問(wèn)題,對(duì)每個(gè)子問(wèn)題只計(jì)算一次,然后將其計(jì)算的結(jié)果保存到一個(gè)表格中,每一次需要上一個(gè)子問(wèn)題解時(shí),進(jìn)行調(diào)用,只要o(1)時(shí)間復(fù)雜度,準(zhǔn)確的說(shuō),動(dòng)態(tài)規(guī)劃是利用空間去換取時(shí)間的算法.

判斷是否可以利用動(dòng)態(tài)規(guī)劃求解,第一個(gè)是判斷是否存在重疊子問(wèn)題。

爬樓梯

假設(shè)你正在爬樓梯。需要 n 階你才能到達(dá)樓頂。

每次你可以爬 1 或 2 個(gè)臺(tái)階。你有多少種不同的方法可以爬到樓頂呢?

注意:給定 n 是一個(gè)正整數(shù)。

示例 1:

輸入: 2

輸出: 2

解釋?zhuān)?有兩種方法可以爬到樓頂。

1. ?1 階 + 1 階

2. ?2 階

示例 2:

輸入: 3

輸出: 3

解釋?zhuān)?有三種方法可以爬到樓頂。

1. ?1 階 + 1 階 + 1 階

2. ?1 階 + 2 階

3. ?2 階 + 1 階

分析:

假定n=10,首先考慮最后一步的情況,要么從第九級(jí)臺(tái)階再走一級(jí)到第十級(jí),要么從第八級(jí)臺(tái)階走兩級(jí)到第十級(jí),因而,要想到達(dá)第十級(jí)臺(tái)階,最后一步一定是從第八級(jí)或者第九級(jí)臺(tái)階開(kāi)始.也就是說(shuō)已知從地面到第八級(jí)臺(tái)階一共有X種走法,從地面到第九級(jí)臺(tái)階一共有Y種走法,那么從地面到第十級(jí)臺(tái)階一共有X+Y種走法.

即F(10)=F(9)+F(8)

分析到這里,動(dòng)態(tài)規(guī)劃的三要素出來(lái)了.

邊界:F(1)=1,F(2)=2

最優(yōu)子結(jié)構(gòu):F(10)的最優(yōu)子結(jié)構(gòu)即F(9)和F(8)

狀態(tài)轉(zhuǎn)移函數(shù):F(n)=F(n-1)+F(n-2)

class Solution(object):

def climbStairs(self, n):

? ? """

? ? :type n: int

? ? :rtype: int

? ? """

? ? if n=2:

? ? ? ? return n

? ? a=1#邊界

? ? b=2#邊界

? ? temp=0

? ? for i in range(3,n+1):

? ? ? ? temp=a+b#狀態(tài)轉(zhuǎn)移

? ? ? ? a=b#最優(yōu)子結(jié)構(gòu)

? ? ? ? b=temp#最優(yōu)子結(jié)構(gòu)

? ? return temp

利用動(dòng)態(tài)規(guī)劃的思想計(jì)算編輯距離。

編輯距離是指兩個(gè)字串之間,由一個(gè)轉(zhuǎn)成另一個(gè)所需的最少編輯操作次數(shù)。通常來(lái)說(shuō),編輯距離越小,兩個(gè)文本的相似性越大。這里的編輯操作主要包括三種:

插入:將一個(gè)字符插入某個(gè)字符串;

刪除:將字符串中的某個(gè)字符刪除;

替換:將字符串中的某個(gè)字符替換為另外一個(gè)字符。

那么,如何用Python計(jì)算編輯距離呢?我們可以從較為簡(jiǎn)單的情況進(jìn)行分析。

當(dāng)兩個(gè)字符串都為空串,那么編輯距離為0;

當(dāng)其中一個(gè)字符串為空串時(shí),那么編輯距離為另一個(gè)非空字符串的長(zhǎng)度;

當(dāng)兩個(gè)字符串均為非空時(shí)(長(zhǎng)度分別為 i 和 j ),取以下三種情況最小值即可:

1、長(zhǎng)度分別為 i-1 和 j 的字符串的編輯距離已知,那么加1即可;

2、長(zhǎng)度分別為 i 和 j-1 的字符串的編輯距離已知,那么加1即可;

3、長(zhǎng)度分別為 i-1 和 j-1 的字符串的編輯距離已知,此時(shí)考慮兩種情況,若第i個(gè)字符和第j個(gè)字符不同,那么加1即可;如果相同,那么不需要加1。

很明顯,上述算法的思想即為 動(dòng)態(tài)規(guī)劃 。

求長(zhǎng)度為m和n的字符串的編輯距離,首先定義函數(shù)——edit(i, j),它表示第一個(gè)長(zhǎng)度為i的字符串與第二個(gè)長(zhǎng)度為j的字符串之間的編輯距離。動(dòng)態(tài)規(guī)劃表達(dá)式可以寫(xiě)為:

if i == 0 且 j == 0,edit(i, j) = 0

if (i == 0 且 j 0 )或者 (i 0 且j == 0),edit(i, j) = i + j

if i ≥ 1 且 j ≥ 1 ,edit(i, j) == min{ edit(i-1, j) + 1, edit(i, j-1) + 1, edit(i-1, j-1) + d(i, j) },當(dāng)?shù)谝粋€(gè)字符串的第i個(gè)字符不等于第二個(gè)字符串的第j個(gè)字符時(shí),d(i, j) = 1;否則,d(i, j) = 0。

def edit_distance(word1, word2):

len1 = len(word1)

len2 = len(word2)

dp = np.zeros((len1 + 1,len2 + 1))

for i in range(len1 + 1):

? ? dp[i][0] = i? ?

for j in range(len2 + 1):

? ? dp[0][j] = j

for i in range(1, len1 + 1):

? ? for j in range(1, len2 + 1):

? ? ? ? delta = 0 if word1[i-1] == word2[j-1] else 1

? ? ? ? dp[i][j] = min(dp[i - 1][j - 1] + delta, min(dp[i-1][j] + 1, dp[i][j - 1] + 1))

return dp[len1][len2]

edit_distance('牛奶','華西奶')

結(jié)果:2

新聞名稱(chēng):python動(dòng)態(tài)函數(shù),python動(dòng)態(tài)函數(shù)名
鏈接URL:http://muchs.cn/article34/phipse.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶(hù)體驗(yàn)、關(guān)鍵詞優(yōu)化、App開(kāi)發(fā)、搜索引擎優(yōu)化、軟件開(kāi)發(fā)、全網(wǎng)營(yíng)銷(xiāo)推廣

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名