上篇我們說到,python中內建了很多函式,我們可以直接呼叫的出來,那我我們能不能自己「創作」乙個函式呢?
sure!讓我們試試看
首先,我們要知道怎麼去定義乙個函式
在python中,定義乙個函式要使用以乙個求絕對值的函式def
語句,依次寫出函式名、括號、括號中的引數和冒號:,然後,在縮排塊中編寫函式體,函式的返回值用return
語句返回。
my_abs
為例子
def
my_abs
(x):
if x >=0:
return x
else
:return
-x
讓我們輸乙個數值來測試一下
print
(my_abs(-10
))
10
結果正確!
注意!!函式體內部一旦執行到return
的時候就執行完畢了,並會將結果返回,所以你會發現你在這個過程中加入input()
並沒有用,那麼什麼情況下我們可以輸入呢?
在python互動環境中你可以這樣做
如果你已經把什麼是空函式?就是啥也沒有唄,這個函式什麼都不用做,那麼這個空函式的存在的意義是什麼?my_abs()
的函式定義儲存為abstest.py
檔案了,那麼,可以在該檔案的當前目錄下啟動python直譯器,用fromabstest import my_abs
來匯入my_abs()函式,注意abstest是檔名(不含.py副檔名)
def
abc():
pass
就像有的時候你寫作文,有段文字還沒想好怎麼寫,這時候你就會留著空,pass
語句就是幹這個活的!.
當然pass
也可以用在其他語句裡,比如:
while n>
0pass
缺少了pass
,**執行就會出現語法錯誤
>>
> my_abs(1,
2)traceback (most recent call last)
: file ""
, line 1,in
typeerror: my_abs(
) takes 1 positional argument but 2 were given
如果換成引數型別呢?
>>
> my_abs(
'a')
traceback (most recent call last)
: file ""
, line 1,in
file ""
, line 2
,in my_abs
typeerror: unorderable types:
str(
)>=
int(
)
很顯然,python直譯器無法幫我們檢查錯誤,反觀內建函式abs
>>
>
abs(
'a')
traceback (most recent call last)
: file ""
, line 1,in
typeerror: bad operand type
forabs()
:'str'
是可以檢查出來是引數型別出錯
當傳入了不恰當的引數時,內建函式abs會檢查出引數錯誤,而我們定義的那讓我們來完善它吧!首先,我們要修改的就是函式的定義,讓python直譯器可以對引數型別做檢查my_abs
沒有引數檢查,會導致if語句出錯,出錯資訊和abs
不一樣。所以,這個函式定義不夠完善。
只允許整數和浮點數型別的引數。資料型別檢查可以用內建函式isinstance()
實現:
def
my_abs
(x):
ifnot
isinstance
(x,(
int,
float))
:raise typeerror(
'bad operand type'
)if x >=0:
return x
else
:return
-x
新增了引數檢查後,如果輸入了錯誤的引數型別,函式就可以丟擲乙個確定的錯誤:
>>
> my_abs(
'a')
traceback (most recent call last)
: file ""
, line 1,in
file ""
, line 3
,in my_abs
typeerror: bad operand type
函式可以返回多個值嗎?當然可以。
就像我們在遊戲裡要從乙個點移動到另乙個點,會有橫軸和縱軸座標數值的變化。
給出當前點的座標,以及我們位移的距離和位移的角度就可以計算新的座標
import math
defmove
(x, y, step, angle=0)
: nx = x + step * math.cos(angle)
ny = y - step * math.sin(angle)
return nx, ny
然後,我們就得到獲得返回值啦:import math
語句表示匯入math
包,並允許後續**引用math
包裡的sin
、cos
等函式。
>>
> x, y = move(
100,
100,
60, math.pi /6)
#math.pi是圓周率的數值
>>
>
print
(x, y)
151.96152422706632
70.0
不過,注意!這是一塊鍍了金的鐵,是假象!python函式返回的仍然是單一值。
>>
> r = move(
100,
100,
60, math.pi /6)
>>
>
print
(r)(
151.96152422706632
,70.0
)
明白了吧,這是乙個tuple(元組)!
在語法上,返回乙個tuple可以省略括號,而多個變數可以同時接收乙個tuple,按位置賦給對應的值,所以,python的函式返回多值其實就是返回乙個tuple,但寫起來更方便。今天的學習就止於此啦,大家晚安!
高中生零基礎學python(六)
今天我們要學習的是函式的引數 例如,我們寫乙個計算x2的函式 def power x return x x對於函式,引數就是乙個位置引數x 當我們呼叫函式的時候,就只能傳入乙個引數x power 2 4 power 10 100如果我們要計算x3,x4怎麼辦呢?當然,你可以重新再定義乙個函式,but...
高中生零基礎下python(十八)
回顧一下我們這兩天學的高階函式 map 函式可以將傳入的函式作用到序列的每個元素並作為新的iterator返回 reduce 函式把乙個函式作用在乙個序列 x1,x2,x3,上,這個函式必須接收兩個引數,reduce把結果繼續和序列的下乙個元素做累積計算 filter 的作用是從乙個序列中篩出符合條...
零基礎學Python
零基礎學python 1 1 python是一門指令碼語言 2 python的優勢 1 語法和結構比較簡單,易入門 2 能夠跨平台使用 3 應用範圍廣,設計到作業系統 3d動畫 web 雲計算,企業應用等多方面。3 idle 是乙個python shell,類似於windows的cmd視窗 4 pr...