Python學習總結【連載】(九)
2018.06.23 Juttachen
概述
+ 28 函數(shù)變量
- 函數(shù)名
- 為其他變量賦值
- 作為參數(shù)
- 作為返回值
+ 29 匿名函數(shù)
- 格式
+ 30 遞歸函數(shù)
- 定義
- 作用
- 步驟
- 函數(shù)的調用過程
+ 31 模塊與函數(shù)
- 模塊的類型
二十八本冲、函數(shù)變量
我們在聲明函數(shù)的時候,其實就是在聲明一個類型是函數(shù)類型(function)的變量。
普通變量能做的事情,函數(shù)變量都能做屑迂。
1.函數(shù)名就是函數(shù)類型變量(類型名:function),存的是函數(shù)入口的地址突勇。
def func1():
print('aaa')
print(type(func1))
num = 10
print(type(num))
2.可以用一個變量給另外一個變量賦值
注意:a = func1() #這樣賦值,是將func1的返回值賦給a
a = func1 #將函數(shù)變量func1賦給a,a就會變成一個函數(shù)
a() #現(xiàn)在就可以用函數(shù)變量a件舵,去調用函數(shù)func1
他們指向同一個地址骚秦,所以運行方式一樣她倘。
3.函數(shù)變量作為函數(shù)的參數(shù)
def calculate(num1,num2,func1):
'''num1 = 10 num2 =20 fn=func_add'''
'''如果num1不是int 或者float數(shù)據(jù)'''
if not(isinstance(num1,int) or isinstance(num1,float)):
print('num1不是數(shù)字')
if not(isinstance(num2,int) or isinstance(num2,float)):
print('num2不是數(shù)字')
return None
return func1(num1,num2)
def func_add(m,n):
return m+n
def fumc_sub(m,n):
return m-n
func2(10)
result = calculate(10,20,func_add)
print(result)
4.函數(shù)作為返回值
例子:寫一個函數(shù),func2('+') -> 返回求和的功能作箍;如果是('')——>返回求乘積的功能*
def func2(char):
if char == '+':
def func2_add(*nums):
sum1 = 0
for x in nums:
sum1 += x
return sum1
return func2_add
if char =='*':
def func2_product(*nums):
pro1 = 1
for x in nums:
pro1 += x
return pro1
return func2_product
result = func2('+') # result是一個求和功能的函數(shù)的函數(shù)變量
print('aaa',result(1,2,3,4))
result2 = func2('*')(10,20)
print(result2)
def func4():
list1 = [1,2,3]
return list1
# 列表作為返回(對象變量作為返回值)
result = func4()
print(result)
print(func4()[0])
二十九帝牡、匿名函數(shù)
python 中使用lambda關鍵字來聲明一個匿名函數(shù)
1.格式
lambda 參數(shù)列表:返回值
參數(shù)列表:多個參數(shù)之間用逗號隔開
例子:使用普通函數(shù)實現(xiàn)求兩個數(shù)的和
def func1(num1,num2):
return num1 + num2
func1(10,20)
# 使用匿名函數(shù)實現(xiàn)
func2 = lambda num1,num2 : num1 + num2
func2(10,20)
相當于匿名函數(shù)就是可以替代函數(shù)體里只有return或者只有一句命令的函數(shù)。
練習:使用匿名函數(shù)求指定列表中蒙揣,指定的兩個下標對應的元素的和
list1 = [1,2,3,4]
func3 = lambda list1,num1,num2 : list1[num1]+list1[num2]
print(func3(list1,0,3))
def calculate(num1,num2,fn):
return fn(num1,num2)
sum1 = calculate(10,20,lambda a,b:a+b)
print(sum1)
三十、遞歸函數(shù)
1.定義
在函數(shù)的聲明中調用函數(shù)本身就是遞歸函數(shù)开瞭。
例子:這里的func1就是一個遞歸函數(shù)懒震,但是是一個死循環(huán)
def func1()
print('aaa')
func1()
func1()
2.遞歸作用
理論上循環(huán)能夠做到的事情遞歸都可以做(但實際除非是非用不可的情況一般不用遞歸)原因:要調動函數(shù)罩息,調動函數(shù)需要內存空間,還需要銷毀个扰,消耗空間且運行麻煩瓷炮,損耗cpu
3.步驟:
a.確定臨界值(結束函數(shù)的時刻)
b.假設函數(shù)的功能已經(jīng)實現(xiàn),然后找到f(n)和f(n-1)關系
c.使用f(n-1)與f(n)的關系去實現(xiàn)f(n)的功能
練習:計算1+2+3+4+...+n
方法一:使用循環(huán)
def func1(n):
sum1 = 0
for x in range(1,n+1):
sum1 += x
return sum1
方法二:使用遞歸
def func2(n):
# 1.確定臨界值
if n == 1:
return 1
# 2.假設func2功能實現(xiàn)了递宅,找func2(n-1),func2(n)的關系
# func2(n-1)=1+2+3+...+n-1
# func2(n) = 1+2+3+...+n-1+n = func2(n-1)+n
# 3.通過func2(n-1)去實現(xiàn)func2(n)的功能
return func2(n-1)+n
print(func1(10))
print(func2(10))
練習:用遞歸實現(xiàn):24...*n(要求n是偶數(shù))
def func3(n):
if n % 2 == 1:
print('n必須是偶數(shù)')
return None
else:
if n == 2:
return 2
return func3(n-2)*n
print(func3(10))
注意:無用代碼不要寫娘香,不必一定要else,在函數(shù)中可以用return結束的就多用return办龄。
例子:
n = 5
*****
****
***
**
*
def func4(n):
if n == 1:
# 1.確定臨界值(一定要讓函數(shù)結束)
print('*')
return None
# 需要結束的話烘绽,直接結束就好,不要和返回值混淆在一起了俐填。
print('*'*n)
func4(n-1)
# f(n)和f(n-1)關系:先打印一行n個*安接,再執(zhí)行f(n-1)
func4(5)
例子:
*
**
***
****
*****
def func5(n):
if n == 1:
print('*')
return None
func5(n-1)
print('*'*n)
func5(5)
4.函數(shù)的調用過程
a.調用函數(shù)的時候,首先在棧中開辟一塊內存空間英融,用來保存函數(shù)調用過程中產(chǎn)生的數(shù)據(jù)
(包括函數(shù)的參數(shù)和在函數(shù)中聲明的變量)
b.當函數(shù)執(zhí)行完成后盏檐,被調用函數(shù)對應的內存空間會被回收(釋放)
棧:是內存中的一塊特殊的區(qū)域。數(shù)字和字符串的值是存在棧里面
堆:對象是存在堆里面的(在Python中不用我們擔心驶悟,但是在c語言中這些對象是需要程序員自己申請內存的)
總結:遞歸要慎用胡野!能用循環(huán)做的就不要用遞歸,因為遞歸消耗內存也消耗CPU資源
三十一痕鳍、模塊與函數(shù)
模塊就是指一個.py文件(一個.py文件就是一個模塊)
可以在一個模塊使用其他模塊的函數(shù)和類
怎么使用其他模塊中的函數(shù)硫豆?
1.通過import關鍵字導入模塊,然后用過模塊名.函數(shù)的方法使用模塊中的函數(shù)
注意6罨瘛够庙!當我們導入其他的模塊的時候會將其他模塊中的所有內容都會導入到當前文件中。
如何解決執(zhí)行語句也被運行抄邀?
判斷模塊的內置屬性name的值是否是'main'
將不需要被其他模塊導入的代碼寫到這個if語句中
if __name__=='__main__':
print(1,2,3)
關于name屬性:
name是每個模塊都有的屬性耘眨,作用是用來存儲模塊的名字。
當模塊不是正在執(zhí)行的模塊境肾,name屬性的值是模塊對應的文件的文件名
當模塊正在執(zhí)行的時候name的值就是一個固定值'main'
2.通過from-import直接導入指定的函數(shù)或者類剔难。導入后就可以直接調用函數(shù)
格式:
from 模塊名 import 函數(shù)名一,函數(shù)二
from qf_math import sum
print(sum(10,2))
3.通過as關鍵字給導入的模塊或者函數(shù)重命名
import qf_math as my_math
# 重命名后可以使用新的模塊名去調用函數(shù)
pirnt(my_math.sum(1,3,5))
from qf_math import sum as my_sum
# 重命名后使用新的函數(shù)名調用函數(shù)
print(my_sum(10,2))
4.模塊的分類
a.內置函數(shù) (python 自己的)
b.第三方函數(shù)(別人寫的)
c.自定義函數(shù)(自己寫的)