python的函数(2)递归函数、匿名函数、时间函数、命名空间与作用域

递归函数

递归函数是一种在函数体内调用自身的函数。递归函数通过不断地将问题分解为更小的子问题来解决问题,直到达到一个简单到可以直接解决的情况(称为基准情况或基本情况)。递归函数是解决许多数学和计算机科学问题(如排序、搜索、遍历树或图等)的强大工具。
递归函数需要满足两个条件:

  • 自己调用自己
  • 有停止条件

阶乘1-10

def factorial(n):
    # 出口
    if n == 1:
        return 1
    # 自己调用自己
    return n * factorial(n - 1)
    print(factorial(10))
#输出结果:3628800

斐波那契数列

def fib(n):
    # 出口
    if n == 1 or n == 2:
        return 1
    # 自己调用自己
    return fib(n - 1) + fib(n - 2)
    print(fib(10))    
#输出结果:55

递归的缺点

尽管递归函数非常强大和优雅,但它们也有一些缺点:

  • 栈溢出:如果递归太深,可能会导致调用栈溢出,因为每次递归调用都会消耗一定的栈空间。
  • 效率问题:递归函数在某些情况下可能不如迭代函数效率高,因为递归调用会产生额外的函数调用开销。
  • 难以理解:对于复杂的递归逻辑,理解起来可能比较困难,尤其是对于不熟悉递归的人来说。

匿名函数

匿名函数,也被称为“lambda函数”,是一种没有函数名的函数形式。它的主要特点是可以在需要函数的地方直接定义和使用,而不必事先定义函数名。

匿名函数的特点

  • 无需定义函数名:匿名函数没有函数名,因此可以直接在需要的地方定义和使用,避免了命名冲突或命名困扰。
  • 一次性使用:匿名函数通常用于一次性使用的情况,不需要事先定义函数名,避免了定义函数的繁琐过程。
  • 简化代码:匿名函数可以将一些简单的函数功能直接写在一行代码中,简化了代码的编写和阅读。
  • 函数即表达式:匿名函数的定义形式和表达式非常接近,可以直接将其作为表达式使用,简化了代码的结构和逻辑。
  • 支持函数式编程:匿名函数在函数式编程中广泛应用,可以作为参数传递给其他函数,实现更加灵活的编程方式。
  • 函数体内只能有一个表达式:匿名函数的函数体内通常只能有一个表达式,不能包含多个语句或复杂的逻辑,这限制了函数的功能和复杂性。
def plus(x):
    return x + 1
    li = [1, 2, 3, 4]
    new_li = []
    f = lambda x: x + 1
    print(f(1))
    new_li = [f(i) for i in li]
    print(new_li)
#输出结果:2
#[2, 3, 4, 5]

时间函数

在Python中,处理时间相关的功能主要通过time模块和datetime模块来实现。这两个模块提供了丰富的函数和类来帮助开发者进行时间的获取、格式化、解析、计算等操作。

示例

from datetime import datetime, timedelta

# 通过切分的方式获取到年月日 时分
strs = '2024-07-14 18:00'
print(strs.split(" ")[0].split("-"))
#输出结果:['2024', '07', '14']

类型转换

字符串类型转换为时间类型

from datetime import datetime, timedelta
strs = '2024-07-14 18:00'
str_time = datetime.strptime(strs, "%Y-%m-%d %H:%M")

print(str_time, type(str_time))
#输出结果:2024-07-14 18:00:00 <class 'datetime.datetime'>

时间类型转换为字符串类型

from datetime import datetime, timedelta
strs1 = "7你2024好14 18世00界00"
strs1_time = datetime.strptime(strs1, "%m你%Y好%d %H世%M界%S")
strs2 = strs1_time.strftime("%d.%m.%Y  %H:%M:%S")
print(strs2, type(strs2))
#输出结果:14.07.2024  18:00:00 <class 'str'>

显示当前时间

print(datetime.now())
#输出结果:2024-07-14 20:08:22.006512

命名空间

Python中一般有三种命名空间:

  • 内置名称(built-in names):Python 语言内置的名称,比如函数名 abs、chr 和异常名称 BaseException、Exception 等等
  • 全局名称(global names):模块中定义的名称,记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常量
  • 局部名称(local names):函数中定义的名称,记录了函数的变量,包括函数的参数和局部定义的变量(类中定义的也是)
    在这里插入图片描述

作用域

在Python中,作用域(Scope)是指变量名与对象之间绑定关系的有效范围,即变量的可见性和生命周期。Python中的作用域可以分为几种类型,它们决定了在程序中如何访问和修改变量。
Python 的作用域一共有4种:

  • L(Local):包含局部变量,比如一个函数/方法内部
  • E(Enclosing):包含了非局部(non-local)也非全局(non-global)的变量
  • G(Global):最外层,比如当前模块的全局变量
  • B(Built-in):包含内建变量/关键字等,最后被搜索
# 闭包函数
# outer 数据enclosing 闭包函数的外函数
def outer():
    o_count = 1
    print(o_count)
    # inner 属于局部作用域
    def inner():
        i_count = 2
        print(i_count, o_count)
    return inner()
if __name__ == '__main__':
    # 全局作用域
    inner = outer()
#输出结果:
#1
#2 1
  • 23
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值