1. 程式人生 > >《零基礎入門學習Python》(18)--函式:靈活即強大

《零基礎入門學習Python》(18)--函式:靈活即強大

前言

上一節課我們基本介紹Python函式的用法,這一節課我們主要針對函式的引數進行進一步的深入學習。

知識點

  • 形參(parameter)和實參(argument)
>>> def MyFirstFunction(name):
    '函式定義過程中的name是叫形參'
    #因為Ta只是一個形式,表示佔據一個引數位置
    print('傳遞進來的' + name + '叫做實參,因為Ta是具體的引數值!')


>>> MyFirstFunction('小甲魚')
傳遞進來的小甲魚叫做實參,因為Ta是具體的引數值!
  • 函式文件
     
    給函式寫文件是為了讓別人可以更好的理解你的函式,寫函式文件是一個好習慣。
>>> def MyFirstFunction(name):
    '函式定義過程中的name是叫形參'#函式文件
    #因為Ta只是一個形式,表示佔據一個引數位置
    print('傳遞進來的' + name + '叫做實參,因為Ta是具體的引數值!')
>>> MyFirstFunction.__doc__
'函式定義過程中的name是叫形參'  

>>> help(MyFirstFunction)
Help on function MyFirstFunction in module __main__:

MyFirstFunction(name)
    函式定義過程中的name是叫形參
  • 關鍵字引數 
>>> def SaySome(name,words):
	 print(name + '->' + words)#切記不能搞混了關鍵字的位置

>>> SaySome('今天天氣真好','非常適合出去遊玩')
	 
今天天氣真好->非常適合出去遊玩
>>> SaySome(name='今天天氣真好',words='非常適合出去遊玩')
	 
今天天氣真好->非常適合出去遊玩
>>> 
  • 預設引數 
    定義了預設值的引數
>>> def SaySome(name='天氣',words='真好'):
	 print(name+'->'+words)

	 
>>> SaySome()
	 
天氣->真好
>>> SaySome('今天')#當然因為第二個關鍵字有預設值所以可以只賦一個關鍵字的值

>>> SaySome(words='啦啦啦')
	 
天氣->啦啦啦
	 
今天->真好
>>> SaySome('今天','天氣真好')
	 
今天->天氣真好
  • 收集引數(可變引數)
>>> def test(*params):
    print('引數的長度是:',len(params));
    print('第二個引數是:',params[1]);


>>> test(1,'小甲魚',3.14,5,6,7,8)
引數的長度是: 7
第二個引數是: 小甲魚

>>> def test(*params,exp):#收集引數和關鍵字引數一起用,必須在後面給它賦值否則就會出錯
    print('引數的長度是:',len(params));
    print('第二個引數是:',params[1]);


>>> test(1,'小甲魚',3.14,5,6,7,8)
Traceback (most recent call last):
  File "<pyshell#40>", line 1, in <module>
    test(1,'小甲魚',3.14,5,6,7,8)
TypeError: test() missing 1 required keyword-only argument: 'exp'

>>> test(1,'小甲魚',3.14,5,6,7,exp=8)
引數的長度是: 6
第二個引數是: 小甲魚


>>> def test(*params,exp=8):
    print('引數的長度是:',len(params));
    print('第二個引數是:',params[1]);


>>> test(1,'小甲魚',3.14,5,6,7,8)
引數的長度是: 7
第二個引數是: 小甲魚

課後習題

測試題

  • 請問以下哪個是行參哪個是實參?
def MyFun(x):
    return x ** 3

y = 3
print(MyFun(y))

#x是形式引數(行參),y是實際引數(實參)。
#跟絕大部分程式語言一樣,形參指的是函式建立和定義過程中小括號裡的引數,
#而實參指的是函式在呼叫過程中傳遞進去的引數。
  • 函式文件和直接用’#’為函式寫註釋有什麼不同? 

給函式寫文件是為了讓別人可以更好的理解你的函式

>>> def MyFirstFunction(name):
        '函式文件在函式定義的最開頭部分,用不記名字串表示'
        print('I love FishC.com!')

>>> MyFirstFunction('fs')
I love FishC.com!    

我們看到在函式開頭寫下的字串Ta是不會打印出來的,但Ta會作為函式的一部分儲存起來,這個我們稱之為函式文件字串,Ta的功能跟註釋是一樣的。

函式的文件字串可以按如下方式進行訪問:

>>> MyFirstFunction.__doc__
#'函式文件在函式定義的最開頭部分,用不記名字串表示'

另外,我們用help()來訪問這個函式也可以看到這個文件字串:

>>> help(MyFirstFunction)
Help on function MyFirstFunction in module __main__:

MyFirstFunction(name)
#函式文件在函式定義的最開頭部分,用不記名字串表示
  • 使用關鍵字引數,可以避免什麼問題的出現?

關鍵字引數,是指函式在呼叫的時候,帶上引數的名字去指定具體呼叫的是哪個引數,從而可以不用按照引數的順序呼叫引數,例如:

>>> def SaySome(name, words):
        print(name + '->' + words)

>>> SaySome(words='讓程式設計改變世界!', name='小甲魚')

使用關鍵字引數,可以有效避免因不小心搞亂引數的順序導致的BUG

  • 使用help(print)檢視print()這個BIF有哪些預設引數?分別起到什麼作用

>>> help(print)
Help on built-in function print in module builtins:

print(...)
    print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)

    Prints the values to a stream, or to sys.stdout by default.
    Optional keyword arguments:
    file:  a file-like object (stream); defaults to the current sys.stdout.
    # 檔案型別物件,預設是sys.stdout(標準輸出流)
    sep:   string inserted between values, default a space.
    # 第一個引數如果有多個值(第一個引數是收集引數),各個值之間預設用空格(space)隔開
    end:   string appended after the last value, default a newline.
    # 列印最後一個值之後預設引數一個新行識別符號(‘\n’)
    flush: whether to forcibly flush the stream.
    # 是否強制重新整理流
  • 預設引數和關鍵字引數表面最大區別是什麼?

關鍵字引數是在呼叫的時候,通過引數名制定需要賦值的引數,這樣做就不怕搞不清楚引數的順序而導致函式調用出錯。而預設引數是在引數定義的過程中,為形參賦初值,當函式呼叫的時候,不傳遞實參,則預設使用形參的初始值代替。

動動手

  • 編寫一個符合以下要求的函式: 
    1)計算列印所有引數的和乘以基數(base=3)的結果 
    2)如果引數中最後一個引數為(base=5),則設定基數為5,基數不參與求和計算。
def mul_sum(*param,base=3):
    result=0
    for each in param:
        result += each

    result *= base

    print('結果是',result)


mul_sum(1,2,3,4,1,1,5,base=5)
  • 尋找水仙花數 
    題目要求:如果一個3位數等於其他各位數字的立方和,則稱這個數為水仙花數。例如153=1^3 + 5^3 + 3^3,因此153是一個水仙花數。編寫一個程式,找出所有的水仙花數。
def Narcissus():
    for x in range(0,10):
        for y in range(0,10):
            for z in range(0,10):
                sum = x*100 + y*10 +z
                if x**3 + y**3 + z **3 == sum and sum>=100 and sum<1000:
                    print(sum, end='\t')          

print("所有的水仙花數分別是:", end='')
Narcissus()

#或者

def Narcissus():
    for each in range(100, 1000):
        temp = each
        sum = 0
        while temp:
            sum = sum + (temp%10) ** 3
            temp = temp // 10  # 注意這裡用地板除

        if sum == each:
            print(each, end='\t')

print("所有的水仙花數分別是:", end='')
Narcissus()

執行結果:
================== RESTART: C:/Users/ThinkPad/Desktop/12.py ==================
所有的水仙花數分別是:153  370 371 407
--------------------- 
  • 寫一個函式findstr(),該函式統計一個長度為2的子字串在另一個字串中出現的次數。例如:假定輸入的字串為“You cannot improve your past,but you can improve your future.Once time is wasted,life is wasted” 
def findStr(aimStr,subStr):
    count=0
    length=len(aimStr)
    if subStr not in aimStr:
        print('在目標字串')
    else:
        for each in range(length):
            if aimStr[each] == subStr[0]:
                if aimStr[each+1]==subStr[1]:
                    count += 1
        print('字串在目標字串中共%d 次' % count)

aimStr = input('請輸入目標字串:')
subStr = input('請輸入字串(兩個字元):')
findStr(aimStr,subStr)