目录
函数
语法定义
返回值
位置参数
关键字传递
默认参数
函数参数中 / 作用
lambda表达式
递归函数
面向对象
初识对象
继承
构造函数
编辑 多态
"私有属性"
动态
类方法和静态方法
函数
语法定义
pyhon的函数定义语法是
def 函数名(参数1,参数2,参数3...):
#业务逻辑
pass # pass关键字是python占位符,类似于java的todo 表示此处是待编写
return
返回值
如果函数没有return,python默认返回none
举例
python定义函数不需要像java语法一样在方法中定义返回值类型,可以直接返回任意类型
位置参数
def函数传递参数时会按照定义形参时的参数顺序进行传递
举例
关键字传递
函数调用在传递参数时可以直接定义实参和形参的映射
注意如果想同时手使用关键字参数和位置参数时,关键字参数顺序一定要在位置参数后
如果关键字参数在位置参数前的话:
编辑器已经给出python语法错误提示 执行更是直接报错
所以位置参数必须在关键字参数之前,在之间也不可以
默认参数
python函数允许定义函数时定义参数默认值,这样调用函数时如果不传入参数,则会直接传递函数的参数的默认值进行处理
默认参数不传递参数时
传递参数时覆盖默认参数值
注意默认参数在使用时,传递的默认参数要放在最后位置,此处在三个参数开头也定义为默认参数则报错
函数参数中 / 作用
函数在定义参数时的 / 作用为: / 左侧的参数必须是位置参数而不能是关键字参数
lambda表达式
lambda表达式是一种简洁的匿名函数,它可以接受任意数量的参数,但只能有一个表达式。Lambda表达式的语法是:lambda arguments: expression
。
语法格式:
举例演示
过滤列表
numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers) # 输出:[4, 6, 10, 12]
递归函数
定义:
当定义的函数自身调用自身时,可以称为递归函数,递归函数有两个重点
(1) 自身调用自己
(2)有正确的返 回值
普通循环求阶乘
递归求阶乘
斐波那契数列示例:
面向对象
初识对象
本博主目前主力语言是java,所以这里python的面向对象主要和java进行对比
格式:
class 对象名:
私有属性 = value
def 方法名(self):
pass
self的作用类似于java中的this,表示当前对象本身,且必须传递
对象定义的方法中未传递self时
继承
python中的对象也支持子类继承父类的成员变量或方法
但是不同于java使用extend关键字,python继承直接在类名后加括号跟上要继承的父类
class 类名(继承的类)
可以看到Cat类中没有任何的属性和方法,Cat类继承了Animal类,从而Cat的新实例可以直接使用父类Animal的方法和属性
注意这里有区别于java的继承,java是单继承,python是支持多继承的
再定义一个BigAnimal类,使得Cat继承Animal和BigAnimal类
比对Cat实例的调用结果,发现当继承了两个类时,如果两个父类拥有相同的实例属性或者方法时,调用的实例会默认以继承的顺序从左至右的权重使用继承而来的属性或方法,只有当继承到的左边的类没有属性或方法时才会接着在右边按照从左至右的顺序找别的继承类的方法或属性
构造函数
python的构造函数使得我们在创建实例对象时就可以将对象个性化
__init__固定构造写法(注意前后都是双下划线)
子类继承父类时,使用super关键字调用父类的构造方法
注意观察输出结果
多态
python是一种动态语言,这里的多态和java的多态差异性有些大
java中的多态允许父类进行创建一个子类的实例,也就是父类new 子类,python中却不是这样,python更注重于方法或对象的行为可以有多种表现形式
在Java中,可以通过父类引用指向子类对象,并使用父类引用调用子类对象中的方法,这被称为多态。这是因为Java是一种静态类型语言,对象的行为是通过类来定义和控制的。
而在Python中,由于它是一种动态类型语言,对象的类型是在运行时确定的。Python更注重于对象的行为可以有多种表现形式,而不关心对象的具体类型。因此,在Python中,我们不需要像Java那样创建父类的实例来引用子类对象,直接使用子类的对象就可以了。这种灵活性使得Python更加注重于对象的行为和特性,而不是过于关注类型的层次结构
上代码:
调用结果:
可以看到,调用的animal函数在调用参数的共同方法时,无需关注被调用者本身是什么对象类型,具体的方法表现形式由具体对象本身来定
"私有属性"
python在私有属性上和java也有较大的差异
在python中仅限从一个对象内部才能够访问的"私有变量"并不存在
java中在定义私有属性时直接使用private即可
但是python中要想定义"私有",就需要在属性前添加__(双下划线)
举例:
不可以访问,
如果要访问必须使用相对应的方法进行访问
set_name()设置数据,get_name()获取数据
查看自省数据
发现有一个属性为_类名__私有属性名
所以也可以直接这样访问:
动态
由于python是动态语言,所以可以像js一样动态的为对象类型添加属性
举例:
这就是python的动态灵活性,但是这样也会消耗一定的内存空间,而java是一种静态语言,是不允许动态为对象实例添加属性的
类方法和静态方法
类方法和静态方法都可以被类直接调用,但它们之间存在一些关键区别:
- 定义方式:类方法是通过在方法前加
@classmethod
装饰符来定义的,而静态方法是通过在方法前加@staticmethod
装饰符来定义的。 - 访问方式:类方法可以通过类名直接访问,如
ClassName.class_method()
,而静态方法可以通过类名直接访问,如ClassName.static_method()
。 - 继承:类方法可以被继承,而静态方法不能被继承。这意味着如果在一个类中定义了一个类方法,那么在子类中也可以通过该方法访问,而不会出现重复定义的问题。但是,如果在子类中定义了一个静态方法,那么该方法将不会被继承到子类中,需要在子类中重新定义。
- 调用:类方法和静态方法都可以被类或对象直接调用,但类方法需要传入一个类对象作为参数,而静态方法不需要传入任何参数。
综上所述,类方法和静态方法都可以被类直接调用,但它们之间存在定义方式、访问方式、继承方式和调用方式等方面的区别。
上代码