day18 函數強化練習

函數應用:學生管理系統

import time
import os

# 定一個列表,用來存儲所有的學生信息(每個學生是一個字典)
info_list = []


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


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

    new_name = input("請輸入姓名:")
    new_tel = input("請輸入手機號:")
    new_qq = input("請輸入QQ:")

    for temp_info in info_list:
        if temp_info['name'] == new_name:
            print("此用戶名已經被佔用,請重新輸入")
            return  # 如果一個函數只有return就相當於讓函數結束,沒有返回值

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

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

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


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

    del_num = int(input("請輸入要刪除的序號:"))
    if 0 <= del_num < len(info_list):
        del_flag = input("你確定要刪除麼?yes or no")
        if del_flag == "yes":
            del info_list[del_num]
    else:
        print("輸入序號有誤,請重新輸入")


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

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


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


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


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

        # 2. 獲取用戶的選擇
        num = input("請輸入要進行的操作(數字)")

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


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

# 程序的開始
main()

遞歸函數

<1>什麼是遞歸函數

通過前面的學習知道一個函數可以調用其他函數。

如果一個函數在內部不調用其它的函數,而是自己本身的話,這個函數就是遞歸函數。

<2>遞歸函數的作用

舉個例子,我們來計算階乘 n! = 1 * 2 * 3 * ... * n

解決辦法1:

看階乘的規律
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:

原理

匿名函數

用lambda關鍵詞能創建小型匿名函數。這種函數得名於省略了用def聲明函數的標準步驟。

lambda函數的語法只包含一個語句,如下:

lambda [arg1 [,arg2,.....argn]]:expression

如下實例:

sum = lambda arg1, arg2: arg1 + arg2

# 調用sum函數
print("Value of total : " % sum( 10, 20 ))
print("Value of total :  "% sum( 20, 20 ))

以上實例輸出結果:

Value of total :  30
Value of total :  40

Lambda函數能接收任何數量的參數但只能返回一個表達式的值

匿名函數不能直接調用print,因爲lambda需要一個表達式

應用場合

函數作爲參數傳遞

  1. 自己定義函數
    >>> def fun(a, b, opt):
    ...     print("a = " % a)
    ...     print("b = " % b)
    ...     print("result =" % opt(a, b))
    ...
    >>> fun(1, 2, lambda x,y:x+y)
    a = 1
    b = 2
    result = 3
    
  2. 作爲內置函數的參數

想一想,下面的數據如何指定按age或name排序?

stus = [
    {"name": "zhangsan", "age": 18}, 
    {"name": "lisi", "age": 19}, 
    {"name": "wangwu", "age": 17}
]

按name排序:

>>> stus.sort(key = lambda x: x['name'])
>>> stus
[{'age': 19, 'name': 'lisi'}, {'age': 17, 'name': 'wangwu'}, {'age': 18, 'name': 'zhangsan'}]

按age排序:

>>> stus.sort(key = lambda x: x['age'])
>>> stus
[{'age': 17, 'name': 'wangwu'}, {'age': 18, 'name': 'zhangsan'}, {'age': 19, 'name': 'lisi'}]

給程序傳參數

import sys

print(sys.argv)

運行結果:

列表推導式

所謂的列表推導式,就是指的輕量級循環創建列表

1. 基本的方式

2. 在循環的過程中使用if

3. 2個for循環

4. 3個for循環

練習

請寫出一段 Python 代碼實現分組一個 list 裏面的元素,比如 [1,2,3,...100]變成 [[1,2,3],[4,5,6]....]

參考答案:

a = [x for x in range(1,101)]
b = [a[x:x+3] for x in range(0,len(a),3)]

set、list、tuple

set是集合類型

set、list、tuple之間可以相互轉換

使用set,可以快速的完成對list中的元素去重複的功能


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章