day10

一、復(fù)習(xí)
1.函數(shù)的聲明

def 函數(shù)名(參數(shù)1:類型1, 參數(shù)2:類型2...) ->返回值類型:
函數(shù)說明文檔
函數(shù)體
補(bǔ)充:參數(shù)列表中,可以通過'參數(shù)名:類型名'來指定參數(shù)的類型,也可以通過設(shè)置默認(rèn)值來說明參數(shù)的類型
說明類型的好處:a.傳什么類型的值一目了然 b.實(shí)現(xiàn)函數(shù)體的時(shí)候,可以有相關(guān)提示

聲明函數(shù)的時(shí)候不會(huì)執(zhí)行函數(shù)體
2.函數(shù)的調(diào)用
函數(shù)名(實(shí)參列表)
調(diào)用過程:
第一步:回到函數(shù)聲明的位置
第二步:用實(shí)參給形參賦值 --> 傳參(保證每個(gè)參數(shù)都要有值)
第三步:執(zhí)行函數(shù)體
第四步:確定返回值 --> 將函數(shù)調(diào)用表達(dá)式設(shè)置為返回值
第五步:回到函數(shù)調(diào)用的位置,接著往后執(zhí)行
3.函數(shù)的參數(shù)
位置參數(shù)
關(guān)鍵字參數(shù)
參數(shù)的默認(rèn)值 --> 有默認(rèn)值的參數(shù)要放在沒有默認(rèn)值參數(shù)的后面
不定長參數(shù)
4.返回值
python中所有的函數(shù)都有返回值。如果遇到return,函數(shù)的返回值就是return后面的值;沒有遇到返回值就是None
返回值就是函數(shù)調(diào)用表達(dá)式的值。
調(diào)用函數(shù)的目的:a.執(zhí)行函數(shù)體 b.獲取返回值
return的作用:a.返回返回值 b.結(jié)束函數(shù)(函數(shù)中遇到return函數(shù)就結(jié)束)

def download(url):
if 沒有網(wǎng):
retrun None
有網(wǎng)
請求數(shù)據(jù)
處理數(shù)據(jù)
保存數(shù)據(jù)
二、匿名函數(shù)
1.普通函數(shù):
def 函數(shù)名(參數(shù)列表)
函數(shù)體

2.匿名函數(shù):
函數(shù)名 = lambda 參數(shù)列表:返回值
說明:
函數(shù)名 --> 變量名
lambda --> 關(guān)鍵字
參數(shù)列表 --> 參數(shù)名1,參數(shù)名2…
: ---> 固定的
返回值 --> 相當(dāng)于只有一個(gè)return語句的函數(shù)體
匿名函數(shù)的調(diào)用和普通函數(shù)一樣:函數(shù)名(實(shí)參列表),也支持位置參數(shù)、關(guān)鍵字參數(shù)、參數(shù)設(shè)置默認(rèn)值、不定長參數(shù)

寫一個(gè)匿名函數(shù),功能是求兩個(gè)數(shù)的和
sum1 = lamdba num1=10, num2=3, num1+num2
print(sum1(10, 20)) # 30
print(sum1(num1=100, num2=200)) # 300
print(sum1()) # 13

sum11 = lamdbanums: sum(nums)
print(sum11(1, 2, 3)) # 6
練習(xí):求1+2+3+…+n的和
sum2 = lambda n: sum(range(n+1))
print(sum2(100)) # 5050
練習(xí):讀程序
funcs = []
for item in range (1, 5):
funcs.append(lambda x : x
item)
print(item) # 4
print(funcs0) # 8
print(funcs1) # 8
三、變量的作用域
1.變量的作用域
變量的作用域指的是變量能夠使用的范圍
2.全局變量
全局變量:聲明在函數(shù)和類的外面的變量都是全局變量;作用域是從聲明開始,到整個(gè)py文件結(jié)束(任何地方都可以使用)

x和b都是全局變量
for x in range(5):
b = 10
print(x)

c是全局變量
for x in range(5):
for y in range(4):
c = 100
3.局部變量
聲明在函數(shù)和類中的變量都是局部變量。聲明在函數(shù)的局部變量,作用域是從聲明開始到整個(gè)函數(shù)結(jié)束

def fun1():
# 局部變量
aa = 100
print(aa, a1)
for xx in range(5):
print(aa+xx)
4.global關(guān)鍵字
在函數(shù)中說明一個(gè)變量是全局變量
注意:只能在函數(shù)中使用

def func2():
global age
age = 18

global name    

說明當(dāng)前函數(shù)中使用的name是全局變量name

name = 'aaa'
print(name)

5.nonlocal關(guān)鍵字
想要在局部的局部中修改局部變量的值

def func3():
abc = 100
def func4():
nonlocal abc
abc = 200
print('f4:', abc)
func4()
print('f3:', abc)
四、函數(shù)作為變量
聲明函數(shù)就是聲明一個(gè)類型是function的變量, 函數(shù)名實(shí)質(zhì)就是變量名。

def func1():
print('====')

print(type(func1))
1.變量可以給其他變量賦值

a = 10
b = a
print(b*10)

list1 = [1, 2]
list2 = list1
list2.append(100)
print(list2)

func1 = lambda x: print(x)
func2 = func1
func2(10)
聲明一個(gè)變量func11,類型是function
def func11():
print('我是函數(shù)')

用一個(gè)函數(shù)給變量a賦值,a也是一個(gè)函數(shù)
a = func11
a()
print(a)

將函數(shù)func11的返回值給b,b的值是None
b = func11()
print(b)
2.函數(shù)作為列表的元素

a = 10
list1 = [1, a]
print(list1, list1[1]+100)

def func22():
print('我又是函數(shù)')
return 10

list2 = [1, func22, func22()]
print(list2)

list2[1]取到一個(gè)函數(shù), 通過后面加()調(diào)用函數(shù)
print(list21)

list2[2]取到的是整數(shù)10
print(list2[2]+100)
3.將函數(shù)作為參數(shù)

a = 10
def func1(n):
print(n)

func1(a)

def func11(n):
# n = func12
n() # func12()

def func12():
print('hello world')

re = func11(func12)
應(yīng)用:sort的使用
列表.sort(key=None, reverse=False)
使用sort的時(shí)候,可以通過給key賦一個(gè)函數(shù)變量,來規(guī)定列表中的元素按照什么標(biāo)準(zhǔn)來排序。
這兒的函數(shù)變量要求要有一個(gè)參數(shù)和一個(gè)返回值。參數(shù)代表列表中的元素,返回值代表按照那個(gè)標(biāo)準(zhǔn)排序

list1 = [1, 45, 8, 89]
list1.sort()
print(list1)

list2 = [
{'name': '張三', 'age': 20, 'score': 90},
{'name': '李四', 'age': 28, 'score': 70},
{'name': '王五', 'age': 18, 'score': 89}
]
根據(jù)成績排序
def get_age(item):
return item['score']
list2.sort(key=get_age)
list2.sort(key=lambda item: item['score'])
print(list2)
4.將函數(shù)作為返回值
根據(jù)運(yùn)算符號,返回對應(yīng)的功能

def operation(operator: str):
if operator == '+':
def add(*args, **kwargs):
sum1 = 0
for item in args:
sum1 += item
for key in kwargs:
sum1 += kwargs[key]
return sum1
return add

elif operator == '*':
    def func2(*args, **kwargs):
        """求乘積"""
        sum1 = 1
        for item in args:
            sum1 *= item
        for key in kwargs:
            sum1 *= kwargs[key]
        return sum1
    return func2

f1 = operation('+')

f1就是有兩個(gè)不定長參數(shù),功能是求和的函數(shù)

re = f1(10, 20, a=2, b=3)
print(re)

print(operation('+')(10, 20, a=2, b=3))
print(operation('*')(1, 2, 3, 4))
五、函數(shù)的調(diào)用
1、補(bǔ)充:python中的函數(shù)可以有多個(gè)返回值

求多個(gè)數(shù)的和以及平均值
def my_sum(*sums):
sum1 = sum(nums)
average = sum1 / len(nums)
return sum1, average # 同時(shí)返回了和,平均值

a, b = yt_sum(2, 45, 67, 90, 0)
num = yt_sum(34, 56, 67, 34, 56)
print(a, b) # 204 40.8
print(num[0], num[1]) # 247 49.4
2.函數(shù)的調(diào)用過程是一個(gè)壓棧的過程
每次調(diào)用函數(shù)的時(shí)候,系統(tǒng)都會(huì)在內(nèi)存中(棧)開辟空間來存儲(chǔ)函數(shù)執(zhí)行過程中產(chǎn)生數(shù)據(jù)(函數(shù)中聲明的變量)。
當(dāng)函數(shù)調(diào)用完成后,這塊內(nèi)存會(huì)自動(dòng)銷毀。

六、遞歸函數(shù)(了解)
1.什么是遞歸函數(shù)
遞歸函數(shù):函數(shù)中調(diào)用函數(shù)本身,這樣的函數(shù)就是遞歸函數(shù)(自己調(diào)自己)

循環(huán)能做的事情遞歸都可以做,但是實(shí)際上循環(huán)能解決的問題絕對不選遞歸
2.怎么寫遞歸函數(shù)
第一步:確定臨界值(循環(huán)結(jié)束的條件), 讓函數(shù)結(jié)束
第二步:找關(guān)系,假設(shè)函數(shù)的功能已經(jīng)實(shí)現(xiàn),找f(n)和f(n-1)的關(guān)系
第三步:根據(jù)關(guān)系,用f(n-1)實(shí)現(xiàn)f(n)的功能

寫一個(gè)遞歸函數(shù),實(shí)現(xiàn):1+2+3+...n
def yt_sum(n):
# 1.找臨界值
if n == 1:
return 1

# 2.找關(guān)系
"""
yt_sum(n) = 1+2+3+...+n
yt_sum(n-1) = 1+2+3+...+n-1
yt_sum(n) = yt_sum(n-1)+n
"""
# 3.用f(n-1)實(shí)現(xiàn)f(n)的功能
return yt_sum(n-1) + n

print(yt_sum(5))
用遞歸實(shí)現(xiàn)以下功能
"""
n = 3


**

n = 4



**

f(n)和f(n-1)的關(guān)系:
先打印n顆星
f(n-1)
總結(jié):遞歸,能不用就不用??!
七、作業(yè)
1.寫一個(gè)函數(shù)將一個(gè)指定的列表中的元素逆序( 如[1, 2, 3] -> [3, 2, 1])(注意:不要使 表自帶的逆序函數(shù))

def my_num(list1):
new_list =[]
for item in list1[::-1]:
new_list.append(item)
return new_list
list1 = [9, 3, 8, 5, 1, 7]
print(list1,my_num(list1))
結(jié)果:[9, 3, 8, 5, 1, 7] [7, 1, 5, 8, 3, 9]
2.寫一個(gè)函數(shù),提取出字符串中所有奇數(shù)位上的字符

def my_function(str1):
str2 = ""
for index in range(0,len(str1),2):
str2 += str1[index]
return str2
str1 =' jvg9o3rqyg90943'
print(str1,my_function(str1))
結(jié)果:jgory993
3.寫一個(gè)匿名函數(shù),判斷指定的年是否是閏年

4.使用遞歸打印:

n = 3的時(shí)候
@
@@@
@@@@@

n = 4的時(shí)候:
@
@@@
@@@@@
@@@@@@@

5.寫函數(shù),利用遞歸獲取斐波那契數(shù)列中的第 10 個(gè)數(shù),并將該值返回給調(diào)用者。

6.寫一個(gè)函數(shù),獲取列表中的成績的平均值,和最高分

def my_num(list1):
sum1 = 0
ave = 0
max list1[0]
for item in list1:
sum1 += item
if max< item:
max = item
ave = sum1/len(list1)
return ave, max
score = [85, 36, 76, 1, 19, 35, 20]
print(my_num(score))
結(jié)果:(38.857142857142854, 85)
7.寫函數(shù),檢查獲取傳入列表或元組對象的所有奇數(shù)位索引對應(yīng)的元素,并將其作為新的列表返回給調(diào)用者

def new(xulie):
a = []
for index in range(0, len(xulie), 2):
a.append(xulie[index])
return a

a = [1,2,3,6,5,4,8]
b = (6,9,8,5,7,8,415,8)
print(new(a))
print(new(b))
結(jié)果: [1, 3, 5, 8]
[6, 8, 7, 415]
8.實(shí)現(xiàn)屬于自己的字典update方法:用一個(gè)字典去更新另一個(gè)字典的元素(不能使用自帶的update方法)
yt_update(字典1, 字典2)

9.實(shí)現(xiàn)屬于自己的items方法:將字典轉(zhuǎn)換成列表,字典中的鍵值對轉(zhuǎn)換成元祖。(不能使用items方法)
yt_items(字典)
例如:{'a': 1, 'b':2, 'c':3} ---> [('a', 1), ('b', 2), ('c', 3)]

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容