版權(quán)聲明:本文為博主原創(chuàng)文章恤磷,未經(jīng)博主允許不得轉(zhuǎn)載液茎。
PS:轉(zhuǎn)載請(qǐng)注明出處
作者: TigerChain
地址: http://www.reibang.com/p/105ee1470d02
本文出自 TigerChain簡(jiǎn)書(shū) Python 系列
教程簡(jiǎn)介
- 1、閱讀對(duì)象
本篇教程適合新手閱讀乔妈,老手直接略過(guò)
-
2蝙云、教程難度
初級(jí)
3、demo 地址:https://github.com/tigerchain/python-study/tree/master/01-basic/03路召、函數(shù) 如果喜歡就給個(gè) star 吧
正文
一勃刨、什么是函數(shù)
1、定義
在編程中股淡,函數(shù)是對(duì)實(shí)現(xiàn)特定功能身隐,并且可以重復(fù)使用的一個(gè)代碼片段。比如 python 的內(nèi)置函數(shù) print()唯灵,函數(shù)的作用:
- 1贾铝、封裝代碼
- 2、降低耦合
- 3、方便復(fù)用
- 4垢揩、方便閱讀
2玖绿、定義函數(shù)的格式
def 函數(shù)名(參數(shù)...):
函數(shù)體
...
ps:函數(shù)體以 : 號(hào)開(kāi)始,并且縮進(jìn)
比如定義一個(gè) 返回 a+b 的函數(shù)
def add(a,b):
return a+b
這樣就自定義了一個(gè)函數(shù)叁巨。
函數(shù)調(diào)用:add(5,6)
即可
demo1:將后一個(gè)姓名列表添加到第一個(gè)列表的末尾
names = ["tigerchain","xiaoming","liubing"]
print("原始的姓名列表是:%s"%names)
# ?定義函數(shù)
def appendList(lists):
names.append(lists)
print("添加后的姓名列表是:%s"%names)
new_names = ["sulei","xiaozhang"]
appendList(new_names)
print("最終的姓名列表是: %s "%names)
運(yùn)行查看結(jié)果:
? python 01斑匪、函數(shù)的基本用法.py
原始的姓名列表是:['tigerchain', 'xiaoming', 'liubing']
添加后的姓名列表是:['tigerchain', 'xiaoming', 'liubing', ['sulei', 'xiaozhang']]
最終的姓名列表是: ['tigerchain', 'xiaoming', 'liubing', ['sulei', 'xiaozhang']]
二、函數(shù)的參數(shù)
1锋勺、形參和實(shí)參
首先我們要明確一點(diǎn) python 中傳遞參數(shù)是按址傳遞的秤标,也就是把變量的引用傳遞進(jìn)去,而不是按值傳遞
- 1宙刘、定義函數(shù)后面的()中的參數(shù)稱為形參
- 2苍姜、調(diào)用函數(shù)的方法,傳遞給函數(shù)的參數(shù)稱為實(shí)參
比如:定義一個(gè)函數(shù)
def addsub(a,b):
return a+b
其中 a 和 b 是形參
調(diào)用方法 addsub(1,5)悬包,其中 1,5 就是實(shí)參
2衙猪、理論上函數(shù)可以傳遞無(wú)數(shù)個(gè)參數(shù),但是不建議這樣干布近,如果多個(gè)參數(shù)垫释,就想辦法抽取多個(gè)方法
def 方法名(形參1,形參2,...,形參n)
demo2:定義一個(gè)函數(shù)撑瞧,輸入三條邊棵譬,看其能不能組成三角形
def sanjiao(x,y,z):#實(shí)際開(kāi)發(fā)中不要使用拼音作為函數(shù)名
if(x+y>z and x+z>y and y+z>x):
print("%d,%d,%d 可以組成三角形"%(x,y,z))
if(x==y==z):
print("并且這是一個(gè)等邊三角形")
elif(x==y or y==z or x==z):
print("并且這是一個(gè)等腰三角形")
elif(x*x+y*y==z*z or y*y+z*z==x*x or x*x+z*z==y*y):
print("并且這是一個(gè)直角三角形")
else:
print("并且這是一個(gè)普通的其解形")
else:
print("不好意思,你三角形的概念好好學(xué)學(xué)吧预伺,不能構(gòu)成三角形")
print("請(qǐng)輸入三角形的三條邊")
x = raw_input("第一條邊:")
y = raw_input("第二條邊:")
z = raw_input("第三條邊:")
sanjiao(int(x),int(y),int(z))
運(yùn)行查看結(jié)果:
demo3:輸入三個(gè)數(shù)订咸,輸出最大數(shù)
def getMax(x,y,z):
max = x
if(y>max):
max=y
if(z>max):
max=z
return max
a = raw_input("請(qǐng)輸入第一個(gè)數(shù):")
b = raw_input("請(qǐng)輸入第二個(gè)數(shù):")
c = raw_input("請(qǐng)輸入第三個(gè)數(shù):")
print("%d,%d,%d 中最大的數(shù)是:%d"%(int(a),int(b),int(c),getMax(int(a),int(b),int(c))))
運(yùn)行查看結(jié)果:
? python 02、形參和實(shí)參.py
請(qǐng)輸入第一個(gè)數(shù):4
請(qǐng)輸入第二個(gè)數(shù):8
請(qǐng)輸入第三個(gè)數(shù):0
4,8,0 中最大的數(shù)是:8
3酬诀、變量的作用域
定義在函數(shù)體中的變量只能在本函數(shù)中有效脏嚷,出了函數(shù)以后就不能被訪問(wèn)
demo1:變量的作用域
def add(x,y):
z = x+y
print z
def new_add():
print("===1====")
z+=4
print("===3===")
print z
add(1,2)
new_add()
運(yùn)行查看結(jié)果:
? python 04、變量作用域.py
3
===1====
Traceback (most recent call last):
File "04瞒御、變量作用域.py", line 13, in <module>
new_add()
File "04父叙、變量作用域.py", line 8, in new_add
z+=4
UnboundLocalError: local variable 'z' referenced before assignment
掛掉了,問(wèn)題出在 new_add() 方法中的 z+=4肴裙,看 error 大概意思就是不能訪問(wèn)之前在 add 方法中定義的 z 變量
三趾唱、函數(shù)的文檔「注釋」
我們知道多行注釋使用 ''' ''' ,函數(shù)的文檔是什么呢蜻懦?就是用來(lái)描述函數(shù)的語(yǔ)句甜癞,但是不會(huì)被編譯,不能使用 # 注釋
demo1:對(duì) add 函數(shù)作文檔說(shuō)明
'''
demo1:對(duì)add 函數(shù)作文檔說(shuō)明
'''
def addFun(a,b):
''' 這個(gè)函數(shù)是返回兩個(gè)整數(shù)的和 '''
return a+b
'''help(addFun) 顯示方法體中的文檔說(shuō)明'''
print __doc__
運(yùn)行查看結(jié)果:
? python 03阻肩、函數(shù)的文檔.py
demo1:對(duì)add 函數(shù)作文檔說(shuō)明
2带欢、局部變量和全局變量
1运授、局部變量:
局部變量是針對(duì)方法而說(shuō)的,沒(méi)有方法局部變量就沒(méi)有意義乔煞,定義在方法體中的變量我們稱為局部變量吁朦,局部變量只能在方法體中被仿問(wèn),在方法體外是不能被仿問(wèn)的渡贾。
2逗宜、全局變量:
定義在方法調(diào)用之前的變量,我們稱為全局變量空骚,全局變量纺讲,所有方法都要以仿問(wèn)
demo2:以下 demo1 中的 x 是修改全局變量 x 還是定義了一個(gè)局部變量 x 呢?
x = 0
def demo1():
x = 100
print("x 的值是%d "%x)
def demo2():
print("x 的值是%d "%x)
pass
demo1()
demo2()
運(yùn)行查看結(jié)果:
? python 04囤屹、變量作用域.py
x 的值是100
x 的值是0
可以看到在 demo1 方法中的變量 x 就是定義一個(gè)局部變量熬甚,對(duì)全局變量 x 一點(diǎn)毛影響也沒(méi)有。那么肋坚,我們?nèi)绾巫?demo1 中的 x 就是修改全局變量 x 呢乡括?,使用 global 關(guān)建字來(lái)聲明即可
稍微修改上面的代碼在 demo1 x = 100 之前加入 global x
global x
x = 100
繼續(xù)運(yùn)行查看結(jié)果:
? python 04智厌、變量作用域.py
x 的值是100
x 的值是100
可以看到我們成功的修改了全局變量诲泌。
demo3:可變類型變量例子
# 定義一個(gè)列表「可變類型」
a = [1,2,3,4]
def demo1():
a.append(5)
print("a 的內(nèi)容是 %s"%a)
def demo2():
print("a 的內(nèi)容是 %s"%a)
pass
demo1()
demo2()
運(yùn)行查看結(jié)果:
? python 04、變量作用域.py
a 的內(nèi)容是 [1, 2, 3, 4, 5]
a 的內(nèi)容是 [1, 2, 3, 4, 5]
我們可以看到铣鹏,執(zhí)行 demo1() 我們就修改了列表敷扫,所以如果聲明的是列表類型的變量,我們就可以直接修改
四诚卸、函數(shù)的參數(shù)(二)
1葵第、缺省參數(shù)
缺省參數(shù),就是我們可以給函數(shù)默認(rèn)設(shè)置參數(shù)惨险,格式如下:
def 方法名(參數(shù)1羹幸,參數(shù)2脊髓,...,參數(shù)n = 值)
PS:在這里一定要注意一點(diǎn)辫愉,缺省參數(shù)一定要放在參數(shù)列表的最后面
demo1:定義函數(shù) demo1(),并且?guī)в袃蓚€(gè)參數(shù)姓名和年齡将硝,并且姓名是默認(rèn)值是'TigerChain'恭朗,輸入看結(jié)果
# -*- coding:utf-8 -*-
'''
demo1:缺省參數(shù)
'''
def demo1(age,name='TigerChain'):
print("name = %s"%name)
print("age = %d"%age)
demo1(12)
運(yùn)行查看結(jié)果:
? python 05、函數(shù)的參數(shù).py
name = TigerChain
age = 12
從上面的 demo 中我們可以看到依疼,如果我們沒(méi)有給默認(rèn)值的參數(shù)傳值的話痰腮,就會(huì)使用默認(rèn)值,如果我們傳遞了呢律罢?答案肯定是按傳遞的值顯示膀值,修改上面代碼棍丐,只是把調(diào)用方法改為 demo(12,'TigerChain001')
查看結(jié)果
? python 05、函數(shù)的參數(shù).py
name = TigerChain001
age = 12
2沧踏、不定長(zhǎng)參數(shù)
我們知道函數(shù)的參數(shù)理論上可以有無(wú)數(shù)個(gè)歌逢,如果一個(gè)函數(shù)要處理比聲明時(shí)更多的參數(shù),這就叫做不定長(zhǎng)參數(shù)翘狱,在傳遞的時(shí)候才會(huì)確定參數(shù)的多少秘案,格式如下:
def 方法名(參數(shù)1,參數(shù)2潦匈,*參數(shù)3阱高,**參數(shù)4):
方法體
PS:其中參數(shù) 1 和參數(shù) 2 沒(méi)有什么說(shuō)的,就是普通的參數(shù)茬缩,參數(shù) 3 傳遞進(jìn)來(lái)的會(huì)被錄作元組存起來(lái)赤惊,參數(shù) 4 「兩個(gè) **」傳遞的是字典
demo2:可變參數(shù) 1
def demo2(param1,param2,*param3):
print "param1 = ",param1
print "param2 = ",param2
print "param3 = ",param3
demo2(1,2,3,4,5,6)
運(yùn)行查看結(jié)果:
? python 05、函數(shù)的參數(shù).py
param1 = 1
param2 = 2
param3 = (3, 4, 5, 6)
我們可以看到 3凰锡,4荐捻,5,6 被當(dāng)作元組傳傳遞過(guò)來(lái)
- 我們修改上面的代碼
def demo3(param1,param2,*param3,**param4):
print "param1 = ",param1
print "param2 = ",param2
print "param3 = ",param3
for key,value in param4.items():
print key ," = ",value
demo3(1,2,3,4,5,name='TigerChain',age=12,address='中國(guó)')
運(yùn)行查看結(jié)果:
? python 05寡夹、函數(shù)的參數(shù).py
param1 = 1
param2 = 2
param3 = (3, 4, 5)
age = 12
name = TigerChain
address = 中國(guó)
- 續(xù)續(xù)修改上面的代碼处面,我們把調(diào)用方式改一下
c = (7,8,9)
d = {"name":"TigerChain","age":12,"sex":"男"}
demo3(1,2,3,c,d)
運(yùn)行查看結(jié)果:
? python 05、函數(shù)的參數(shù).py
param1 = 1
param2 = 2
param3 = (3, (7, 8, 9), {'age': 12, 'name': 'TigerChain', 'sex': '男'})
我們可以看到 c 「元組」 和 d 「字典」 整體被當(dāng)做元組傳到 param3 中了
- 再修改上面的代碼
這次我們?cè)谏厦娲a基礎(chǔ)上菩掏,只是修改調(diào)用方式
demo3(1,2,3,*c,**d)
運(yùn)行查看結(jié)果:
? python 05魂角、函數(shù)的參數(shù).py
param1 = 1
param2 = 2
param3 = (3, 7, 8, 9)
age = 12
name = TigerChain
sex = 男
3、模擬用戶注冊(cè)登錄「函數(shù)版」
demo:用戶注冊(cè)登錄智绸,并且用戶名密碼輸入錯(cuò)誤三次野揪,鎖定
# -*- coding:utf-8 -*-
'''
這是一個(gè)函數(shù)版模擬用戶注冊(cè)登錄
'''
# 定義保存用戶名和密碼的字典
userInfo = {}
# 是否登錄的標(biāo)志
islog = False
# 注冊(cè)方法
def register():
uname = raw_input("添加用戶名: ")
upass = raw_input("添加密碼: ")
userInfo[str(uname)] = upass
print("注冊(cè)成功")
# 登錄方法
def login():
for i in range(3):
global islog
if(islog):
break
username_input = raw_input('請(qǐng)輸入用戶名:')
userpass_input = raw_input("請(qǐng)輸入密碼:")
login_count = 2-i # 判斷還能輸入多少次。
for key in userInfo.keys():
if(str(username_input) == key and userInfo[key]== userpass_input):
print("歡迎 %s 登錄"%key)
islog = True
break
else:
# 最后一次是 0 不再提示
if login_count != 0:
print("用戶名或密碼錯(cuò)誤瞧栗,還可以輸入 %d 次"%login_count)
if(i==2):
print("登錄超過(guò) 3 次斯稳,半個(gè)小時(shí)后再登錄")
register()
login()
運(yùn)行查看結(jié)果:
五、匿名函數(shù)
什么是匿名函數(shù)迹恐,顧名思義就是沒(méi)有名字的函數(shù)
在 python 中使用 lambda 關(guān)建字來(lái)創(chuàng)建匿名函數(shù)「lambda 是一個(gè)表達(dá)多挣惰,不是一個(gè)語(yǔ)句」,格式如下:
lambda [arg1 [,arg2,.....argn]]:expression
demo1:使用 lambda 來(lái)創(chuàng)建一個(gè)加法運(yùn)算函數(shù)
# 定義一個(gè) labmda 表達(dá)式
sum = lambda a,b:a+b
print sum(1,4)
運(yùn)行查看結(jié)果:
? python 07殴边、匿名函數(shù).py
5
demo2:使用 lambda 作為方法參數(shù)「函數(shù)式編程」
# 定義一個(gè)函數(shù)憎茂,參數(shù)分別是普通變量和一個(gè)函數(shù)
def fun(a,b,func):
return func(a,b)
result = 0
e = ''
while True:
if e=='e':
break
if e == 'c' or e =='':
a = int(raw_input("請(qǐng)輸入一個(gè)整數(shù) a = "))
b = int(raw_input("請(qǐng)輸入一個(gè)整數(shù) b = "))
calc = raw_input("選擇 + - * / 其中一項(xiàng):")
# 加法運(yùn)算
if calc == '+':
result = fun(a,b,lambda a,b:a+b)
# 減法運(yùn)算
elif calc == '-':
result = fun(a,b,lambda a,b:a-b)
# 乘法運(yùn)算
elif calc == "*":
result = fun(a,b,lambda a,b:a*b)
else:
# 除法運(yùn)算
if b==0:
print("被除數(shù)不能為0")
continue
result = fun(a,b,lambda a,b:a/b)
print result
e = raw_input("退出請(qǐng)輸入 e 繼續(xù)請(qǐng)輸入 c : ")
運(yùn)行查看結(jié)果:
python 07、匿名函數(shù).py
到此為止锤岸,我們就把函數(shù)的一些方法和功能基本介紹完了