Python函数语法与面向对象回顾(精华)

目录

函数

语法定义

返回值

位置参数 

关键字传递

默认参数

函数参数中 / 作用 

lambda表达式

递归函数 

面向对象 

初识对象

继承 

构造函数

​编辑 多态

"私有属性"

动态

类方法和静态方法


函数

语法定义

pyhon的函数定义语法是

def 函数名(参数1,参数2,参数3...):

      #业务逻辑

      pass # pass关键字是python占位符,类似于java的todo 表示此处是待编写

      return 

返回值

如果函数没有return,python默认返回none

举例

Python函数语法与面向对象回顾(精华)_第1张图片

python定义函数不需要像java语法一样在方法中定义返回值类型,可以直接返回任意类型

Python函数语法与面向对象回顾(精华)_第2张图片

Python函数语法与面向对象回顾(精华)_第3张图片

位置参数 

def函数传递参数时会按照定义形参时的参数顺序进行传递

举例

Python函数语法与面向对象回顾(精华)_第4张图片

关键字传递

函数调用在传递参数时可以直接定义实参和形参的映射

Python函数语法与面向对象回顾(精华)_第5张图片

注意如果想同时手使用关键字参数和位置参数时,关键字参数顺序一定要在位置参数后

Python函数语法与面向对象回顾(精华)_第6张图片

如果关键字参数在位置参数前的话:

Python函数语法与面向对象回顾(精华)_第7张图片

编辑器已经给出python语法错误提示  执行更是直接报错

Python函数语法与面向对象回顾(精华)_第8张图片

所以位置参数必须在关键字参数之前,在之间也不可以 

默认参数

python函数允许定义函数时定义参数默认值,这样调用函数时如果不传入参数,则会直接传递函数的参数的默认值进行处理

默认参数不传递参数时

Python函数语法与面向对象回顾(精华)_第9张图片

传递参数时覆盖默认参数值

Python函数语法与面向对象回顾(精华)_第10张图片

注意默认参数在使用时,传递的默认参数要放在最后位置,此处在三个参数开头也定义为默认参数则报错

Python函数语法与面向对象回顾(精华)_第11张图片 Python函数语法与面向对象回顾(精华)_第12张图片

函数参数中 / 作用 

函数在定义参数时的 / 作用为: / 左侧的参数必须是位置参数而不能是关键字参数

Python函数语法与面向对象回顾(精华)_第13张图片

lambda表达式

lambda表达式是一种简洁的匿名函数,它可以接受任意数量的参数,但只能有一个表达式。Lambda表达式的语法是:lambda arguments: expression

语法格式:

举例演示 

 Python函数语法与面向对象回顾(精华)_第14张图片

 Python函数语法与面向对象回顾(精华)_第15张图片

 Python函数语法与面向对象回顾(精华)_第16张图片

过滤列表

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)有正确的返 回值

普通循环求阶乘

Python函数语法与面向对象回顾(精华)_第17张图片

递归求阶乘

 Python函数语法与面向对象回顾(精华)_第18张图片

斐波那契数列示例:

 Python函数语法与面向对象回顾(精华)_第19张图片

面向对象 

初识对象

本博主目前主力语言是java,所以这里python的面向对象主要和java进行对比

格式:

class 对象名:

     私有属性 = value

     def 方法名(self):

         pass

self的作用类似于java中的this,表示当前对象本身,且必须传递

Python函数语法与面向对象回顾(精华)_第20张图片

 对象定义的方法中未传递self时

继承 

python中的对象也支持子类继承父类的成员变量或方法

但是不同于java使用extend关键字,python继承直接在类名后加括号跟上要继承的父类

class 类名(继承的类)

Python函数语法与面向对象回顾(精华)_第21张图片

可以看到Cat类中没有任何的属性和方法,Cat类继承了Animal类,从而Cat的新实例可以直接使用父类Animal的方法和属性

注意这里有区别于java的继承,java是单继承,python是支持多继承的

再定义一个BigAnimal类,使得Cat继承Animal和BigAnimal类

 Python函数语法与面向对象回顾(精华)_第22张图片

Python函数语法与面向对象回顾(精华)_第23张图片 比对Cat实例的调用结果,发现当继承了两个类时,如果两个父类拥有相同的实例属性或者方法时,调用的实例会默认以继承的顺序从左至右的权重使用继承而来的属性或方法,只有当继承到的左边的类没有属性或方法时才会接着在右边按照从左至右的顺序找别的继承类的方法或属性

构造函数

python的构造函数使得我们在创建实例对象时就可以将对象个性化

__init__固定构造写法(注意前后都是双下划线)

Python函数语法与面向对象回顾(精华)_第24张图片

子类继承父类时,使用super关键字调用父类的构造方法 

Python函数语法与面向对象回顾(精华)_第25张图片

注意观察输出结果

Python函数语法与面向对象回顾(精华)_第26张图片 多态

python是一种动态语言,这里的多态和java的多态差异性有些大

java中的多态允许父类进行创建一个子类的实例,也就是父类new 子类,python中却不是这样,python更注重于方法或对象的行为可以有多种表现形式

在Java中,可以通过父类引用指向子类对象,并使用父类引用调用子类对象中的方法,这被称为多态。这是因为Java是一种静态类型语言,对象的行为是通过类来定义和控制的。

而在Python中,由于它是一种动态类型语言,对象的类型是在运行时确定的。Python更注重于对象的行为可以有多种表现形式,而不关心对象的具体类型。因此,在Python中,我们不需要像Java那样创建父类的实例来引用子类对象,直接使用子类的对象就可以了。这种灵活性使得Python更加注重于对象的行为和特性,而不是过于关注类型的层次结构

上代码:

Python函数语法与面向对象回顾(精华)_第27张图片

调用结果:

Python函数语法与面向对象回顾(精华)_第28张图片 可以看到,调用的animal函数在调用参数的共同方法时,无需关注被调用者本身是什么对象类型,具体的方法表现形式由具体对象本身来定

"私有属性"

python在私有属性上和java也有较大的差异

在python中仅限从一个对象内部才能够访问的"私有变量"并不存在

java中在定义私有属性时直接使用private即可

但是python中要想定义"私有",就需要在属性前添加__(双下划线)

举例:

Python函数语法与面向对象回顾(精华)_第29张图片

不可以访问,

如果要访问必须使用相对应的方法进行访问

set_name()设置数据,get_name()获取数据

Python函数语法与面向对象回顾(精华)_第30张图片

查看自省数据

Python函数语法与面向对象回顾(精华)_第31张图片 发现有一个属性为_类名__私有属性名

所以也可以直接这样访问:

Python函数语法与面向对象回顾(精华)_第32张图片

动态

由于python是动态语言,所以可以像js一样动态的为对象类型添加属性

举例:

Python函数语法与面向对象回顾(精华)_第33张图片

这就是python的动态灵活性,但是这样也会消耗一定的内存空间,而java是一种静态语言,是不允许动态为对象实例添加属性的

类方法和静态方法

类方法和静态方法都可以被类直接调用,但它们之间存在一些关键区别:

  1. 定义方式:类方法是通过在方法前加@classmethod装饰符来定义的,而静态方法是通过在方法前加@staticmethod装饰符来定义的。
  2. 访问方式:类方法可以通过类名直接访问,如ClassName.class_method(),而静态方法可以通过类名直接访问,如ClassName.static_method()
  3. 继承:类方法可以被继承,而静态方法不能被继承。这意味着如果在一个类中定义了一个类方法,那么在子类中也可以通过该方法访问,而不会出现重复定义的问题。但是,如果在子类中定义了一个静态方法,那么该方法将不会被继承到子类中,需要在子类中重新定义。
  4. 调用:类方法和静态方法都可以被类或对象直接调用,但类方法需要传入一个类对象作为参数,而静态方法不需要传入任何参数。

综上所述,类方法和静态方法都可以被类直接调用,但它们之间存在定义方式、访问方式、继承方式和调用方式等方面的区别。

上代码

你可能感兴趣的:(python,python,开发语言,函数,面向对象,蟒蛇)