********以下筆記參考廖雪峰老師的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) 變化大的引數放在前面,變化小的引數放在後面。
預設引數易錯點:
>>>add_end()呼叫預設引數,輸出['end'],再次呼叫時結果為['end','end']def
add_end
(l=):
return l
原因:
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 考慮到人性化設計...