總結(jié)
一.匿名函數(shù)
匿名函數(shù)本質(zhì)還是函數(shù),之前函數(shù)的所有內(nèi)容都適用于它
1.匿名函數(shù)的聲明
函數(shù)名 = lambda 參數(shù)列表:返回值
2.說明:
函數(shù)名:變量名
lambda:聲明匿名函數(shù)的關(guān)鍵字
參數(shù)列表:參數(shù)名1,參數(shù)名2,...
冒號:固定寫法
返回值:表達式,表達式的值就是返回值
3.匿名函數(shù)的調(diào)用和普通函數(shù)一樣,函數(shù)名(實參列表)
寫一個匿名函數(shù)計算兩個數(shù)的和
# 聲明一個匿名函數(shù)
my_sum = lambda x, y: x+y
# 調(diào)用匿名函數(shù)
result = my_sum(10, 20)
print(result)
練習1:寫一個匿名函數(shù),獲取指定列表指定下標的值的1/2
get_value = lambda list1,index=0: list1[index]/2
# 位置參數(shù)
print(get_value([1, 2, 3, 4], 2))
# 關(guān)鍵字參數(shù)
print(get_value(index=1, list1=[10, 78, 39]))
練習2:獲取一個列表的所有的元素的和與平均值(sum函數(shù)可以計算一個序列的和)
list_operation = lambda list1: (sum(list1), sum(list1)/len(list1))
sum1, average = list_operation([1, 2, 3, 4, 5, 6])
print(sum1, average)
# 補充:python中函數(shù)可以有多個返回值的,就是在一個return后返回多個值,多個值之間用逗號隔開
def list_operation2(list1):
return sum(list1), sum(list1)/len(list1) # 最終是將多個返回值放到一個元祖中返回的
print(list_operation2([1, 2, 3, 4, 5, 6]))
二.變量的作用域
1.函數(shù)的調(diào)用過程是一個壓棧的過程
每次調(diào)用一個函數(shù),系統(tǒng)就會在內(nèi)存區(qū)域中的棧區(qū)間去開辟空間,保存函數(shù)調(diào)用過程中產(chǎn)生的數(shù)據(jù)
當函數(shù)調(diào)用完成,對應的棧區(qū)間會自動銷毀
函數(shù)調(diào)用時產(chǎn)生的棧區(qū)間中保存的數(shù)據(jù)有:形參,在函數(shù)中聲明的變量
2.作用域:指的是一個變量能夠使用的范圍
3.全局變量和局部變量
a.全局變量:聲明在函數(shù)和類的外面的變量都是全局變量
全局變量的作用域:從聲明開始到文件結(jié)束(任何地方都可以使用)
b.局部變量:聲明在函數(shù)中或者類中的變量都是全局變量
局部變量的作用域:從聲明開始到函數(shù)或類結(jié)束
1恒序、全局變量(global)
全局變量:就是聲明在函數(shù)和類外面的變量都是全局變量。
全局變量作用域:從聲明開始到文件結(jié)束。
2净响、局部變量(local)
局部變量:聲明在函數(shù)中或者類的變量就是局部變量。
局部變量的作用域:從聲明開始到函數(shù)結(jié)束(類結(jié)束)财边。
注意:函數(shù)的參數(shù)是聲明在函數(shù)中的局部變量氧腰,同樣不能在別的函數(shù)中使用锨苏。
# x, y, z都是局部變量
def func3(x, y):
z = 'ab'
在局部區(qū)域內(nèi)修改全局變量的值 --- global
c = 100
def func1():
global c #修改全局變量
c = 200
func1()
print(c)
在局部的局部中修改局部變量 --- nonlocal
def func5():
nn = 10
def func6():
nonlocal nn
nn = 20
print('func6',nn)
func6()
print('func5', nn)
func5()
func6 20
func5 20
三.遞歸函數(shù)
1.遞歸函數(shù):
在函數(shù)的函數(shù)體中調(diào)用函數(shù)本身的函數(shù)
2.遞歸的特點
while循環(huán)能做的遞歸函數(shù)都可以
3.怎么寫遞歸函數(shù)
第一步:找臨界值(找到讓循環(huán)結(jié)束的值/找到能夠確定函數(shù)結(jié)果的值)
第二步:假設函數(shù)的功能已經(jīng)實現(xiàn)的前提下,找關(guān)系(找f(n)和f(n-1)/當次循環(huán)和上次循環(huán)的關(guān)系)
第三步:根據(jù)f(n)和f(n-1)的關(guān)系,通過后者實現(xiàn)前者效果
用遞歸實現(xiàn)1+2+3...+n
def my_sum(n):
# 1.找臨界值(在臨界值的位置一定要讓函數(shù)結(jié)束)
if n == 1:
return 1
# 2.找關(guān)系
"""
my_sum(n):1+2+3...+n
my_sum(n-1):1+2+3...+n-1
my_sum(n) = my_sum(n-1)+n
"""
# 3.使用后者實現(xiàn)前者效果
return my_sum(n-1)+n
print(my_sum(10))
四.模塊和包的使用
封裝:
1.函數(shù):對實現(xiàn)某一特定功能的代碼段的封裝
2.模塊:對變量,函數(shù),類進行封裝
模塊:一個py文件就是一個模塊
def multiply(*numbers):
sum1 = 1
for item in numbers:
sum1 *= item
return sum1
print(multiply(1, 2, 5))
1.如何使用其他模塊中的內(nèi)容
a.import 模塊
b.from 模塊 import 模塊中的內(nèi)容
2.重命名
1.import 模塊(as 重命名)
通過模塊.內(nèi)容的形式去使用模塊中的內(nèi)容(能夠使用的是全局變量耿币,函數(shù)梳杏,類)
2.from 模塊 import 模塊中的內(nèi)容
從模塊里面導入需要的內(nèi)容(可以是多個)
3.from 模塊 import 模塊中的內(nèi)容 as 名稱(自己定的名字),可以直接使用淹接,不用加模塊名。
從模塊里面導入需要的內(nèi)容叛溢,然后把內(nèi)容名稱設置成自己設定的塑悼。可以直接使用自己定義的名稱楷掉,不用加模塊名厢蒜。
from 模塊 import * 即導入模塊內(nèi)的所有內(nèi)容。
4.可以導入自己寫的模塊烹植,也可以導入自定義的模塊
將不希望被別的模塊導入(執(zhí)行)的代碼放到模塊的這個if語句中
if __name__ == '__main__':
每個模塊都有一個name屬性,這個屬性的值默認就是當前模塊的文件名
當當前模塊正在被執(zhí)行(直接在當前這個模塊中點了run)的時候,name屬性的值是'main'
在一個模塊中,將不希望被其他模塊導入的代碼寫在if name == 'main'中,
希望被導入的放到這個if外面
建議:函數(shù)的聲明,類的聲明一般寫在if外面,其他的寫在if里面(想要被外部使用的全局變量也可以寫在外面)
作業(yè)
1.寫一個函數(shù)將一個指定的列表中的元素逆序(例例如[1, 2, 3] -> [3, 2, 1])(注意:不要使?用列表自帶的逆序函數(shù))
def reverse(list1:list):
list1 = list1[::-1]
return list1
list1 = reverse([1,2,3,6,7])
print('逆序的列表為:{}'.format(lst))
2.寫一個函數(shù)斑鸦,提取出字符串中所有奇數(shù)位上的字符
def extract(str1:str):
str1 = str1[1::2]
return str1
str2 = extract('wqerwedf')
print('奇數(shù)位上的字符串為:{}'.format(str2))
3.寫一個匿名函數(shù),判斷指定的年是否是閏年
year=lambda x:x%4==0
4.使用遞歸打硬莸瘛:
n = 3的時候
@
@@
@@@
n = 4的時候:
@
@@
@@@
@@@@
def dgdy(n,a=[]):
if n ==1:
print((len(a)+1)*'@')
return
a.append('@')
print('@'*len(a))
return dgdy(n-1),a
dgdy(8)
5.寫函數(shù)巷屿,檢查傳入列列表的長度,如果大于2墩虹,那么僅保留前兩個長度的內(nèi)容嘱巾,并將新內(nèi)容返回給調(diào)用者。
def two(n):
new=[]
for i in n[:2]:
new.append(i)
return new
6.寫函數(shù)诫钓,利用遞歸獲取斐波那契數(shù)列中的第 10 個數(shù)旬昭,并將該值返回給調(diào)用者。(自己背著寫)
def func(n:int):
if n == 1 or n == 2:
n = 1
return n
return func(n-1) + func(n-2)
a = func(10)
print(a)
7.寫一個函數(shù)菌湃,獲取列表中的成績的平均值问拘,和最?高分
def average(lst:list):
average1 = sum(lst)/len(lst)
max1 = max(lst)
return average1,max1
a,b = average([1,2,3,4,5,6,7])
print('平均值%f,最大值%f'%(a,b))
8.寫函數(shù)惧所,檢查獲取傳入列表或元組對象的所有奇數(shù)位索引對應的元素骤坐,并將其作為新的列表返回給調(diào)?用者
def func(sequence):
sequence = list(sequence[1::2])
return sequence
a = func([1,2,3,4,5,6,7,8,9])
b = func((1,2,3,4,5,6,7,8,9))
print(a,b)
效果
[2, 4, 6, 8] [2, 4, 6, 8]