06经瓷、python 系列之--函數(shù)

fun.png

版權(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ò)

正文

一勃刨、什么是函數(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é)果:

fun_sanjiao.gif

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é)果:

login_fun.gif

五、匿名函數(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
lambda.gif

到此為止锤岸,我們就把函數(shù)的一些方法和功能基本介紹完了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末竖幔,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子是偷,更是在濱河造成了極大的恐慌拳氢,老刑警劉巖募逞,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件概行,死亡現(xiàn)場(chǎng)離奇詭異刃宵,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)秒紧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)栗恩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)透乾,“玉大人,你說(shuō)我怎么就攤上這事磕秤∪槲冢” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵市咆,是天一觀的道長(zhǎng)汉操。 經(jīng)常有香客問(wèn)我,道長(zhǎng)蒙兰,這世上最難降的妖魔是什么磷瘤? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮搜变,結(jié)果婚禮上采缚,老公的妹妹穿的比我還像新娘。我一直安慰自己挠他,他們只是感情好扳抽,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著殖侵,像睡著了一般贸呢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上拢军,一...
    開(kāi)封第一講書(shū)人閱讀 51,258評(píng)論 1 300
  • 那天楞陷,我揣著相機(jī)與錄音,去河邊找鬼茉唉。 笑死固蛾,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的赌渣。 我是一名探鬼主播魏铅,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼坚芜!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起斜姥,我...
    開(kāi)封第一講書(shū)人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤鸿竖,失蹤者是張志新(化名)和其女友劉穎沧竟,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體缚忧,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡悟泵,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了闪水。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片糕非。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖球榆,靈堂內(nèi)的尸體忽然破棺而出朽肥,到底是詐尸還是另有隱情,我是刑警寧澤持钉,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布衡招,位于F島的核電站,受9級(jí)特大地震影響每强,放射性物質(zhì)發(fā)生泄漏始腾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一空执、第九天 我趴在偏房一處隱蔽的房頂上張望浪箭。 院中可真熱鬧,春花似錦辨绊、人聲如沸山林。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)驼抹。三九已至,卻和暖如春拜鹤,著一層夾襖步出監(jiān)牢的瞬間框冀,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工敏簿, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留明也,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓惯裕,卻偏偏與公主長(zhǎng)得像温数,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蜻势,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • //Clojure入門(mén)教程: Clojure – Functional Programming for the J...
    葡萄喃喃囈語(yǔ)閱讀 3,660評(píng)論 0 7
  • 有些人這樣說(shuō)的撑刺,農(nóng)村的孩子與城市里的孩子相比,缺少禮貌握玛,的確够傍,我經(jīng)過(guò)觀察確實(shí)如此甫菠。在小的時(shí)候,城里的父母經(jīng)常...
    心如山亦如水閱讀 270評(píng)論 0 0
  • 經(jīng)過(guò)這一段時(shí)間的學(xué)習(xí)冕屯,讓我對(duì)創(chuàng)意有了更深的了解寂诱,現(xiàn)在我按個(gè)人的理解,重新定義了創(chuàng)意大師安聘,總結(jié)了創(chuàng)意的三種境界痰洒,簡(jiǎn)稱...
    醒時(shí)做夢(mèng)閱讀 384評(píng)論 0 2
  • 友人向我推薦夏達(dá)的《子不語(yǔ)》最近看了看,有點(diǎn)感觸浴韭。權(quán)且寫(xiě)下來(lái)當(dāng)做記憶吧丘喻,也可說(shuō)是感思。 終于可以表達(dá)一下自己的看法...
    曾經(jīng)未來(lái)的我閱讀 618評(píng)論 0 0
  • 第一篇是羅丹琳小朋友寫(xiě)的放風(fēng)箏日記囱桨,這個(gè)小朋友寫(xiě)出了這個(gè)冬天放風(fēng)箏的別樣心情仓犬,誰(shuí)說(shuō)冬天就不適合放風(fēng)箏呢 第二篇...
    fdeceb686cba閱讀 239評(píng)論 0 0