mysqldump備份復原和mysqldump導入導出語句年夜全詳解。本站提示廣大學習愛好者:(mysqldump備份復原和mysqldump導入導出語句年夜全詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是mysqldump備份復原和mysqldump導入導出語句年夜全詳解正文
import datetime as dt def log_time(message, time=None): if time is None: time=dt.datetime.now() print("{0}: {1}".format(time.isoformat(), message))
比來我在一段Python代碼中發明了一個由於毛病的應用默許參數而發生的異常惡心的bug。假如您曾經曉得關於默許參數的全體內容了,只是想譏笑一下我這好笑的毛病,請直接跳到本文末尾。哎,這段代碼是我寫的,然則我異常肯定那天我被惡魔附體了。你懂的,有時刻就是如許。
本文僅僅是總結一下關於Python函數的尺度參數和默許參數的一些根本內容。提示你留意你的代碼中能夠存在的圈套。假如你剛開端接觸Python,開端寫一些函數,我真心推舉你看一下Python官方手冊中關於函數的內容,鏈接以下:Defining Functions 和 More on Defining Functions。
簡略溫習一下函數
Python是一個壯大的面向對象說話,它把這類編程范式推向了巅峰。然則,面向對象編程依然須要依附函數這一概念,你可以用它來處置數據。Python關於可挪用對象有一個更廣泛的概念,即任何對象都可以被挪用,挪用的意思是對其運用數據。
函數在Python中是可挪用對象,而且乍一看,它和其他說話中的函數有著相似的行動。它們獲得一些數據,這些數據被稱為參數,然後處置它們,接著前往成果(假如沒有return語句則是None)
參數被聲明為占位符(在界說函數的時刻),用以代表那些當函數挪用時被現實傳入的對象。在Python中你不須要聲明參數的類型(例如,像你在C或Java中做的那樣)由於Python哲學依附於多態。
記住,Python的變量是援用,即現實變量的內存地址。這意味著Python的函數永久以“傳址”的方法任務(這裡應用了一個C/C++術語),當你挪用一個函數的時刻,其實不是復制了一份參數的值來調換占位符,而是把占位符指向了變量自己。這招致了一個異常主要的成果:你可以在函數外部轉變這個變量的值。這裡有一個很好可視化講授,關於援用機制。
援用在Python飾演著異常主要的腳色,它是Python完整多態方法的主干。關於這個異常主要的主題,請點擊這個鏈接 檢查更好的說明。
為了檢討你能否懂得了這門說話的這一根本特征,請追隨這段簡略的代碼(變量ph代表的是“占位符(placeholder)”)
>>> def print_id(ph): ... print(hex(id(ph))) ... >>> a = 5 >>> print(hex(id(a))) 0x84ab460 >>> print_id(a) 0x84ab460 >>> >>> def alter_value(ph): ... ph = ph + 1 ... return ph ... >>> b = alter_value(a) >>> b 6 >>> a 5 >>> hex(id(a)) '0x84ab460' >>> hex(id(b)) '0x84ab470' >>> >>> def alter_value(ph): ... ph.append(1) ... return ph ... >>> a = [1,2,3] >>> b = alter_value(a) >>> a [1, 2, 3, 1] >>> b [1, 2, 3, 1] >>> hex(id(a)) '0xb701f72c' >>> hex(id(b)) '0xb701f72c' >>>
假如你對這裡產生的工作其實不覺得受驚,那解釋你曾經控制了Python中最為主要的部門之一,你可以寧神的跳過上面的說明了。
print_id()函數顯示,函數外部的占位符同運轉時傳入的變量完整一樣(它們的內存地址分歧)。
兩個版本的alter_value()意在轉變傳入參數的值。正如你所看到的,第一個alter_value() 並沒有像第二個alter_value()一樣勝利的轉變變量a的值。這是為何呢?現實上二者的行動是一樣的,都是測驗考試修正傳入的原始變量的值,然則在Python中,有些變量是弗成變的(immutable),整數就在此列。另外一方面,列表其實不是弗成變的,所以函數得以完成它的名字所包管的任務。 在這裡,你可以找到關於弗成變類型的加倍具體的引見 。
關於Python中的函數,還有一些要說的,然則這些是關於尺度的參數的根本常識。
默許參數值
有時刻你須要界說一個函數,讓它接收一個參數,並且在這個參數湧現或不湧現時,函數有分歧的行動。假如一門說話不支撐這類情形,你就只要兩個選擇:第一種是界說兩個分歧的函數,決議每次挪用應當選擇挪用哪一個,第二種是 兩種辦法都是可行的,然則都不是最好的。
Python和其他說話一樣,支撐默許參數值,即函數參數可所以挪用時指定的,也能夠留空,主動接收一個預界說的值。
一個關於默許值的異常簡略(也很沒用)的例子以下:
def log(message=None): if message: print("LOG: {0}".format(message))
這個函數可以帶一個參數運轉(可所以None)
>>> log("File closed") LOG: File closed >>> log(None) >>>
然則異樣也能夠不帶參數運轉,這類情形下它會接收一個函數原型中設置的默許值(本例中是None)
>>> log() >>>
你可以在尺度庫中找到更多風趣的例子,好比在open()函數中(請檢查官方文檔)
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
函數原型可以證實,例如 f = open('/etc/hosts')如許的挪用,經由過程傳入默許值隱蔽了許多參數 (mode, buffering, encoding, 等),而且使這個函數的典范運用案例變得異常簡略易用。
正如你在內建的open()函數中看到的那樣,我們可以在函數中應用尺度或許默許參數,然則二者在函數中湧現的順序是固定的:起首挪用尺度參數,然後挪用默許參數。
def a_rich_function(a, b, c, d=None, e=0): pass
緣由是不言而喻的:假如我們可以在尺度參數後面放置一個默許參數,說話就沒法懂得,默許參數能否曾經被初始化。例如,斟酌上面這個函數界說
def a_rich_function(a, b, d=None, c, e=0): pass
當挪用函數a_rich_function(1, 2, 4, 5)時,我們傳入了甚麼參數? 是d=4, c=5 照樣c=4, e=5?由於d有一個默許的值。是以這類次序的界說是被制止的,假如你如許做,Python會拋出一個SyntaxError
>>> def a_rich_function(a, b, d=None, c, e=0): ... pass ... File "<stdin>", line 1 SyntaxError: non-default argument follows default argument >>>
默許參數求值
默許參數可以經由過程通俗值或是函數挪用成果來進步,然則後者這類技巧須要一個特殊的警示
一個通俗的值是硬編碼的,是以除編譯時,其他時刻是不須要求值的,然則函數挪用希冀在運轉時履行求值。所以我們可以如許寫
import datetime as dt def log_time(message, time=dt.datetime.now()): print("{0}: {1}".format(time.isoformat(), message))
每次我們挪用log_time()時都希冀它可以或許准確供給以後時光。喜劇的是並沒有勝利:默許參數在界說時求值(好比說當你初次導入模塊時),挪用的成果以下
>>> log_time("message 1") 2015-02-10T21:20:32.998647: message 1 >>> log_time("message 2") 2015-02-10T21:20:32.998647: message 2 >>> log_time("message 3") 2015-02-10T21:20:32.998647: message 3
假如把默許值賦給一個類的實例,成果會加倍奇異,你可以在Hitchhiker's Guide to Python!中讀到相干內容。依據。。平日的處理辦法是把默許參數調換為None,而且在函數外部檢討參數值。
結論
默許參數可以或許極年夜的簡化API,你須要存眷它獨一的“掉敗點”,即求值的機會。使人驚異的是,Python最根本的內容之一,函數的參數和援用,是最年夜的毛病源之一,有時刻關於有經歷的法式員也一樣。我建議抽時光進修一下援用和多態。
相干浏覽: