6.1 函式介紹
1 為什麼要有函式?沒有函式帶來的困擾?
組織結構不清晰,可讀性差
**冗餘
可擴充套件性差
2 什麼是函式
具備某乙個功能的工具---》函式
事先準備工具-》函式的定義
拿來就用、重複使用-》函式的呼叫
ps:先定義後呼叫
3 函式的分類:
內建函式:len,max(10,11),help(函式名)
自定義函式:def
語法:def 函式名(引數1,引數2,...):
"""注釋"""
函式體6.2 函式的定義
定義函式階段都發生了什麼事:只檢測語法,不執行**
定義階段
***='male'
defauth():
***name=input('name>>:').strip()
password=input('password>>:').strip()if name =='egon' and password == '123':print('login successfull')else:print('user or password err')#呼叫階段
auth()
函式的使用:先定義後呼叫
#定義階段
deffoo():print('from foo')
bar()defbar():print('from bar')#呼叫
foo()
定義函式的三種形式
第一種:無參函式
defauth():
name=input('name>>:').strip()
password=input('password>>:').strip()if name =='egon' and password == '123':print('login successfull')else:print('user or password err')
第二種:有參函式
defauth(name,password):if name =='egon' and password == '123':print('login successfull')else:print('user or password err')definteractive():
name=input('name>>:').strip()
password=input('password>>:').strip()
auth(name,password)
interactive()
第三種:空函式
defauth():pass
defput():pass
6.3 函式的呼叫
函式的呼叫:函式名加括號
1 先找到名字
2 根據名字呼叫**
6.3.1 函式的返回值
return的特點:
1、函式內可以有多個return,但是只能執行一次return
2、執行return函式就立刻結束,並且return的後值當做本次呼叫的結果返回
3、返回的值沒有型別限制
defmy_max(x,y):if x >=y:return x #只能執行一次return
else:return y
return返回值的個數
1: 沒有return:預設返回none
2:return 值:值本身
3:return 多個值:返回乙個元組
6.3.2函式呼叫的三種形式
defmy_max(x,y):if x >=y:returnxelse:return y
1、語句形式
res1=my_max(1,2)
2、表示式形式
res2=my_max(1,2)*10
3、當中另外乙個函式的引數
res3=my_max(my_max(1,2),3)
6.4 函式的引數
函式的引數分類兩種:
形參:在定義階段括號內指定的引數,相當於變數名
實參:在呼叫階段括號內傳入的值稱之為實參,相當於值
#在呼叫階段,實參的值會繫結給形參,在呼叫結束後解除繫結
def foo(x,y): #x=1,y=2
print(x,y)
foo(1,2)
6.4.1 位置引數
位置引數:按照從左到右的順序依次定義的引數
位置形參:必須被傳值,多乙個少乙個都不行
位置實參:與形參一一對應傳值
deffoo(x,y):print(x,y)
foo(2,1)
6.4.2 關鍵字引數
關鍵字引數:在函式呼叫時,按照key=value的形式定義的實參
特點:指名道姓地給形參傳值,不再依賴與位置
foo('egon',18,'male')
foo(***='male',age=18,name='egon') #關鍵字引數
foo('egon',***='male',age=18,name='egon') #關鍵字實參必須在位置實參的後面
注意:1、 關鍵字實參必須在位置實參的後面
2、 不能為同乙個引數賦值多次
6.4.3 預設引數
預設引數:在函式定義階段,就已經為形參賦值了
特點:定義階段已經有值意味著呼叫階段可以不用傳值
位置引數通常用於經常變化的引數,而預設引數指的是大多數情況下都一樣的
def foo(x,y=1): #y有預設值
print(x,y)
foo(1,2) #位置實參
foo(y=3,x=1) #關鍵字引數
foo(111)
foo(x=1111) #為給y傳參
注意:1、預設引數必須放到位置形參的後面
def register(name,***='male',age,): #報錯
print(name,age,***)
2、預設引數的值只在定義時被賦值一次
3、預設的引數的值通常應該是不可變型別
6.4.5 可變長引數
可變長引數:在呼叫函式時,實參值的個數不固定
實參的形式有:位置實參和關鍵字實參,
形參的解決方案:* , **
#*args的用法
def foo(x,y,*args): #z=(3,4,5,6)
print(x,y)print(args)
foo(1,2,3,4,5,6)
foo(1,2,*[3,4,5,6]) #foo(1,2,3,4,5,6)
foo(*[1,2,3,4,5,6]) #foo(1,2,3,4,5,6)
#**kwargs
def foo(x,y,**kwargs): #kwargs=
print(x,y)print(kwargs)
foo(y=2,x=1,a=3,b=4,c=5)
foo(y=2,**) #foo(y=2,a=3,c=5,b=4)
deffoo(name,age):print(name,age)
foo(**)
foo()
6.4.6 命名關鍵字引數
命名關鍵字引數:指的是定義在*後的引數,該引數必須被傳值(除非有它有預設值),而且必須按照key=value的形式傳值
def foo(x,y,*args,m=100000,n):print(x,y)print(args)print(m,n)
foo(1,2,3,n=4,)def foo(x,y,*,m=100000,n):print(x,y)print(args)print(m,n)
foo(1,2,3,n=4,)
6.5 函式物件
函式是第一類物件:指的是函式可以當做資料傳遞
1、可以被引用 x=1,y=x
deffunc(x,y):print(x,y)
f=func #獲得函式名
f(1,2) #呼叫函式
2、可當做函式的引數傳入
deffoo():print('from foo')def bar(func): #函式為引數
#print(func)
func()
bar(foo)
3、可以當做函式的返回值
deffoo():print('from foo')defbar():return foo #返回函式
f=bar()
f()4、可以當做容器型別的元素
deffoo():print('from foo')defbar():returnfoo
l=[foo,bar] #函式為列表元素
print(l)
l[0]()#呼叫函式
利用該特性,取代多分支的if
defget():print('get')defput():print('put')defls():print('ls')defauth():print('auth')
func_dic=#func_dic['put']()
cmd = input('>>:').strip()if cmd infunc_dic:
func_dic[cmd]()
6.6 函式巢狀
6.6.1函式的巢狀呼叫
defmy_max(x,y):if x >=y:returnxelse:returnydefmy_max4(a,b,c,d):
res1=my_max(my_max(a,b),c) #函式巢狀呼叫
res2=my_max(res2,d)return res2
6.6.2函式的巢狀定義
deff1():deff2():print('from f2')deff3():print('from f3')
f3()#print(f2)
f2()
f1()#f2
7 命名空間與作用域、閉包函式、 裝飾器
8 迭代器、 生成器、 面向過程程式設計
9 三元表示式、列表推導式和生成器表示式
10 遞迴呼叫、 二分法
11 匿名函式、內建函式
Linux上用anaconda安裝pytorch
pytorch是乙個非常優雅的深度學習框架。使用anaconda可以非常方便地安裝pytorch。下面我介紹一下用anaconda安裝pytorch的步驟。bash anaconda shconda install pytorch torchvision cuda75 c pytorchcuda8....
不安裝Python的情況下用C 呼叫Python
想在不安裝python的情況下呼叫它,網上說的方法都不太詳細,就連官方給的chm檔案也沒提及怎麼配置,摸索了下,找到了簡單呼叫的辦法。記錄下。msvs 2010 c console程式 python 2.7 include資料夾 libs資料夾 lib資料夾 python27.dll檔案 新建控制台...
C 實現Matlab的psf2otf函式
最近在用c 實現l0smooth的 其中裡面用到了psf2otf這個函式,但是opencv沒有,因此我自寫了乙個。關於這個函式的介紹,你可以參考matlab的官方文件及其源 也可以參考這裡寫的乙個記錄,這裡不做過多介紹了。filename filter.cpp version 0.10 author...