丹的Python學習筆記Day7函式

2021-07-25 13:03:43 字數 4936 閱讀 7924

********以下筆記參考廖雪峰老師的python教程

1. python內建函式呼叫(如)

求絕對值:abs()

求最大值:max()

資料型別轉換:int()

函式名是指向乙個函式物件的引用,把函式名賦給乙個變數相當於給這個函式起別名。

2. 函式定義:

定義乙個函式quadratic(a,b,c),接收3個引數,返回一元二次方程的兩個解。

import math

def quadratic(a,b,c):

t=math.sqrt(b**2-4*a*c)

x1=(-b+t)/(2*a)

x2=(-b-t)/(2*a)

return x1,x2

print(quadratic(2, 3, 1))

這是我自己寫的廖老師該章節的練習,對比其他同學的答案發現很不嚴密:1.沒有考慮非法值的判斷;2.沒有考慮(b^2-4ac)是否大於0

另外在寫**中,發現:1. python中冪的表示x**y;2. *不可省略

以下是重寫**:

注:raise顯示錯誤:

當程式出現錯誤,python會自動引發異常,也可以通過raise顯示地引發異常。一旦執行了raise語句,raise後面的語句將不能執行。

import math

def quadratic(a,b,c):

if not isinstance(a, (int,float)):

raise typeerror('bad oprand type')

if not isinstance(b, (int,float)):

raise typeerror('bad oprand type')

if not isinstance(c, (int,float)):

raise typeerror('bad oprand type')

if a==0:

return('非一元二次方程')

t=b**2-4*a*c

if t>0:

t=math.sqrt(t)

x1=(-b+t)/(2*a)

x2=(-b-t)/(2*a)

return('方程有兩個根',x1,x2)

elif t==0:

x=-b/(2*a)

return('方程有乙個跟',x)

elif t<0:

return('無解')

------------------------------------

print(quadratic(2, 3, 1))

print(quadratic(1, 3, -4))

print(quadratic(1, 1, 1))

print(quadratic(0, 1, 1))

輸出結果為:

('方程有兩個根', -0.5, -1.0)

('方程有兩個根', 1.0, -4.0)

無解非一元二次方程

函式體內部的語句在執行時,一旦執行到return,函式就執行完畢,並將結果返回。

如果沒有return語句,函式執行完畢後會自動返回none;return none可以簡寫為return。

注:python函式中print()和return()的區別:

這兩個看起來輸出結果一樣,但是內涵是完全不一樣的

return的作用之一是返回計算的值

print的作用是輸出資料到控制端

def add (x, y):

z = x + y

return/print z

如此段**中,如果是return z,則返回了z,如果不在之後print z 的話則沒有輸出

如果是print z,則該函式沒有return,預設返回值是none,會多出乙個空值,但會直接輸出z的值

3. 定義函式呼叫,如需要呼叫abstest.py中的quadratic函式,應寫為:

from abstest import quadratic

print(quadratic(0, 1, 1))

4. 空函式:

def  nop():

pass

5. python函式返回值:

python函式可以返回多個值,但這是個假象,python返回的多個值其實是乙個tuple,所以python函式返回的仍然是個單一值

6. 函式的引數:

① 位置引數:

呼叫函式的時候,傳遞的引數都是根據位置來跟函式定義裡的參數列匹配的,比如funcb(100, 99)和funcb(99, 100)的執行結果是不一樣的。

對於func(x)函式,引數x就是乙個位置引數。

② 關鍵字引數:(個人感覺廖老師這部分解釋較為複雜,建議參見該blog)

目的:在程式比較繁瑣的時候,引數順序是很難能記住的,為了讓程式簡單不出錯,會為引數起乙個名字,這就是關鍵字引數的作用;另外,可以為關鍵字引數設定預設值。

③ 預設引數:

func(x,y=2)

把引數y的預設值設定為2,此時,呼叫func(5)時,相當於呼叫func(5,2)

如果需要改變y的值,則可直接傳入(5,3)

注:設定引數時:1) 必選引數在前,預設引數在後;2) 變化大的引數放在前面,變化小的引數放在後面。

預設引數易錯點:

def

add_end

(l=):

return l

>>>add_end()呼叫預設引數,輸出['end'],再次呼叫時結果為['end','end']

原因:

python函式在定義的時候,預設引數的l的值被定義為,因為預設引數l也是乙個變數,它指向,每次呼叫該函式,如果改變了l 的內容,則下次呼叫時,預設引數的內容就變了,不再是函式定義時候的l了。

傳入引數[1,2,3]時,接下來的**都是針對[1,2,3],和l=沒有關係。當沒有傳入引數時,之後的**針對l的預設值進行修改。

預設引數必須指向不變物件!

④ 可變引數:

1)可變引數:*list

目的:傳入不確定個數的引數。

其他方法:可通過構建乙個list或tuple傳入不確定個數的引數。如:func([1,2,3,4,5])

,如:def func(names)

for name in names:

print(name)

傳值時,需要先構建list,func(['zhangsan','lisi','wangwu'])

可變引數:在引數前加*,如:

def func(*names)

for name in names:

print(name)

可以直接傳:func(『zhangsan』,'lisi','wangwu');在函式內部,引數names收到的是乙個tuple

2)關鍵字引數**kw

傳入dict的key值,常用**kw表示

和可變函式的區別:可變引數允許你傳入0個或任意個引數,這些可變引數在函式呼叫時自動組裝為乙個tuple。而關鍵字引數允許你傳入0個或任意個含引數名的引數,這些關鍵字引數在函式內部自動組裝為乙個dict。

a. 判斷關鍵字引數:

def persons(name,age,**kw)

if 'city' in kw

pass

if 'job' in kw

pass

b. 命名關鍵字引數(即只接收指定的關鍵字作為關鍵字引數)

如:只接收city和job作為關鍵字引數

def persons(name,age,*,city,job):

print(name,age,city,job)

*後面的引數被視為命名關鍵字引數。命名關鍵字引數必須傳入引數名。

如果函式定義中已經有乙個可變引數,後面跟著的命名關鍵字引數不需要單獨出乙個*了

⑤ 引數組合:

5種引數定義的順序必須是:必選引數(位置引數)、預設引數、可變引數、命名關鍵字引數和關鍵字引數。

如:

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

print('a=',a,'b'=,b,'c=',c,'args=',args,'kw=',kw)

輸入:args=(1,2,3,4)

kw=f1(*args,**kw)

輸出:a=1,b=2,c=3,args=(4,),kw=

7. 遞迴函式:在乙個函式內呼叫自身本身。

如:fact=n!

即:fact(n)=n*fact(n-1),當n=1時特殊處理

def fact(n):

if n==1:

return 1

return n*fact(n-1)

print(fact(5))

個人理解相當於利用遞推公式和截止條件計算。(不用人腦算通項公式了哈哈哈)

使用遞迴函式需要防止棧溢位。

④ 關鍵字引數:

目的:在程式比較繁瑣的時候,引數順序是很難能記住的,為了讓程式簡單不出錯,會為引數起乙個名字,這就是關鍵字引數的作用。

丹的Python學習筆記Day3

20160910 今天上班不太忙,摸魚 1.python可以處理的資料型別 整數,運算結果永遠是精確的 包括除法 浮點數,注意,此處的e代替10,用來表示科學計數法,如2e2 2 2 2,且浮點數運算有四捨五入的誤差 字串布林值 2.特殊符號的表示 和 是一種表示方式,如果想要輸出符號本身,對於 可...

丹的Python學習筆記Day6dict和set

1.dict dictionary,使用鍵 值 key value 儲存 d 其中,zhangsan 等名字相當於dict d 的key,而95等為value,通過d zhangsan 可以通過key快速查詢value 乙個key只能對應乙個value,且key必須是不可變物件,list和可變tup...

Python學習筆記 day0

本部落格標題設計敏感關鍵字0day,違反相關法律法規,現已處理。1.輸入 raw input 這個可以輸入一行。和c 不同,它不能讀取單個整數 我的意思是,它是以字串儲存的。所以沒有什麼諸如 d這種東西。name raw input 這樣就可以讀入乙個字串,相當於gets name 考慮到人性化設計...