Day29
复习日
一、函数
1、函数是什么?
(1)、定义:
函数就像一个“黑匣子”,你给它输入数据(参数),它按照内部的逻辑处理这些数据,然后返回一个结果。函数一般包含函数名、参数列表、函数体和返回值。
(2)、函数的组成部分
①函数名:用于标识函数,调用函数时会用到。
②参数列表:函数接收的输入数据,可包含零个或多个参数。
③函数体:实现函数功能的代码块。
④返回值:函数处理完数据后返回的结果,部分函数可能没有返回值。
(3)、函数的作用
①代码复用:可在程序不同地方多次调用同一函数,避免代码重复。
②模块化:把复杂任务分解成多个小函数,使代码结构更清晰,便于维护和调试。
③抽象化:隐藏函数内部实现细节,让使用者只需关注函数功能和输入输出。
2、变量作用域是什么?
(1)、定义
变量作用域指的是在程序里变量可被访问和使用的范围。了解变量作用域有助于避免命名冲突,同时能合理管理内存。不同编程语言的变量作用域规则有所不同,但常见的作用域类型有全局作用域、局部作用域,部分语言还有块级作用域。下面详细介绍这些作用域,并给出不同编程语言的示例。
(2)、分类:
①全局作用域:全局作用域里定义的变量被称为全局变量,在整个程序的任何地方都能访问。全局变量通常在程序的最外层定义。
②局部作用域:局部作用域里定义的变量被称为局部变量,只能在定义它的代码块内访问。一般在函数、方法或者类内部定义的变量就属于局部变量。
③块级作用域:部分语言存在块级作用域,像 if 语句、 for 循环、 while 循环等代码块内定义的变量,只能在该代码块内访问。 let 和 const 声明的变量在 JavaScript 里就具有块级作用域。
3、参数的类型
(1)、位置参数:位置参数是最常见的参数类型,调用函数时按照参数定义的顺序依次传递参数。函数会根据参数的位置来匹配值。
(2)、关键字参数:使用关键字参数时,可以通过参数名来指定传递的值,这样就无需按照参数定义的顺序传递。
(3)、默认参数:在定义函数时,可以为参数设置默认值。如果调用函数时没有提供该参数的值,则使用默认值。
(4)、可变参数:可变参数允许函数接受任意数量的参数。常见的有可变位置参数和可变关键字参数。
(5)、引用参数:在某些语言中,参数传递方式可以是引用传递。这意味着函数接收的是变量的内存地址,函数内部对参数的修改会影响到原始变量。
4、参数传递的手段?
(1)、值传递:值传递是将实际参数的值复制一份传递给函数的形式参数。函数内部对形式参数的修改不会影响到实际参数。
(2)、引用传递:引用传递是将实际参数的引用(内存地址)传递给函数的形式参数。函数内部对形式参数的修改会影响到实际参数。
(3)、指针传递:指针传递主要用于支持指针的语言,如 C 和 C++。传递的是变量的内存地址,函数可以通过指针访问和修改该地址上的数据。
(4)、关键字参数传递:允许在调用函数时通过参数名来指定传递的值,而不必按照函数定义中参数的顺序进行传递。
5、参数传递的顺序?
(1)、位置参数顺序:当使用位置参数调用函数时,必须按照函数定义中参数的顺序依次传递参数。
(2)、关键字参数与位置参数混合顺序:如果同时使用位置参数和关键字参数,位置参数必须在关键字参数之前。
(3)、可变参数顺序:在 Python 中,可变位置参数 *args 要在普通位置参数之后,可变关键字参数 **kwargs 要在所有参数之后。
6、什么是装饰器?
在 Python 里,装饰器本质上是一个函数,它接收一个函数作为参数,并返回一个新的函数。新函数通常会在原函数的基础上添加一些额外的功能。
7、什么时候装饰器的进一步复用?
装饰器进一步复用指的是将一个或多个装饰器应用到多个不同的函数、方法或者类上,从而避免代码重复,提高代码的可维护性和可扩展性。
(1)、单个装饰器复用
单个装饰器可以被多个函数使用,为这些函数添加相同的额外功能。
(2)、多个装饰器复用
多个装饰器可以组合使用,并且这种组合也能被多个函数复用。
8、内部函数的返回值是什么?
内部函数(也称为嵌套函数)的返回值取决于其函数体中 return 语句返回的内容。若没有 return 语句,默认返回 None (Python)、 undefined (JavaScript)等。
在 Python 里,内部函数是定义在其他函数内部的函数。其返回值由 return 语句决定,若没有 return 语句,默认返回 None 。
9、类的定义?
在 Python 里,类是对象的蓝图,使用 class 关键字来定义。类可以包含属性(变量)和方法(函数)。
10、Pass占位符和缩进?
(1)、Pass占位符的定义:
pass 是 Python 里的一个空语句,它不执行任何操作,主要作用是作为占位符,在语法上需要语句但暂时又没有具体代码要写时使用。这在定义类、函数或者编写条件语句时非常有用,可以保持代码结构的完整性,避免因缺少代码而导致的语法错误。
eg:
class MyClass:
pass # 暂时没有具体代码,使用 pass 占位
这里定义了一个名为 MyClass 的类,目前还没想好类里面要实现什么功能,使用 pass 占位,保证类定义的语法正确性。
(2)、缩进的定义:
在 Python 里,缩进是用来表示代码块的,不像其他一些编程语言(如 Java、C++)使用大括号 {} 来划分代码块。Python 通过缩进来确定代码的层次结构,相同缩进量的代码属于同一个代码块。通常建议使用 4 个空格进行缩进,不过也可以使用制表符(Tab),但要保证代码中缩进风格的一致性。
eg:
def add_numbers(a, b):
result = a + b # 该语句属于 add_numbers 函数的代码块,有 4 个空格的缩进
return result # 该语句同样属于 add_numbers 函数的代码块
result = a + b 和 return result 这两行代码有相同的缩进量,它们都属于 add_numbers 函数的代码块。
11、类的初始化方法
在 Python 里,类的初始化方法是 __init__ ,它会在创建类的实例时自动调用。借助这个方法,能够为实例的属性设定初始值。
12、类的普通方法
普通方法是类中实现特定功能的函数,需要通过对象显式调用。
13、类的继承?
在 Python 里,定义子类时,在类名后面加上括号并指定父类名,即可实现继承。子类可以使用父类的属性和方法,也能对其进行重写或添加新的属性和方法。
14、装饰器的核心思想:外部修改和动态?
(1)、外部修改:“外部修改”意味着无需改动原有类或函数的内部代码,就能为其添加新功能。这符合软件开发里的开闭原则,即对扩展开放,对修改关闭。通过装饰器,我们能在不触碰原有代码的前提下,增强其功能,降低代码之间的耦合度,提高代码的可维护性。
(2)、动态:“动态”指的是在运行时才决定是否要对类或函数进行功能增强,能根据不同的条件灵活应用装饰器。这种特性让程序更加灵活,可根据不同的业务场景动态调整代码的行为。
(3)、总结:“外部修改”和“动态”是装饰器思想的两大关键特性。“外部修改”保证了代码的可维护性和可扩展性,“动态”则赋予了程序更高的灵活性,让我们能根据不同的需求在运行时调整代码的行为。
15、类方法的定义?
(1)、内部定义:在类内部定义类方法时,需要使用 @classmethod 装饰器,并且类方法的第一个参数通常命名为 cls ,它代表类本身。借助这个参数,类方法可以访问和修改类的属性,还能调用其他类方法。
(2)、外部定义:在类外部定义类方法时,需要手动将函数绑定到类上,并使用 classmethod() 函数将其转换为类方法。
(3)、两种方式对比:
①内部定义 :代码结构更清晰,类方法和类的其他成员放在一起,便于维护和理解。这是最常用的定义类方法的方式。
②外部定义 :灵活性更高,在某些动态编程场景下,可以在运行时为类添加类方法。不过,这种方式会让代码结构显得松散,降低代码的可读性。
@浙大疏锦行