復(fù)習(xí)昨天的內(nèi)容
"""
0.列表(list)
[元素1, 元素2, ...]
可變,有序
元素可以是任意類型的數(shù)據(jù)蝌箍,可以重復(fù)
元素的增刪改查
相關(guān)運(yùn)算和方法
相同數(shù)據(jù)的時(shí)候用列表計(jì)算
1.元祖(tuple)
(元素1, 元素2, ...) 元素1, 元素2, ... (元素,) - 只有一個(gè)元素時(shí),后面必須加逗號
不可變鲫骗,有序
元素可以是任意類型的數(shù)據(jù)殖卑,可以重復(fù)
獲取元素的值 - 查(因?yàn)椴豢勺儾荒茉鰟h改)
相關(guān)運(yùn)算
2.字典(dict)
{key1:value1, key2:value2, ...} {}
可變,無序
元素是鍵值對些侍;鍵不可變并且唯一;值可以任意類型的數(shù)據(jù)政模,可以重復(fù)
元素的增刪改查 - 通過key來
相關(guān)運(yùn)算和方法 in / not 在這里是判斷key的存在
多個(gè)數(shù)據(jù)不是相同信息用字典計(jì)算
3.集合(set)
{元素1, 元素2, ...} set()
可變岗宣,無序
元素不可變并且唯一
元素的增刪查; 數(shù)學(xué)集合運(yùn)算
相關(guān)運(yùn)算
"""
一淋样,認(rèn)識函數(shù)
"""
1.什么是函數(shù)
函數(shù)就是對實(shí)現(xiàn)某一特定功能的代碼段的封裝
2.函數(shù)的分類
系統(tǒng)函數(shù): 系統(tǒng)已經(jīng)給我們定義好的函數(shù)耗式,程序員直接調(diào)用函數(shù)使用功能
print(), input, id(), type(), chr(), bin()...
自定義函數(shù): 需要程序員自己去定義的函數(shù)
3.函數(shù)的定義/聲明 - 造機(jī)器的意思
a.語法
def 函數(shù)名(參數(shù)列表):
函數(shù)體
b.說明
def - python中聲明函數(shù)的關(guān)鍵字
函數(shù)名 - 標(biāo)識符,不能是關(guān)鍵字;
PEP8命名規(guī)范: 所有字母小寫刊咳。 見名知義(看到函數(shù)名大概知道函數(shù)的功能)
() - 固定格式
參數(shù)列表 - 參數(shù)1, 參數(shù)2, 參數(shù)3...彪见; 這兒的參數(shù)叫形參
定義的時(shí)候形參就是變量
功能是將函數(shù)外面的數(shù)據(jù)傳遞到函數(shù)里面
: - 固定格式
函數(shù)體 - 一個(gè)完整的函數(shù)體包含: 函數(shù)說明文檔,實(shí)現(xiàn)函數(shù)功能的代碼段,函數(shù)返回值(產(chǎn)物)
c.初學(xué)者聲明函數(shù)的步驟
第一步: 確定函數(shù)的功能
第二步: 根據(jù)功能確定函數(shù)的命名
第三步: 確定形參(確定需不需要參數(shù), 確定需要幾個(gè)參數(shù))
看實(shí)現(xiàn)函數(shù)的功能需不需要從函數(shù)外面?zhèn)髦颠M(jìn)來娱挨?需要傳幾個(gè)余指?
第四步: 實(shí)現(xiàn)函數(shù)的功能
第五步: 確定函數(shù)返回值
(重點(diǎn)!!!)注意: 聲明函數(shù)的時(shí)候不會(huì)執(zhí)行函數(shù)體!让蕾,只有在調(diào)用的時(shí)候才會(huì)執(zhí)行
4.函數(shù)的調(diào)用 - 使用機(jī)器的意思
a.語法:
函數(shù)名(實(shí)參列表)
b.說明:
函數(shù)名 - 這個(gè)函數(shù)名對應(yīng)的函數(shù)必須是已經(jīng)聲明過的函數(shù)
() - 固定寫法
實(shí)參列表 - 實(shí)參是用來給形參賦值(用實(shí)參給形參賦值的過程叫傳參)
實(shí)參和形參要一一對應(yīng)
c.函數(shù)的調(diào)用過程(重點(diǎn)!!!!)
第一步: 回到函數(shù)聲明的位置
第二步: 用實(shí)參給形參賦值(傳參)
第三步: 執(zhí)行函數(shù)體
第四步: 執(zhí)行完函數(shù)體就確定并返回返回值
第五步: 再回到函數(shù)調(diào)用的位置,接著執(zhí)行后面的其他代碼
"""
寫一個(gè)函數(shù)或听, 求兩個(gè)數(shù)的和
聲明函數(shù)
def th_sum(num1, num2):
"""
求兩個(gè)數(shù)的和(函數(shù)功能說明)
:param num1: # 參數(shù)1說明 求和的第一個(gè)數(shù)
:param num2: # 參數(shù)2說明 1求和的第二個(gè)數(shù)
:return: # 返回值說明 無
"""
# 實(shí)參回到這里 就是讓 num1 = 10, num2 = 20
print('=========')
print(num1, num2)
print(num1 + num2) # 不會(huì)被執(zhí)行 聲明函數(shù)的時(shí)候不會(huì)執(zhí)行函數(shù)體探孝!
# 調(diào)用函數(shù)
th_sum(10, 20) # 可以按Ctr1查看注釋 10是實(shí)參,賦給形參的num1. 20是實(shí)參誉裆,賦給形參的num2
print('~~~~~~~') # ~~~~~~~先執(zhí)行上面完了才執(zhí)行這步
聲明一個(gè)函數(shù)顿颅,打印指定的n!
def factorial( n):
"""求指定數(shù)的階乘"""
i = 1
for x in range(1, n+1):
i *= x
print('%d的階乘是:%d' % (n, i))
factorial(4) # 24
# 注意一個(gè)函數(shù)可以調(diào)用多次
factorial(5) # 120
練習(xí):去聲明一個(gè)函數(shù)足丢,打印指定列表中指定元素對應(yīng)的下標(biāo)
def list_index(list1, item):
"""打印指定列表(list1)中指定元素(item)對應(yīng)的下標(biāo)"""
count = 0 # 保存指定列表中指定元素的個(gè)數(shù)
for index in range(len(list1)):
if list1[index] == item:
print(index)
count += 1
if count == 0:
print('列表中沒有指定元素粱腻!')
list_index([1, 2, 3, 1, 8, 19], 1)
導(dǎo)入random模塊
import random
"""
randint(M, N) - 產(chǎn)生一個(gè)M帶N的隨機(jī)整數(shù)
print()
num = random.randint(M, N)
print(num)
"""
導(dǎo)入random模塊
import random
"""
randint(M, N) - 產(chǎn)生一個(gè)M帶N的隨機(jī)整數(shù)
print()
num = random.randint(M, N)
print(num)
"""
練習(xí)3:聲明一個(gè)函數(shù),函數(shù)功能是猜數(shù)字游戲:
"""
隨機(jī)產(chǎn)生一個(gè)0-100的數(shù)字斩跌,用戶不斷的輸入數(shù)字绍些,知道輸入的數(shù)字和產(chǎn)生數(shù)字一樣就結(jié)束
當(dāng)猜錯(cuò)了,可以給出'大了'/'小了'這樣的提示
27
請輸入數(shù)字(0-100): 50
大了耀鸦,再小點(diǎn)兒
請輸入數(shù)字(0-100): 20
小了柬批,再大點(diǎn)兒
請輸入數(shù)字(0-100): 27
猜對了
"""
def caishuzi():
import random
suijishu = random.randint(0, 100)
count = 0
while True:
# 輸入數(shù)字
print('========游戲開始=========')
num = int(input('請輸入數(shù)字:'))
count += 1
# 判斷是否猜對
if num < suijishu:
print('小了,再大點(diǎn)')
if num > suijishu:
print('大了袖订,再小點(diǎn)')
if num == suijishu:
print('猜對了')
# 游戲結(jié)束
print('========游戲結(jié)束=========')
if count > 7:
print('可以換個(gè)腦袋')
elif count > 4:
print('正常人')
else:
print('天才')
break
caishuzi() # 數(shù)字游戲
二氮帐,paramter(關(guān)于函數(shù)的參數(shù))
"""
1.位置參數(shù)和關(guān)鍵字參數(shù)(根據(jù)實(shí)參的傳遞方式對參數(shù)進(jìn)行的分類)
a.位置參數(shù):實(shí)參的位置和形參保持一致, 按形參聲明的先后順序一一賦值
b.關(guān)鍵字參數(shù): 調(diào)用函數(shù)的時(shí)候以 形參=實(shí)參的方式來傳參,這個(gè)時(shí)候?qū)崊⒌捻樞驘o所謂
"""
def func1(a, b, c):
print(a, b, c)
# 通過位置參數(shù)給形參賦值(傳參)
func1(10, 20, 30) # 10 20 30
# 關(guān)鍵字參數(shù)傳參
func1(c=30, a=10, b=20) # 10 20 30
# 通過位置參數(shù)和關(guān)鍵字參數(shù)集合傳參(關(guān)鍵字參數(shù)必須在位置參數(shù)的后面)
func1(10, 20, c=30) # 關(guān)鍵字參數(shù)必須在位置參數(shù)后面洛姑,不然會(huì)報(bào)錯(cuò)
"""
2.參數(shù)默認(rèn)值
聲明函數(shù)的時(shí)候上沐,可以給參數(shù)賦默認(rèn)值。
如果一個(gè)形參有默認(rèn)值了楞艾,那么調(diào)用函數(shù)的時(shí)候就可以不用穿參
如果有的形參有默認(rèn)值参咙,有的形參沒有默認(rèn)值,那么有默認(rèn)值的形參要放在沒有默認(rèn)值的形參的后面
調(diào)用函數(shù)要保證每個(gè)參數(shù)都有值硫眯!
"""
# 參數(shù)c有默認(rèn)值昂勒,調(diào)用函數(shù)的時(shí)候c可以不用傳參
def func2(a, b, c = 0): # c = 0有默認(rèn)值放在會(huì)面,不然會(huì)報(bào)錯(cuò)
# a=100, b=200
print(a, b, c)
func2(100, 200, 300) # 100 200 300
func2(100, 200) # 100 200 0 c有默認(rèn)值, 沒有c = 0 (默認(rèn)值)就會(huì)報(bào)錯(cuò)舟铜,因?yàn)閰?shù)必須對應(yīng)
def func3(width=1, color='black', long=10):
print('畫一條長度是%d寬度是%s的%s' % (long, width, color))
func3() # 畫一條長度是10寬度是1的black
func3(color = 'red') # 也可以是func3(1,'red'# ) 畫一條長度是10寬度是1的red
func3(3) # 畫一條長度是10寬度是3的black
"""
3.參數(shù)的類型說明 - 類型說明只有提示功能戈盈,沒有約束功能
a.給參數(shù)設(shè)置默認(rèn)值, 默認(rèn)值的類型就是參數(shù)的類型
b.在形參后面加 : 類型名,來說明參數(shù)類型塘娶。這種方式調(diào)用的時(shí)候必須傳參
c.函數(shù)聲明的時(shí)候在()后面加 ->類型名归斤,來說明函數(shù)返回值的類型
類型說明的好處:
a.對實(shí)參的類型進(jìn)行指導(dǎo)
b.實(shí)現(xiàn)函數(shù)功能的時(shí)候有類型相關(guān)的語法提示
"""
def list_item(list1: list, index=0):
print(list1[index])
list_item([2, 34]) # 2 按住Ctrl(看類型)
def func4(a: list, b :str):
a.append(b)
print(a)
func4([1, 2, 3], 'ass') # [1, 2, 3, 'ass']
"""
4.不定長參數(shù) --函數(shù)的參數(shù)個(gè)數(shù)不確定
a. 聲明函數(shù)的時(shí)候在參數(shù)名前加, 可以用來同時(shí)獲取多個(gè)實(shí)參的值
-- 實(shí)質(zhì)是將帶的參數(shù)編程元祖,將多個(gè)實(shí)參的值作為元祖的元素
注意:a.如果函數(shù)中既有不定長參數(shù)又有普通參數(shù)刁岸,那么不定長參數(shù)必須放在普通參數(shù)的后面(不然會(huì)報(bào)錯(cuò))
b.兩個(gè)的參數(shù)要放在一個(gè)的后邊脏里,不然會(huì)報(bào)錯(cuò)
"""
# 寫一個(gè)函數(shù),計(jì)算多個(gè)數(shù)的和
def th_sum1(*nums):
print(nums)
th_sum1(1)
th_sum1(1, 2) # 1, 2) 出來的是元祖
th_sum1(1, 2, 3)
th_sum1(1, 2, 3, 4, 5)
def func5(name, *scores):
print(name, scores)
func5('小明') # 小明 ()-指的是空元祖
func5('小花', 10, 20, 30) # 小花 (10, 20, 30)
"""
b.在參數(shù)名前加兩個(gè)*虹曙,會(huì)將這個(gè)參數(shù)編程一個(gè)字典來獲取關(guān)鍵字參數(shù)的值迫横,其他關(guān)鍵字作為key,實(shí)參作為value
"""
def fun6(**nums):
print(nums)
# fun6(10) # TypeError: fun6() takes 0 positional arguments but 1 was given 會(huì)報(bào)錯(cuò)酝碳,**必須是關(guān)鍵字參數(shù)
fun6(a=10) # {'a': 10} 必須是關(guān)鍵字參數(shù) 變成字典
fun6() # {}
def func7(*args, **kwargs): # 兩顆*的必須放在一顆*的后面矾踱,不然會(huì)報(bào)錯(cuò)
print(args, kwargs)
func7(10, 5, 89) # (10, 5, 89) {}
func7(a=90, b=9, c=90) # () {'a': 90, 'b': 9, 'c': 90}
func7(90, 89, z=0, v=87) # (90, 89) {'z': 0, 'v': 87}
# 寫一個(gè)函數(shù),計(jì)算多個(gè)數(shù)的和(要求可以使用位置參數(shù)也可以使用關(guān)鍵字參數(shù))
def th_sum1(*args, **kwargs):
sum1 = 0
# 遍歷元祖
for num in args:
sum1 += num
# 遍歷字典
for key in kwargs:
sum1 += kwargs[key]
print(sum1)
th_sum1(1, 2) # 3
th_sum1(1, 2, 3, a=4, b=5) # 15
三returnValue 返回值
"""
1.什么是返回值 - 返回值就是將函數(shù)里面的數(shù)據(jù)傳遞到函數(shù)外面(和參數(shù)相反)
a.返回值就是函數(shù)調(diào)用表達(dá)式的值疏哗,就是return關(guān)鍵字后面的表達(dá)式的值
b.python中每個(gè)函數(shù)都有返回值呛讲,默認(rèn)是None
函數(shù)調(diào)用表達(dá)式 - 調(diào)用函數(shù)的語句
return - 關(guān)鍵字,只能寫在函數(shù)體中返奉。功能:1.確定函數(shù)的返回值 2.結(jié)束函數(shù)
執(zhí)行函數(shù)的時(shí)候如果遇到return, 函數(shù)直接結(jié)束,并且將return后面的值作為函數(shù)的返回值
函數(shù)調(diào)用過程:
回到函數(shù)聲明的位置
傳參 - (保證每個(gè)參數(shù)都有值)
執(zhí)行函數(shù)體
執(zhí)行完函數(shù)確定返回值 - 如果執(zhí)行過程中沒有遇到return,函數(shù)的返回值是None
如果執(zhí)行過程中遇到return,return后面是什么返回值就是什么
回到函數(shù)調(diào)用的位置(這個(gè)時(shí)候函數(shù)調(diào)用表達(dá)式的值就是函數(shù)的返回值)
"""
def func1():
print('****')
return
print('=====') # 遇到return 不會(huì)出現(xiàn)
result = func1() # func1()就是函數(shù)調(diào)用表達(dá)式
print(result) # None
def func1():
print('****')
return 123 # 遇到return, 輸出return后面的值
print('=====') # 遇到return 不會(huì)出現(xiàn)
result = func1() # 此時(shí) func1()=123, 然后再把123賦給result
print(result) # *** 123 return后面的值作為函數(shù)的返回值
練習(xí):讀程序
def func2(num):
if num & 1: # 取奇數(shù)
return 100
else:
return 200
return 300
print(func2(10)) # 200 num = 10 if num&1 10為偶數(shù)贝搁,不成立,所以else 答案200
print(func2(111)) # 100 num = 111 111為奇數(shù) 成立 所以執(zhí)行if 答案 100
"""
2.多個(gè)返回值
return 值1,值2,值3... <==> return(值1, 值2, 值3...) 是個(gè)元祖
"""
def func3():
return 1, 2, 3
print(func3()) # (1, 2, 3)
x, y, z = func3()
print(x, y, z) # 1 2 3
"""
3.怎么確定函數(shù)是否需要返回值
實(shí)現(xiàn)函數(shù)的功能如果會(huì)產(chǎn)生新的數(shù)據(jù)芽偏,就將這個(gè)數(shù)據(jù)用return返回
"""
def th_sum(num1, num2):
# print(num1 + num2) 取出來數(shù)字之后就不能用了
return num1 + num2 # 用return就會(huì)保存這個(gè)數(shù)據(jù)雷逆,可以使用
result = th_sum(10, 2823)
print(result)
print(result + 100)
list1 = [result]
print(list1) # [2833]