Chapter 3 Python函數與條件
3.1 函數基本寫法
def 函數名稱(input1,input2=value,*input3,**input4):
/* 程序每行「內縮2格」 */
return ...
input1:無預設值的input
input2:有預設值的input
*input3
:將「無」keyword的arguments合成tuple物件input3。
**input4
:將「有」keyword的arguments合成dictionary物件input4。
3.1.1 預設值
3.1.2 pack to tuple
def test2(input1,*input3):
print('input1 is ', input1)
print('input3 is ', input3)
return None
test2(1,1.2,4,5)
test2(1,[1.2,4],5)
test2(["1","b"],{2,5,7},10)
def test2(input1,**input4):
print('input1 is ', input1)
print('input4 is ', input4)
return None
test3(1,a=10,b={2,3})
Any variables specified after a packed variable must be called by name:
3.1.3 unpacking usage
f(1,2,3)
是在call f這個函數, 當進行function calling時,*
可以用在input arguments, 它代表unpacking。(注意,在define function時*
代表packing。
範例: normal pdf
\[\frac{1}{\sqrt{2\pi\sigma^2}}*exp(-\frac{(z-\mu)^2}{2\sigma^2})\]
範例: Cobb-Douglass
\[ u(x,y|\alpha,\beta)=x^{\alpha}y^{\beta} \]
3.1.3.1 範例: 負值index
listA=[1,-2,3,-4,10,"-4"]
[i for i in range(len(listA)) if type(listA[i]) in {int, float} and listA[i]<0]
def negValue_index(listInput):
"""回傳list中負值的位置"""
return [i for i in range(len(listInput)) if
type(listInput[i]) in {int, float} and listInput[i]<0]
應用:
import pandas as pd
finStatement=pd.read_csv("http://mopsfin.twse.com.tw/opendata/t187ap06_O_ci.csv")
dict_finStatement=finStatement.to_dict()
profit=list(dict_finStatement.get('營業利益(損失)').values())
[dict_finStatement.get('公司名稱').get(index) for index in negValue_index(profit)]
寫一個lossFirmList函數,其input為dict_finStatement, output return為負營業利潤公司名稱。
3.2 條件
3.2.1 Block statement
if condition1:
body1
elif condition2:
body2
elif condition3:
body3
.
.
.
elif condition(n-1):
body(n-1)
else:
body(n)
body部份要內縮(indentation):
- One or more whitespace characters (spaces or tabs) is sufficient to serve as indentation.
- A given indented block must use a uniform level of indentation. E.g. if the first line of an indented block has two leading spaces, all subsequent lines in that block must lead with exactly two white spaces.
範例
Function with specified domain. \[f(x)=1/x\ with x\neq0\]
範例
\[f(x)=1/x\]
1. Domain \(D_1=(1,2)\).
2. Domain \(D_2 =[1,2]\).
(
或)
不包含界限;[
丶]
包含
範例
\[\begin{array}{lcl} f1(x) &=& \begin{cases} +x^2 &\quad x≥0,\\ -x^2 &\quad -1<x<0 \end{cases} \\ f2(x) &=& \begin{cases} x^3 &\quad x<0,\\ 3x-2 &\quad 2>x\geq0 \end{cases} \end{array}\]3.2.2 inline statement
A if <condition> else B
3.3 local and global
對多數程式語言,當函數使用到input argument所沒有的物件時,它會去global environment找。
def funDemo():
localC="two"
print(localC)
funDemo() # localC沒有return所以只在函數執行暫時environment存在,函數執行完就消失了。
localC
function被call時會開啟一個環境,叫executive environment,在裡面執行函數程序,中間如果有創造出任何物件(如localC
)會存活在executive environment,然而函數程序完成後整個executive environment會刪除,裡面的物件除非有return,否則值(這裡的"two"
)就消失了。
function input(比如叫x
)若是直接來自global variable(比如叫global1
),它相當於是在做x=global1
的定義式複製。如果global1
是mutable,要小心函數裡對x
值的更改會動到global1
。
3.4 視函數為元素
函數本身也是個物件,所以也可以當元素值儲存
當有一群函數時,可以以dictionary方式存:
PythonFun={
"funDemo": funDemo,
}
PythonFun["funDemo2"]=funDemo2 # 額外加一個不存在的元素
PythonFun.get("funDemo")(); # 或
PythonFun["funDemo"]()
PythonFun.get("funDemo2")(); # 或
PythonFun["funDemo2"]()
注意,Python dictionary才可額外「用index或key」增加不存在原始定義的元素,如果用list就不行;list得使用append method,且list無法給元素名稱。
3.5 Anonymous函數
函數很小時可使用anonymous function寫法,或稱為lambda
lambda input_arguments : expression
相當於
唯一不同是上述lambda用法該行執行完後此函數就消失了,無法再呼叫使用。若想再呼叫使用,可用以下寫法: