從實現(xiàn)函數(shù)的角度來看,其至少需要想清楚以下 3 點:
? 函數(shù)需要幾個關(guān)鍵的需要動態(tài)變化的數(shù)據(jù),這些數(shù)據(jù)應(yīng)該被定義成函數(shù)的參數(shù)。
? 函數(shù)需要傳出幾個重要的數(shù)據(jù)(就是調(diào)用該函數(shù)的人希望得到的數(shù)據(jù)),這些數(shù)據(jù)
應(yīng)該被定義成返回值。
? 函數(shù)的內(nèi)部實現(xiàn)過程。
#1). 定義函數(shù):
#def 函數(shù)名(參數(shù)1, 參數(shù)2........):
#函數(shù)執(zhí)行的內(nèi)容
#2). 定義函數(shù)時指定參數(shù)和返回值的類型
#def mymax(num1: int, num2: int) -> int:
#代表num1需要傳入整形, num2需要傳入整形, 返回值必須是整形。
#3). 函數(shù)的幫助文檔: 三引號
def mymax(num1: int, num2: int) -> int:
"""
求兩數(shù)的大值
:param num1: 第一個數(shù)值
:param num2: 第二個數(shù)值
:return: 大值
"""
#if num1 > num2:
#return num1
#else:
#return num2
return num1 if num1 > num2 else num2
#調(diào)用函數(shù)
max_num = mymax(2, 1)
print(max_num)
#print(help(mymax))
#定義函數(shù)的時候, 函數(shù)內(nèi)部代碼不會執(zhí)行。 只有在調(diào)用函數(shù)的時候, 才會執(zhí)行代碼的內(nèi)容.
def login(username: str, passwd: str) -> bool:
"""
實現(xiàn)用戶登錄
:param username: 用戶名
:param passwd: 密碼
:return: 是否登錄成功
"""
pass
login('root', 'westos')
返回值理解:
#定義函數(shù)的時候, 函數(shù)內(nèi)部代碼不會執(zhí)行。 只有在調(diào)用函數(shù)的時候, 才會執(zhí)行代碼的內(nèi)容.
def login(username: str, passwd: str) -> bool:
"""
實現(xiàn)用戶登錄
: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)
函數(shù)里面可以調(diào)用其他函數(shù):
def printOneLine():
"""打印一行提示"""
print('*'*30)
def printNumLine(num: int): # num=3
"""打印多行提示"""
for count in range(num):
printOneLine()
printNumLine(3)
? 局部變量,就是在函數(shù)內(nèi)部定義的變量
? 不同的函數(shù),可以定義相同的名字的局部變量,但是各用個的不會產(chǎn)生影響
? 局部變量的作用,為了臨時保存數(shù)據(jù)需要在函數(shù)中定義變量來進行存儲,這就是它的作用
#局部變量,就是在函數(shù)內(nèi)部定義的變量, 只在函數(shù)內(nèi)部生效
def save_money(money):
"""存錢"""
#函數(shù)內(nèi)部定義的變量
#如何將局部變量聲明為全局變量? 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)
#沒有在函數(shù)內(nèi)部定義的函數(shù), 我們就稱為全局變量。
如果一個變量,既能在一個函數(shù)中使用,也能在其他的函數(shù)中使用,這樣的變量就是全局變量。
? 在函數(shù)外邊定義的變量叫做全局變量
? 全局變量能夠在所有的函數(shù)中進行訪問
? 如果在函數(shù)中修改全局變量,那么就需要使用global進行聲明,否則出錯
? 如果全局變量的名字和局部變量的名字相同,那么使用的是局部變量的
allMoney = 100
#局部變量,就是在函數(shù)內(nèi)部定義的變量, 只在函數(shù)內(nèi)部生效
def save_money(money):
"""存錢"""
#函數(shù)內(nèi)部定義的變量
#如何將局部變量聲明為全局變量? global 變量名, 這樣操作, 外部就可以訪問到該局部變量.
global allMoney
allMoney = 200
print("存錢前: ", allMoney)
allMoney += money
print("存錢后: ", allMoney)
if __name__ == '__main__':
save_money(100)
不使用global聲明全局變量時不能修改全局變量?
global的本質(zhì)是聲明可以修改全局變量的指向, 即變量可以指向新的數(shù)據(jù)。
1). 不可變類型的全局變量: 指向的數(shù)據(jù)不能修改, 不使用global時無法修改全局變量。
2). 可變類型的全局變量: 指向的數(shù)據(jù)可以修改, 不使用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(): 當前局部范圍內(nèi)所有變量組成的“變量字典”。
print(locals())
if __name__ == '__main__':
save_money(10)
#save_money(20)
#save_money(30)
##globals():全局范圍內(nèi)所有變量組成的“變量字典”。
#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
#默認參數(shù)可以降低調(diào)用函數(shù)的難度。
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')
#形參(必選參數(shù), 默認參數(shù), 可變參數(shù)/位置參數(shù),)
#args是形參, 可以任意修改名稱.
#args是可變參數(shù),可以傳入1個、2個、3個......個參數(shù)。將所有的參數(shù)封裝成元組, 賦值給變量args.
def square_sum(*args): # args=(1, 2, 3, 4)
"""
求多個數(shù)值的平方和
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). 調(diào)用函數(shù)
#square_sum(1)
#square_sum(1, 2)
print(square_sum(1, 2, 3))
print(square_sum(1, 2, 3, 4))
import random
print()
#關(guān)鍵字參數(shù)允許傳入 0 個或任意個含參數(shù)名的參數(shù);
#kwargs是形參, 可以任意修改名稱, 一般是kwargs
#kwargs是以字典的數(shù)據(jù)類型存儲用戶傳入的信息
def record_student_info(name, age, **info):
print(name, age, info)
#1). 調(diào)用參數(shù)
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)
匿名函數(shù)指一類無須定義標識符的函數(shù)或子程序。Python用lambda語法定義匿名函數(shù),
只需用表達式而無需申明。(省略了用def聲明函數(shù)的標準步驟)
lambda函數(shù)的語法只包含一個語句,如下:
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函數(shù)能接收任何數(shù)量的參數(shù)但只能返回一個表達式的值
匿名函數(shù)當作參數(shù)傳入:
#應(yīng)用場合1: 函數(shù)作為參數(shù)傳遞
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))
匿名函數(shù)作為參數(shù)傳遞:
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("按照數(shù)量進行排序".center(30, '*'))
goods.sort(key=lambda x:x[1])
show(goods)
print("按照價格進行排序".center(30, '*'))
goods.sort(key=lambda x:x[2])
show(goods)
(2018-攜程-春招題)
給定一個整形數(shù)組, 將數(shù)組中所有的0移動到末尾, 非0項保持不變;
在原始數(shù)組上進行移動操作, 勿創(chuàng)建新的數(shù)組;
? 輸入: 數(shù)組的記錄;0 7 0 2
? 輸出: 調(diào)整后數(shù)組的內(nèi)容; 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)
# 遞歸函數(shù)
一個函數(shù)在內(nèi)部調(diào)用自己本身,這個函數(shù)就是遞歸函數(shù)
需求:
計算階乘 factorial: n! = 1 * 2 * 3 * ... * n
def factorial(num):
"""通過遞歸的方式求num的階乘"""
#遞歸退出的條件: num <= 1
#階乘循環(huán)的內(nèi)容: 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))
遞歸實現(xiàn)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. 遞歸的規(guī)則: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數(shù)列:", fib(5)) # 5
print("第8個Fib數(shù)列:", fib(8)) # 21
print("第100個Fib數(shù)列:", fib(100))
遞歸實現(xiàn)漢諾塔:
movecount = 0
def hanoi(n=3, start='A', cache='B', target='C'):
"""
:param n: 盤子個數(shù)
:param start: 初始塔
:param cache: 緩沖塔
:param target: 目標塔
:return: None
"""
#遞歸函數(shù)規(guī)則:
#1). 什么情況下退出遞歸? 當盤子格式n=1是退出遞歸;
#2). 遞歸的規(guī)則:
#- 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)
求素數(shù):
素數(shù)的特征是除了1和其本身能被整除,其它數(shù)都不能被整除的數(shù)'
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)
# 編寫“學生管理系統(tǒng)”,要求如下:
# ? 必須使用自定義函數(shù),完成對程序的模塊化
# ? 學生信息至少包含:姓名、年齡、學號,除此以外可以適當添加
#
# ? 必須完成的功能:添加、刪除、修改、查詢、退出
import re # 導(dǎo)入正則表達式模塊
import os # 導(dǎo)入操作系統(tǒng)模塊
filename = "students.txt" # 定義保存學生信息的文件名
def menu():
# 輸出菜單
print('''
學生信息管理系統(tǒng)
=============== 功能菜單 ===============
│ 1 錄入學生信息 │
│ 2 查找學生信息 │
│ 3 刪除學生信息 │
│ 4 修改學生信息 │
│ 5 排序 │
│ 6 統(tǒng)計學生總?cè)藬?shù) │
│ 7 顯示所有學生信息 │
│ 0 退出系統(tǒng)
''')
def main():
ctrl = True # 標記是否退出系統(tǒng)
while (ctrl):
menu() # 顯示菜單
option = input("請選擇:") # 選擇菜單項
option_str = re.sub("\D", "", option) # 提取數(shù)字
if option_str in ['0', '1', '2', '3', '4', '5', '6', '7']:
option_int = int(option_str)
if option_int == 0: # 退出系統(tǒng)
print('您已退出學生成績管理系統(tǒng)!')
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: # 統(tǒng)計學生總數(shù)
total()
elif option_int == 7: # 顯示所有學生信息
show()
'''1 錄入學生信息'''
def insert():
stdentList = [] # 保存學生信息的列表
mark = True # 是否繼續(xù)添加
while mark:
id = input("請輸入ID(如 1001):")
if not id: # ID為空,跳出循環(huán)
break
name = input("請輸入名字:")
if not name: # 名字為空,跳出循環(huán)
break
try:
english = int(input("請輸入英語成績:"))
python = int(input("請輸入Python成績:"))
c = int(input("請輸入C語言成績:"))
except:
print("輸入無效,不是整型數(shù)值....重新錄入信息")
continue
stdent = {"id": id, "name": name, "english": english, "python": python, "c": c} # 將輸入的學生信息保存到字典
stdentList.append(stdent) # 將學生字典添加到列表中
inputMark = input("是否繼續(xù)添加?(y/n):")
if inputMark == "y": # 繼續(xù)添加
mark = True
else: # 不繼續(xù)添加
mark = False
save(stdentList) # 將學生信息保存到文件
print("學生信息錄入完畢!??!")
# 將學生信息保存到文件
def save(student):
try:
students_txt = open(filename, "a") # 以追加模式打開
except Exception as e:
students_txt = open(filename, "w") # 文件不存在,創(chuàng)建文件并打開
for info in student:
students_txt.write(str(info) + "\n") # 按行存儲,添加換行符
students_txt.close() # 關(guān)閉文件
'''2 查找學生成績信息'''
def search():
mark = True
student_query = [] # 保存查詢結(jié)果的學生列表
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() # 讀取全部內(nèi)容
for list in student:
d = dict(eval(list)) # 字符串轉(zhuǎn)字典
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) # 顯示查詢結(jié)果
student_query.clear() # 清空列表
inputMark = input("是否繼續(xù)查詢?(y/n):")
if inputMark == "y":
mark = True
else:
mark = False
else:
print("暫未保存數(shù)據(jù)信息...")
return
'''3 刪除學生成績信息'''
def delete():
mark = True # 標記是否循環(huán)
while mark:
studentId = input("請輸入要刪除的學生ID:")
if studentId is not "": # 判斷要刪除的學生是否存在
if os.path.exists(filename): # 判斷文件是否存在
with open(filename, 'r') as rfile: # 打開文件
student_old = rfile.readlines() # 讀取全部內(nèi)容
else:
student_old = []
ifdel = False # 標記是否刪除
if student_old: # 如果存在學生信息
with open(filename, 'w') as wfile: # 以寫方式打開文件
d = {} # 定義空字典
for list in student_old:
d = dict(eval(list)) # 字符串轉(zhuǎn)字典
if d['id'] != studentId:
wfile.write(str(d) + "\n") # 將一條學生信息寫入文件
else:
ifdel = True # 標記已經(jīng)刪除
if ifdel:
print("ID為 %s 的學生信息已經(jīng)被刪除..." % studentId)
else:
print("沒有找到ID為 %s 的學生信息..." % studentId)
else: # 不存在學生信息
print("無學生信息...")
break # 退出循環(huán)
show() # 顯示全部學生信息
inputMark = input("是否繼續(xù)刪除?(y/n):")
if inputMark == "y":
mark = True # 繼續(xù)刪除
else:
mark = False # 退出刪除學生信息功能
'''4 修改學生成績信息'''
def modify():
show() # 顯示全部學生信息
if os.path.exists(filename): # 判斷文件是否存在
with open(filename, 'r') as rfile: # 打開文件
student_old = rfile.readlines() # 讀取全部內(nèi)容
else:
return
studentid = input("請輸入要修改的學生ID:")
with open(filename, "w") as wfile: # 以寫模式打開文件
for student in student_old:
d = dict(eval(student)) # 字符串轉(zhuǎn)字典
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 # 跳出循環(huán)
student = str(d) # 將字典轉(zhuǎn)換為字符串
wfile.write(student + "\n") # 將修改的信息寫入到文件
print("修改成功!")
else:
wfile.write(student) # 將未修改的信息寫入到文件
mark = input("是否繼續(xù)修改其他學生信息?(y/n):")
if mark == "y":
modify() # 重新執(zhí)行修改操作
'''5 排序'''
def sort():
show() # 顯示全部學生信息
if os.path.exists(filename): # 判斷文件是否存在
with open(filename, 'r') as file: # 打開文件
student_old = file.readlines() # 讀取全部內(nèi)容
student_new = []
for list in student_old:
d = dict(eval(list)) # 字符串轉(zhuǎn)字典
student_new.append(d) # 將轉(zhuǎn)換后的字典添加到列表中
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) # 顯示排序結(jié)果
''' 6 統(tǒng)計學生總數(shù)'''
def total():
if os.path.exists(filename): # 判斷文件是否存在
with open(filename, 'r') as rfile: # 打開文件
student_old = rfile.readlines() # 讀取全部內(nèi)容
if student_old:
print("一共有 %d 名學生!" % len(student_old))
else:
print("還沒有錄入學生信息!")
else:
print("暫未保存數(shù)據(jù)信息...")
''' 7 顯示所有學生信息 '''
def show():
student_new = []
if os.path.exists(filename): # 判斷文件是否存在
with open(filename, 'r') as rfile: # 打開文件
student_old = rfile.readlines() # 讀取全部內(nèi)容
for list in student_old:
student_new.append(eval(list)) # 將找到的學生信息保存到列表中
if student_new:
show_student(student_new)
else:
print("暫未保存數(shù)據(jù)信息...")
# 將保存在列表中的學生信息顯示出來
def show_student(studentList):
from prettytable import PrettyTable
if not studentList:
print("(o@.@o) 無數(shù)據(jù)信息 (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()
運行結(jié)果示例:
學生信息管理系統(tǒng)
=============== 功能菜單 ===============
│ 1 錄入學生信息 │
│ 2 查找學生信息 │
│ 3 刪除學生信息 │
│ 4 修改學生信息 │
│ 5 排序 │
│ 6 統(tǒng)計學生總?cè)藬?shù) │
│ 7 顯示所有學生信息 │
│ 0 退出系統(tǒng)
請選擇:1
請輸入ID(如 1001):1109
請輸入名字:淺淺
請輸入英語成績:98
請輸入Python成績:99
請輸入C語言成績:80
是否繼續(xù)添加?(y/n):n
學生信息錄入完畢?。。?/code>
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
當前文章:python學習之函數(shù)-創(chuàng)新互聯(lián)
標題URL:http://aaarwkj.com/article30/ppsso.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、網(wǎng)站排名、全網(wǎng)營銷推廣、網(wǎng)站改版、電子商務(wù)、定制開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容