《零基礎入門學習Python》(18)--函式:靈活即強大
阿新 • • 發佈:2018-11-09
前言
上一節課我們基本介紹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)