標籤:

Python學習(二)

和R語言類似help()可以查看函數的詳細信息,

調用函數時,如果傳入參數不對,那麼Python會報錯

##一個小程序,在CMD中運行既可以得到結果l=(255,1000)for i in l: print(i,的十六進位表示是:,hex(i))

1.定義函數:需要用到def語句,依次寫函數名,括弧,括弧中的參數以及冒號然後再縮進塊中編寫函數,函數的返回值均用return語句,如果沒有return 語句的話函數執行完畢也會返回結果,結果是None(等價於return none)

#定義自己的取絕對值函數def my_abs(x): if not isinstance(x,(float,int)):#限制輸入參數數據類型 raise TypeError(bad operand type)#反饋錯誤 if x>=0: return x else: return -x#將文件保持在python安裝目錄下,命名為functions.py#使用自己定義的函數print(my_abs(-11))#關閉IDE重新調用函數,查看是否可以調用:from functions import my_abs #調用函數語句from xxx(文件) import xx(函數)print(my_abs(-11))#定義空函數:(沒有想好要寫的函數時可以讓代碼先運行起來,可以這樣做)def no_func(x): pass

2.返回多個值,此時返回的是元組數據類型(元組中數據的指向不能發生變化,但是list可以改變)

#本例中引用math包import mathdef move(x,y,step,angle=0):#angle=0是定義默認值為0 nx=x+step*math.cos(angle) ny=y-step*math.sin(angle) return nx,nyfrom functions import move#在IDE中調用movemove(2,3,4.math.pi/6)#計算move#例子求一元二次方程的根#ax^2+bx+c=0,求一階導得到取極值條件2ax+b=0,x=-b/2a,將x=-b/2a代入ax^2+bx+c中得到判別式#當a>=0時,我們另判別式<=0即可得到有解條件下的abc,反之則另判別式>0即可import mathdef quadratic(a,b,c): y1=-c/b y2=-b/(2*a) y3=(-b-math.sqrt(b**2-4*a*c))/(2*a) y4=(-b+math.sqrt(b**2-4*a*c))/(2*a) if not isinstance(a,(int,float)): raise TypeError(bad operand type) if not isinstance(b,(int,float)): raise TypeError(bad operand type) if not isinstance(c,(int,float)): raise TypeError(bad operand type) if a==0: return y1 if b**2-4*a*c==0: return y2 if b**2-4*a*c>0 and y3>=y4: return y4,y3 if b**2-4*a*c>0 and y3<y4: return y3,y4 if b**2-4*a*c<0: return

3.重點:①定義函數時需要定義函數名與具體參數(我自己老是寫等於號)

②定義函數前,要注意限制參數的數據類型

③函數體內部可以使用return隨時返回函數結果

④函數體執行完無return語句時,自動返回node

⑤函數可以同時返回多個值,此時是一個元組

#自行定義power函數def power(x,n): if not isinstance(x,(int,float)): raise TypeError(bad operand type) if x==0: return error s=1 while n>0: n=n-1 s=s*x return s


python中參數分為必選參數與默認參數,自定義函數的默認參數不能夠放在必選參數前,同時在設置多個默認參數時,大的放在前邊,小的放在後邊

def enroll(name,gender,age=18,country=china): print(name:,name) print(gender:,gender) print(age:,age) print(country:,country)enroll(lisa,male)enroll(lisa,male,country=japan)#可以不遵循順序,但需要聲明變數指向enroll(lisa,male,country=japan,20)#會報錯enroll(lisa,male,20)

從這裡可以看到默認參數是指向list的,所以當調用函數改變函數內容時,默認參數也會改變

def add_end(l=[]): l.append(end) return ladd_end([1,2,3])add_end()add_end()#連續調用2次可以看見end隨著調用次數的增加而增加def add_end(l=None):#默認參數指向空值而不是[] if l is None: l=[] l.append(end)#此處是將else的內容和在一起 return l#未優化的代碼:def add_end(l=None): if l is None: l=[] l.append(end) return l else: l.append(end) return l #重色標註的段落是可以優化的代碼#正確的寫法,①def add_end(l=[]):#默認參數指向[]而不是空值 if l is None: l=[] l.append(end) return l#錯誤寫法,②


可變參數指的是傳入參數的個數是可以變化的,

#列印a^2+b^2+...def clac(number): sum=0 for i in number: sum=sum+i*i return sum #①#調用的時候需要傳入list或者tupleclac([1,2,3])#考慮下面def clac(*number):#表示將列表中的數據依次調出 sum=0 for i in number: sum=sum+i*i return sum #②#②僅僅在number前加上*號就得到了可變參數,在函數內部,number接收到的是一個tuple,#所以代碼完全不變,但是調用該函數是可以傳入任意參數clac(1,2,3)#與clac([1,2,3])效果完全一致


可變參數允許傳入0個或任意個參數,在函數調動時自動組裝tuple,

關鍵字參數則是允許傳入0個或者任意哥參數,在函數調用時自動調用組裝dict,

def person(name,age,**kw): print(name:,name,age:,age,others:,kw)#定義關鍵字函數person(micheal,30)person(micheal,30,city=beijing)#名字與年齡之外的數據被裝入others中#與可變參數相似,也可以先組裝一個dict,再把dict轉換為關鍵字傳出extra={city:beijing,job:analyst}person(micheal,30,city=extra[city],job=extra[job])person(micheal,30,**extra)#**extra是指依次將extra中的KV傳進**kw中,extra將不發生改變


函數調用者可以傳入任意不受限制的關鍵字參數,檢查傳入內容需要通過kw檢查,如果要限制關鍵字參數的名字,則可以使用命名關鍵字參數

def person(name,age,**kw): if city in kw: pass if job in kw: pass print(name:,name,age:,age,other:,kw)person(jack,24,city=beijing,addr=chaoyang,zipcode=123456)#檢查關鍵字def person(name,age,*,city,job):#命名關鍵字時*必須寫在可選範圍前 print(name,age,city,job)#命名關鍵字person(jack,18,city=bj,job=engineer)person(jack,18,gender=m,city=bj,job=engineer)#運行代碼後發現,前後的差異在於,後者限定關鍵字插入只能是城市與工作#命名關鍵字是將可選項限定在一定範圍,而關鍵字參數是不對可選項進行限定person(jack,18,job=engineer)#區別於關鍵字參數,命名關鍵字參數未傳入參數也會一樣報錯def person(name,age,*,city=beijing,job):#將北京設為預設值 print(name,age,city,job)person(jack,18,job=engineer)#設置預設值後,不傳入參數不會報錯


在python中定義函數可以用:必選參數,默認參數,可變參數,關鍵字參數和命名關鍵字參數(參數的順序也必須如此)。

def test1(a,b,c=0,*d,**kw): print(a=,a,b=,b,c=,c,d=,d,kw=,kw)def test2(a,b,c=0,*,d,**kw): print(a=,a,b=,b,c=,c,d=,d,kw=,kw)test1(1,2)test1(1,2,a,b)test1(1,2,a,b,x=99)#x=99是KV形式存儲test2(1,2,d=99,x=99)#d是命名關鍵字,必須出現

對於任意函數,都可以通過類似func(*args, **kw)的形式調用它,無論它的參數是如何定義的。

推薦閱讀:

基於新浪微博的男女性擇偶觀數據分析
【數據分析】中文筆記翻譯計劃順利結束
大數據之數據分析精進之路:起跑
數據團隊建設思考
SQL初級數據分析(基於Microsoft Access)

TAG:數據分析 |