您好,登錄后才能下訂單哦!
從實現函數的角度來看,其至少需要想清楚以下 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
學生信息錄入完畢!!!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。