python動態函數
⑴ 為什麼說python是一門動態語言
首先要理解什麼是動態語言:通俗地說:能夠在運行時修改自身程序結構的語言,就屬於動態語言。那怎樣才算是「運行時修改自身程序結構」捏?比如下面這幾個例子都 算:在運行時給某個類增加成員函數及成員變數;在運行時改變某個類的父類;在運行時創建出某個函數.。
Python是可以實現動態類的創建類(在任意代碼位置,符合正確的書寫格式),或者給類增加刪除屬性。因為類也是對象,你可以在運行時動態的創建它們,就像其他任何對象一樣。首先,你可以在函數中創建類,使用class關鍵字即可。
例子:
defchoose_class(name):
ifname=='foo':
classFoo(object):
pass
returnFoo#返回的是類,不是類的實例
else:
classBar(object):
pass
returnBar
#排版有問題不好意思
#如果你覺得還不夠動態,因為你仍然需要自己編寫整個類的代碼。由於類也是對象,
#所以它們必須是通過什麼東西來生成的才對。當你使用class關鍵字時,Python解釋器自動創建這
#個對象。但就和Python中的大多數事情一樣,Python仍然提供給你手動處理的方法。內建函數中有
#一個名叫type的內建函數,這個內建函數古老但強大的函數,它能夠讓你知道一個對象的類型是
#什麼,就像這樣:
>>>MyShinyClass=type('MyShinyClass',(),{})#返回一個類對象
>>>printMyShinyClass<class'__main__.MyShinyClass'
>>>>printMyShinyClass()#創建一個該類的實例
<__main__.MyShinyClassobjectat0x8997cec>另附type使用方法:
#type(類名,父類的元組(針對繼承的情況,可以為空),包含屬性的字典(名稱和值))
⑵ 如何用python動態生成變數名字
你好,方法如下:
要寫一個程序,讓linuxany1=1,linuxany2=2,… inuxany100=100,你會怎麼做?
最容易想到的自然是eval,但是實際上根本不需要這種危險的東西,因為Python的變數名就是一個字典的key而已。要獲取這個字典,直接用locals和globals函數即可。
>>> names = locals()
>>> for i in xrange(1, 101):
... names['linuxany%s' % i] = i
... >>> linuxany1
1 >>> linuxany2
2 >>> linuxany100
100
不過你也許會說這個例子沒什麼用,畢竟用數組來實現更為實用。
舉一個例子:伺服器使用一種對象資料庫,可以直接保存對象到資料庫中。伺服器列出目前支持的所有類,而用戶想添加一個不存在於列表中的類,於是向伺服器發送一段JSON或XML文本。伺服器解析這段文本,將它轉換成一個class對象,並且設置類名。之後用戶就可以隨意生成這個類的對象。
關鍵是這個資料庫和類名相關,你不能用一個通用的Object類來保存所有的對象,否則查詢時就亂套了。
除了動態設置變數名,動態刪除也是可以的,例如
del locals()['linuxany1']
同樣,delattr也是可用的。
希望能幫到你。
⑶ python 怎麼生成可變函數名
定義一個A類,然後實例化一個A對象,通過setattr函數來給當前類添加一個變數,值是test函數。調用haha函數,就相當於調用了test函數。 例2,定義一個模塊,通過另一個模塊函數調用函數來增加變數,值是test2函數。調用haha函數,就相當於調用了test2函數。
原理
python系統會維護一個變數的字典,可以通過locals()或者globals()獲取到該字典。由於字典是可變對象,那麼,就可以動態的增加變數。由於函數也是一個對象,那麼就可以將變數指向函數。這樣就可以達到動態修改函數名的目的了。
⑷ python裡面 如何動態調用 一個函數
function="luckywin."+case_name+"."+def_name
function=eval(function)
function(player_id,test_url)
function是個字元串,function(player_id,test_url) 這樣寫肯定不是字元串,怎麼能用eval呢,直接eval function返回函數名,然後調用函數
⑸ python是動態語言嗎
動態語言的定義:動態編程語言是高級程序設計語言的一個類別,在計算機科學領域已被廣泛應用。
它是一類在執行時能夠改變其結構的語言:比如新的函數、對象、甚至代碼能夠被引進,已有的函數能夠被刪除或是其它結構上的變化。
Python是一種跨平台的計算機程序設計語言。是一種面向對象的動態類型語言,最初被設計用於編寫自動化腳本(shell),隨著版本的不斷
更新和語言新功能的添加,越來越多被用於獨立的、大型項目的開發。
自從20世紀90年代初Python語言誕生至今,它已被逐漸廣泛應用於系統管理任務的處理和Web編程。
python學習網,免費的python學習網站,歡迎在線學習!
Python的創始人為荷蘭人吉多·范羅蘇姆 (Guido van Rossum)。1989年聖誕節期間,在阿姆斯特丹,Guido為了打發聖誕節的無趣,
決心開發一個新的腳本解釋程序,作為ABC 語言的一種繼承。之所以選中Python(大蟒蛇的意思)作為該編程語言的名字,是取自英國
20世紀70年代首播的電視喜劇《蒙提.派森的飛行馬戲團》(Monty Python's Flying Circus)。
ABC是由Guido參加設計的一種教學語言。就Guido本人看來,ABC 這種語言非常優美和強大,是專門為非專業程序員設計的。但是ABC
語言並沒有成功,究其原因,Guido 認為是其非開放造成的。Guido 決心在Python 中避免這一錯誤。同時,他還想實現在ABC 中閃現
過但未曾實現的東西。
就這樣,Python在Guido手中誕生了。可以說,Python是從ABC發展起來,主要受到了Mola-3(另一種相當優美且強大的語言,為
小型團體所設計的)的影響。並且結合了Unix shell和C的習慣。
Python 已經成為最受歡迎的程序設計語言之一。自從2004年以後,python的使用率呈線性增長。Python 2於2000年10月16日發
布,穩定版本是Python 2.7。Python 3於2008年12月3日發布,不完全兼容Python 2。 [3] 2011年1月,它被TIOBE編程語言排行榜評
為2010年度語言。
⑹ Python怎麼根據不同的字元串動態選擇函數
#可以用函數字典,看看是否滿足你的要求
deftext_func(self):
print"thisistextfunc"
defint_func(self):
print"thisisint_func"
gen_func={'text':text_func,'int':int_func}
defchoose(a='text'):
returngen_func[a]
⑺ 怎樣理解Python是動態語言說出其能動態的本質原因。
它是一類在執行時能夠改變其結構的語言:比如新的函數、對象、甚至代碼能夠被引進,已有的函數能夠被刪除或是其它結構上的變化。它是一類在執行時能夠改變其結構的語言:比如新的函數、對象、甚至代碼能夠被引進,已有的函數能夠被刪除或是其它結構上的變化。
⑻ 求Python代碼編動態規劃貝爾曼函數
classNode(object):
def__init__(self,name):
self._name=name
self._value=None
self._from=None
self._next=[]
defsetValue(self,value):
self._value=value
defsetNext(self,node):
self._next.append(node)
defsetFrom(self,node):
self._from=node
defgetValue(self):
returnself._value
defgetNext(self):
returnself._next
defgetName(self):
returnself._name
defgetFrom(self):
returnself._from
classBFtree():
def__init__(self,dList):
self._dList=dList
defbfValue(self,start):
cur=start
ifcur.getNext()isnotNone:
fornodeincur.getNext():
path=[cur.getName(),node.getName()]
path.sort()
path=''.join(path)
value=cur.getValue()+self._dList[path]
ifnode.getValue()isNoneorvalue<node.getValue():
node.setValue(value)
node.setFrom(cur)
self.bfValue(node)
defmove(self,start,end):
print'From:',start.getName(),'to:',end.getName()
start.setValue(0)
self.bfValue(start)
trace=[end.getName()]
cur=end
whilecur.getFrom()isnotNone:
cur=cur.getFrom()
trace.append(cur.getName())
trace=reversed(trace)
print'Thepathis',''.join(trace),'andthevalueis',end.getValue()
#builidngnode
a=Node('A')
b=Node('B')
c=Node('C')
d=Node('D')
e=Node('E')
f=Node('F')
g=Node('G')
h=Node('H')
#buildtree
a.setNext(b)
a.setNext(c)
a.setNext(d)
b.setNext(a)
b.setNext(g)
c.setNext(a)
c.setNext(g)
c.setNext(e)
d.setNext(a)
d.setNext(e)
e.setNext(c)
e.setNext(b)
e.setNext(f)
f.setNext(e)
g.setNext(b)
g.setNext(c)
g.setNext(h)
h.setNext(g)
#builddistancelist
dList=dict();
dList['AB']=1
dList['AC']=2
dList['AD']=3
dList['BG']=1
dList['BE']=6
dList['CE']=2
dList['CG']=5
dList['DE']=4
dList['EF']=3
dList['GH']=4
#buildBFtree
tree=BFtree(dList)
tree.move(a,h)
tree.move(a,f)
tree.move(a,e)
代碼略長....
⑼ python的類中怎麼實現動態化函數
給你這樣一個例子吧,這個例子裡面有動態增加類的函數。
聲明一個類,類初始化的時候讀取配置文件,根據配置列表載入特定目錄下的模塊下的函數,函數和模塊同名,將此函數動態載入為類的成員函數。
代碼如下所示:
class WinBAS(Bas):
def __init__(self):
self.__baslist = {}
self.__Init_Moles()
pass
def __Init_Moles(self):
import modplugs
for m in modplugs.__moleset__:
mh = __import__('moles.' + m)# + '.' + m)
ma = getattr(mh, m)# + '.' + m)
ma = getattr(ma, m)
setattr(self.__class__, m, ma)
modplugs.py是模塊配置文件如下:
__moleset__ = [
'BAS_GetUserList',
]
然後建立目錄moles下面建立一個空的__init__.py文件,把目錄變為一個包,在moles目錄下建立真正的BAS_GetUserList實現:BAS_GetUserList文件中有個BAS_GetUserList函數如下:
def BAS_GetUserList(self, strs):
return [0, strs]
這樣WinBAS類就可以動態加入了BAS_GetUserList函數。
⑽ python的數據分解和動態傳值,*的幾個簡單用
Python中內置了很多有用的數據結構,列表list , 集合set,字典dict.那今天我們就根據這幾個數據結構來看看python中 * 的用法。*的作用,如果在函數參數中*表示的是不限的位置參數。*args,**kwargs則說明了python中函數的動態賦值用法。