函数与作用域

函数与作用域

函数基础与高级用法

函数基础是编程中的一个重要概念,它是一段可重用的代码块,用于执行特定的任务或计算。函数可以接受输入参数,并返回输出结果。函数可以提高代码的可读性、可维护性和复用性。

函数的基本用法包括定义函数、调用函数和函数返回值。在Python中,函数可以使用def关键字来定义。函数的定义由函数名、参数列表和函数体组成。参数列表是函数的输入,函数体是函数的具体实现。函数的返回值可以使用return关键字指定。

下面是一个简单的函数示例:

def greet(name):return "Hello, " + nameresult = greet("Alice")
print(result)

这个函数接受一个参数name,并返回一个字符串。在调用函数时,需要传入一个参数,函数会根据参数生成相应的返回值。

函数的高级用法包括函数的嵌套、匿名函数和装饰器。

函数的嵌套是指在一个函数中定义另一个函数。内部函数可以访问外部函数的变量和参数。嵌套函数可以提供更好的代码封装和组织。

匿名函数是没有函数名的函数,也称为lambda函数。它通常用于定义简单的函数,特别是作为函数参数传递。

装饰器是一种特殊的函数,用于修改其他函数的行为。装饰器可以在不修改原始函数代码的情况下添加额外的功能,比如日志记录、性能分析和权限验证。

下面是一个使用嵌套函数、匿名函数和装饰器的示例:

def outer_func():x = 1def inner_func():y = 2return x + yreturn inner_funcfunc = outer_func()
result = func()
print(result)square = lambda x: x * x
print(square(3))def decorator_func(original_func):def wrapper_func():print("Before")original_func()print("After")return wrapper_func@decorator_func
def hello():print("Hello")hello()

这个示例中,outer_func是一个嵌套函数,它定义了一个内部函数inner_func。嵌套函数可以访问外部函数的变量x,并返回x + y的结果。

square是一个匿名函数,它接受一个参数x,并返回x * x的结果。

decorator_func是一个装饰器函数,它接受一个原始函数original_func作为参数,并返回一个包装函数wrapper_func。包装函数在原始函数执行之前打印"Before",在原始函数执行之后打印"After"。

使用装饰器可以直接在函数定义之前添加@decorator_func来应用装饰器。在示例中,hello函数被decorator_func装饰,所以在调用hello函数时,会先执行包装函数的逻辑,再执行原始函数的逻辑。

作用域与闭包深入理解

作用域是指在程序中某个变量可以被访问的范围。Python中有四个作用域,从内到外分别是局部作用域、嵌套作用域、全局作用域和内置作用域。

局部作用域是在函数内部定义的变量的作用域,它只在函数内部可见。嵌套作用域是在函数内部的嵌套函数中定义的变量的作用域,它在函数内部和嵌套函数内部可见。

全局作用域是在函数外部定义的变量的作用域,它在整个程序中都可见。内置作用域是Python内置函数和模块中定义的变量的作用域,它在整个程序中都可见。

在Python中,变量的作用域由LEGB原则决定。LEGB分别代表局部作用域、嵌套作用域、全局作用域和内置作用域。当访问一个变量时,解释器首先在局部作用域查找,然后在嵌套作用域中查找,接着在全局作用域中查找,最后在内置作用域中查找。

闭包是指一个函数内部定义的函数,它可以访问外部函数的变量,并且这些变量在外部函数执行结束后仍然可用。闭包可以用来实现一些特殊的功能,例如记住函数的状态和延迟执行。

下面是一个闭包的示例:

def outer_func(x):def inner_func(y):return x + yreturn inner_funcadd_2 = outer_func(2)
result = add_2(3)
print(result)

在这个示例中,outer_func是一个外部函数,它接受一个参数x,并返回一个内部函数inner_funcinner_func可以访问外部函数的变量x。在调用outer_func(2)时,返回的是一个闭包函数add_2,它可以将传入的参数与外部函数的变量相加并返回结果。

闭包的特点是在定义时捕获了外部函数的状态,所以即使外部函数执行结束,闭包函数仍然可以使用外部函数的变量。这种特性可以用来实现一些高级的功能,例如装饰器、函数工厂和延迟执行。

立即执行函数表达式(IIFE)的应用

立即执行函数表达式(Immediately Invoked Function Expression,IIFE)是JavaScript中一种常见的模式,它允许我们创建一个立即执行的函数,并且它的作用域被限制在函数内部。

IIFE的应用有以下几个方面:

  1. 封装变量:使用IIFE可以创建一个私有的作用域,从而防止变量泄露到全局作用域。这在处理模块化的JavaScript代码时非常有用。
(function() {// 私有作用域var privateVar = "IIFE";console.log(privateVar); // 输出 "IIFE"
})();console.log(privateVar); // 报错,privateVar不在全局作用域内可见

  1. 避免命名冲突:当多个脚本文件在同一个页面中加载时,使用IIFE可以避免全局命名冲突。
// 脚本1
(function() {var name = "Script 1";console.log(name); // 输出 "Script 1"
})();// 脚本2
(function() {var name = "Script 2";console.log(name); // 输出 "Script 2"
})();

  1. 模块化开发:IIFE可以用来实现模块化的JavaScript开发。通过将模块代码放在IIFE中,可以创建私有的作用域,并且通过返回的对象来访问模块内部的方法和变量。
var module = (function() {var privateVar = "Private Var";function privateFunc() {console.log(privateVar);}return {publicFunc: function() {privateFunc();}};
})();module.publicFunc(); // 输出 "Private Var"

  1. 函数作为参数:IIFE可以用来将函数作为参数传递给其他函数。
var result = (function() {var num1 = 3;var num2 = 4;return function() {return num1 + num2;};
})();console.log(result()); // 输出 7

总结来说,IIFE是一种非常强大且常用的模式,在JavaScript开发中有许多应用场景,如封装变量,避免命名冲突,模块化开发和函数作为参数的传递等。它可以帮助我们更好地管理作用域和代码结构。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/831386.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大数据学习笔记14-Hive基础2

一、数据字段类型 数据类型 :LanguageManual Types - Apache Hive - Apache Software Foundation 基本数据类型 数值相关类型 整数 tinyint smallint int bigint 小数 float double decimal 精度最高 日期类型 date 日期 timestamps 日期时间 字符串类型 s…

nginx--自定义日志跳转长连接文件缓存状态页

自定义日志服务 [rootlocalhost ~]# cat /apps/nginx/conf/conf.d/pc.conf server {listen 80;server_name www.fxq.com;error_log /data/nginx/logs/fxq-error.log info;access_log /data/nginx/logs/fxq-access.log main;location / {root /data/nginx/html/pc;index index…

使用STM32F103C8T6与蓝牙模块HC-05连接实现手机蓝牙控制LED灯

导言: 在现代智能家居系统中,远程控制设备变得越来越普遍和重要。本文将介绍如何利用STM32F103C8T6单片机和蓝牙模块HC-05实现远程控制LED灯的功能。通过这个简单的项目,可以学会如何将嵌入式系统与蓝牙通信技术相结合,实现远程控制的应用。 目录 导言: 准备工作: 硬…

Java零基础入门到精通_Day 11

1.继承 定义: 继承是面向对象三大特征之一。可以使得子类具有父类的属性和方法,还可以在子类中重新定义,追加属性和方法 格式: public class 子类 extends 父类{} 子类:也叫派生类 父类:基类/超类 继…

低代码技术在构建质量管理系统中的应用与优势

引言 在当今快节奏的商业环境中,高效的质量管理系统对于组织的成功至关重要。质量管理系统帮助组织确保产品或服务符合客户的期望、符合法规标准,并持续改进以满足不断变化的需求。与此同时,随着技术的不断进步,低代码技术作为一…

机器学习笔记-14

机器学习系统设计 1.导入 以垃圾邮件分类器为例子,当我们想要做一个能够区分邮件是否为垃圾邮件的项目的时候,首先在大量垃圾邮件中选出出现频次较高的10000-50000词作为词汇表,并为其设置特征,在对邮件分析的时候输出该邮件的特…

Vue 3 Hooks: 深入理解 Composition API 的魅力

hooks简介 Vue 3 引入了革命性的 Composition API,它提供了一系列的 Hooks(也称为Composition Functions),让组件的逻辑组织更加清晰、复用性更强。本文将深入探讨Vue 3的Hooks使用,从基础概念到实践应用,…

Kerckhoffs原则详细介绍

Kerckhoffs原则,也被称为柯克霍夫原则或柯克霍夫假说,是密码学中的一个核心原则,它起源于19世纪,由荷兰语言学家和密码学家Auguste Kerckhoffs提出。这一原则在密码学领域具有深远的影响,为现代密码系统的设计和安全性…

数据结构(三)------栈

制作不易,三连支持一下呗!!! 文章目录 前言一、什么是栈二、栈的实现 1.栈的结构2.栈的初始化和销毁3.栈的插入数据和删除数据4.取栈顶元素总结 前言 前面我们介绍了第二种数据结构---链表,这里我们继续介绍下一种数据…

SpringBoot3 + SpringSecurity6 + JWT

相关链接 Spring Security mvnrepository 1. pom 引入 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency><groupId>org.spring…

Python一些可能用的到的函数系列126 UCS函数

说明 UCS(Universal Calculation Standard)要求数据是以块进行组织的&#xff1a; 1 数据的存储要按块2 数据的处理也是按块 内容 1 已经完成的部分 假设&#xff0c;数据是按照数值顺序编号的。最常见的是mysql的自增ID&#xff0c;因为这种范式比较好&#xff0c;所以我…

计算机网络-408考研

后续更新发布在B站账号&#xff1a;谭同学很nice http://【计算机408备考-什么是计算机网络&#xff0c;有什么特点&#xff1f;】 https://www.bilibili.com/video/BV1qZ421J7As/?share_sourcecopy_web&vd_source58c2a80f8de74ae56281305624c60b13http://【计算机408备考…

在idea中连接mysql

IDE&#xff08;集成开发环境&#xff09;是一种软件应用程序&#xff0c;它为开发者提供编程语言的开发环境&#xff0c;通常集成了编码、编译、调试和运行程序的多种功能。一个好的IDE可以大幅提高开发效率&#xff0c;尤其是在进行大型项目开发时。IDE通常包括以下几个核心组…

Docker-Compose编排lnmp(dockerfile) 完成Wordpress

目录 一、创建nginx镜像 二、创建mysql镜像 三、创建php镜像 四、启动wordpress 五、安装Compose 六、准备环境 ​编辑 七、编写docker-compose.yml 八、启动并运行 九、浏览器访问 一、创建nginx镜像 #基于基础镜像 FROM centos:7 #用户信息 MAINTAINER this is ngi…

LabVIEW换智能仿真三相电能表研制

LabVIEW换智能仿真三相电能表研制 在当前电力工业飞速发展的背景下&#xff0c;确保电能计量的准确性与公正性变得尤为重要。本文提出了一种基于LabVIEW和单片机技术&#xff0c;具有灵活状态切换功能的智能仿真三相电能表&#xff0c;旨在通过技术创新提高电能计量人员的培训…

vue初始化项目

打开终端输入vue create project-name 选择Manually select features回车&#xff0c;继续选择如下&#xff1a; 如果要使用pina就可以不选vuex&#xff0c;回车&#xff0c;选择如下&#xff1a; 按下图选即可

BJFUOJ-C++程序设计-实验2-类与对象

A 评分程序 答案&#xff1a; #include<iostream> #include<cstring>using namespace std;class Score{ private:string name;//记录学生姓名double s[4];//存储4次成绩&#xff0c;s[0]和s[1]存储2次随堂考试&#xff0c;s[2]存储期中考试&#xff0c;s[3]存储期…

与 Apollo 共创生态:企业解决方案Apollo X 9.0,七载同舟,携手远航,视频简说

目录 介绍背景方案与项目Apollo 开源项目Apollo X 企业解决方案落地因素助力企业落地流程 预置套件需求定义功能定义场景用例融合技术面向园区功能安全Cyber RT企业硬件套件 开发工具链研发迭代范式协同研发工具链标定工具地图工具仿真平台数据闭环 企业合作模式合作方式 共创计…

概述小样本学习的具体应用场景

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 小样本学习&#xff08;Few-shot Learning&#xff0c;FSL&#xff09;作为机器学习的一个重要分支&#xff0c;特别强调从极少量的标注数据中学习和泛化的能力。这在众多领域都有广泛的应用&#xff0…

windows ubuntu sed,awk,grep篇:12.awk 关联数组

目录 78. 引用数组元素 79.使用循环遍历 awk 数组 80. 删除数组元素 81. 多维数组 82. SUBSEP 下标分隔符 83. 用 asort 为数组排序 84. 用 asorti 为索引排序 相比较与其他编程语言中的传统数组&#xff0c; awk 的数组更为强大。 Awk 的数组&#xff0c;都是关联数组&…