当前位置: 首页 > wzjs >正文

有哪些可以做调查的网站免费推广的渠道有哪些

有哪些可以做调查的网站,免费推广的渠道有哪些,餐饮vi设计,金华市建设监理协会网站函数式编程是现代编程范式中的重要组成部分,Python虽然不是纯粹的函数式语言,但提供了强大的函数式编程特性。本文将重点介绍Python中两个核心的函数式编程概念:闭包和装饰器,帮助初学者掌握这些强大工具。 一、函数式编程基础 …

函数式编程是现代编程范式中的重要组成部分,Python虽然不是纯粹的函数式语言,但提供了强大的函数式编程特性。本文将重点介绍Python中两个核心的函数式编程概念:闭包和装饰器,帮助初学者掌握这些强大工具。

一、函数式编程基础

什么是函数式编程?

函数式编程(Functional Programming)是一种编程范式,它将计算视为数学函数的求值,避免改变状态和使用可变数据。主要特点包括:

  • 函数是一等公民

  • 避免副作用

  • 强调不可变性

  • 使用高阶函数

在编程语言设计中,"一等公民"(First-class Citizen)是指某种语言元素享有与其他元素同等的权利和灵活性。当说"函数是一等公民"时,意味着函数在语言中拥有与其他基本数据类型(如整数、字符串)相同的地位和操作权限。这是函数式编程范式的核心特征之一,也是Python强大灵活性的重要体现。 

Python中的函数式特性

# 函数作为一等公民
def greet(name):return f"Hello, {name}!"# 将函数赋值给变量
say_hello = greet
print(say_hello("Alice"))  # 输出: Hello, Alice!# 函数作为参数
def apply(func, x):return func(x)print(apply(greet, "Bob"))  # 输出: Hello, Bob!

二、闭包(Closure)

闭包的概念

闭包是指一个函数"记住"并"访问"其词法作用域中的变量,即使该函数在其词法作用域之外执行。

 

闭包必须满足以下三个条件:

  • 必须有一个内嵌函数

  • 内嵌函数必须引用外部函数中变量

  • 外部函数返回值必须是内嵌函数

闭包示例

def outer_func(x):def inner_func(y):return x + yreturn inner_funcclosure = outer_func(10)
print(closure(5))  # 输出: 15

闭包的工作原理

  1. outer_func被调用,创建局部变量x

  2. inner_func被定义并返回,它"记住"了x

  3. 即使outer_func执行完毕,inner_func仍能访问x

闭包的实用场景

# 计数器工厂
def counter():count = 0def increment():nonlocal countcount += 1return countreturn incrementc = counter()
print(c())  # 1
print(c())  # 2
print(c())  # 3

闭包优点

  1. 逻辑连续,当闭包作为另一个函数调用参数时,避免脱离当前逻辑而单独编写额外逻辑。

  2. 方便调用上下文的局部变量。

  3. 加强封装性,是第2点的延伸,可以达到对变量的保护作用。

闭包缺点

引用在,空间不灭:闭包使得函数中的变量保存在内存中,内存消耗很大

 

三、装饰器(Decorator)

装饰器基础

Python装饰器是一种特殊的高阶函数,它允许在不修改原函数代码的情况下动态增强函数的功能。装饰器本质上是一个接收函数作为参数的可调用对象(通常是一个函数),它返回一个新的函数来"包装"原始函数,通过在函数执行前后添加额外逻辑(如日志记录、性能统计、权限校验等)来实现功能的扩展。使用`@decorator`语法糖可以简洁地将装饰器应用到目标函数上,使得代码更加模块化和可复用,是Python中实现AOP(面向切面编程)的核心技术。

简单装饰器示例

def my_decorator(func):def wrapper():print("函数执行前")func()print("函数执行后")return wrapper@my_decorator
def say_hello():print("Hello!")say_hello()
"""
输出:
函数执行前
Hello!
函数执行后
"""

 执行过程:

  1. 定义阶段

    • 当解释器遇到@my_decorator时,会立即执行my_decorator(say_hello)

    • 将原始say_hello函数作为参数传递给my_decorator

  2. 装饰过程

    def my_decorator(func):  # func = 原始say_hellodef wrapper():      # 定义包装函数print("函数执行前")  # 新增前置逻辑func()          # 调用原始函数print("函数执行后")  # 新增后置逻辑return wrapper     # 返回包装后的函数
    • 原始say_hello被替换为wrapper函数

    • 现在say_hello变量指向的是wrapper而非原始函数

  3. 调用阶段

    say_hello()  # 实际调用的是wrapper()

    执行流程:

    • 打印"函数执行前"

    • 调用func()即原始say_hello(),打印"Hello!"

    • 打印"函数执行后"

  4. 内存变化示意图

    装饰前: say_hello -> 原始函数对象
    装饰后: say_hello -> wrapper函数对象wrapper.func -> 原始函数对象(闭包保持引用)

关键点说明:

  • 装饰器在模块导入时就会执行(函数定义时)

  • 实际调用的是被装饰后的新函数

  • 原始函数通过闭包被保留在wrapper的作用域中

  • 这种模式实现了"横切关注点"与核心逻辑的分离

装饰器的工作原理

  1. @my_decorator语法糖等价于:say_hello = my_decorator(say_hello)

  2. 调用say_hello()实际上是调用wrapper()

  3. wrapper函数可以访问原始函数func并在其前后添加操作

带参数的装饰器

def repeat(num):def decorator(func):def wrapper(*args, **kwargs):for _ in range(num):result = func(*args, **kwargs)return resultreturn wrapperreturn decorator@repeat(3)
def greet(name):print(f"Hello, {name}!")greet("Alice")
"""
输出:
Hello, Alice!
Hello, Alice!
Hello, Alice!
"""

四、装饰器的实际应用

1. 计时装饰器

import timedef timer(func):  # 接收被装饰的函数def wrapper(*args, **kwargs):  # 定义包装函数start = time.time()       # 记录开始时间result = func(*args, **kwargs)  # 调用原始函数end = time.time()         # 记录结束时间print(f"{func.__name__}执行时间: {end-start:.4f}秒")  # 打印耗时return result             # 返回原始函数的结果return wrapper               # 返回包装后的函数@timer
def long_running_func():time.sleep(2)  # 人为制造一个2秒的"耗时任务" 休眠2slong_running_func()  # 输出: long_running_func执行时间: 2.0002秒

 2. 缓存装饰器

from functools import lru_cache@lru_cache(maxsize=None)
def fibonacci(n):if n < 2:return nreturn fibonacci(n-1) + fibonacci(n-2)print(fibonacci(30))  # 快速计算结果

 3. 权限验证装饰器

def login_required(func):def wrapper(user, *args, **kwargs):if not user.is_authenticated:raise PermissionError("需要登录")return func(user, *args, **kwargs)return wrapper@login_required
def view_profile(user):print(f"查看{user.username}的个人资料")

五、类装饰器

Python还支持使用 类 实现装饰器:

class CountCalls:def __init__(self, func):self.func = funcself.calls = 0def __call__(self, *args, **kwargs):self.calls += 1print(f"调用次数: {self.calls}")return self.func(*args, **kwargs)@CountCalls
def say_hello():print("Hello!")say_hello()  # 输出: 调用次数: 1 \n Hello!
say_hello()  # 输出: 调用次数: 2 \n Hello!

六、保留函数元信息

使用装饰器时,原始函数的__name____doc__等元信息会被覆盖,可以使用functools.wraps来保留:

from functools import wrapsdef my_decorator(func):@wraps(func)def wrapper(*args, **kwargs):"""包装函数文档"""print("装饰器操作")return func(*args, **kwargs)return wrapper@my_decorator
def example():"""示例函数文档"""passprint(example.__name__)  # 输出: example
print(example.__doc__)   # 输出: 示例函数文档

七、总结与最佳实践

闭包要点

  1. 内部函数可以访问外部函数的变量

  2. 外部函数执行完毕后,内部函数仍能记住这些变量

  3. 使用nonlocal关键字可以修改外部变量

装饰器要点

  1. 装饰器本质上是高阶函数

  2. 可以接受函数作为参数并返回函数

  3. 使用@语法糖使代码更简洁

  4. 多层装饰器从下往上执行

最佳实践

  1. 保持装饰器简单专注

  2. 使用functools.wraps保留元信息

  3. 为装饰器编写清晰的文档

  4. 避免过度使用装饰器导致代码难以理解

函数式编程的这些特性可以让你的Python代码更加简洁、模块化和可维护。掌握闭包和装饰器是成为Python高级程序员的重要一步!

 

 

 

 

http://www.dtcms.com/wzjs/394750.html

相关文章:

  • 网站保姆-源码下载域名批量注册查询
  • 常设中国建设工程法律论坛网站广东企业网站seo哪里好
  • 采集wordpress整站数据郑州关键词排名顾问
  • 小程序就是做网站网络媒体推广产品
  • 广东两学一做考试网站搜索引擎哪个最好用
  • 商城站地址优化网站关键词的技巧
  • 紫阳网站建设上海网络推广平台
  • 网站开发毕业设计任务书范文广告投放方式
  • 动态网站开发技术有哪些电脑软件推广平台
  • 做的好的大学生旅行有哪些网站好微信朋友圈推广
  • 找快照网站查询网站seo优化方案设计
  • 宛城区微网站建设制作网站建设入门
  • 公务员写作材料网站上海专业seo服务公司
  • 上海平台网站建设哪家好西安网站制作费用
  • 文档里链接网站地址怎么做免费手机网站建站系统
  • 网站留言板块怎么做百度一下你就知道搜索引擎
  • 网站建设最重要的因素哪里有网站推广优化
  • 网站建设 学习什么软文案例大全300字
  • 成都p2p网站建设windows7系统优化工具
  • 深圳网站设计招聘粤语seo是什么意思
  • 专教做蛋糕的网站百度下载安装最新版
  • 一个专门做恐怖片的网站2022适合小学生的简短新闻
  • 网站鼠标的各种效果怎么做的营销型网站建设优化建站
  • 穆棱市城乡建设局网站漳州网络推广
  • 重庆梁平网站建设报价网站seo是什么意思
  • 导航网站 php一个新手如何推销产品
  • 海口做网站供应商百度指数怎么算
  • 网站目录遍历网站搭建
  • 县政府网站党风廉政建设工作汇报成人就业技术培训机构
  • 做网站专题需要什么软件网站互联网推广