目录
前言
在上一课,我们学习了Python的常见数据结构,然而当我们遇到复杂的问题时,我们通常需要采用“分而治之”的思想解决,把大任务分解为多个容易解决的小任务,先解决每个小任务,最后解决复杂的大任务。同时它还可以提高应用的模块性,和代码的重复利用率类则是进一步将函数打包,让其模拟现实。
一.函数
1.函数的定义
在Python中,函数定义的格式为:
def name_of_function("形参"): #这是一个变量名
(<函数体>)
解释说明:
函数必须使用关键字def(英文define的缩写),后需要接函数的名字(基本上是 函数的功能,并且最好不要出现大写,后面要接一个冒号),形参(即你给需要传 入的参数的统一变量名,可以有多个),函数体(需要缩进)。
2.函数的使用
我们以计算长方形面积为例,编写一个函数。
def rectangle(length, width):
return length*width
s=rectangle(6, 4)
print(s)
# 输出结果:24
解释说明:
return([表达式])结束函数,选择性地返回一个或多个值给调用的语句。
s=rectangle(6, 4)这一句即是调用语句,6,4这两个值是实参,分别对应函数中的 length,width。在调用函数时,需要注意:
1.在没有特殊情况(后面要讲的默认参数的使用)时,实参和形参个数一致。
2.实参和对应的形参数据结构相同。
3.实参与形参是对应的。
3.参数分类
Python的参数分类有四种。
(1) 必备参数
必备参数是指调用函数时个数,数据类型,输入顺序等必须相等且正确的参 数,否则出现不匹配报错。这也是最常见的一类参数。
(2) 默认参数
默认参数是指允许有默认值的参数,如果调用时不给默认参数,那么函数 体,则默认获得默认值。我们以计算圆形面积为例,编写一个示例。
def round(r, π=3.14):
return(r*r*π)
print(3) #28.26
print(3, 3.1415) #28.2735
可以看到,Python通过在形参后面加上"="和给定的值来指定默认值。
(3) 关键参数
最硬核的传参方法,直接使用键值对的方式,因此它也叫命名参数:
def a_b(a, b):
return(a+b)
a_b(b=3, a=2)
即便打乱顺序,由于指定了形参,因此仍然可以正常赋值。
(4) 可变长参数
Python中的可变长参数是指在函数定义时,可以接收任意数量的参数。在函 数中使用一个或两个星号(*)表示可变长参数。
有两种类型的可变长参数:
1.*args
:当你不确定要向函数中传递多少个参数时,可以使用 *args
。它将 所位置参数打包成一个元组。
def func(*args):
for arg in args:
print(arg)
my_function(1, '2', [3])
2.**kwargs:
**kwargs
允许你传递任意数量的关键字参数,并将它们打包成一 个字典。
def my_function(**kwargs):
for key, value in kwargs.items():
print(f"{key}:{value}")
my_function(a="a", b="b")
3.特殊函数
1.匿名函数
Python 使用 lambda 来创建匿名函数。
lambda 函数是一种小型、匿名的、内联函数,它可以具有任意数量的参数,但只 能有一个表达式。它比def语法简单的多。
其语法为:
函数名=lambda [参数]:表达式
示例:
sum_num = lambda a, b: a+b
print(sum(10, 20)) # 返回30
刚刚的代码也可以用常规的函数来表示为:
def sum_num(a, b):
return a+b
print(sum_num(10,20))
我们可以直观地看出匿名函数的简洁性。但是,lambda不能处理繁琐任务,适用于编写简单的函数。
2.递归函数
递归函数在同一个函数内进行嵌套调用,通常前一次的输出就是后一次的输入。
举个栗子:求1-100数字之和:
def sum_num(n):
if n>0:
return n +sum_num(n-1)
else:
return 0
print(sum_num(100))
二.类
1.类的定义
Python的类是一种对象的抽象化方式,它定义了对象的属性和行为。类是创建对象的蓝 图,可以根据类创建多个具有相同属性和行为的对象。在类中,可以定义属性(类变量 和实例变量)和方法(类方法和实例方法)。类变量是类的所有实例共享的变量,而实 例变量是每个对象独有的变量。类方法是类中定义的方法,可以通过类本身调用,而实 例方法是对象可调用的方法。通过使用类,可以实现封装、继承、多态等面向对象的特 性。
2.类的使用
在Python中,类的定义和对象的创建是实现面向对象编程(OOP)的基础。我们可以通 过类来创建对象,并对其属性和方法进行操作。下面是一个简单的类的示例:
class Dog:
def __init__(self, name, age):
self.name = name # 实例变量
self.age = age # 实例变量
def bark(self):
print(f"{self.name} is barking!")
# 创建对象
my_dog = Dog("Rex", 3)
# 访问属性和调用方法
print(my_dog.name) # 输出: Rex
print(my_dog.age) # 输出: 3
my_dog.bark() # 输出: Rex is barking!
解释说明:
1.__init__
方法:这是类的构造函数,用于在创建对象时初始化对象的属性。self
参数 指代对象本身,后面的参数 name
和 age
是我们传递给对象的参数。
2.实例变量:每个对象都有自己的实例变量,例如 name
和 age
,它们的值会因对象不同 而不同。
3.实例方法:通过 self
访问实例变量,并在方法中执行相关操作,例如 bark()
方法。
3.面向对象的特性
Python的面向对象编程有三个核心特性:封装、继承和多态。
(1)封装
封装是指将对象的属性和方法封装在类的内部,通过接口来与外部通信,从而保证 内部实现的隐藏。通过封装,可以使代码更具模块化和可维护性。例如,我们可以 使用私有属性(在属性名前加上双下划线 __
)来隐藏类的内部实现。
(2)继承
继承是指一个类可以继承另一个类的属性和方法,从而实现代码复用。例如,我们 可以创建一个父类 Animal
,并从中继承创建一个子类 Dog
。
class Animal:
def __init__(self, species):
self.species = species
def make_sound(self):
print("Some generic animal sound")
class Dog(Animal):
def __init__(self, name, age):
super().__init__("Dog")
self.name = name
self.age = age
def make_sound(self):
print("Woof woof")
# 创建Dog对象
my_dog = Dog("Rex", 3)
print(my_dog.species) # 输出: Dog
my_dog.make_sound() # 输出: Woof woof
(3) 多态
多态是指不同的对象可以通过相同的接口进行调用,具体的实现可以有所不同。在 上面的例子中,make_sound
方法在 Animal
和 Dog
中都有定义,但它们的实现不 同。这就是多态的体现。
通过这些特性,我们可以更加灵活地处理复杂的编程任务,使代码更具扩展性和可 维护性。
三.总结
本课我们介绍了Python中的函数与类,了解了如何定义函数、使用参数,以及函数的特殊用法。同时,我们也学习了类的定义和使用,并深入探讨了面向对象编程的核心特性:封装、继承和多态。在实际开发中,函数和类是我们构建程序的基础,通过良好的结构设计,可以让我们的代码更加简洁、模块化和高效。在下一课中,我们将继续深入学习Python的高级特性,进一步提升编程能力。
如果有任何问题,欢迎在评论区留言,我将尽力为你解答。祝你编程愉快!