函数及装饰器
1、函數(shù)
?# 定義函數(shù)
?# 如果不主動調用函數(shù),函數(shù)是不會執(zhí)行的
?def say_hello():
???? print 'hello1'
???? print 'hello2'
???? print 'hello3'
?# 函數(shù)的調用
?say_hello()
?def sum_2_sum():
???? """對兩個數(shù)字的求和"""
???? num1 = 20
???? num2 = 20
???? result = num1 + num2
? ? print '%d + %d = %d' %(num1,num2,result)
?sum_2_sum()
?
"""
函數(shù)參數(shù)的使用
在函數(shù)名后面的小括號內填寫 參數(shù)
多個參數(shù)之間使用 , 分隔
"""
# 定義函數(shù)時的變量,叫形參 形參可以任意起名字
def sum_2_sum(num1,num2):
??? """
??? :param num1:
??? :param num2:
??? :return:
??? """
??? result = num1 + num2
??? print '%d + %d = %d' %(num1,num2,result)
# 在調用函數(shù)的時候
# 在調用函數(shù)時傳遞得參數(shù)稱為實參(真實的數(shù)據信息)
sum_2_sum(5,20)
2、函數(shù)變量的作用域
局部變量:在函數(shù)內部定義的普通變量,只在函數(shù)內部作用,函數(shù)執(zhí)行結束
變量會自動刪除
全局變量
#通過變量id來判斷哪個是局部變量,哪個是全局變量
例1:
a = 1
print 'outside:',id(a)
def fun():
??? global a # 聲明a為全局變量
??? a = 5
??? print 'inside:',id(a)
fun()
print a
print id(a)
例2:
def test(num):
??? print '在函數(shù)內部%d對應的內存地址是%d' %(num,id(num))
??? result = 'hello'
??? print '函數(shù)要返回的數(shù)據的內存地址是 %d' %id(result)
??? return result
a = 10
print 'a變量保存數(shù)據的內存地址是%d' %id(a)
r = test(a)
print '%s 的內存地址是 %d' %(r,id(r))
?
3、函數(shù)形參之四大參數(shù):
參數(shù):形參 實參
形參:位置參數(shù) 默認參數(shù) 可變參數(shù) 關鍵字參數(shù)
1.位置參數(shù):形參和實參個數(shù)必須保持一致
?def getInfo(name,age):
???? print name,age
?getInfo(age=12,name='westos')
2.默認參數(shù):形參和實參的個數(shù)可以不一致
?def mypow(x,y=2):
???? 求x的y次方,y的值默認為2
???? :param x:
???? :param y:
???? :return:
???? """
???? print x**y
?mypow(4)
?# 默認形參可以改變
?mypow(4,3)
3.可變參數(shù)
?def mysum(*agrs):
???? """
???? *args:是可變參數(shù)
????? args:是元組類型數(shù)據
????? args:名字可變(因為是形參 名字可變)
???? :param agrs:
???? :return:
???? """
???? print agrs
???? sum = 0
???? for item in agrs:
???????? sum += item
???? print sum
?#對list tuple set 解包時,只需要在變量前加 *
?nums = [1,2,3,4,66,78]
?nums1 =(1,2,3,4,5)
?nums2 = {1,2,3}
# *nums:解包
?mysum(*nums2)
mysum(1,2,3,4,5)
4.關鍵字參數(shù)
def getStuInfo(name,age,**kwargs):
??? """
??? **kwargs:是一個字典;可以傳遞任意多的key-value對
??? :param name:
??? :param age:
??? :param kwargs:
??? :return:
??? """
??? print name,age
??? print kwargs
getStuInfo('westos',18,hobbies=['code','running'],gender ='female')
4、函數(shù)的返回值
#返回值:函數(shù)運算的結果,還需要進一步操作時,給一個返回值
return用來返回函數(shù)執(zhí)行結果的,如果沒有返回值,默認為None
python可以間接返回多個值(返回了一個元組)
一旦遇到return,函數(shù)執(zhí)行結束,后面的代碼不會執(zhí)行
def mypow(x, y=2):
??? return x ** y, x + y
??? print 'hello'
??? # pass
# 對元組進行解包
a,b = mypow(3)
print a,b
map參數(shù):
def f(x):
??? return x*x
# map()傳入的第一個參數(shù)是一個函數(shù),第二個參數(shù)是一個序列
print map(f,[1,2,3,4])
print map(lambda x:x*x,[1,2,3,4])
5、裝飾器:
"在不改變原函數(shù)的基礎上,給函數(shù)增加功能"
把一個函數(shù)當作參數(shù),返回一個替代版的函數(shù)
本質上:返回函數(shù)的函數(shù)
def func1():
???? print 'have a nice day!'
?def func2():
???? print 'good luck!'
?def outer(func):
???? def inner():
???????? print '*********'
???????? func()
??????? print '&&&&&&&&&&&&'
???? return inner
?func1 = outer(func1)
?func1()
def say(age):
??? print 'man is %d years old' % age
def outer(func):
??? def inner(age):
??????? if age < 0:
??????????? age = 0
??????? func(age)
??? return inner
# "化妝過的函數(shù)"
say = outer(say)
# 其實是調用的新的函數(shù)
say(-10)
6、語法糖
def desc(fun):
??? def add_info():
??????? print '中秋快樂'
??????? fun()
??????? print '北京歡迎你'
??? return add_info
?
# 語法糖
@desc
def login():
??? # print '中秋快樂...'
??? print 'login....'
??? # print '北京歡迎你...'
@desc ? ? ? ? ? ? ? ? ? ? ? ? # logout=desc(logout)
def logout():
??? print 'logout....'
@desc
def savemoney():
??? print '存錢...'
@desc
def transferMoney():
??? print '轉賬....'
??? # def ..
login()
logout()
savemoney()
transferMoney()
?
注意:
def desc(fun):
??? def add_info():
??????? print '中秋快樂'
??????? fun()
??????? print '北京歡迎你'
??? return add_info
?
@desc
def login():
print 'logoin....'
login()
"""上下兩個意思相同,裝飾器的表達方式和語法糖的表達方式"""
def desc(fun):
def add_info():print '中秋快樂'fun()print '北京歡迎你'return add_infodef logout():print 'logout....' logout()
logout = desc(logout)
logout()
?
?
?
?
?
總結
- 上一篇: 元组、列表、字典及集合练习
- 下一篇: 列表及字典生成式