新手教程---python-函数(新添加)

一、递归函数

在Python中,递归函数是指一个函数调用自身的过程 。递归函数一般包括两个部分:基本情况和递归情况。

基本情况是指在递归过程中终止递归的条件。如果不满足基本情况,递归函数将进入递归情况,调用自身,并缩小问题的规模。

注:递归函数又有一个出口(结束条件)!

递归的深度(函数的条用次数)默认为1000,通过sys模块可以改变递归深度。

示例:

复制代码
# n的阶乘和 
def get_product(v):
    if v == 1:
        return 1
    else:
        return v * get_product(v - 1)


def get_sum(n):
    if n == 1:
        return 1
    else:
        return get_sum(n-1) + get_product(n)


print(get_sum(4)) # 输出4的阶乘和:33

二、变量的作用域(global、nonlocal)

在Python中,变量的作用域指的是变量的可访问范围 。Python中有三种变量的作用域**:全局作用域(global)、局部作用域(local)和非局部作用域(nonlocal)**。

1、全局作用域(global):全局作用域是在整个程序中定义的变量可被访问的范围。在任何函数内部声明的变量,如果没有使用global关键字进行声明,那么该变量都是局部变量,只能在函数内部使用。而在函数外部声明的变量是全局变量,可以在整个程序中的任何地方访问。

示例:

python 复制代码
x = 10   # 全局变量

def func():
    y = 20   # 局部变量
    print(x)   # 可以访问全局变量x
    print(y)   # 可以访问局部变量y

func()
print(x)   # 可以在函数外部访问全局变量x
print(y)   # 报错,不能在函数外部访问局部变量y

2、局部作用域(local):局部作用域是在函数内部定义的变量可被访问的范围。在函数内部声明的变量只能在函数内部使用,无法在函数外部访问。

示例:

python 复制代码
def func():
    x = 10   # 局部变量
    print(x)   # 可以访问局部变量x

func()
print(x)   # 报错,不能在函数外部访问局部变量x

3、非局部作用域(nonlocal):非局部作用域是在嵌套函数中声明的变量可被访问的范围。当在一个函数内部再定义一个函数时,内部函数可以访问外部函数的变量,但不能修改该变量的值。如果需要在内部函数中修改外部函数的变量,可以使用nonlocal关键字进行声明。

示例:

python 复制代码
def outer_func():
    x = 10   # 外部函数的变量

    def inner_func():
        nonlocal x   # 声明使用外部函数的变量x
        x = 20   # 修改外部函数的变量x的值
        print(x)   # 可以访问修改后的外部函数的变量x

    inner_func()
    print(x)   # 可以在外部函数中访问修改后的变量x

outer_func()

总结:

  • 全局作用域中的变量可以在整个程序中任何地方访问。
  • 局部作用域中的变量只能在函数内部访问。
  • 非局部作用域可以在嵌套函数中访问外部函数的变量,并使用nonlocal关键字修改该变量的值。

三、闭包

在Python中,闭包是指函数对象可以访问并修改定义在其外部作用域内的变量的能力。具体来说,闭包可以在内部函数中引用外部函数的变量,即使外部函数已经执行完毕,这些变量仍然可以被内部函数访问和修改。

闭包的特点:

  • 内部函数可以引用外部函数的变量。
  • 外部函数的变量在外部函数执行完后仍然可以被内部函数访问和修改。
  • 内部函数可以作为外部函数的返回值返回或作为其他函数的参数传递。

示例:

复制代码
import random
def fun1():
    print("fun1")
    d0 = []

    def fun2():
        d0.append(random.randint(1, 20))
        print("fun2", d0)

    return fun2
# 不同的变量名存储的值不共用
r1 = fun1()
r1()
r1()
r1()
r1()  # fun2 [18, 4, 12, 2]
r2 = fun1()
r2()  # fun2 [13]

四、装饰器

在Python中,装饰器是一种特殊的函数,用于修改其他函数的行为或功能。装饰器可以在不修改原函数源代码的情况下,对函数进行包装、修饰或扩展。装饰器通常用于添加额外的功能、验证输入参数、缓存结果等。

下面是一个简单的装饰器示例:

python 复制代码
def decorator_function(original_function):
    def wrapper_function():
        print("Before executing the function")
        original_function()
        print("After executing the function")
    return wrapper_function

@decorator_function
def hello():
    print("Hello, world!")

hello()

在上面的示例中,decorator_function是一个装饰器函数,它接受一个函数作为参数,并返回一个修饰后的函数。wrapper_function是内部函数,包含了对原函数的修饰逻辑。@decorator_function表示将hello函数用decorator_function装饰。

当执行hello()时,实际执行的是wrapper_function。在执行original_function()之前和之后,打印了一些额外的信息。这样,我们就实现了在不修改hello函数源代码的情况下,给它添加了额外的功能。

这只是一个简单的装饰器示例,实际中装饰器还可以传递参数、支持多层装饰等。装饰器是Python中非常强大和灵活的特性,可以帮助我们优雅地扩展和修改代码功能。

相关推荐
BK贝壳5 小时前
亿级用户签到位图选型复盘:用 bool-hybrid-array 扛冷启动打卡,也把它和 Roaring/Redis 的边界测清楚了
数据结构·python·性能优化·numpy
2601_966949656 小时前
如何根据研究的起止时间截取分钟级行情?Python 实战与 QuantDash 数据处理指南
开发语言·python·pandas·量化交易·1024程序员节·股票数据·quantdash
在世修行10 小时前
智学文枢:页面切换与跨页数据预填
python·桌面应用·signal·1024程序员节·pyside·跨页跳转·状态预填
2601_9628857211 小时前
如何用 Python 把 K 线重采样成任意周期?
开发语言·python
打工仔折腾 AI11 小时前
在 Ubuntu ARM64 部署 Q1 V3.0 MuJoCo 模型:加载、单步推理与执行器响应解析
linux·运维·人工智能·python·深度学习·ubuntu·性能优化
信誓旦旦的程序猿12 小时前
【Python量化实战宝典 #21】北向资金跟随手册:聪明钱择时信号(Python 可跑)
python·1024程序员节·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
严谨的麻辣烫12 小时前
静态 ISP 代理请求超时怎么排查?Python 与 curl 实战
python·http·requests·1024程序员节·网络排障
KeepRobots14 小时前
11-01 温哥华不回拨:用 60 行 Python 查你的工单系统会不会差一小时(KeepRobots 工程笔记)
python
xiao77mwq14 小时前
你以为 OCR 慢?实测 81.3 s 里全是故障代价:如何把「定格态」消掉,让耗时从 6.5 s 到 13 倍差距显出原形
python
深圳市益普科技有限公司14 小时前
半导体良率管理YMS:良率与设备参数的相关性,先拉哪几组数据
人工智能·python·算法