第七节 Python的函数的局部变量和全局变量、函数参数引用传值、匿名函数lambda和递归函数
目录
Day07新手小白学python
前言
一、函数的4种基本类型
二、局部变量和全局变量
三、函数参数引用传值
四、匿名函数
五、递归函数
总结
本文介绍了函数的局部变量和全局变量、函数参数引用传值、匿名函数lambda和递归函数。
局部变量:就是在函数内部定义的变量【作用域仅仅局限在函数的内部】 ;不同的函数可以定义相同的局部变量,他们不会相互之间影响。局部变量的作用:为了临时的保存数据,需要在函数中定义来进行存储。
全局变量:在每个函数中都可以使用。
当全局变量和局部变量出现重复定义时,程序会优先执行使用函数内部定义的变量(局部变量)
如果在函数的内部想要对全局变量进行修改的话,必须使用global关键字进行声明
# 局部变量: 就是在函数内部定义的变量【作用域仅仅局限在函数的内部】
# 不同的函数可以定义相同的局部变量,他们不会相互之间影响
# 局部变量的作用:为了临时的保存数据 需要在函数中定义来进行存储
# 全局变量:在每个函数中都可以使用
# 当全局变量和局部变量出现重复定义时,程序会优先执行使用函数内部定义的变量(局部变量)
# 如果在函数的内部想要对全局变量进行修改的话,必须使用global关键字进行声明
pro='自动化' # 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) # 此时依然输出:自动化 因为 pro='英语'定义在函数中,是局部变量 要修改则需要使用global关键字
TestMethod()
printInfo()
在python函数中,参数的传递本身就是一种赋值操作,它直接传递的不是值,而是对对象的一个引用,传递的是对象的地址。
a=1 # 不可变类型:int str 元组类型
def func(x):
print('x的地址{}'.format(id(x)))
x=2 # x是不可变类型
print('x修改之后的地址{}'.format(id(x)))
# print(x)
pass
print('a的地址{}'.format(id(a)))
func(a)
print(a)
# 可变类型:列表 字典
li=[]
def testRenc(parms):
li.append([1,23,5])
print(id(parms))
print('内部的{}'.format(parms))
pass
print(id(li))
testRenc(li)
print('外部的变量对象{}'.format(li))
# 1,在python中,万物皆对象,在函数调用时,实参传递的就是对象的引用
# 2,了解后,就可以更好把控在函数内部的处理是否会影响到函数外部的数据变化
# 参数传递时通过对象引用来完成(通过内存地址传递)
不可变类型:int,str,元组类型。主要指:当该值一旦被赋值被改变,内存地址需要重新去分配。
可变类型:列表,字典类型。主要指:当该值一旦被赋值被改变,内存地址不变,所以数据是同步变化的
python中使用lambda关键字创建匿名函数,所谓匿名即指这个函数没有名字 不能用def关键字创建标准的函数。匿名函数冒号后面的表达式有且只有一个,注意是表达式而不是语句。匿名函数自带return,而这个return的结果就是表达式计算后的结果。缺点:lambda只能是单个表达式,不是一个代码块,仅仅能封装有限逻辑,复杂逻辑实现不了,要用def实现。
语法:lambda 参数1,参数2,参数n:表达式
def computer(x,y):
return x+y
print(computer(10,45))
# 对应的匿名函数
M=lambda x,y:x+y
# 通过变量来调用匿名函数
print(M(19,23))
result=lambda a,b,c:a*b*c
print(result(23,1,2))
三元运算:双分支用b if a else c来表示,若条件a满足则执行b否则则执行c;可以替换传统双分支的写法
age=15
print('可以参军' if age>18 else '继续上学')
lambda与三元运算:
funcTset=lambda x,y:x if x>y else y
print(funcTset(12,3))
rs=(lambda x,y:x if x>y else y)(16,12) # 直接的调用传参
print(rs)
rs1=lambda x:x**2+890
print(rs1(10))
如果一个寒素在内部不调用其他的函数而是调用自己本身则为递归函数。递归函数必须有一个结束条件,否则递归无法结束会一直递归下去,直到到达最大递归深度报错。
递归需要满足的条件:自己调用自己;必须有一个明确的结束条件
递归优点:逻辑简单,定义简单。缺点:容易导致栈溢出,内存资源紧张,甚至内存泄漏
# 递归的方式实现阶乘
def diguiJc(n):
'''
递归实现
:param n:阶乘参数
:return:
'''
if n==1:
return 1
else:
return n*diguiJc(n-1)
pass
# 递归调用
print(diguiJc(5))
递归的原理:与入栈出栈类似,n=5逐步调用函数往下执行至n=1,返回时从n=1逐步执行算式至n=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) # 如果是一个文件夹 再次去递归
pass
else:
print(fileItem)
pass
pass
else:
return # 按要求做到,结果返回空
pass
# 调用搜索文件夹对象
findFile('D:\\各种申请表') # 要加一个/来对已有的/进行转义
本文仅仅简单介绍了Python的函数的局部变量和全局变量、函数参数引用传值、匿名函数lambda和递归函数