Python——变量、传参、匿名、递归函数(day05)

目录

一、函数的基本类型

二、函数参数引用传值

三、匿名函数

 四、递归函数

五、递归优缺点


什么是函数:一系列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:\\软件')

五、递归优缺点

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清园暖歌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值