欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

python重構(gòu)函數(shù),函數(shù)重構(gòu)方法

python 形參沒有被定義???感覺遇到鬼了。。。

一、前言

站在用戶的角度思考問題,與客戶深入溝通,找到木壘哈薩克網(wǎng)站設(shè)計(jì)與木壘哈薩克網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名申請雅安服務(wù)器托管、企業(yè)郵箱。業(yè)務(wù)覆蓋木壘哈薩克地區(qū)。

在python中,函數(shù)參數(shù)的定義和傳遞有以下幾種方式:

語法

意義 ?

def func(name)

普通參數(shù),可以根據(jù)位置匹配,也可以根據(jù)key來匹配 ?

def func(name=value)

默認(rèn)參數(shù),當(dāng)參數(shù)沒有傳遞時(shí),使用默認(rèn)值

def func(*iteratable)

將所有剩下的未匹配的參數(shù)收集至一個(gè)tuple中

def func(**dictionary)

將剩下未匹配的參數(shù)收集值一個(gè)dict中

def func(*, name)

必須使用key來匹配參數(shù)

def func(*other, name)

必須使用key來匹配參數(shù)

func(value)

函數(shù)調(diào)用,參數(shù)值按傳遞的參數(shù)順序匹配 ?

func(name=value)

函數(shù)調(diào)用,參數(shù)值根據(jù)key來匹配 ?

func(*iteratable)

函數(shù)調(diào)用,將iteratable容器中的參數(shù)展開,按位置匹配對應(yīng)的函數(shù)參數(shù) ?

func(**dictionary)

函數(shù)調(diào)用,將dict中的參數(shù)展開,按key值來匹配對應(yīng)的函數(shù)參數(shù) ?

在python中,參數(shù)可以按照順序傳遞,在調(diào)用函數(shù)時(shí),參數(shù)的值按照傳遞的順序,從左到右依次匹配。并且還可以給參數(shù)傳遞默認(rèn)值,這都很好理解,因?yàn)樵贑、C++、Java等許多語言中,函數(shù)的參數(shù)傳遞都是按照這種方法來傳遞的。

但python的參數(shù)定義和傳遞除了按照順序傳遞以及可以給默認(rèn)值外,它還有其它的一些特點(diǎn),在進(jìn)一步講解之前,首先說明python中函數(shù)調(diào)用中參數(shù)匹配的順序:

按照順序,給沒有key的參數(shù)賦值,意味著傳遞參數(shù)時(shí),需按順序匹配的參數(shù)必須出現(xiàn)在按key匹配的參數(shù)之前;

給按照key匹配的參數(shù)賦值;

將多余的按照順序匹配但未匹配的參數(shù)值歸入*name的tuple中;

將多余未匹配上的按照key進(jìn)行匹配的參數(shù)值歸入**name的dict對象中;

將為匹配上的且具有默認(rèn)值的參數(shù)賦默認(rèn)值

二、按key匹配參數(shù)

對于C、C++這種語言,在調(diào)用函數(shù)時(shí),系統(tǒng)會首先將函數(shù)地址壓入堆棧,其次按參數(shù)的從右往左的順序,一次壓入堆棧。因此,C、C++這種語言它們只支持按順序匹配形參。而python的做法不同,參數(shù)除了可以按順序匹配,還可以按照參數(shù)名稱來匹配。如:

def func(name, age):

print(name, age)

對于這個(gè)函數(shù),以下的調(diào)用時(shí)等價(jià)的:

func('rechar', 27) ? ?#按順序匹配

func(name = 'rechar', age = 27) ? ?#按參數(shù)名稱匹配,在運(yùn)行時(shí)告訴系統(tǒng)參數(shù)name的值為‘rechar’,age的值為27

func(age = 27, name = 'rechar') ? ?#按參數(shù)名稱匹配

func('rechar', age = 27) ? ?#name是按順序匹配,age按名稱匹配

在python中,當(dāng)按照參數(shù)名稱進(jìn)行匹配參數(shù)是,參數(shù)傳遞的順序是可以任意的,不要求按照函數(shù)定義中參數(shù)的順序進(jìn)行傳遞。在使用名稱匹配時(shí),如果需要混合使用按順序匹配規(guī)則,則按順序匹配的參數(shù)必須出現(xiàn)在按key匹配的參數(shù)前,否則會報(bào)錯(cuò):

func(name = 'rechar', 27)

以上調(diào)用會報(bào)如下錯(cuò)誤:

三、函數(shù)定義中的”*name“

python在給按順序匹配和按key匹配的參數(shù)賦完值后,如果發(fā)現(xiàn)調(diào)用者傳入的參數(shù)仍有未匹配上的會發(fā)生什么情況呢?看一下下面的例子:

func('rechar', 27, 32)

運(yùn)行時(shí)我們看到如下錯(cuò)誤:

Traceback (most recent call last):

File "E:\tmp\tt.py", line 5, in module

func('rechar', 27, 32)

TypeError: func() takes 2 positional arguments but 3 were given

哦,python會抱怨我們傳遞的參數(shù)太多了。那如果確實(shí)在一些情況下,我們無法保證傳遞的參數(shù)數(shù)量一定和函數(shù)需要的參數(shù)數(shù)相等怎么辦呢?這是就是*iterable這種參數(shù)該登場的時(shí)候了,假如在定義函數(shù)定義是,我們增加了一個(gè)參數(shù),這個(gè)參數(shù)以一個(gè)”*“開始,那么這個(gè)參數(shù)實(shí)際上是一個(gè)tuple類型。假如傳遞的參數(shù)比需要的多,那那些多余的參數(shù)會被放入這個(gè)tuple中。例如,

def func(name, age, *other):

print(name, age, other)

那么,

func('rechar', 27, 32)

這個(gè)調(diào)用的輸出如下:

rechar 27 (32,)

四、函數(shù)定義中的”**name“

python在將所有未匹配上的非按名稱匹配的參數(shù)裝入?yún)?shù)中的tuple之后,假如還有未匹配上的按名稱匹配的參數(shù)那情況會怎樣呢?首先來看一下下面的示例:

def func(name, age):

print(name, age)

func(name = 'rechar', age = 27, pay='1800')

執(zhí)行時(shí),python又抱怨了:

Traceback (most recent call last):

File "E:\tmp\tt.py", line 5, in module

func(name = 'rechar', age = 27, pay='1800')

TypeError: func() got an unexpected keyword argument 'pay'

它說func這個(gè)函數(shù)沒有名稱為”pay“的參數(shù),這種情況或許出現(xiàn)在我們函數(shù)重構(gòu)之后,原來函數(shù)時(shí)有這個(gè)參數(shù)的。而這個(gè)函數(shù)調(diào)用可能在別處沒有被修改。假設(shè)即使給了”pay“這個(gè)參數(shù),程序的正確性不受影響,沒錯(cuò),這就是”**name“參數(shù)的用武之地了。

假如在函數(shù)定義中,給函數(shù)增加一個(gè)以”**“開頭的參數(shù),那么這個(gè)參數(shù)實(shí)際上是一個(gè)dict對象,它會將參數(shù)調(diào)用中所有沒有被匹配的按名稱傳遞的參數(shù)都放入這個(gè)dict中。例如,

def func(name, age,**other):

print(name, age, other)

func(name = 'rechar', age = 27, pay='1800')

那么運(yùn)行結(jié)果輸出,

rechar 27 {'pay': '1800'}

看到了吧,這里的other就將沒有匹配的”pay=‘1800’“收入囊中了。

五、規(guī)定調(diào)用必須按名稱匹配

當(dāng)我們在定義函數(shù)時(shí),如果第一個(gè)參數(shù)就是”*name“參數(shù),那么可想而知,我們無法使用按順序匹配的方式傳遞,因?yàn)樗械陌错樞騻鬟f的參數(shù)值最終的歸宿都會是這里的tuple當(dāng)中。而為了給后續(xù)的參數(shù)傳遞值,我們只能使用按名稱匹配的方法。

六、”**“參數(shù)只能出現(xiàn)在最后一個(gè)形參之后

想想為什么?其實(shí)很好理解,因?yàn)槌霈F(xiàn)在”**“形參之后的形參,無論使用按順序傳遞還是按名稱傳遞,最終都無法到達(dá)參數(shù)值真正應(yīng)該需要到的地方。所以python規(guī)定,如果需要”**“參數(shù),那它必須是最后一個(gè)形參。否則python會報(bào)語法錯(cuò)誤。

七、函數(shù)調(diào)用中的”*“

在表格中我們看到了有func(*iteratable)的調(diào)用,這個(gè)調(diào)用的意思是,iteratable必須是一個(gè)可迭代的容器,比如list、tuple;作為參數(shù)傳遞值,它最終傳遞到函數(shù)時(shí),不是以一個(gè)整體出現(xiàn),而是將其中的元素按照順序傳遞的方式,一次賦值給函數(shù)的形參。例如,

li = ['rechar', 27]

func(*li)

這個(gè)函數(shù)調(diào)用與

func('rechar', 27)

是等價(jià)的。

八、函數(shù)調(diào)用中的”**“

知道”*“在函數(shù)調(diào)用中的效果之后,也就很好理解”**“的作用了。它是將傳遞進(jìn)來的dict對象分解,每一個(gè)元素對應(yīng)一個(gè)按名稱傳遞的參數(shù),根據(jù)其中的key對參數(shù)進(jìn)行賦值。

Python3和Python2的區(qū)別?

具體區(qū)別如下

1:打印時(shí),py2需要可以不需要加括號,py3 需要python 2 :print ('lili') , print 'lili'python 3 : print ('lili') python3 必須加括號exec語句被python3廢棄,統(tǒng)一使用exec函數(shù)

2:內(nèi)涵

Python2:1,臃腫,源碼的重復(fù)量很多。 2,語法不清晰,摻雜著C,php,Java的一些陋習(xí)。

Python3:幾乎是重構(gòu)后的源碼,規(guī)范,清晰,優(yōu)美。

3: 輸出中文的區(qū)別python2:要輸出中文 需加 # -*- encoding:utf-8 -*-Python3 :直接輸出

4:input不同python2 :raw_input python3 :input 統(tǒng)一使用input函數(shù)

5:指定字節(jié)python2在編譯安裝時(shí),可以通過參數(shù)-----enable-unicode=ucs2 或-----enable-unicode=ucs4分別用于指定使用2個(gè)字節(jié)、4個(gè)字節(jié)表示一個(gè)unicode;python3無法進(jìn)行選擇,默認(rèn)使用 ucs4查看當(dāng)前python中表示unicode字符串時(shí)占用的空間:impor sysprint(sys.maxunicode)#如果值是65535,則表示使用usc2標(biāo)準(zhǔn),即:2個(gè)字節(jié)表示#如果值是1114111,則表示使用usc4標(biāo)準(zhǔn),即:4個(gè)字節(jié)表示

6:py2:xrangerangepy3:range 統(tǒng)一使用range,Python3中range的機(jī)制也進(jìn)行修改并提高了大數(shù)據(jù)集生成效率

7:在包的知識點(diǎn)里包:一群模塊文件的集合 + __init__區(qū)別:py2 : 必須有__init__ py3:不是必須的了

8:不相等操作符""被Python3廢棄,統(tǒng)一使用"!="

9:long整數(shù)類型被Python3廢棄,統(tǒng)一使用int

10:迭代器iterator的next()函數(shù)被Python3廢棄,統(tǒng)一使用next(iterator)

11:異常StandardError 被Python3廢棄,統(tǒng)一使用Exception

12:字典變量的has_key函數(shù)被Python廢棄,統(tǒng)一使用in關(guān)鍵詞

13:file函數(shù)被Python3廢棄,統(tǒng)一使用open來處理文件,可以通過io.IOBase檢查文件類型

python主函數(shù)怎么寫

一般來說,Python程序員可能是這樣寫main()函數(shù)的:

"""Module docstring.

This serves as a long usage message.

"""import sysimport getoptdef main():

# parse command line options

try:

opts, args = getopt.getopt(sys.argv[1:], "h", ["help"]) except getopt.error, msg: print msg print "for help use --help"

sys.exit(2) # process options

for o, a in opts: if o in ("-h", "--help"): print __doc__

sys.exit(0) # process arguments

for arg in args:

process(arg) # process() is defined elsewhereif __name__ == "__main__":

main()1234567891011121314151617181920212223242526

Guido也承認(rèn)之前自己寫的main()函數(shù)也是類似的結(jié)構(gòu),但是這樣寫的靈活性還不夠高,尤其是需要解析復(fù)雜的命令行選項(xiàng)時(shí)。為此,他向大家提出了幾點(diǎn)建議。

添加可選的 argv 參數(shù)

首先,修改main()函數(shù),使其接受一個(gè)可選參數(shù) argv,支持在交互式shell中調(diào)用該函數(shù):

def main(argv=None):

if argv is None:

argv = sys.argv # etc., replacing sys.argv with argv in the getopt() call.1234

這樣做,我們就可以動態(tài)地提供 argv 的值,這比下面這樣寫更加的靈活:

def main(argv=sys.argv):

# etc.12

這是因?yàn)樵谡{(diào)用函數(shù)時(shí),sys.argv 的值可能會發(fā)生變化;可選參數(shù)的默認(rèn)值都是在定義main()函數(shù)時(shí),就已經(jīng)計(jì)算好的。

但是現(xiàn)在sys.exit()函數(shù)調(diào)用會產(chǎn)生問題:當(dāng)main()函數(shù)調(diào)用sys.exit()時(shí),交互式解釋器就會推出!解決辦法是讓main()函數(shù)的返回值指示退出狀態(tài)(exit status)。因此,最后面的那行代碼就變成了這樣:

if __name__ == "__main__":

sys.exit(main())12

并且,main()函數(shù)中的sys.exit(n)調(diào)用全部變成return n。

定義一個(gè)Usage()異常

另一個(gè)改進(jìn)之處,就是定義一個(gè)Usage()異常,可以在main()函數(shù)最后的except子句捕捉該異常:

import sysimport getoptclass Usage(Exception):

def __init__(self, msg):

self.msg = msgdef main(argv=None):

if argv is None:

argv = sys.argv try: try:

opts, args = getopt.getopt(argv[1:], "h", ["help"]) except getopt.error, msg: raise Usage(msg) # more code, unchanged

except Usage, err: print sys.stderr, err.msg print sys.stderr, "for help use --help"

return 2if __name__ == "__main__":

sys.exit(main())123456789101112131415161718192021222324

這樣main()函數(shù)就只有一個(gè)退出點(diǎn)(exit)了,這比之前兩個(gè)退出點(diǎn)的做法要好。而且,參數(shù)解析重構(gòu)起來也更容易:在輔助函數(shù)中引發(fā)Usage的問題不大,但是使用return 2卻要求仔細(xì)處理返回值傳遞的問題。

python程序怎么重構(gòu)

其實(shí)不只是python,各種語言都是這樣。唯一的辦法就是多寫,然后不停的回頭去看自己寫的代碼,不停的去重構(gòu)。同時(shí)也要多讀,現(xiàn)在網(wǎng)上太多開源的代碼,去觀摩,一點(diǎn)一點(diǎn)的積累。

python重構(gòu)函數(shù)怎么確定參數(shù)(在《python從入門到實(shí)踐》的《外星人入侵》小游戲遇到的問題)?

1,對,__init__中定義的變量,其他對象方法(第一個(gè)參數(shù)是self的),可以直接用

2,不是很清楚你什么地方?jīng)]想明白,三個(gè)參數(shù)都是update_screen的參數(shù),作者認(rèn)為它需要3個(gè)才能正確工作,就這么設(shè)計(jì)了。

3,ai_settings是一個(gè)實(shí)例,在圖1的1處就是它了。

Python的pywavelet如何實(shí)現(xiàn) matlab的小波算法系數(shù)重構(gòu)的信號,matlab算法如下

pywt.waverec(coeffs, wavelet, mode='symmetric', axis=-1)

It may sometimes be desired to run waverec with some sets of coefficients omitted. This can best be done by setting the corresponding arrays to zero arrays of matching shape and dtype. Explicitly removing list entries or setting them to None is not supported.

Specifically, to ignore detail coefficients at level 2, one could do:

coeffs[-2] = np.zeros_like(coeffs[-2])

##################################################################

coeffs=pywt.wavedec(data_current,'db6',level=3)

for i in range(1,4):

coeffs[i] = np.zeros_like(coeffs[i])

A3 = pywt.waverec(coeffs, 'db6')

網(wǎng)站標(biāo)題:python重構(gòu)函數(shù),函數(shù)重構(gòu)方法
URL地址:http://chinadenli.net/article15/dsipgdi.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT定制網(wǎng)站手機(jī)網(wǎng)站建設(shè)品牌網(wǎng)站制作企業(yè)建站網(wǎng)頁設(shè)計(jì)公司

廣告

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

微信小程序開發(fā)