亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python學習之函數

發布時間:2020-07-01 23:35:08 來源:網絡 閱讀:176 作者:霍金181 欄目:編程語言

函數概述

從實現函數的角度來看,其至少需要想清楚以下 3 點:
? 函數需要幾個關鍵的需要動態變化的數據,這些數據應該被定義成函數的參數。
? 函數需要傳出幾個重要的數據(就是調用該函數的人希望得到的數據),這些數據
應該被定義成返回值。
? 函數的內部實現過程。

函數創建和調用

#1). 定義函數:
#def 函數名(參數1, 參數2........):
#函數執行的內容
#2). 定義函數時指定參數和返回值的類型
#def mymax(num1: int, num2: int) -> int:
#代表num1需要傳入整形, num2需要傳入整形, 返回值必須是整形。
#3). 函數的幫助文檔: 三引號

def mymax(num1: int, num2: int) -> int:
    """
    求兩數的最大值
    :param num1: 第一個數值
    :param num2: 第二個數值
    :return: 最大值
    """
    #if num1 > num2:
    #return  num1
    #else:
    #return  num2
    return num1 if num1 > num2 else num2

#調用函數
max_num = mymax(2, 1)
print(max_num)

#print(help(mymax))

定義空函數

#定義函數的時候, 函數內部代碼不會執行。 只有在調用函數的時候, 才會執行代碼的內容.

def login(username: str, passwd: str) -> bool:
    """
    實現用戶登錄
    :param username: 用戶名
    :param passwd: 密碼
    :return: 是否登錄成功
    """
    pass

login('root', 'westos')

返回值理解:
#定義函數的時候, 函數內部代碼不會執行。 只有在調用函數的時候, 才會執行代碼的內容.

def login(username: str, passwd: str) -> bool:
    """
    實現用戶登錄
    :param username: 用戶名
    :param passwd: 密碼
    :return: 是否登錄成功
    """
    if username == 'root' and passwd == 'westos':
        print('login ok')
        return  True
    else:
        print('login fail')
        return False

#沒有返回值,默認返回None

result = login('root', 'westos')
print(result)

函數里面可以調用其他函數:

def printOneLine():
    """打印一行提示"""
    print('*'*30)

def printNumLine(num: int):  # num=3
    """打印多行提示"""
    for count in range(num):
        printOneLine()
printNumLine(3)

局部變量:

? 局部變量,就是在函數內部定義的變量
? 不同的函數,可以定義相同的名字的局部變量,但是各用個的不會產生影響
? 局部變量的作用,為了臨時保存數據需要在函數中定義變量來進行存儲,這就是它的作用
#局部變量,就是在函數內部定義的變量, 只在函數內部生效
def save_money(money):
"""存錢"""
#函數內部定義的變量
#如何將局部變量聲明為全局變量? global 變量名, 這樣操作, 外部就可以訪問到該局部變量.
global allMoney
allMoney = 100
print(id(allMoney))
print("存錢前: ", allMoney)
allMoney += money
print("存錢后: ", allMoney)

def view_money():

函數內部定義的變量

allMoney = 500
print(id(allMoney))
print(allMoney)

if name == 'main':
save_money(150)
print(allMoney)

全局變量

#沒有在函數內部定義的函數, 我們就稱為全局變量。
如果一個變量,既能在一個函數中使用,也能在其他的函數中使用,這樣的變量就是全局變量。
? 在函數外邊定義的變量叫做全局變量
? 全局變量能夠在所有的函數中進行訪問
? 如果在函數中修改全局變量,那么就需要使用global進行聲明,否則出錯
? 如果全局變量的名字和局部變量的名字相同,那么使用的是局部變量的
allMoney = 100

#局部變量,就是在函數內部定義的變量, 只在函數內部生效
def save_money(money):
"""存錢"""
#函數內部定義的變量
#如何將局部變量聲明為全局變量? global 變量名, 這樣操作, 外部就可以訪問到該局部變量.

    global  allMoney
    allMoney = 200
    print("存錢前: ", allMoney)
    allMoney += money
    print("存錢后: ", allMoney)

if __name__ == '__main__':
    save_money(100)
不使用global聲明全局變量時不能修改全局變量?
global的本質是聲明可以修改全局變量的指向, 即變量可以指向新的數據。

1). 不可變類型的全局變量: 指向的數據不能修改, 不使用global時無法修改全局變量。
2). 可變類型的全局變量: 指向的數據可以修改, 不使用global時可以修改全局變量。

可變數據類型與不可變數據類型在全局變量修改的不同

import  pprint

#定義了兩個全局變量
allMoney = 100
operator = []

def save_money(money):
    testCount = 1000
    global  allMoney
    print("存錢之前: ", allMoney, operator)
    allMoney += money
    operator.append("存錢%s元" %(money))
    print("存錢之后: ", allMoney, operator)
    #locals(): 當前局部范圍內所有變量組成的“變量字典”。
    print(locals())

if __name__ == '__main__':
    save_money(10)
    #save_money(20)
    #save_money(30)
    ##globals():全局范圍內所有變量組成的“變量字典”。
    #pprint.pprint(globals().keys())

默認參數

#def mypow(x, y=2, z=None):
#"""求次方, 默認求2次方"""
#return  x**y

#if __name__ == '__main__':
#print(mypow(2))         # 4  x=2, y=2,z=None
#print(mypow(2, 3))      # 8  x=2, y=3,z=None

#默認參數可以降低調用函數的難度。
def connect_mysql(user, passwd, host='localhost', port=3306, charset='utf8'):
    print('connect mysql......', user, passwd, host, port, charset)

if __name__ == '__main__':
    connect_mysql(user='root', passwd='redhat')
    connect_mysql(user='root', passwd='redhat', host='172.25.254.197')

可變參數

#形參(必選參數, 默認參數, 可變參數/位置參數,)
#args是形參, 可以任意修改名稱.
#
args是可變參數,可以傳入1個、2個、3個......個參數。將所有的參數封裝成元組, 賦值給變量args.

def square_sum(*args):  # args=(1, 2, 3, 4)
    """
    求多個數值的平方和
    args = (1, 2, 3, 4)
    count   arg   result
    1       1       1
    2       2       1+4=5
    3       3       5+9=14
    4       4       14+16=30
    :return:
    """
    result = 0
    for arg in args:
        result = result + arg ** 2
    return  result

#1). 調用函數
#square_sum(1)
#square_sum(1, 2)
print(square_sum(1, 2, 3))
print(square_sum(1, 2, 3, 4))

關鍵字參數

import random
print()

#關鍵字參數允許傳入 0 個或任意個含參數名的參數;
#kwargs是形參, 可以任意修改名稱, 一般是kwargs
#kwargs是以字典的數據類型存儲用戶傳入的信息
def record_student_info(name, age, **info):
print(name, age, info)

#1). 調用參數
record_student_info('root', 10)
record_student_info('root', 10, hobby='python program', city='西安', english_level='CET-6')

#2). 解包
info = dict(hobby='python program', city='西安', english_level='CET-6')
record_student_info('westos', 10, **info)

匿名函數

匿名函數指一類無須定義標識符的函數或子程序。Python用lambda語法定義匿名函數,
只需用表達式而無需申明。(省略了用def聲明函數的標準步驟)
lambda函數的語法只包含一個語句,如下:

mymax = lambda num1, num2 : num1 if num1 > num2 else num2
print(mymax(1, 2))

mypow = lambda x, y=2 :  x**y
print(mypow(2))
print(mypow(2, 3))

lambda函數能接收任何數量的參數但只能返回一個表達式的值
匿名函數當作參數傳入:
#應用場合1: 函數作為參數傳遞

def fun(num1, num2, operator_fun=pow):
    return  operator_fun(num1, num2)

print(fun(2, 3))
print(fun(2, 3, lambda  x, y: x+y))

匿名函數作為參數傳遞:

from prettytable import  PrettyTable
def show(goods):
    """友好的以表格的方式打印商品信息"""
    table = PrettyTable(field_names=['Name', 'Count', 'Price'])
    for good in goods:
        table.add_row(good)
    print(table)

goods = [
    ("Python核心編程", 200, 378.9),
    ("Java核心編程", 300, 278.9),
    ("Php核心編程", 100, 78.9),
    ("Ruby核心編程", 260, 178.9),
]

print("按照數量進行排序".center(30, '*'))
goods.sort(key=lambda x:x[1])
show(goods)

print("按照價格進行排序".center(30, '*'))
goods.sort(key=lambda x:x[2])
show(goods)

(2018-攜程-春招題)
給定一個整形數組, 將數組中所有的0移動到末尾, 非0項保持不變;
在原始數組上進行移動操作, 勿創建新的數組;
? 輸入: 數組的記錄;0 7 0 2
? 輸出: 調整后數組的內容; 7 2 0 0

li = [0, 7, 0, 2]
"""
0   7   0   2
\   \   \   \
1   0   1   0

由小到大:
0   0   1   1
\   \   \   \
7   2   0   0
"""
li.sort(key=lamb
```da  x: 1 if x == 0 else 0)
print(li)
# 遞歸函數
一個函數在內部調用自己本身,這個函數就是遞歸函數
需求:
計算階乘 factorial: n! = 1 * 2 * 3 * ... * n
def factorial(num):
    """通過遞歸的方式求num的階乘"""
    #遞歸退出的條件: num <= 1
    #階乘循環的內容: num! = num * (num-1)!

    if num > 1:
        result = num * factorial(num-1)
    else:
        result = 1
    return  result

if __name__ == '__main__':
    print("2的階乘: ", factorial(2))
    print("3的階乘: ", factorial(3))
    print("4的階乘: ", factorial(4))

遞歸實現Fib

from functools import lru_cache@lru_cache(maxsize=1000)
br/>@lru_cache(maxsize=1000)
#1. 遞歸退出的條件: num=1 or num=2 直接退出遞歸. F(1)=1,F(2)=1
#2. 遞歸的規則:F(n)=F(n-1)+F(n-2)
if num == 1 or num == 2:
return 1
else:
return fib(num - 1) + fib(num - 2)

if name == 'main':
print("第5個Fib數列:", fib(5)) # 5
print("第8個Fib數列:", fib(8)) # 21
print("第100個Fib數列:", fib(100))

遞歸實現漢諾塔:
movecount = 0
def hanoi(n=3, start='A', cache='B', target='C'):
    """

    :param n: 盤子個數
    :param start: 初始塔
    :param cache: 緩沖塔
    :param target: 目標塔
    :return: None
    """
    #遞歸函數規則:
    #1). 什么情況下退出遞歸? 當盤子格式n=1是退出遞歸;
    #2). 遞歸的規則:
    #- hanoi(n-1, start, target ,cache)
    #- hanoi(1, start,   cache ,target)
    #- hanoi(n-1, cache,  start,target)
    if n == 1:
        print("盤子從%s移動到%s" %(start, target))
        global  movecount
        movecount += 1
    else:
        hanoi(n - 1, start, target, cache)
        hanoi(1, start, cache, target)
        hanoi(n - 1, cache, start, target)
hanoi(4)
print(movecount)

這周作業

判斷閏年:

num=int(input("輸入:"))
def nian(year):
    return (year %4 ==0 and year % 100 !=0) or (year %400 ==0)
print(nian(num))

99乘法表:

def printLine(row):
    for col in range(1,row+1):
        print("{}*{}={}\t".format(col,row,col*row),end=" ")
    print("")
for row in range(1,10):
printLine(row)

求素數:
素數的特征是除了1和其本身能被整除,其它數都不能被整除的數'

def num(a,b):
    for i in range(a,b):
        f = 0
        for j in range(2,i -1):
            if i % j ==0:
                f = 1
                break
        if f  == 0:
            print(i)
num(100,200)


# 編寫“學生管理系統”,要求如下:
# ? 必須使用自定義函數,完成對程序的模塊化
# ? 學生信息至少包含:姓名、年齡、學號,除此以外可以適當添加
# 
# ? 必須完成的功能:添加、刪除、修改、查詢、退出

    import re  # 導入正則表達式模塊
    import os  # 導入操作系統模塊

    filename = "students.txt"  # 定義保存學生信息的文件名

    def menu():
        # 輸出菜單
        print('''
                        學生信息管理系統
            =============== 功能菜單 ===============        
        │   1 錄入學生信息                             │
        │   2 查找學生信息                             │
        │   3 刪除學生信息                             │
        │   4 修改學生信息                             │
        │   5 排序                                    │
        │   6 統計學生總人數                            │
        │   7 顯示所有學生信息                          │
        │   0 退出系統                                 
        ''')

    def main():
        ctrl = True  # 標記是否退出系統
        while (ctrl):
            menu()  # 顯示菜單
            option = input("請選擇:")  # 選擇菜單項
            option_str = re.sub("\D", "", option)  # 提取數字
            if option_str in ['0', '1', '2', '3', '4', '5', '6', '7']:
                option_int = int(option_str)
                if option_int == 0:  # 退出系統
                    print('您已退出學生成績管理系統!')
                    ctrl = False
                elif option_int == 1:  # 錄入學生成績信息
                    insert()
                elif option_int == 2:  # 查找學生成績信息
                    search()
                elif option_int == 3:  # 刪除學生成績信息
                    delete()
                elif option_int == 4:  # 修改學生成績信息
                    modify()
                elif option_int == 5:  # 排序
                    sort()
                elif option_int == 6:  # 統計學生總數
                    total()
                elif option_int == 7:  # 顯示所有學生信息
                    show()

    '''1 錄入學生信息'''
    def insert():
        stdentList = []        # 保存學生信息的列表
        mark = True  # 是否繼續添加
        while mark:
            id = input("請輸入ID(如 1001):")
            if not id:  # ID為空,跳出循環
                break
            name = input("請輸入名字:")
            if not name:  # 名字為空,跳出循環
                break
            try:
                english = int(input("請輸入英語成績:"))
                python = int(input("請輸入Python成績:"))
                c = int(input("請輸入C語言成績:"))
            except:
                print("輸入無效,不是整型數值....重新錄入信息")
                continue
            stdent = {"id": id, "name": name, "english": english, "python": python, "c": c}  # 將輸入的學生信息保存到字典
            stdentList.append(stdent)  # 將學生字典添加到列表中
            inputMark = input("是否繼續添加?(y/n):")
            if inputMark == "y":  # 繼續添加
                mark = True
            else:  # 不繼續添加
                mark = False
        save(stdentList)  # 將學生信息保存到文件
        print("學生信息錄入完畢!!!")

    # 將學生信息保存到文件
    def save(student):
        try:
            students_txt = open(filename, "a")  # 以追加模式打開
        except Exception as e:
            students_txt = open(filename, "w")  # 文件不存在,創建文件并打開
        for info in student:
            students_txt.write(str(info) + "\n")  # 按行存儲,添加換行符
        students_txt.close()  # 關閉文件

    '''2 查找學生成績信息'''
    def search():
        mark = True
        student_query = []  # 保存查詢結果的學生列表
        while mark:
            id = ""
            name = ""
            if os.path.exists(filename):  # 判斷文件是否存在
                mode = input("按ID查輸入1;按姓名查輸入2:")
                if mode == "1":
                    id = input("請輸入學生ID:")
                elif mode == "2":
                    name = input("請輸入學生姓名:")
                else:
                    print("您的輸入有誤,請重新輸入!")
                    search()  # 重新查詢
                with open(filename, 'r') as file:  # 打開文件
                    student = file.readlines()  # 讀取全部內容
                    for list in student:
                        d = dict(eval(list))  # 字符串轉字典
                        if id is not "":  # 判斷是否按ID查
                            if d['id'] == id:
                                student_query.append(d)  # 將找到的學生信息保存到列表中
                        elif name is not "":  # 判斷是否按姓名查
                            if d['name'] == name:
                                student_query.append(d)  # 將找到的學生信息保存到列表中
                    show_student(student_query)  # 顯示查詢結果
                    student_query.clear()  # 清空列表
                    inputMark = input("是否繼續查詢?(y/n):")
                    if inputMark == "y":
                        mark = True
                    else:
                        mark = False
            else:
                print("暫未保存數據信息...")
                return

    '''3 刪除學生成績信息'''

    def delete():
        mark = True  # 標記是否循環
        while mark:
            studentId = input("請輸入要刪除的學生ID:")
            if studentId is not "":  # 判斷要刪除的學生是否存在
                if os.path.exists(filename):  # 判斷文件是否存在
                    with open(filename, 'r') as rfile:  # 打開文件
                        student_old = rfile.readlines()  # 讀取全部內容
                else:
                    student_old = []
                ifdel = False  # 標記是否刪除
                if student_old:  # 如果存在學生信息
                    with open(filename, 'w') as wfile:  # 以寫方式打開文件
                        d = {}  # 定義空字典
                        for list in student_old:
                            d = dict(eval(list))  # 字符串轉字典
                            if d['id'] != studentId:
                                wfile.write(str(d) + "\n")  # 將一條學生信息寫入文件
                            else:
                                ifdel = True  # 標記已經刪除
                        if ifdel:
                            print("ID為 %s 的學生信息已經被刪除..." % studentId)
                        else:
                            print("沒有找到ID為 %s 的學生信息..." % studentId)
                else:  # 不存在學生信息
                    print("無學生信息...")
                    break  # 退出循環
                show()  # 顯示全部學生信息
                inputMark = input("是否繼續刪除?(y/n):")
                if inputMark == "y":
                    mark = True  # 繼續刪除
                else:
                    mark = False  # 退出刪除學生信息功能

    '''4 修改學生成績信息'''

    def modify():
        show()  # 顯示全部學生信息
        if os.path.exists(filename):  # 判斷文件是否存在
            with open(filename, 'r') as rfile:  # 打開文件
                student_old = rfile.readlines()  # 讀取全部內容
        else:
            return
        studentid = input("請輸入要修改的學生ID:")
        with open(filename, "w") as wfile:  # 以寫模式打開文件
            for student in student_old:
                d = dict(eval(student))  # 字符串轉字典
                if d["id"] == studentid:  # 是否為要修改的學生
                    print("找到了這名學生,可以修改他的信息!")
                    while True:  # 輸入要修改的信息
                        try:
                            d["name"] = input("請輸入姓名:")
                            d["english"] = int(input("請輸入英語成績:"))
                            d["python"] = int(input("請輸入Python成績:"))
                            d["c"] = int(input("請輸入C語言成績:"))
                        except:
                            print("您的輸入有誤,請重新輸入。")
                        else:
                            break  # 跳出循環
                    student = str(d)  # 將字典轉換為字符串
                    wfile.write(student + "\n")   # 將修改的信息寫入到文件
                    print("修改成功!")
                else:
                    wfile.write(student)  # 將未修改的信息寫入到文件
        mark = input("是否繼續修改其他學生信息?(y/n):")
        if mark == "y":
            modify()  # 重新執行修改操作

    '''5 排序'''

    def sort():
        show()  # 顯示全部學生信息
        if os.path.exists(filename):  # 判斷文件是否存在
            with open(filename, 'r') as file:  # 打開文件
                student_old = file.readlines()  # 讀取全部內容
                student_new = []
            for list in student_old:
                d = dict(eval(list))  # 字符串轉字典
                student_new.append(d)  # 將轉換后的字典添加到列表中
        else:
            return
        ascORdesc = input("請選擇(0升序;1降序):")
        if ascORdesc == "0":  # 按升序排序
            ascORdescBool = False           # 標記變量,為False表示升序排序
        elif ascORdesc == "1":  # 按降序排序
            ascORdescBool = True          # 標記變量,為True表示降序排序
        else:
            print("您的輸入有誤,請重新輸入!")
            sort()
        mode = input("請選擇排序方式(1按英語成績排序;2按Python成績排序;3按C語言成績排序;0按總成績排序):")
        if mode == "1":  # 按英語成績排序
            student_new.sort(key=lambda x: x["english"], reverse=ascORdescBool)
        elif mode == "2":  # 按Python成績排序
            student_new.sort(key=lambda x: x["python"], reverse=ascORdescBool)
        elif mode == "3":  # 按C語言成績排序
            student_new.sort(key=lambda x: x["c"], reverse=ascORdescBool)
        elif mode == "0":  # 按總成績排序
            student_new.sort(key=lambda x: x["english"] + x["python"] + x["c"], reverse=ascORdescBool)
        else:
            print("您的輸入有誤,請重新輸入!")
            sort()
        show_student(student_new)  # 顯示排序結果

    ''' 6 統計學生總數'''

    def total():
        if os.path.exists(filename):  # 判斷文件是否存在
            with open(filename, 'r') as rfile:  # 打開文件
                student_old = rfile.readlines()  # 讀取全部內容
                if student_old:
                    print("一共有 %d 名學生!" % len(student_old))
                else:
                    print("還沒有錄入學生信息!")
        else:
            print("暫未保存數據信息...")

    ''' 7 顯示所有學生信息 '''

    def show():
        student_new = []
        if os.path.exists(filename):  # 判斷文件是否存在
            with open(filename, 'r') as rfile:  # 打開文件
                student_old = rfile.readlines()  # 讀取全部內容
            for list in student_old:
                student_new.append(eval(list))  # 將找到的學生信息保存到列表中
            if student_new:
                show_student(student_new)
        else:
            print("暫未保存數據信息...")

    # 將保存在列表中的學生信息顯示出來
    def show_student(studentList):
        from prettytable import PrettyTable
        if not studentList:
            print("(o@.@o) 無數據信息 (o@.@o) \n")
            return
        field_names = ("ID", "名字", "英語成績", "Python成績", "C語言成績", "總成績")
        table = PrettyTable(field_names=field_names)
        for info in studentList:
            sum_score = info.get('english', 0) + info.get('python', 0) + info.get('c', 0)
            row = list(info.values())
            row.append(sum_score)
            table.add_row(row)
        print(table)

    if __name__ == "__main__":
        main()

運行結果示例:

                        學生信息管理系統

            =============== 功能菜單 ===============        

        │   1 錄入學生信息                             │
        │   2 查找學生信息                             │
        │   3 刪除學生信息                             │
        │   4 修改學生信息                             │
        │   5 排序                                    │
        │   6 統計學生總人數                            │
        │   7 顯示所有學生信息                          │
        │   0 退出系統                                 

    請選擇:1
    請輸入ID(如 1001):1109
    請輸入名字:淺淺
    請輸入英語成績:98
    請輸入Python成績:99
    請輸入C語言成績:80
    是否繼續添加?(y/n):n
    學生信息錄入完畢!!!
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

甘洛县| 湖南省| 固阳县| 象山县| 台中市| 邳州市| 建德市| 西昌市| 江孜县| 岑巩县| 望都县| 常山县| 启东市| 呼伦贝尔市| 齐齐哈尔市| 托里县| 元谋县| 连城县| 乌拉特中旗| 启东市| 安顺市| 汝阳县| 温州市| 额敏县| 普陀区| 康定县| 敖汉旗| 剑阁县| 包头市| 瑞昌市| 巴中市| 台湾省| 额尔古纳市| 万载县| 郧西县| 宜良县| 北京市| 高雄市| 酉阳| 文化| 孟连|