巨蟒python全棧開發-第9天 初識函數

一.今日主要內容總覽(重點)
1.什麼是函數?
f(x)=x+1
y=x+1
函數是對功能或者動做的封裝
2.函數的語法和定義
def 函數名():
函數體
調用:函數名()
3.關於函數的返回值
return:返回
(1)當程序沒寫過return,不返回任何結果.若是你非要接收,接收到的是None
(2)當函數寫return 值,有一個返回值.
(3)當函數寫了 return 值1,值2,值3...... 返回多個結果,多個結果打包成元組
(4)當程序執行到return,函數結束執行
總結:return,中止函數調用
4.函數的參數(部分)
小括號是什麼,小括號表示調用,傳參
1.什麼是參數:參數是給函數傳遞的信息
形參:在函數us恆明的位置寫的變量
1.位置參數
2.默認值
3.動態傳參(明天講解), *,**
實參:在函數調用的時候給函數傳遞的具體值
1.位置參數
2.關鍵字參數
3.混合:位置,關鍵字
傳參:把實參給形參的過程

DAY9-初識函數

二.今日內容大綱
1.什麼是函數?
2.函數的語法和定義
3.關於函數的返回值
4.函數的參數(部分)

內容詳解:
1.什麼是函數?
(1)引子
約妹子
print('拿出手機')
print('打開陌陌')
print('找一個心儀的小姐姐')
print('有沒有時間啊,聊一聊人生')
print('一塊兒出來吃飯唱歌,看電影')
開心,上癮,再來一次
print('拿出手機')
print('打開陌陌')
print('找一個心儀的小姐姐')
print('有沒有時間啊,聊一聊人生')
print('一塊兒出來吃飯唱歌,看電影')
爲了減小代碼的重複
while循環也不行

2.函數的語法和定義
(1)初嘗函數
先計劃一下,約應該怎麼約...而後在須要的時候吧這個事情拿出來作一次.
先定義好一個函數,後期須要用,再調用就能夠直接用了了
理解:咱們能夠使用函數來定義一個動做
define 定義
def yue():
    #描述你的動做
    print('拿出手機')
    print('打開陌陌')
    print('找一個心儀的小姐姐')
    print('有沒有時間啊,聊一聊人生')
    print('一塊兒出來吃飯唱歌,看電影')
#調用函數
yue()
print('上班')
print('上班')
print('上班')
yue()

結果:git

拿出手機
打開陌陌
找一個心儀的小姐姐
有沒有時間啊,聊一聊人生
一塊兒出來吃飯唱歌,看電影
上班
上班
上班
拿出手機
打開陌陌
找一個心儀的小姐姐
有沒有時間啊,聊一聊人生
一塊兒出來吃飯唱歌,看電影

下面的程序對比上邊的程序微信

def yue():
    #描述你的動做
    print('拿出手機')
    print('打開陌陌')
    print('找一個心儀的小姐姐')
    print('有沒有時間啊,聊一聊人生')
    print('一塊兒出來吃飯唱歌,看電影')
#調用函數
print('上班')     #先打印這一行
yue()
print('上班')
print('上班')
print('上班')
yue()
#避免了重複寫代碼,也就是重複造輪子
(2)
def yue():
    print('你好')
print(yue)  #16位 結果:內存地址:<function yue at 0x000001C666601E18>
函數名字是一個內存地址,內部的代碼塊存儲在內存地址內

3.關於函數的返回值
(1)
return
繼續約#超級重點
def yue():
    #描述你的動做
    print('拿出手機')
    print('打開陌陌')
    print('找一個心儀的小姐姐')
    print('有沒有時間啊,聊一聊人生')
    print('一塊兒出來吃飯唱歌,看電影')
    #獲得一個結果
    return '小姐姐'
yue()
這裏調用的函數,返回值就返回給這裏
誰調用就返回給誰,沒有人調用就不返回,這裏就是這種狀況,不會返回'小姐姐'
(2)
def yue():
    #描述你的動做
    print('拿出手機')
    print('打開陌陌')
    print('找一個心儀的小姐姐')
    print('有沒有時間啊,聊一聊人生')
    print('一塊兒出來吃飯唱歌,看電影')
    #獲得一個結果
    return '小姐姐'
ret=yue()   #這裏調用的函數,返回值就返回給這裏,結果就會有"小姐姐"了
print(ret)
(3)
return多個字符串,調用的結果除原來的代碼塊,還有return的多個值,以元組的形式返回
同時返回多個結果,返回的是元組
def yue():
    #描述你的動做
    print('拿出手機')
    print('打開陌陌')
    print('找一個心儀的小姐姐')
    print('有沒有時間啊,聊一聊人生')
    print('一塊兒出來吃飯唱歌,看電影')
    #獲得一個結果
    return '小姐姐','大媽','流浪漢'  #同時返回多個結果,返回的是元組
ret=yue()   #這裏調用的函數,返回值就返回給這裏
print(ret)

結果:app

結果:
拿出手機
打開陌陌
找一個心儀的小姐姐
有沒有時間啊,聊一聊人生
一塊兒出來吃飯唱歌,看電影
('小姐姐', '大媽', '流浪漢')
(4)
當代碼塊下面有多個return時,最終調用的返回,只返回第一個返回值
def yue():
    #描述你的動做
    print('拿出手機')
    print('打開陌陌')
    print('找一個心儀的小姐姐')
    print('有沒有時間啊,聊一聊人生')
    print('一塊兒出來吃飯唱歌,看電影')
    #獲得一個結果
    return '小姐姐'    #只能返回小姐姐,其餘的都不會執行
    return'大媽'
    return'流浪漢'
ret=yue()       #這裏調用的函數,返回值就返回給這裏
print(ret)
(5)
函數的返回值問題總結:
函數能夠有返回值,也能夠沒有返回值
函數若是沒有返回值,在函數最後執行完畢的時候會默認返回None
在函數中只寫了return,可是沒有寫返回值
在函數中寫了return 值, 返回一個結果
在函數中寫 return 值1,值2,值3 ,最終返回值會以元組形式返回
def yue():
    #描述你的動做
    print('拿出手機')
    print('打開陌陌')
    print('找一個心儀的小姐姐')
    return None     #返回的是None,後面的就再也不執行了
    print('有沒有時間啊,聊一聊人生')
    print('一塊兒出來吃飯唱歌,看電影')
ret=yue()
print(ret)

結果:函數

拿出手機
打開陌陌
找一個心儀的小姐姐
None
(6)
練習:寫一個函數,在函數內部,要求用戶輸入兩個數,返回大的那個數
個人兩種解法
#解法一:
def big():
    a=1
    b=2
    if a>b:       #普通寫法
        print(a)
    else:
        print(b)
big()

#解法二:
def big():
    a=1
    b=2
    print(a if a>b else b)  #三元運算符
big()
#老師講解1
def func():#定義函數
    a=int(input('請輸入第一個數:'))
    b=int(input('請輸入第二個數:'))
    if a>b:
        return a
    else:
        return b
ret=func()
print(ret)

#老師講解2 ,#只有Python是用這種:三元運算符或者叫三目運算符
            #模式:值1 if 條件 else 值2
def func():#定義函數
    a=int(input('請輸入第一個數:'))
    b=int(input('請輸入第二個數:'))
    #三目運算
    c=a if a>b else b  #c裝的是a,b中大數
    #模式:值1 if 條件 else 值2
    return c
ret=func()
print(ret)

 

4.函數的參數(部分)
(1)回顧上邊講的
def chi():
    print('池什麼')
    print('酸菜魚')
chi()   #小括號表示調用
(2)
def yue(tools):
    #描述你的動做
    print('拿出手機')
    print('打開%s'%tools)
    print('找一個心儀的小姐姐')
    print('有沒有時間啊,聊一聊人生')
    print('一塊兒出來吃飯唱歌,看電影')
yue('微信')
yue('探探')
yue('陌陌')
上邊定義的函數,若是調用的時候,沒有參數,則會報下面的錯誤
# yue()    #報錯:  yue() missing 1 required positional argument: 'tools'
(3)
def chi(zhushi,fushi,tang,tiandian):
    print("主食:%s"%zhushi)
    print('副食:%s'%fushi)
    print('湯:%s'%tang)
    print('甜點:%s'%tiandian)
# chi('大米飯','鍋包肉',tiandian='哈根達斯','酸辣湯') #錯誤寫法,關鍵字必須在位置參數後面
chi('大米飯','鍋包肉',tiandian='哈根達斯',tang='酸辣湯') #正確寫法
#規則,調用時,先寫位置參數,再寫關鍵字參數
(4)#練習
def regist(name,age,edu,gender):
    print('name:',name)
    print('age:',age)
    print('edu:',edu)
    print('gender:',gender)
regist('趙玉冰','19','中專','')
regist('韓志遠','25','本科','')
regist('董忠浩','25','高中','')
regist('劉力','21','本科','')
(5)總結
需求:根據你指定的APP去約
在括號內的東西叫參數
在函數聲明的位置,寫的參數叫形參
在函數調用的地方,寫的參數叫實參
傳參:把實參傳遞給形參的過程叫作傳參

在函數調用的時候,必須保證全部的參數都有值
yue() #錯誤的,必須保證有參數

1.關於實參:
(1)位置參數, 按照位置給形參傳遞信息
(2)關鍵字參數,按照形參聲明的變量名進行傳遞
(3)混合參數.位置參數+關鍵字(規定)
2.形式參數(2):#今天只說兩個簡單的
1.位置參數,按照位置聲明的變量
2.默認值參數
3.當默認值和位置參數同時存在的時候,規定:默認值必須寫在後面
4.動態傳參(明天)
總結:全部帶等號的,都寫在後面

今日做業:
2,寫函數,檢查獲取傳入列表或元組對象的全部奇數位索引對應的元素,
並將其做爲新列表返回給調用者。
def fun(a):
    lst=[]
    for i in range(len(a)):
        if i%2==1:
            lst.append(a[i])
    return lst
k=fun([1,2,3,4,5,6,7,0])
print(k)
a=fun((1,2,3,4,5,6,7))
3,寫函數,判斷用戶傳入的對象(字符串、列表、元組)長度是否大於5。
def func(a):
    if len(a)>5:
        print('長度大於5')
    else:
        print('長度小於等於5')
func('skt')
func((1,2,3,4,5,6,7))
func([1,2,3,4,5,6,7,8,9])
4,寫函數,檢查傳入列表的長度,若是大於2,將列表的前兩項內容返回給調用者。
def func(a):
    if len(a)>2:
        # return a[0],a[1]      #以元組形式返回給調用者
        return a[0:2]           #以列表形式返回給調用者
a=func([1,2,3])
print(a)
5,寫函數,計算傳入函數的字符串中, 數字、字母、空格 以及 其餘內容的個數,並返回結果。
def func(canshu):
    num=0
    zimu=0
    kongge=0
    qita=0
    for i in canshu:
        if i.isdigit():
            num+=1
        elif i.isalpha():
            zimu+=1
        elif i is " ":
            kongge+=1
        else:
            qita+=1
    return '數字:',num,'字母:',zimu,"空格:",kongge,'其餘:',qita
    #必定要注意return放置的位置
s=func(' 1w3v')
print(s)
6,寫函數,接收兩個數字參數,返回比較大的那個數字。
def func():
    a=int(input('請輸入一個數:'))
    b=int(input('請輸入另外一個數:'))
    if a>b:
        return a
    else:
        return b
k=func()
print('返回值是:',k)
7,寫函數,檢查傳入字典的每個value的長度,若是大於2,那麼僅保留前兩個長度的內容,
並將新內容返回給調用者。
dic = {"k1": "v1v1", "k2": [11,22,33,44]}
PS:字典中的value只能是字符串或列表
def func(a):
    for i in a:
        a[i]=a[i][0:2]
    return a
s=func({"k1": "v1v1", "k2": [11,22,33,44]})
print(s)
#若是長度小於2不操做
8,寫函數,此函數只接收一個參數且此參數必須是列表數據類型,此函數完成的功能是返回給調用者一個字典,
此字典的鍵值對爲此列表的索引及對應的元素。例如傳入的列表爲:[11,22,33]
返回的字典爲 {0:11,1:22,2:33}。
def func(lst):
    dic={}
    for i in range(len(lst)):
        dic[i]=lst[i]
    return dic
a=func([11,22,33])
print(a)
9,寫函數,函數接收四個參數分別是:姓名,性別,年齡,學歷。
用戶經過輸入這四個內容,而後將這四個內容傳入到函數中,此函數接收到這四個內容,
將內容追加到一個student_msg文件中。
#方法一:個人想法
def func(name,sex,age,xueli):
    with open('student_msg',mode='a',encoding='utf-8') as f:
        f.write(name)       #注意,這個write只能接收一個參數,且必須是字符串類型的
        f.write(sex)
        f.write(age)
        f.write(xueli)
func('小冬瓜\t','男\t','28\t','小學本科\t')
#方法二:另外一種想法
def w(name,sex,age,edu):
    f = open("student_msg",mode='w',encoding="utf-8")
    f.write("姓名:%s\n性別:%s\n年齡:%s\n學歷:%s" % (name,sex,age,edu))   #一句話搞定寫入,格式化
    f.flush()
    f.close()
w("corn","",21,"專科")
10,對第9題升級:支持用戶持續輸入,Q或者q退出,性別默認爲男,若是遇到女學生,則把性別輸入女。
方法一:
while 1:
    a=input('請輸入要輸入的姓名:')
    b=input('請輸入要輸入的性別:')
    c=input('請輸入要輸入的年齡:')
    d=input('請輸入要輸入的學歷:')
    if a.upper()=="Q"or b.upper()=="Q"or c.upper()=="Q"or d.upper()=="Q":
        break
    def func(name,age,xueli,sex=''):
        with open('student_msg',mode='a',encoding='utf-8') as f:
            f.write(name)       #注意,這個write只能接收一個參數,且必須是字符串類型的
            f.write(sex)
            f.write(age)
            f.write(xueli)
    func(a,b,c,d)
方法二:
while 1:
    s=input('要輸入的格式(姓名,年齡,學歷,性別)或者輸入Q退出:')
    if s.upper()=='Q':
        break
    a,b,c,d=s.split(',')
    def func(name,age,xueli,sex=''):
        with open('student_msg',mode='a',encoding='utf-8') as f:
            f.write(name)       #注意,這個write只能接收一個參數,且必須是字符串類型的
            f.write(sex)
            f.write(age)
            f.write(xueli)
    func(a,b,c,d)
方法三:
def func(name, age,edu,sex =""):
    f = open("student.msg", mode="a", encoding="utf-8")
    f.write(name+"_"+str(age)+"_"+sex+"_"+edu+"\n")
    f.flush()
    f.close()

while 1:
    content = input("請問. 是否要錄入學生信息, 輸入q退出:")
    if content.upper() == "Q":
        break
    n = input("請輸入名字:")
    a = input("請輸入年齡:")
    s = input("請輸入性別:")
    e = input("請輸入學歷:")
    if s == "":
        func(n,a,e)
    else:
        func(n,a,e,s)
11,寫函數,用戶傳入修改的文件名,與要修改的內容,執行函數,
完成整個文件的批量修改操做(升級題, 此題認真閱讀和理解. 應該有3個參數纔對)。
def mod(r,m,n):
    import  os
    with open(r,mode="r",encoding="utf-8")as f, \
            open("a1.txt",mode="w",encoding="utf-8")as f1:
        for line in f:
            s = line.replace(m,n)
            f1.write(s)
    os.remove(r)
    os.rename("a1.txt",r)

mod("a.txt","我很差!","我很好!")
12,寫一個函數完成三次登錄功能,再寫一個函數完成註冊功能(升級題)
參考網上的操做
def dl():
    count = 3
    while count > 0:
        account = input("請輸入你的帳號:")
        password = input("請輸入你的密碼:")
        count -= 1
        for i in dic:
            if account == i and password ==dic[i]:
                print("登陸成功")
                return

        print('帳號或者密碼錯誤,請從新輸入(還剩%s次機會):' % count)
        x = input("按Q返回上一菜單,其餘鍵繼續:")
        if x.upper().strip() == "Q":
            return


def login():
    while 1:
        account = input("請輸入你註冊的帳號(6位以上):")
        password = input("請輸入你的密碼:")
        password1 = input("請從新輸入一遍你的密碼:")
        if len(account) <= 6 or account.isdigit() == False:
            print("帳號不合法!請從新輸入!")
        elif password == password1:
            dic[account] = password
            print("恭喜你,註冊成功!")
            return
        else:
            print("你輸入的兩次密碼不匹配,請從新輸入")
            x = input("按Q返回上一菜單,其餘鍵繼續:")
            if x.upper().strip() == "Q":
                break
dic = {}
menus = ("1, 登陸", "2, 註冊", "3, 退出")
while 1:
    for item in menus:
        print(item)
    s = input('請輸入您要選擇的菜單項:')
    if s == '1':
        dl()
    elif s == "2":
        login()
    elif s == "3":
        break
    else:
        print("指令錯誤!")
#利用文件操做來進行操做(有時間再升級成這樣)
明日默寫。①,return的做用。②,傳參的幾種方法,每一個都簡單寫一個代碼。如,實參,按位置傳參。def func(x,y):Passfunc(‘a’,’b’)
相關文章
相關標籤/搜索