一、復(fù)習(xí)
1. 列表
- 1)數(shù)據(jù): [元素1, 元素2, 元素3,...] -- 元素是任何類型的數(shù)據(jù)
- 2)特點(diǎn): 可變敦姻、有序
- 3)支持的相關(guān)操作: +, *, ==, !=, in/not in, len(), list()
- 4)什么時(shí)候使用: 需要保存的多個(gè)數(shù)據(jù)是相同性質(zhì)的數(shù)據(jù), 例如:保存多個(gè)學(xué)生的成績二庵、保存多個(gè)學(xué)生的信息...
2. 元組
- 1)數(shù)據(jù): (元素1, 元素2, 元素3,...) -- 元素是任何類型的數(shù)據(jù)
(元素,)
元素1, 元素2, 元素3,...
變量1, 變量2,... = 元祖
變量1, *變量2,... = 元祖 - 2)特點(diǎn): 不可變钳幅,有序
- 3)支持的相關(guān)操作: +, *, ==, !=, in/not in, len(), tuple()
- 4)什么時(shí)候使用: 存儲數(shù)據(jù)的時(shí)候一般不主動使用元組秉剑。主要是在使用函數(shù)的過程中經(jīng)常遇到元組
3. 字典
- 1)數(shù)據(jù): {鍵1:值1, 鍵2:值2, ...} -- 鍵: 不可變蜜氨、唯一 值: 任何類型的數(shù)據(jù)
- 2)特點(diǎn): 可變械筛、無序
- 3)支持的相關(guān)操作: ==, !=, in / not in, len(), dict()
- 4)什么時(shí)候使用: 同時(shí)存儲的多個(gè)數(shù)據(jù)需要區(qū)分(性質(zhì)不同)
4. 集合
- 1)數(shù)據(jù): {元素1, 元素2, 元素3,...} -- 元素不可變、唯一
- 2)特點(diǎn): 可變飒炎,無序
- 3)支持的相關(guān)操作: 數(shù)據(jù)集合運(yùn)算(|,&,-,^對稱差分)埋哟、 in/not in 、len()郎汪、set()
- 4)什么時(shí)候使用: 去重赤赊、對數(shù)據(jù)的處理涉及到數(shù)學(xué)集合運(yùn)算
補(bǔ)充: is的使用
== 和 is的區(qū)別: 他們兩個(gè)都是來判斷兩個(gè)數(shù)據(jù)是否相等, ==判斷的是值是否相等煞赢,is判斷地址是否相等
python中所有的變量都是保存的數(shù)據(jù)在內(nèi)存中地址;
用一個(gè)變量給另外一個(gè)變量賦值抛计,實(shí)質(zhì)將變量中存儲的地址賦過去;
使用變量實(shí)質(zhì)是使用變量中地址對應(yīng)的內(nèi)存區(qū)域中的值
== : 判斷兩個(gè)變量地址對應(yīng)的值是否相等
is : 判斷兩個(gè)變量存儲的地址是否相等
list1 = [1, 2]
list2 = [1, 2]
print(id(list1), id(list2))
print(list1 == list2) # True
print(list1 is list2) # False
list3 = list1
print(id(list1), id(list3))
print(list1 == list3) # True
print(list1 is list3) # True
class1 = {
'name': 'python1902',
'address': '19樓5教室',
'all_student': [
{'name': '張三', 'age': 18, 'id': 'stu001'},
{'name': '李四', 'age': 20, 'id': 'stu002'},
{'name': '小明', 'age': 30, 'id': 'stu003'},
{'name': '王五', 'age': 16, 'id': 'stu004'}
]
}
print(len(class1['all_student']))
all_student = class1['all_student']
for stu in all_student:
if stu['age'] < 18:
print(stu['name'])
school = {
'leader': {'name': '雷靜', 'tel': '1723828333'},
'all_class': [
{
'name': 'python1902',
'address': '19樓5教室',
'all_student': [
{'name': '張三', 'age': 18, 'id': 'stu001'},
{'name': '李四', 'age': 20, 'id': 'stu002'},
{'name': '小明', 'age': 30, 'id': 'stu003'},
{'name': '王五', 'age': 16, 'id': 'stu004'}
]
},
{
'name': 'python1901',
'address': '19樓10教室',
'all_student': [
{'name': '張三1', 'age': 18, 'id': 'stu005'},
{'name': '李四1', 'age': 20, 'id': 'stu006'},
{'name': '小明1', 'age': 30, 'id': 'stu007'},
{'name': '王五1', 'age': 16, 'id': 'stu008'}
]
}
]
}
all_class = school['all_class']
for class1 in all_class:
all_student = class1['all_student']
for stu in all_student:
if stu['age'] < 18:
print(stu['name'])
二、作業(yè)
1. 聲明一個(gè)字典保存一個(gè)學(xué)生的信息照筑,學(xué)生信息中包括: 姓名吹截、年齡、成績(單科)凝危、電話
student = {'name': '張三', 'age': 23, 'score': 80, 'tel': '15382839992'}
2. 聲明一個(gè)列表饭弓,在列表中保存6個(gè)學(xué)生的信息(6個(gè)題1中的字典)
all_student = [
{'name': '小明', 'age': 28, 'score': 89, 'tel': '15627382903'},
{'name': '路飛', 'age': 30, 'score': 59, 'tel': '15627382904'},
{'name': '鳴人', 'age': 29, 'score': 60, 'tel': '15627382908'},
{'name': '柯南', 'age': 17, 'score': 45, 'tel': '15627382909'},
{'name': '佐助', 'age': 22, 'score': 90, 'tel': '15627382902'},
{'name': '張楚嵐', 'age': 16, 'score': 90, 'tel': '15627382908'}
]
# a.統(tǒng)計(jì)不及格學(xué)生的個(gè)數(shù)
count = 0
for stu in all_student:
if stu['score'] < 60:
count += 1
print('不及格的人數(shù): %d' % count)
# b.打印不及格學(xué)生的名字和對應(yīng)的成績
for stu in all_student:
if stu['score'] < 60:
print(stu['name'], stu['score'])
# c.統(tǒng)計(jì)未成年學(xué)生的個(gè)數(shù)
count = 0
for stu in all_student:
if stu['age'] < 18:
count += 1
print('未成年的人數(shù): %d' % count)
# d.打印手機(jī)尾號是8的學(xué)生的名字
for stu in all_student:
tel = stu['tel']
if tel[-1] == '8':
print(stu['name'], tel)
# e.打印最高分和對應(yīng)的學(xué)生的名字
max_score = 0
names = []
for stu in all_student:
score = stu['score']
if score >= max_score:
max_score = score
for stu in all_student:
if stu['score'] == max_score:
names.append(stu['name'])
print(names, max_score)
# f.將列表按學(xué)生成績從大到小排序(掙扎一下,不行就放棄)
all_student = [
{'name': '小明', 'age': 28, 'score': 89, 'tel': '15627382903'},
{'name': '路飛', 'age': 30, 'score': 59, 'tel': '15627382904'},
{'name': '鳴人', 'age': 29, 'score': 60, 'tel': '15627382908'},
{'name': '柯南', 'age': 17, 'score': 45, 'tel': '15627382909'},
{'name': '佐助', 'age': 22, 'score': 90, 'tel': '15627382902'},
{'name': '張楚嵐', 'age': 16, 'score': 90, 'tel': '15627382908'}
]
# all_student = [
# {'name': '佐助', 'age': 22, 'score': 90, 'tel': '15627382902'},
# {'name': '張楚嵐', 'age': 16, 'score': 90, 'tel': '15627382908'},
# {'name': '小明', 'age': 28, 'score': 89, 'tel': '15627382903'},
# {'name': '鳴人', 'age': 29, 'score': 60, 'tel': '15627382908'},
# {'name': '路飛', 'age': 30, 'score': 59, 'tel': '15627382904'},
# {'name': '柯南', 'age': 17, 'score': 45, 'tel': '15627382909'}
# ]
# nums = [3, 2, 5, 7, 1]
"""
3, 2, 5, 7, 1
i = 0, j = 1,2,3,4
i = 0, j = 1: [3, 2, 5, 7, 1]
j = 2: [5, 2, 3, 7, 1]
j = 3: [7, 2, 3, 5, 1]
j = 4: [7, 2, 3, 5, 1]
i = 1, j = 2,3,4
j = 2: [7, 3, 2, 5, 1]
j = 3: [7, 5, 2, 3, 1]
j = 4: [7, 5, 2, 3, 1]
i = 2, j = 3, 4
j = 3: [7, 5, 3, 2, 1]
j = 4: [7, 5, 3, 2, 1]
i = 3, j = 4
j = 4: [7, 5, 3, 2, 1]
選擇排序: 讓前面的數(shù)依次和后面的每一個(gè)數(shù)比較大小, 如果后面的比前面的數(shù)大就交換位置(降序)媒抠。
整個(gè)過程執(zhí)行長度-1次
"""
# 選擇排序
nums = [3, 2, 5, 7, 1]
length = len(nums)
# i前面的數(shù)的下標(biāo)
for i in range(0, length-1):
# j表示前面數(shù)后邊的每個(gè)數(shù)的下標(biāo)
for j in range(i+1, length):
# 后面的數(shù)比前面的大
if nums[j] > nums[i]:
# 交換位置
nums[i], nums[j] = nums[j], nums[i]
print(nums)
length = len(all_student)
for i in range(0, length-1):
for j in range(i+1, length):
if all_student[j]['age'] > all_student[i]['age']:
all_student[i], all_student[j] = all_student[j], all_student[i]
print(all_student)
3. 用三個(gè)列表表示三門學(xué)科的選課學(xué)生姓名(一個(gè)學(xué)生可以同時(shí)選多門課)
chinese = {'凜', '律', '鳴', '葉', '陸', '綠', '空', '白'}
math = {'凜', '律', '優(yōu)', '梓', '澪', '柚', '松', '柏'}
english = {'凜', '鳴', '紅', '唯', '澪', '空', '白', '堇'}
# a. 求選課學(xué)生總共有多少人
all_student = chinese | math | english
print('選課學(xué)生的總?cè)藬?shù):', len(all_student), all_student)
# b. 求只選了第一個(gè)學(xué)科的人的數(shù)量和對應(yīng)的名字
only_chinese = chinese - math - english
print('只選了語文的學(xué)生:', only_chinese)
# c. 求只選了一門學(xué)科的學(xué)生的數(shù)量和對應(yīng)的名字
only_one = (chinese - math - english) | (math - chinese - english) | (english - math - chinese)
print('只選一門學(xué)科的學(xué)生', only_one)
only_one = (chinese ^ math ^ english) - (chinese & math & english)
print('只選一門學(xué)科的學(xué)生', only_one)
# d. 求只選了兩門學(xué)科的學(xué)生的數(shù)量和對應(yīng)的名字
only_two = ((chinese & math) | (chinese & english) | (english & math)) - (chinese & math & english)
print('只選兩門學(xué)科的學(xué)生', only_two)
# e. 求選了三門學(xué)生的學(xué)生的數(shù)量和對應(yīng)的名字
print(chinese & math & english)
三弟断、函數(shù)
1. 什么是函數(shù)
函數(shù)就是對實(shí)現(xiàn)某一特定功能的代碼塊的封裝
2. 函數(shù)的分類
- 1)系統(tǒng)函數(shù)(內(nèi)置函數(shù)) - 系統(tǒng)已經(jīng)實(shí)現(xiàn)函數(shù)(已經(jīng)造好的機(jī)器),程序員只需要調(diào)用就行
print函數(shù)、input函數(shù)趴生、len函數(shù)阀趴、sum函數(shù)、max函數(shù)等 - 2)自定義函數(shù) - 程序員自己聲明的函數(shù)(自己造機(jī)器)
3. 函數(shù)的聲明(定義) - 造機(jī)器
- 語法:
def 函數(shù)名(形參列表):
函數(shù)說明文檔
函數(shù)體
- 語法:
2)說明
def - python聲明函數(shù)的關(guān)鍵字
函數(shù)名 - 和變量名要求一樣
見名知義(看到函數(shù)名大概知道函數(shù)的功能)
() - 固定寫法
形參列表 - 變量名1,變量名2,變量名3... (根據(jù)情況變量名的個(gè)數(shù)可以是0個(gè)苍匆、1個(gè)或者多個(gè))
形參的作用是將函數(shù)外面的數(shù)據(jù)傳遞到函數(shù)的里面
: - 固定寫法
函數(shù)體 - 和def保持一個(gè)縮進(jìn)的一條或者多條語句刘急。(實(shí)現(xiàn)函數(shù)功能的代碼塊)3)初學(xué)者聲明函數(shù)的步驟
第一步: 確定函數(shù)的功能
第二步: 根據(jù)功能確定函數(shù)名
第三步: 確定形參(看實(shí)現(xiàn)函數(shù)的功能需不需要從外面?zhèn)髦担绻枰獋髦敌枰獛讉€(gè))
第四步: 實(shí)現(xiàn)函數(shù)的功能
第五步: 確定返回值
(!!!!)注意:函數(shù)聲明的時(shí)候浸踩,函數(shù)體不會執(zhí)行叔汁!
# 寫一個(gè)函數(shù)來求兩個(gè)數(shù)的和
def yt_sum(num1, num2):
# num1 = 23, num2 = 90
"""
函數(shù)說明文檔(功能說明)
:param num1: 參數(shù)說明
:param num2: 參數(shù)說明
:return: 返回值說明
"""
print('求和')
print(num1+num2) # print(23+90)
# 聲明一個(gè)函數(shù),實(shí)現(xiàn)求1+2+3+..+n的功能
def sum1(n):
# n = 100, n=10
total = 0
for num in range(1, n+1):
total += num
print(total)
4. 函數(shù)的調(diào)用 - 使用機(jī)器
1)語法
函數(shù)名(實(shí)參列表)2)說明
函數(shù)名 - 已經(jīng)聲明過的函數(shù)
() - 固定寫法
實(shí)參列表 - 數(shù)據(jù)1,數(shù)據(jù)2,數(shù)據(jù)3,... (實(shí)參是用來給形參賦值)3)函數(shù)的調(diào)用過程(特別重要!!!)
第一步:回到函數(shù)聲明的位置
第二步:用實(shí)參給形參賦值。(這個(gè)過程又叫傳參据块, 傳參要保證每個(gè)形參都有值)
第三步:執(zhí)行函數(shù)體
第四步:回到函數(shù)調(diào)用的位置码邻,接著往后執(zhí)行
yt_sum(23, 90)
print('=============')
# 同一個(gè)函數(shù)可以調(diào)用多次
sum1(100)
sum1(10)
print('==============')
四、函數(shù)參數(shù)
1. 位置參數(shù)和關(guān)鍵字參數(shù)
調(diào)用函數(shù)時(shí)候根據(jù)實(shí)參的寫法分為位置參數(shù)和關(guān)鍵字參數(shù)
- 1)位置參數(shù): 讓實(shí)參的順序和形參一一對應(yīng)另假,中間用逗號隔開
- 2)關(guān)鍵字參數(shù): 以'形參名1=值1, 形參名2=值2...'格式來確定實(shí)參
注意: 如果既有位置參數(shù)又有關(guān)鍵字參數(shù)像屋,位置參數(shù)必須寫在關(guān)鍵字參數(shù)前面
def func1(a, b, c):
# a=10, b=20, c=30
print('a:', a, 'b:', b, 'c:', c)
# 位置參數(shù)
func1(10, 20, 30)
# 關(guān)鍵字參數(shù)
func1(c=30, b=20, a=10)
func1(b=20, a=10, c=30)
# 位置參數(shù)+關(guān)鍵字參數(shù)
func1(10, c=30, b=20)
# func1(c=30,20,a=10) # SyntaxError: positional argument follows keyword argument
2. 參數(shù)默認(rèn)值
聲明函數(shù)的時(shí)候,可以給形參賦默認(rèn)值边篮。有默認(rèn)值的形參己莺,在調(diào)用函數(shù)的時(shí)候可以不用給這個(gè)形參賦值
注意: 聲明的時(shí)候有默認(rèn)值的參數(shù)要放在沒有默認(rèn)值的參數(shù)的后面
def func2(a=10, b=20, c=30):
# a=100, b=200, c=30
# a=100,b==200,c=300
print(a, b, c)
func2()
func2(100)
func2(100, 200)
func2(100, 200, 300)
# 調(diào)用函數(shù)只給a和c賦值,b使用默認(rèn)值
func2(a=100, c=300)
func2(100, c=300)
3. 參數(shù)的類型說明
python中類型只有說明的作用戈轿,沒有約束的作用
- 參數(shù)賦默認(rèn)值
- 參數(shù)名:類型
def func3(nums: list, a: int, b=''):
nums.append(a)
4. 不定長參數(shù) - 形參的參數(shù)不確定
- 聲明函數(shù)的時(shí)候凌受,在形參的前面加*,那么這個(gè)參數(shù)就變成不定長參數(shù)思杯,可以同時(shí)接收多個(gè)實(shí)參(將這個(gè)參數(shù)變成元祖)
注意: 不帶*的參數(shù)要放在帶*參數(shù)的前面
# 寫一個(gè)函數(shù)胁艰,求多個(gè)數(shù)的和
def yt_sum(a, *nums, b=0):
print(a, nums)
# yt_sum()
yt_sum(1, 2) # a=1, nums=()
yt_sum(23, 10, 8) # a=23, nums=(10,)
yt_sum(10, 29, 90, 9)
yt_sum(9, 9, 90, 0, 29, 9)
# 練習(xí): 寫一個(gè)函數(shù),按指定的方式計(jì)算多個(gè)數(shù)字的結(jié)果
# operation('+', 23, 34, 45, 56) -> 求和
# operation('-', 23, 34, 45, 56) -> 23-34-45-56
# operation('*', 23, 34, 45, 56) -> 23*34*45*56
# operation('/', 23, 34, 45, 56) -> 23/34/45/56