当前位置: 首页 > news >正文

定义python中的函数和类

1.函数

在Python中,定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回

1.1 定义函数

def showshow(sex):if sex==1:return 'man'else:return 'lady'
#调用
print(showshow(2))

注意一下不是function是def

1.2 函数的参数

def power(x, n=2):s = 1while n > 0:n = n - 1s = s * xreturn s

这个基本上和php的差不多, 这里的参数 n 设置了默认值。

当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面。变化小的参数就可以作为默认参数。这样子可以能降低调用函数的难度

如果要参数是list,可以这样做:

def addsomthing(s=[]):s.append('jack')return s
print(addsomthing(['tom','jj']))

这里有一个特别需要注意的地方

pythond有一个奇异现象,在模块层面定义的变量(无需global修饰),如果在函数中没有再定义同名变量,可以在函数中当做全局变量使用

hehe=6
def f():print(hehe)
f()
print(hehe) 
#输出6和6

但如果在函数中有再赋值/定义(因为python是弱类型语言,赋值语句和其定义变量的语句一样),则会产生引用了未定义变量的错误:

hehe=6
def f():print(hehe)hehe=2
f()
print(hehe) 

抛出的错误信息为:

UnboundLocalError: local variable 'hehe' referenced before assignment

正确的做法是:

hehe=6
def f():global heheprint(hehe)f()
 

1.3 递归函数

在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。

def sumfun(n):if n==1:return 1else:return  n+sumfun(n-1)
print(sumfun(3))
##结果##
6

上面演示实现 3 +2 +1 算法。

2.类

2.1 类的结构

一个比较典型的打印学生成绩类

class Student(object):def __init__(self, name, score):self.name = nameself.score = scoredef print_score(self):print('%s: %s' % (self.name, self.score))ob = Student()
ob.print_score()

在Python中,定义类是通过class关键字

由于类可以起到模板的作用,因此,可以在创建实例的时候,把一些我们认为必须绑定的属性强制填写进去。通过定义一个特殊的__init__方法,在创建实例的时候,就把name,score等属性绑上去。

注意到__init__方法的第一个参数永远是self,表示创建的实例本身,因此,在__init__方法内部,就可以把各种属性绑定到self,因为self就指向创建的实例本身,这个方法大概就像php的构造函数吧

有了__init__方法,在创建实例的时候,就不能传入空的参数了,必须传入与__init__方法匹配的参数,但self不需要传,Python解释器自己会把实例变量传进去:

2.2 访问限制

如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问,所以,我们把Student类改一改:

class Student(object):def __init__(self, name, score):self.__name = nameself.__score = scoredef print_score(self):print('%s: %s' % (self.__name, self.__score))

改完后,对于外部代码来说,没什么变动,但是已经无法从外部访问实例变量.__name和实例变量.__score了:

>>> bart = Student('Bart Simpson', 59)
>>> bart.__name
Traceback (most recent call last):File "<stdin>", line 1, in <module>
AttributeError: 'Student' object has no attribute '__name'

需要注意的是,在Python中,变量名类似__xxx__的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量,所以,不能用__name__、__score__这样的变量名

2.3 继承和多态

一个比较典型的类继承,基本上和php差不多

class Car(object):def run(self):print('i can run very fast!')class Honda(Car):def go(self):print('vtec is the best')b=Honda()
b.go()
b.run()

这里的子类Honda继承了Car这个父类,所以能使用run这个方法

继承有什么好处?最大的好处是子类获得了父类的全部功能。由于Car实现了run()方法,因此,Honda作为它的子类,什么事也没干,就自动拥有了run()方法。

同时你可以重写父类里的run方法:

class Car(object):def run(self):print('i can run very fast!')class Honda(Car):def go(self):print('vtec is the best')def run(self):print('Honda can run very fast')b=Honda()
b.go()
b.run()

下面是关于多态:

class Animal(object):def run(self):print('Animal is running...')class Dog(Animal):def run(self):print('Dog is running...')def eat(self):print('Eating meat...')class Cat(Animal):def run(self):print('Cat is running...')class Rabbit(Animal):passa = Dog()
a.run()b = Cat()
b.run()def run_twice(animal):animal.run()animal.run()run_twice(Cat())
#Cat is running...
#Cat is running...
run_twice(Rabbit())
#Animal is running...
#Animal is running...

上面是一个多态的典型代码.

由于dog类和cat类都是 继承了Animal类

在python里 dog和cat都是 Animal类型

要理解什么是多态,我们首先要对数据类型再作一点说明。当我们定义一个class的时候,我们实际上就定义了一种数据类型。我们定义的数据类型和Python自带的数据类型,比如str、list、dict没什么两样:

a = list() # a是list类型
b = Animal() # b是Animal类型
c = Dog() # c是Dog类型 ,同时c也是Animal类型

多态的好处就是,当我们需要传入Dog、Cat、Tortoise……时,我们只需要接收Animal类型就可以了,因为Dog、Cat、Tortoise……都是Animal类型,然后,按照Animal类型进行操作即可。由于Animal类型有run()方法,因此,传入的任意类型,只要是Animal类或者子类,就会自动调用实际类型的run()方法,这就是多态的意思。

来一句大神的一句话总结:

派生类的功能可以被基类的方法或引用变量所调用,这叫向后兼容,可以提高可扩充性和可维护性。

http://www.xdnf.cn/news/89929.html

相关文章:

  • SVT-AV1编码器中的模块
  • 如何收集用户白屏/长时间无响应/接口超时问题
  • linux命令集
  • 来啦,烫,查询达梦表占用空间
  • SVT-AV1编码器初始化函数
  • Linux 系统监控基石:top 命令详解与实战指南
  • 华为仓颉编程语言基础概述
  • JavaFX深度实践:从零构建高级打地鼠游戏(含多物品与反馈机制)
  • Windows7升级Windows10,无法在此驱动器上安装Windows
  • 可预测的随机逻辑 -- b01lers CTF when wp
  • 关于大数据的基础知识(三)——数据安全与合规
  • 谐振模态图
  • 【OSG学习笔记】Day 6: Day 6: 几何体(Geometry)的创建与自定义
  • IP-Guard加密系统开启不了,说连接失败了,IPG数据库更改为多用户模式修复成功。
  • 【C++】Json-Rpc框架项目介绍(1)
  • 审计平台本地部署遇到的坑
  • 三生原理与现有密码学的核心区别?
  • 龙虎榜——20250422
  • Airbyte - 数据集成平台
  • vue 修改路由动态选择路由 改文件位置
  • 用Qt和deepseek创建自己的问答系统
  • transformer 编码器层
  • 聊天交友APP聊天系统框架搭建
  • 【Linux禁用历史命令】
  • RK3588 Buildroot 新建板级DTS
  • JAVA线程池ThreadPoolExecutor说明
  • 树莓派超全系列教程文档--(40)树莓派config.txt旧版GPIO控制、超频及条件过滤器
  • 【Spring】依赖注入的方式:构造方法、setter注入、字段注入
  • ProxySQL如何支持高并发读写请求
  • ubuntu 安装 redis server