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