【Python使用】嘿馬python基礎(chǔ)入門全體系教程第9篇:高階函數(shù),函數(shù)應(yīng)用:學(xué)生管理系統(tǒng)【附代碼文檔】

本教程的知識(shí)點(diǎn)為:計(jì)算機(jī)組成 計(jì)算機(jī)是由什么組成的? 1. 硬件系統(tǒng): 2. 軟件系統(tǒng): 目標(biāo) 運(yùn)算符的分類 1. 算數(shù)運(yùn)算符 2. 賦值運(yùn)算符 3. 復(fù)合賦值運(yùn)算符 判斷語句和循環(huán)語句 if嵌套 1. if嵌套的格式 2. if嵌套的應(yīng)用 if嵌套執(zhí)行流程 容器:字符串鹦马、列表辜御、元組厚宰、字典 字符串介紹 一. 認(rèn)識(shí)字符串 1.1 字符串特征 字符串輸出 容器:字符串谣拣、列表碑韵、元組、字典 列表的相關(guān)操作 1添加元素("增"append, extend, insert)1 append extend 容器:字符串蕊连、列表悬垃、元組、字典 字典的常見操作1 1查看元素1 2修改元素2 3添加元素3 函數(shù)介紹 1什么是函數(shù)1 小總結(jié): 函數(shù)定義和調(diào)用 1定義函數(shù)1 多函數(shù)程序的基本使用流程 1. 使用全局變量 2. 使用函數(shù)的返回值甘苍、參數(shù) 3. 函數(shù)嵌套調(diào)用 函數(shù)返回值(二) 函數(shù)應(yīng)用:學(xué)生管理系統(tǒng) 遞歸函數(shù) 1什么是遞歸函數(shù)1 2遞歸函數(shù)的作用2 看階乘的規(guī)律 文件操作介紹 1什么是文件1 2文件的作用2 文件的打開與關(guān)閉 1打開文件1 面向?qū)ο缶幊探榻B 面向?qū)ο?1. 概述 2. 生活舉例 類和對(duì)象 init()方法 說明: 問題: 有參數(shù)的init()方法 說明: 繼承介紹以及單繼承 1. 現(xiàn)實(shí)中的繼承 2. 程序中的繼承 單繼承:子類只繼承一個(gè)父類 說明: super()的使用 問題: 知識(shí)點(diǎn): 私有權(quán)限 面向?qū)ο笕筇匦裕悍庋b尝蠕、繼承、多態(tài) 靜態(tài)方法和類方法 1. 類方法 2. 靜態(tài)方法 總結(jié) 異常 模塊 1Python中的模塊1 2import2 3from…import3 注意

完整筆記資料代碼:https://gitee.com/yinuo112/Backend/tree/master/Python/嘿馬python基礎(chǔ)入門全體系教程/note.md

感興趣的小伙伴可以自取哦~


全套教程部分目錄:


部分文件圖片:

函數(shù)應(yīng)用:學(xué)生管理系統(tǒng)

import time
import os

  
  
# 定一個(gè)列表载庭,用來存儲(chǔ)所有的學(xué)生信息(每個(gè)學(xué)生是一個(gè)字典)
  
  
info_list = []


def print_menu():
    print("---------------------------")
    print("      學(xué)生管理系統(tǒng) V1.0")
    print(" 1:添加學(xué)生")
    print(" 2:刪除學(xué)生")
    print(" 3:修改學(xué)生")
    print(" 4:查詢學(xué)生")
    print(" 5:顯示所有學(xué)生")
    print(" 6:退出系統(tǒng)")
    print("---------------------------")


def add_new_info():
    """添加學(xué)生信息"""
    global info_list

    new_name = input("請(qǐng)輸入姓名:")
    new_tel = input("請(qǐng)輸入手機(jī)號(hào):")
    new_qq = input("請(qǐng)輸入:")

    for temp_info in info_list:
        if temp_info['name'] == new_name:
            print("此用戶名已經(jīng)被占用,請(qǐng)重新輸入")
            return  # 如果一個(gè)函數(shù)只有return就相當(dāng)于讓函數(shù)結(jié)束看彼,沒有返回值

    # 定義一個(gè)字典,用來存儲(chǔ)用戶的學(xué)生信息(這是一個(gè)字典)
    info = {}

    # 向字典中添加數(shù)據(jù)
    info["name"] = new_name
    info["tel"] = new_tel
    info["qq"] = new_qq

    # 向列表中添加這個(gè)字典
    info_list.append(info)


def del_info():
    """刪除學(xué)生信息"""
    global info_list

    del_num = int(input("請(qǐng)輸入要?jiǎng)h除的序號(hào):"))
    if 0 <= del_num < len(info_list):
        del_flag = input("你確定要?jiǎng)h除么?yes or no")
        if del_flag == "yes":
            del info_list[del_num]
    else:
        print("輸入序號(hào)有誤,請(qǐng)重新輸入")


def modify_info():
    """修改學(xué)生信息"""
    global info_list

    modify_num = int(input("請(qǐng)輸入要修改的序號(hào):"))
    if 0 <= modify_num < len(info_list):
        print("你要修改的信息是:")
        print("name:%s, tel:%s, :%s" % (info_list[modify_num]['name'],
            info_list[modify_num]['tel'],info_list[modify_num]['qq']))
        info_list[modify_num]['name'] = input("請(qǐng)輸入新的姓名:")
        info_list[modify_num]['tel'] = input("請(qǐng)輸入新的手機(jī)號(hào):")
        info_list[modify_num]['qq'] = input("請(qǐng)輸入新:")
    else:
        print("輸入序號(hào)有誤,請(qǐng)重新輸入")


def search_info():
    """查詢學(xué)生信息"""
    search_name = input("請(qǐng)輸入要查詢的學(xué)生姓名:")
    for temp_info in info_list:
        if temp_info['name'] == search_name:
            print("查詢到的信息如下:")
            print("name:%s, tel:%s, :%s" % (temp_info['name'],
                temp_info['tel'], temp_info['qq']))
            break
    else:
        print("沒有您要找的信息....")


def print_all_info():
    """遍歷學(xué)生信息"""
    print("序號(hào)\t姓名\t\t手機(jī)號(hào)\t\t")
    i = 0
    for temp in info_list:
        # temp是一個(gè)字典
        print("%d\t%s\t\t%s\t\t%s" % (i, temp['name'], temp['tel'], temp['qq']))
        i += 1


def main():
    """用來控制整個(gè)流程"""
    while True:
        # 1. 打印功能
        print_menu()

        # 2. 獲取用戶的選擇
        num = input("請(qǐng)輸入要進(jìn)行的操作(數(shù)字)")

        # 3. 根據(jù)用戶選擇,做相應(yīng)的事情
        if num == "1":
            # 添加學(xué)生
            add_new_info()
        elif num == "2":
            # 刪除學(xué)生
            del_info()
        elif num == "3":
            # 修改學(xué)生
            modify_info()
        elif num == "4":
            # 查詢學(xué)生
            search_info()
        elif num == "5":
            # 遍歷所有的信息
            print_all_info()
        elif num == "6":
            # 退出系統(tǒng)
            exit_flag = input("親,你確定要退出么?~~~~(>_<)~~~~(yes or no) ")
            if exit_flag == "yes":
                break
        else:
            print("輸入有誤,請(qǐng)重新輸入......")


        input("\n\n\n按回車鍵繼續(xù)....")
        os.system("clear")  # 調(diào)用Linux命令clear完成清屏

  
  
# 程序的開始
  
  
main()

遞歸函數(shù)

<1>什么是遞歸函數(shù)1>

通過前面的學(xué)習(xí)知道一個(gè)函數(shù)可以調(diào)用其他函數(shù)囚聚。

如果一個(gè)函數(shù)在內(nèi)部不調(diào)用其它的函數(shù)靖榕,而是自己本身的話,這個(gè)函數(shù)就是遞歸函數(shù)靡挥。

<2>遞歸函數(shù)的作用2>

舉個(gè)例子序矩,我們來計(jì)算階乘 n! = 1 * 2 * 3 * ... * n

解決辦法1:

看階乘的規(guī)律
1! = 1
2! = 2 × 1 = 2 × 1!
3! = 3 × 2 × 1 = 3 × 2!
4! = 4 × 3 × 2 × 1 = 4 × 3!
...
n! = n × (n-1)!

解決辦法2:

原理

階乘遞歸原理

總結(jié)

  • 函數(shù)內(nèi)部自己調(diào)用自己
  • 必須有終止條件(即必須有出口)

1. 匿名函數(shù)

大家來思考一個(gè)問題:

def my_add(a, b):
    return a + b

my_add()

my_add 函數(shù)需要2行定義, 能不能簡(jiǎn)化一下定義方式, 一行搞定! 當(dāng)然可以鸯绿, 我們可以把這種函數(shù)寫成一個(gè) 匿名函數(shù).

  • 匿名函數(shù)的概念
  • 匿名函數(shù)語法格式
  • 匿名函數(shù)和普通函數(shù)的區(qū)別
  • 匿名函數(shù)的使用場(chǎng)景

1.1 語法格式

定義的函數(shù)沒有名字,這樣的函數(shù)叫做匿名函數(shù).

我們先看下匿名函數(shù)的語法結(jié)構(gòu):

lambda [形參1], [形參2], ... : [單行表達(dá)式] 或 [函數(shù)調(diào)用]

使用匿名函數(shù), 上面的函數(shù)我們就可以定義為單行的函數(shù).

  
  
# 不帶參數(shù)
  
  
my_fun = lambda : 10 + 20
  
  
# 帶參數(shù)
  
  
my_add = lambda a, b: a + b
my_add()

注意:

  • lambda表達(dá)式的參數(shù)可有可無跋破,函數(shù)的參數(shù)在lambda表達(dá)式中完全適用簸淀。
  • lambda表達(dá)式能接收任何數(shù)量的參數(shù)但只能返回一個(gè)表達(dá)式的值。

1.2 和普通函數(shù)的區(qū)別

def my_function(start, end):

    my_sum = 0

    while start <= end:
        my_sum += start
        start += 1

    return my_sum
  1. 匿名函數(shù)中不能使用 while 循環(huán)毒返、for 循環(huán), 只能編寫單行的表達(dá)式租幕,或函數(shù)調(diào)用, 普通函數(shù)都可以.
  2. 匿名函數(shù)中返回結(jié)果不需要使用 return, 表達(dá)式的運(yùn)行結(jié)果就是返回結(jié)果, 普通函數(shù)返回結(jié)果必須 return.
  3. 匿名函數(shù)中也可以不返回結(jié)果. 例如: lambda : print('hello world')

1.3 應(yīng)用場(chǎng)景

1.3.1 定義簡(jiǎn)單的單行函數(shù)

def my_function(a, b):
    return a + b

使用 lambda 定義格式如下:

my_function = lambda a, b: a + b

1.3.2 作為函數(shù)的參數(shù)進(jìn)行傳遞(重點(diǎn)、難點(diǎn), 擴(kuò)展點(diǎn))

1.3.2.1 為什么函數(shù)要作為另外函數(shù)的參數(shù)?

def my_function1():

    a = 100
    b = 200
    result = a + b
    print('result:', result)


def my_function2():

    a = 100
    b = 200
    result = a - b
    print('result:', result)


def my_function3():

    a = 100
    b = 200
    result = a * b
    print('result:', result)

上面函數(shù)定義的缺點(diǎn)是:

  1. 函數(shù)名要定義多個(gè), 使用起來不方便. 需要記憶, 那個(gè)函數(shù)完成什么事情.
  2. 上面函數(shù)只定義了三種計(jì)算方式: a + b拧簸、a -b劲绪、a * b, 如果用戶希望 a 和 b 進(jìn)行除法運(yùn)算, 那么顯然還需要再寫函數(shù).

解決目標(biāo): 1、提高函數(shù)的通用性 2盆赤、減少代碼量

可以通過傳遞給 my_function 一個(gè)函數(shù)來完成.

def my_function(func):

    a = 100
    b = 200
    # 把 cucalate_rule 當(dāng)做函數(shù)來調(diào)用
    result = func(a, b)
    print('result:', result)


def caculate_rule(a, b):
    return a / b


my_function(caculate_rule)

1.3.2.2. 匿名函數(shù)做為函數(shù)參數(shù)

def my_function(func):

    a = 100
    b = 200
    # 把 cucalate_rule 當(dāng)做函數(shù)來調(diào)用
    result = func(a, b)
    print('result:', result)


def caculate_rule1(a, b):
    return a / b

def caculate_rule2(a, b):
    return a // b

def caculate_rule3(a, b):
    return a % b

my_function(caculate_rule1)
my_function(caculate_rule2)
my_function(caculate_rule3)

我們?yōu)榱苏{(diào)用 my_function 函數(shù)要寫很多規(guī)則, 整個(gè)文件中可能就有很多定義的函數(shù)代碼, 問題是:

  1. 這些函數(shù)只會(huì)用一次
  2. 這些函數(shù)也比較簡(jiǎn)單

就沒有必要 py 文件中出現(xiàn)這么多無用的代碼. 如何改進(jìn):

def my_function(func):

    a = 100
    b = 200
    # 把 cucalate_rule 當(dāng)做函數(shù)來調(diào)用
    result = func(a, b)
    print('result:', result)


my_function(lambda a, b: a / b)
my_function(lambda a, b: a // b)
my_function(lambda a, b: a % b)

1.3.2.3. 總結(jié)

  1. 函數(shù)可以做為參數(shù)傳遞給另外一個(gè)函數(shù), 可以使得函數(shù)的實(shí)現(xiàn)更加通用.
  2. 匿名函數(shù)也可以作為參數(shù)傳遞給另外一個(gè)函數(shù), 對(duì)于只需要用到一次函數(shù), 可以通過匿名函數(shù)減少代碼量.

1.3.3 lambda的參數(shù)形式

1.3.3.1.無參數(shù)

fn1 = lambda: 100
print(fn
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末贾富,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子牺六,更是在濱河造成了極大的恐慌颤枪,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,080評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件淑际,死亡現(xiàn)場(chǎng)離奇詭異畏纲,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)春缕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,422評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門盗胀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人锄贼,你說我怎么就攤上這事票灰。” “怎么了宅荤?”我有些...
    開封第一講書人閱讀 157,630評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵米间,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我膘侮,道長(zhǎng)屈糊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,554評(píng)論 1 284
  • 正文 為了忘掉前任琼了,我火速辦了婚禮逻锐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘雕薪。我一直安慰自己昧诱,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,662評(píng)論 6 386
  • 文/花漫 我一把揭開白布所袁。 她就那樣靜靜地躺著盏档,像睡著了一般。 火紅的嫁衣襯著肌膚如雪燥爷。 梳的紋絲不亂的頭發(fā)上蜈亩,一...
    開封第一講書人閱讀 49,856評(píng)論 1 290
  • 那天懦窘,我揣著相機(jī)與錄音,去河邊找鬼稚配。 笑死畅涂,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的道川。 我是一名探鬼主播午衰,決...
    沈念sama閱讀 39,014評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼冒萄!你這毒婦竟也來了臊岸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,752評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤尊流,失蹤者是張志新(化名)和其女友劉穎扇单,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奠旺,經(jīng)...
    沈念sama閱讀 44,212評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蜘澜,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,541評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了响疚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鄙信。...
    茶點(diǎn)故事閱讀 38,687評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖忿晕,靈堂內(nèi)的尸體忽然破棺而出装诡,到底是詐尸還是另有隱情,我是刑警寧澤践盼,帶...
    沈念sama閱讀 34,347評(píng)論 4 331
  • 正文 年R本政府宣布鸦采,位于F島的核電站,受9級(jí)特大地震影響咕幻,放射性物質(zhì)發(fā)生泄漏渔伯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,973評(píng)論 3 315
  • 文/蒙蒙 一肄程、第九天 我趴在偏房一處隱蔽的房頂上張望锣吼。 院中可真熱鬧,春花似錦蓝厌、人聲如沸玄叠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,777評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽读恃。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間寺惫,已是汗流浹背疹吃。 一陣腳步聲響...
    開封第一講書人閱讀 32,006評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留肌蜻,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,406評(píng)論 2 360
  • 正文 我出身青樓必尼,卻偏偏與公主長(zhǎng)得像蒋搜,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子判莉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,576評(píng)論 2 349

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