def 函數(shù)名(參數(shù)1,參數(shù)2,參數(shù)3,...): 函數(shù)體 return 返回的值函數(shù)名()注意:函數(shù)名要能反映其意義
?示例:
def func(): #函數(shù)的定義 print("Hello wprld")func() #函數(shù)的調(diào)用(調(diào)用就是函數(shù)名加上括號(hào))
?
return語句【表達(dá)式】退出函數(shù)(結(jié)束一個(gè)函數(shù)的執(zhí)行),選擇性地向調(diào)用方返回一個(gè)表達(dá)式。
返回值可以是任意數(shù)據(jù)類型。
如果函數(shù)有返回值,必須使用變量接收才有效果。
返回值情況:
1,返回值為None的情況
當(dāng)不寫return時(shí),默認(rèn)返回值為None
return不加參數(shù)時(shí),返回None
return None
2,返回值不為None的情況
返回一個(gè)值: return xxx 返回一個(gè)值(一個(gè)變量) 任意數(shù)據(jù)類型
返回多個(gè)值: return a,b,[1,2,3] ; 用一個(gè)變量接收時(shí)返回的是一個(gè)元祖,也可以用相應(yīng)數(shù)量的變量去接收, 可以返回任意多個(gè)、任意數(shù)據(jù)類型的值
?
示例:
不寫return時(shí),默認(rèn)返回值為Nonedef func(): #函數(shù)定義 s ="hello world" print(s)str = func() #函數(shù)調(diào)用print('str: %s'%str) #因?yàn)闆]有返回值,此時(shí)的str_len為None運(yùn)行結(jié)果:hello worldstr: Nonereturn不加參數(shù)時(shí),返回Nonedef func(): s ="hello world" print(s) returnstr = func()print('str: %s'%str)運(yùn)行結(jié)果:hello worldstr: Nonereturn Nonedef func(): s ="hello world" print(s) return Nonestr = func()print('str: %s'%str)運(yùn)行結(jié)果:hello worldstr: None返回一個(gè)值def func(): s ="hello world" print(s) return sstr = func() print('str: %s'%str)運(yùn)行結(jié)果:hello worldstr: hello world返回多個(gè)值def func(): s ="hello world" s1 = 'hi' print(s) return 1,2str = func()print(str)運(yùn)行結(jié)果:hello world(1, 2)def func(): s ="hello world" s1 = 'hi' print(s) return 1,2str1,str2 = func()print(str1,str2)運(yùn)行結(jié)果:hello world1 2View Code
?
#-*- coding:utf-8 -*-2def msg(name,age): print("Hello,your name is %s,your age is %s"%(name,age))msg('root',12)View Code位置參數(shù)必須一一對(duì)應(yīng),缺一不可
關(guān)鍵字參數(shù)必須在位置參數(shù)右邊
對(duì)同一個(gè)形參不能重復(fù)傳值
# #-*- coding:utf-8 -*-## 按照順序?yàn)楹瘮?shù)形參傳值# def msg(name,age,sex):# print("Hello,your name is %s,age is %s,sex is %s"%(name,age,sex))# msg('root',12,'男')#有位置參數(shù)和關(guān)鍵字參數(shù)時(shí),關(guān)鍵字參數(shù)要放在位置參數(shù)后面# def msg(name,age,sex):# print("Hello,your name is %s,age is %s,sex is %s"%(name,age,sex))# msg('root',12,sex= '男')# 參數(shù)中有多個(gè)關(guān)鍵字參數(shù)時(shí),關(guān)鍵字參數(shù)不分先后順序# def msg(name,age,sex):# print("Hello,your name is %s,age is %s,sex is %s"%(name,age,sex))# msg('root',sex= '男',age= 22)正確示例
?
# 關(guān)鍵字參數(shù)放在了位置參數(shù)的前面# def msg(name,age,sex):# print("Hello,your name is %s,age is %s,sex is %s"%(name,age,sex))# msg(name='root',22,'男')# def msg(name,age,sex):# print("Hello,your name is %s,age is %s,sex is %s"%(name,age,sex))# msg('root',age=12,'男')錯(cuò)誤示例
?
在調(diào)用函數(shù)時(shí)可以不給有默認(rèn)值的形參傳值
無論是函數(shù)的定義還是調(diào)用,默認(rèn)參數(shù)的定義應(yīng)該在位置形參右面
只在定義時(shí)賦值一次
默認(rèn)參數(shù)通常應(yīng)該定義成不可變類型
def msg(name,age,sex='男'): #默認(rèn)參數(shù)在關(guān)鍵字參數(shù)后面 ...
?
def test(x,y=2): print(x) print(y)test(2) #只給一個(gè)參數(shù)傳值,則另外一個(gè)使用默認(rèn)值View Code
?
4.1*args? 接收的是實(shí)參,位置參數(shù),將轉(zhuǎn)化成元祖返回def test(*args): print(args)test(1,2,3,4,5)運(yùn)行結(jié)果:(1, 2, 3, 4, 5)View Code
def test1(x,*args): print(x) print(args)test1(1,2,3,4,5)運(yùn)行結(jié)果:(2, 3, 4, 5)View Code
?
?
?
4.2*kwargs 接收的是實(shí)參,關(guān)鍵字參數(shù),將轉(zhuǎn)化成字典返回def func(a,b,**kwargs): print(a,b,kwargs)func(a = 10,b = 20,cc = 30,dd = 40)運(yùn)行結(jié)果:10 20 {'cc': 30, 'dd': 40}View Code?參數(shù)定義順序:位置參數(shù)->*args->默認(rèn)參數(shù)->**kwargs
?
在函數(shù)中定義的變量稱為局部變量,在程序的一開始定義的變量稱為全局變量。
全局變量作用域是整個(gè)程序,局部變量作用域是定義該變量的函數(shù)。
當(dāng)全局變量與局部變量同名時(shí),在定義局部變量的函數(shù)內(nèi),局部變量起作用;在其它地方全局變量起作用。
global關(guān)鍵字:在函數(shù)內(nèi)部修改全局變量
?
定義在函數(shù)內(nèi)部的變量擁有一個(gè)局部作用域,定義在函數(shù)外的擁有全局作用域。局部變量只能在其被聲明的函數(shù)內(nèi)部訪問,而全局變量可以在整個(gè)程序范圍內(nèi)訪問。調(diào)用函數(shù)時(shí),所有在函數(shù)內(nèi)聲明的變量名稱都將被加入到作用域中。如下實(shí)例:#!/usr/bin/python#-*- coding:UTF-8 -*-total = 0 # 這是一個(gè)全局變量def sum(arg1,arg2): '''返回2個(gè)參數(shù)的和''' total1 = arg1 arg2 #total在這里局部變量 print('函數(shù)內(nèi)是局部變量:',total) return(total)#調(diào)用sum函數(shù)sum(10,20);print('函數(shù)外是全局變量:’,total)#輸入結(jié)果函數(shù)內(nèi)是局部變量:30函數(shù)外是全局變量:0View Code變量查找順序:先查找全局作用域,然后內(nèi)置作用域global關(guān)鍵字:可以是在函數(shù)內(nèi)部聲明的變量變成全局變量nonlocal關(guān)鍵字:可以讓內(nèi)部函數(shù)中的變量在上一層函數(shù)中生效,外部必須要有這個(gè)變量?
# -*- coding: UTF-8 -*-globvar = 0def set_globvar_to_one(): global globvar # 使用 global 聲明全局變量 globvar = 1def print_globvar(): print(globvar) # 沒有使用 globalset_globvar_to_one()print globvar # 輸出 1print_globvar() # 輸出 1,函數(shù)內(nèi)的 globvar 已經(jīng)是全局變量View Code
lambda[arg1[,arg2,......argn]]:expression如下實(shí)例:#!/usr/bin/python#-*- coding:UTF-8 -*-sum = lambda arg1,arg2:arg1 arg2;print('相加后的值為:‘,sum(10,20)print('相加后的值為:‘,sum(20,20)以上實(shí)例輸出結(jié)果:相加后的值為:30相加后的值為:40View Code
定義:
python中的閉包從表現(xiàn)形式上定義(解釋)為:如果在一個(gè)內(nèi)部函數(shù)里,對(duì)在外部作用域(但不是在全局作用域)的變量進(jìn)行引用,那么內(nèi)部函數(shù)就被認(rèn)為是閉包
def func1(): x = 12 def func2(): print(x) return func2f = func1()print(type(f))print(f)f()執(zhí)行結(jié)果:<class 'function'><function func1.<locals>.func2 at 0x000002016685B9D8>12View Code結(jié)合這段簡(jiǎn)單的代碼和定義來說明閉包:如果在一個(gè)內(nèi)部函數(shù)里:f2()就是這個(gè)內(nèi)部函數(shù),對(duì)在外部作用域(但不是在全局作用域)的變量進(jìn)行引用:x就是被引用的變量,x在外部作用域f1()里面,但不在全局作用域里。則這個(gè)內(nèi)部函數(shù)f2()就是一個(gè)閉包?! 暮瘮?shù)的定義角度出發(fā):函數(shù)可以嵌套使用,可以把函數(shù)當(dāng)成參數(shù)或返回值進(jìn)行傳遞,函數(shù)也可以作為容器類型的元素,作為一個(gè)變量可以去賦值。 在這個(gè)簡(jiǎn)單的例子當(dāng)中,函數(shù)f1()中嵌套定義另一個(gè)函數(shù)f2(),內(nèi)部的函數(shù)f2()引用了外部函數(shù)f1()的變量,函數(shù)f2()被當(dāng)成夾帶外部變量的?對(duì)象?返回給f1(),這樣就形成一個(gè)閉包函數(shù)。 實(shí)例化輸出的時(shí)候 定義的 f=f1()中, 其實(shí) f 就是函數(shù)f2()(不準(zhǔn)確但是好理解)。這里需要注意的是,f 是一個(gè)函數(shù)名,加上()就能當(dāng)作函數(shù)來用了。(因?yàn)閒2()返回的是一串函數(shù)執(zhí)行過程的包)閉包的用途閉包就是為了不動(dòng)原函數(shù)里面的代碼,還要給它增加‘新功能’的一種手段。
#_*_coding:utf-8_*_def login(func): def inner(): _username = 'alex' _password ='123' username = input("user:") password = input("password:") if username == _username and password ==_password: print("Login Sucess") else: print("Error") return inner@login # home = login(home)def home(): print("---Home Page----")def pic(): print("-----Picture-----")#home = login(home)home()無參裝飾器
?
user_status = Falsedef login(auth_type): def outer(func): def inner(*args,**kwargs ): _name= 'alex' _passwd = '123' global user_status if user_status == False: name = input('姓名:') password = input('密碼:') if name == _name and password == _passwd: print("welcome") user_status = True else: print('error') if user_status == True: func(*args,**kwargs) return inner return outer@login('qq')def home(abc): print("====首頁(yè)=====")# @logindef vidio(): print("電影")def book(): print("書籍")home1 = login('qq')home = home1(home)home('qa')有參裝飾器
?
?來源:http://www.icode9.com/content-1-147551.html聯(lián)系客服