您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關怎么使用python函數參數高級,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
我們已經了解了最基本的函數,下面將要學習更多函數的特性。例如使用函數返回值,如何在不同的函數間傳遞不同的數據結構等。
參數缺省值
我們初次介紹函數的時候,用的是下述例子:
def thank_you(name): # This function prints a two-line personalized thank you message. print("\nYou are doing good work, %s!" % name) print("Thank you very much for your efforts on this project.") thank_you('Adriana') thank_you('Billy') thank_you('Caroline')
上述代碼中,函數都能正常工作。但是在不傳入參數時,函數就會報錯。如下所示:
def thank_you(name): # This function prints a two-line personalized thank you message. print("\nYou are doing good work, %s!" % name) print("Thank you very much for your efforts on this project.") thank_you('Billy') thank_you('Caroline') thank_you()
出現這個錯誤是合乎情理的。函數需要一個參數來完成它的工作,沒有這個參數就沒辦法工作。
這就引出了一個問題。有時候你想在不傳參數的時候讓函數執行默認的動作。你可以通過設置參數的缺省值實現這個功能。缺省值是在函數定義的時候確定的。如下所示:
def thank_you(name='everyone'): # This function prints a two-line personalized thank you message. # If no name is passed in, it prints a general thank you message # to everyone. print("\nYou are doing good work, %s!" % name) print("Thank you very much for your efforts on this project.") thank_you('Billy') thank_you('Caroline') thank_you()
在函數中有多個參數,且其中一些參數的值基本不變時,使用參數缺省值是非常有幫助的。它可以幫助函數調用者只關注他們關心的參數。
位置參數
使用函數的很重要的一點就是如何向函數中傳遞參數。我們已經學到的都是最簡單的參數傳遞,只有一個參數。接下來我們了解一下如何傳遞兩個以上的參數。
我們創建一個包含 3 個參數的函數,包含一個人的名,姓和年紀。如下所示:
def describe_person(first_name, last_name, age): # This function takes in a person's first and last name, # and their age. # It then prints this information out in a simple format. print("First name: %s" % first_name.title()) print("Last name: %s" % last_name.title()) print("Age: %d\n" % age) describe_person('brian', 'kernighan', 71) describe_person('ken', 'thompson', 70) describe_person('adele', 'goldberg', 68)
在這個函數中,參數是 first_name , last_name , age 。它們被稱為位置參數。Python 會根據參數的相對位置為它們賦值。在下面的調用語句中:
describe_person('brian', 'kernighan', 71)
我們給函數傳遞了 brian, kernighan, 71 三個值。Python 就會根據參數位置將 first_name 和 brian 匹配,last_name 和 kernighan 匹配,age 和 71 匹配。
這種參數傳遞方式是相當直觀的,但是我們需要嚴格保證參數的相對位置。
如果我們混亂了參數的位置,就會得到一個無意義的結果或報錯。如下所示:
def describe_person(first_name, last_name, age): # This function takes in a person's first and last name, # and their age. # It then prints this information out in a simple format. print("First name: %s" % first_name.title()) print("Last name: %s" % last_name.title()) print("Age: %d\n" % age) describe_person(71, 'brian', 'kernighan') describe_person(70, 'ken', 'thompson') describe_person(68, 'adele', 'goldberg')
這段代碼中,first_name 和 71 匹配,然后調用 first_name.title() ,而整數是無法調用 title() 方法的。
關鍵字參數
Python 中允許使用關鍵字參數。所謂關鍵字參數就是在調用函數時,可以指定參數的名字給參數賦值。改寫上述代碼,示例如下:
def describe_person(first_name, last_name, age): # This function takes in a person's first and last name, # and their age. # It then prints this information out in a simple format. print("First name: %s" % first_name.title()) print("Last name: %s" % last_name.title()) print("Age: %d\n" % age) describe_person(age=71, first_name='brian', last_name='kernighan') describe_person(age=70, first_name='ken', last_name='thompson') describe_person(age=68, first_name='adele', last_name='goldberg')
這樣就能工作了。Python 不再根據位置為參數賦值。而是通過參數名字匹配對應的參數值。這種寫法可讀性更高。
混合位置和關鍵字參數
有時候混合使用位置和關鍵字參數是有意義的。我們還是用上述例子,增添一個參數繼續使用位置參數。如下所示:
def describe_person(first_name, last_name, age, favorite_language): # This function takes in a person's first and last name, # their age, and their favorite language. # It then prints this information out in a simple format. print("First name: %s" % first_name.title()) print("Last name: %s" % last_name.title()) print("Age: %d" % age) print("Favorite language: %s\n" % favorite_language) describe_person('brian', 'kernighan', 71, 'C') describe_person('ken', 'thompson', 70, 'Go') describe_person('adele', 'goldberg', 68, 'Smalltalk')
我們假設每個人調用這個函數的時候都會提供 first_name 和 last_name。但可能不會提供其他信息。因此 first_name 和 last_name 使用位置參數,其他參數采用關鍵字參數的形式。如下所示:
def describe_person(first_name, last_name, age=None, favorite_language=None, died=None): """ This function takes in a person's first and last name, their age, and their favorite language. It then prints this information out in a simple format. """ print("First name: %s" % first_name.title()) print("Last name: %s" % last_name.title()) # Optional information: if age: print("Age: %d" % age) if favorite_language: print("Favorite language: %s" % favorite_language) if died: print("Died: %d" % died) # Blank line at end. print("\n")
接受任意數量的參數
利用關鍵字參數我們可以靈活處理各種調用語句。然而,我們還有其他一些問題需要處理。我們考慮一個函數,接收兩個數字參數,并打印數字之和。示例如下:
def adder(num_1, num_2): # This function adds two numbers together, and prints the sum. sum = num_1 + num_2 print("The sum of your numbers is %d." % sum) # Let's add some numbers. adder(1, 2) adder(-1, 2) adder(1, -2)
這個函數運行良好。但是如果我們傳入3個參數呢,看起來這種情況也應該是可以作算術運算的。如下所示:
def adder(num_1, num_2): # This function adds two numbers together, and prints the sum. sum = num_1 + num_2 print("The sum of your numbers is %d." % sum) # Let's add some numbers. adder(1, 2, 3)
出乎意料,函數出錯了。為什么呢?
這是因為無論采用什么形式的參數,函數只接受2個參數。事實上在這種情況下,函數只能恰好接受2個參數。怎么樣才能解決參數個數問題呢?
接受任意長度的序列
Python 幫助我們解決了函數接受參數個數的問題。它提供了一種語法,可以讓函數接受任意數量的參數。如果我們在參數列表的最后一個參數前加一個星號,這個參數就會收集調用語句的剩余參數并傳入一個元組。(剩余參數是指匹配過位置參數后剩余的參數)示例如下:
def example_function(arg_1, arg_2, *arg_3): # Let's look at the argument values. print('\narg_1:', arg_1) print('arg_2:', arg_2) print('arg_3:', arg_3) example_function(1, 2) example_function(1, 2, 3) example_function(1, 2, 3, 4) example_function(1, 2, 3, 4, 5)
你也可以使用 for 循環來處理剩余參數。
def example_function(arg_1, arg_2, *arg_3): # Let's look at the argument values. print('\narg_1:', arg_1) print('arg_2:', arg_2) for value in arg_3: print('arg_3 value:', value) example_function(1, 2) example_function(1, 2, 3) example_function(1, 2, 3, 4) example_function(1, 2, 3, 4, 5)
我們現在就可以重寫 adder() 函數,示例如下:
def adder(num_1, num_2, *nums): # This function adds the given numbers together, # and prints the sum. # Start by adding the first two numbers, which # will always be present. sum = num_1 + num_2 # Then add any other numbers that were sent. for num in nums: sum = sum + num # Print the results. print("The sum of your numbers is %d." % sum) # Let's add some numbers. adder(1, 2) adder(1, 2, 3) adder(1, 2, 3, 4)
接受任意數量的關鍵字參數
Python 也提供了一種接受任意數量的關鍵字參數的語法。如下所示:
def example_function(arg_1, arg_2, **kwargs): # Let's look at the argument values. print('\narg_1:', arg_1) print('arg_2:', arg_2) print('arg_3:', kwargs) example_function('a', 'b') example_function('a', 'b', value_3='c') example_function('a', 'b', value_3='c', value_4='d') example_function('a', 'b', value_3='c', value_4='d', value_5='e')
上述代碼中,最后一個參數前有兩個星號,代表著收集調用語句中剩余的所有鍵值對參數。這個參數常被命名為 kwargs 。這些參數鍵值對被存儲在一個字典中。我們可以循環字典取出參數值。如下所示:
def example_function(arg_1, arg_2, **kwargs): # Let's look at the argument values. print('\narg_1:', arg_1) print('arg_2:', arg_2) for key, value in kwargs.items(): print('arg_3 value:', value) example_function('a', 'b') example_function('a', 'b', value_3='c') example_function('a', 'b', value_3='c', value_4='d') example_function('a', 'b', value_3='c', value_4='d', value_5='e')
def example_function(**kwargs): print(type(kwargs)) for key, value in kwargs.items(): print('{}:{}'.format(key, value)) example_function(first=1, second=2, third=3) example_function(first=1, second=2, third=3, fourth=4) example_function(name='Valerio', surname='Maggio')
此前我們創建過一個描述人的信息的函數。但是我們只能傳遞有限的信息,因為參數的個數在定義時已經被限制。現在利用剛剛學習的知識,我們可以傳遞任意數量任意形式的信息,如下所示:
def describe_person(first_name, last_name, **kwargs): # This function takes in a person's first and last name, # and then an arbitrary number of keyword arguments. # Required information: print("First name: %s" % first_name.title()) print("Last name: %s" % last_name.title()) # Optional information: for key in kwargs: print("%s: %s" % (key.title(), kwargs[key])) # Blank line at end. print("\n") describe_person('brian', 'kernighan', favorite_language='C') describe_person('ken', 'thompson', age=70) describe_person('adele', 'goldberg', age=68, favorite_language='Smalltalk') describe_person('dennis', 'ritchie', favorite_language='C', died=2011) describe_person('guido', 'van rossum', favorite_language='Python')
以上就是怎么使用python函數參數高級,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。