程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python——變量、傳參、匿名、遞歸函數(day05)

編輯:Python

目錄

一、函數的基本類型

二、函數參數引用傳值

三、匿名函數

 四、遞歸函數

五、遞歸優缺點


什麼是函數:一系列Python語句的組合,可以在程序中運行一次或者多次,
一般是完成具體的獨立的功能
為什麼要使用函數:
代碼的復用最大化以及最小化冗余代碼,整體代碼結構清晰,問題局部化
函數定義:
def 函數名():
    函數體[一系列的python語句,表示獨立的功能]
函數的調用:
  本質上就是去執行函數定義裡面的代碼塊,在調用函數之前 必須先定義
 

一、函數的基本類型

# 局部變量 就是在函數內部定義的變量【作用域僅僅局限在函數的內部】
# 不同的函數 可以定義相同的局部變量,但是各自用各自的 不會產生影響
# 局部變量的作用:為了臨時的保存數據 需要在函數中定義來進行存儲
# ------------全局變量----------------
# pro的定義就是一個全局變量【作用域的范圍不同】
# 當全局變量和局部變量出現重復定義的時候,程序會優先執行使用函數內部定義的變量【地頭蛇】
#如果在函數的內部要想對全局變量進行修改的話 對於不可變類型【str 元組 number】必須使用global 關鍵字進行聲明
# 以下兩個是全部變量
pro='計算機信息管理'
name='吳老師'
def printInfo():
# name='peter' #局部變量
print('{}.{}'.format(name,pro))
pass
def TestMethod():
name='劉德華'
print(name,pro)
pass
def changeGlobal():
'''
要修改全局變量
:return:
'''
global pro #聲明全局變量 後才可以修改
pro='市場營銷' #局部變量
pass
changeGlobal()
print(pro) #被修改了嗎
TestMethod()
printInfo()

二、函數參數引用傳值

a=1 #不可變類型
def func(x):
print('x的地址{}'.format(id(x)))
x=2
print('x的值修改之後地址{}'.format(id(x)))
print(x)
pass
# 調用函數
# print('a的地址:{}'.format(id(a)))
# func(a)
# print(a)
# 可變類型
# li=[]
# # def testRenc(parms):
# #
# # li.append([1,3,4,54,67])
# # print(id(parms))
# # print('內部的{}'.format(parms))
# # pass
# #
# # print(id(li))
# # testRenc(li)
# # print('外部的變量對象{}'.format(li))
# 小結
# 1.在python當中 萬物皆對象,在函數調用的時候,實參傳遞的就是對象的引用
# 2.了解了原理之後,就可以更好的去把控 在函數內部的處理是否會影響到函數外部的數據變化
#參數傳遞是通過對象引用來完成 、參數傳遞是通過對象引用來完成、參數傳遞是通過對象引用來完成

三、匿名函數

# 匿名函數
# 語法:
# lambda 參數1、參數2、參數3:表達式
# 特點
# 1.使用lambda關鍵字去創建函數
# 2.沒有名字的函數
# 3.匿名函數冒號後面的表達式有且只有一個, 注意:是表達式,而不是語句
# 4.匿名函數自帶return,而這個return的結果就是表達式計算後的結果
# 缺點
# lambde只能是單個表達式,不是一個代碼塊,lambde的設計就是為了滿足簡單函數的場景,
# 僅僅能封裝有限的邏輯,復雜邏輯實現不了,必須使用def來處理
def computer(x,y):
'''
計算數據和
:param x:
:param y:
:return:
'''
return x+y
pass
# 對應的匿名函數
M=lambda x,y:x+y
# 通過變量去調用匿名函數
# print(M(23,19))
# print(computer(10,45))
result=lambda a,b,c:a*b*c
# print(result(12,34,2))
age=25
# print('可以參軍' if age>18 else '繼續上學') #可以替換傳統雙分支的寫法
# funcTest=lambda x,y:x if x>y else y
# print(funcTest(2,12))
# rs=(lambda x,y:x if x>y else y)(16,12) #直接的調用
# print(rs)
varRs=lambda x:(x**2)+890
print(varRs(10))
#

 四、遞歸函數

# 遞歸滿足的條件
# 自己調用自己
# 必須有一個明確的結束條件
# 優點:邏輯簡單、定義簡單
# 缺點:容易導致棧溢出,內存資源緊張,甚至內存洩漏
# 求階乘
# 循環的方式去實現
def jiecheng(n):
result=1
for item in range(1,n+1):
result*=item
pass
return result
# print('10的階乘{}'.format(jiecheng(10)))
# 遞歸方式去實現
def diguiJc(n):
'''
遞歸實現
:param n: 階乘參數
:return:
'''
if n==1:
return 1
else:
return n*diguiJc(n-1)
pass
# 遞歸調用
print('5的階乘{}'.format(diguiJc(5)))
# 遞歸案例 模擬實現 樹形結構的遍歷
import os #引入文件操作模塊
def findFile(file_Path):
listRs=os.listdir(file_Path) #得到該路徑下所有文件夾
for fileItem in listRs:
full_path=os.path.join(file_Path,fileItem) #獲取完整的文件路徑
if os.path.isdir(full_path):#判斷是否是文件夾
findFile(full_path) #如果是一個文件夾 再次去遞歸
else:
print(fileItem)
pass
pass
else:
return
pass
# 調用搜索文件夾對象
findFile('E:\\軟件')

五、遞歸優缺點


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved