連載|想用Python作自動化測試?Python函數入門

 函數是 Python 程序中不可或缺的一部分,它是的程序模塊化、清晰化。Python的不少功能都是經過內置函數提供的,好比 sorted() 表示對一個集合序列排序,len() 表示返回一個集合序列的長度大小等等。這節課,咱們主要來學習 Python 的自定義函數。
javascript

10.1 定義函數

  • 使用def關鍵字php

  • 函數能夠有返回值也能夠沒有返回值css

# content of test_sample.pydef inc(x): # 有返回值 return x + 1

def test_answer(): # 沒有返回值 assert inc(3) == 5

10.2 調用函數

  • add_one=inc(3)java

  • 函數被調用時,這個函數此前必須定義過python

10.3 函數的參數

10.3.1 位置參數

def divmod(x, y): # known case of builtins.divmod """ Return the tuple (x//y, x%y). Invariant: div*y + mod == x. """ return (0, 0)

這是一個Python內置的得到商和餘數的函數。這個函數有兩個參數:x和y,這兩個參數都是位置參數,調用這個函數時,要按照順序傳入的兩個實參值,實參值會依次賦給參數x和y。sql

10.3.2 默認值參數

def open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True):  pass

這是Python內置的打開文件的函數,調用open打開文件時,能夠只傳遞file文件路徑,其餘的參數能夠不傳遞實參值,由於其餘的參數都具備默認值。mode是打開文件的模式,默認值是r,表示以讀的方式打開文件,默認值參數必須指向不可變對象。swift

  • 不要這樣:數組

def add_end(li=[]): pass
  • 要這樣:
    ruby

def add_end(li=None): pass

10.3.3 變長參數

能夠給函數一次性傳遞多個參數,或者傳遞一個列表或元組。定義函數時在參數名前加一個星號*。bash

def calc(*numbers): sum = 0 for n in numbers: sum = sum + n * n return sum

函數calc的功能是求任意多個參數的平方和。函數定義時,在參數名加一個星號*。這樣的函數,在調用時,能夠傳入的參數個數是可變的,能夠是1個、2個到任意個,還能夠是0個。實際例子以下:

calc(1, 2,3,4)calc(1, 2)calc()nums = [1, 2, 3]calc(*nums) # 還能夠傳遞列表或者元組等進去

max是python內置的求最大值的函數。它的定義以下:

def max(*args, key=None): # known special case of max """ max(iterable, *[, default=obj, key=func]) -> value max(arg1, arg2, *args, *[, key=func]) -> value  With a single iterable argument, return its biggest item. The default keyword-only argument specifies an object to return if the provided iterable is empty. With two or more arguments, return the largest argument. """ pass

第一個參數是一個變長參數,上面舉了兩個例子,第一個參數能夠是可迭代對象,也能夠是多個參數。返回值是多個參數中的最大值,或者可迭代對象中的最大值。好比:

print(max(1, 2, 3, 4, -9, -5)) # 多個參數print(max([1, 2, 3, 4, -9, -5])) # 可迭代對象,這裏是一個列表

max函數還有一個默認值參數key,接受一個函數名,這時max函數返回的值是,將args參數分別用到key函數後的結果中的最大值。好比,找出一個數字列表中絕對值最大的元素:

max([1, 2, 3, 4, -9, -5], key=abs)

10.3.4 關鍵字參數

下面這個sorted函數是Python內置的排序函數,它的第一參數是一個變長參數,第二個參數是個關鍵字參數,關鍵字參數是以兩個星號開頭。

def sorted(*args, **kwargs): # real signature unknown """ Return a new list containing all items from the iterable in ascending order.  A custom key function can be supplied to customize the sort order, and the reverse flag can be set to request the result in descending order. """ pass

sorted函數默認是升序排序的,能夠傳入一個關鍵字參數reverse進行降序排序。方式是:

print(sorted([1, 2, 3, 4, -9, -5], reverse=True))

關鍵字參數容許你傳入0個或任意個含參數名的參數,這些關鍵字參數在函數內部自動組裝爲一個字典。

再來自定義一個:

def person(name, age, **kwargs): print(name,age,kwargs)

關鍵字參數能夠擴展函數的功能。好比,在person函數裏,咱們保證能接收到name和age這兩個參數,可是,若是調用者願意提供更多的參數,咱們也能收到。試想你正在作一個用戶註冊的功能,除了用戶名和年齡是必填項外,其餘都是可選項,利用關鍵字參數來定義這個函數就能知足註冊的需求。傳遞關鍵字參數有兩種方式:

  • 傳入字典

extra = {'city': 'Beijing', 'job': 'Engineer'}person('Jack', 24, **extra) # 字典參數名簽名放兩個**
  • 直接傳入key=value

person('Jack', 24, salary=10000, department='finace')

10.3.5 參數組合

定義函數時,參數順序必須是:位置參數、默認參數、變長參數、關鍵字參數。定義順序不能亂。

def f1(a, b, c=0, *args, **kw):  pass 

10.4 看懂Python源碼中函數的定義

有些朋友平時反映,看不懂官方文檔中介紹函數的說明,好比查看min的源碼:

def min(*args, key=None): # known special case of min """ min(iterable, *[, default=obj, key=func]) -> value min(arg1, arg2, *args, *[, key=func]) -> value  With a single iterable argument, return its smallest item. The default keyword-only argument specifies an object to return if the provided iterable is empty. With two or more arguments, return the smallest argument. """ pass

min 函數的源碼文檔中,舉了兩個例子,其中的形參有 * 符號,又有 []?他們都表示啥意思呢?

函數形參列表中符號 * 表示,後面的形參只能爲關鍵字參數,不能爲位置參數,[]裏面的參數是可選的,不是必填的,例如傳遞一個key參數和default參數時,必須寫明參數名:

>>> a = [1,2,3,4,2,2,3,4] >>> min(a,key=lambda x: a.count(x), default=1) # 求出個數最少的元素1

由於default是可選的,所以還能夠這樣:

>>> list=[1,2,5,9,4,6,3]>>> min(list,key=lambda x:-x) # 取反後最小的值9

再來看一個min函數的用法,求一段文本中出現次數最少的字母。

import string

def maxcharactor(content): content = content.lower() return min(string.ascii_lowercase, key=content.count)

if __name__ == '__main__': print(maxcharactor("/Users/chunming.liu/learn/learn_python_by_coding/learn_string/"))

平時你們更多看到的是這麼使用 min 函數,沒有key參數:

min([1,2,3,4,2,2,3])

這是由於在min函數說明中,key參數是放在[] 中的,說明它是可選的,能夠不傳遞。

自定義一個函數 func,參數 b 位於 * 後面,只能爲關鍵字參數:

def func(a,*,b): pass
func(a,b=1)
f(a,1) # 這種調用是錯誤的TypeError: f() takes 1 positional argument but 2 were given

再看一個內置函數 sum:

sum(iterable, start=0, /) Return the sum of a 'start' value (default: 0) plus an iterable of numbers
When the iterable is empty, return the start value. This function is intended specifically for use with numeric values and may reject non-numeric types.

看到形參列表中有一個 /,它表示 / 前的參數只能是位置參數,不能是關鍵字參數。

所以,如下調用是合法的:

a = [1,3,2,1,4,2]
sum(a,2) # start=2 表示求和的初始值爲 215

如下調用是非法的,iterable 參數不能被賦值爲關鍵字實參:

sum(iterable=a,start=2)
TypeError: sum() takes no keyword arguments

之後再查看Python中函數用法時,應該能夠看懂了吧。

10.5 偏函數functools.partial

Python的functools模塊提供了不少有用的功能,其中一個就是偏函數(Partial function)。

先來看下Python官方的描述:

# content of _functools.pyclass partial(object): """ partial(func, *args, **keywords) - new function with partial application of the given arguments and keywords. """ pass

翻譯過來就是,functools.partial能夠給一個函數設置位置參數和關鍵字參數的默認值,而且返回一個新的可調用對象。以後調用這個新的可調用對象時,就自動帶上了functools.partial設置的默認參數值,從而能夠傳遞更少的參數。舉個例子:

from functools import partial
def add(a, b, *arg, **kwargs): return a + b, arg, kwargs
add10 = partial(add, 10, kw1=1) # 設置add函數的位置參數a的默認值爲10,關鍵詞參數kwargs中的參數kw1的默認值是1,並返回新的可調用對象add10print(add10(11, 12)) # 調用新的函數對象add10,只須要在傳遞add函數的變量b的值就能夠了

用Pycharm調試上面的代碼,在add函數的return語句處添加斷點,能夠看到add10這個對象中args屬性裏面有一個10,kwwargs裏面有一個"kw"=1,這就是經過partial偏函數設置進去的。

當調用add10時,只須要提供變量b=11和arg的值12,add10就可以將其與偏函數設置的值一塊兒傳遞給原函數add了。


本文分享自微信公衆號 - 明說軟件測試(liuchunmingnet)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索