news 2026/4/30 11:23:24

Python数据类型:函数、类

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python数据类型:函数、类

一、函数

基础函数定义

def函数名(参数列表):""" 函数注释 :param 参数1: 参数1说明 :param 参数2: 参数2说明 :return: 返回值注释 """return返回值

global用于修改全局变量的值:常用在程序的状态、配置、计数等场景中。

debug_mode=Falsedefenable_debug():globaldebug_mode debug_mode=Truedefdisable_debug():globaldebug_mode debug_mode=False

参数传递:

  • 位置传参:调用函数时根据函数定义的位置顺序来传递参数(要求顺序一一对应)。优点:简洁,缺点:可读性差。
  • 关键字传参:调用函数时根据形参的名字作为关键字,以”键=值“的形式来传递参数(不要求顺序)。优点:可读性强,缺点:臃肿。
  • 混合传参:位置参数和关键字参数可以同时使用,同时使用时必须先使用位置参数,再使用关键字参数,其中关键字参数部分不要求顺序。

当方法参数较少,并且参数的顺序也比较自然,建议使用位置传参更合适;
当方法参数较多,并且参数容易混淆,建议使用关键字参数增加可读性。

defadd_user(name,age,gender,city):pass# 纯位置方式调用(严格要求顺序)add_user("melong",30,"男","上海")# 纯关键字方式调用(不要求顺序)add_user(gender="男",name="melong",city="上海",age=30)# 混用(位置参数在前,关键字参数在后)add_user("melong",30,city="上海",age=30)

默认参数的定义必须位于参数列表的最后一部分。

defadd_user(name,age,city,country="China")pass

不定长可变参数

  • 不定长位置参数:在参数名前使用*号标记,一般约定俗称的名字为*args, 所有的不定长位置参数都被封装为元祖。适用于不确定参数个数的数据。
  • 不定长关键字参数:在参数名前使用**号标记,一般约定俗成的名字为**kyargs, 所有不定长关键字参数都被封装为字典。适用于不确定的选项(如配置参数等)。
  • 混合不定长参数:必须先定义不定长位置参数,再定义不定长关键字参数,例如rond()。
defcalc_avg(*args):returnsum(args)/len(args)deffoo(**kyargs):foriinkyargs:print(i)defcalc_avg(*args,**kwargs):value=sum(args)/len(args)ifkwargs["round"]isnotNone:value=round(value,kwargs["round"])ifkwargs.get("print"):print(f"avg={value}")

二、类

1. 魔法方法

Python中方法名以双下划线__作为前缀和后缀的方法叫做魔法方法,魔法方法相当于Java的接口方法,具有特定的功能。

  • __new__:实例化方法,先执行__new__再执行__init__。
  • __init__:初始化方法,例如给属性初始化None, 如 self.xxx = None。
  • __str__:toString()方法。
  • __eq__:用于比较两个对象是否相等。
  • __next__:表示迭代器对应的next()方法。
  • __add__:加法运算符 +
  • __or__:或运算符 |
  • __mul__:乘法运算 *,如 字符串乘以数字,print(“-” * 20)
  • __mod__: 取余,self % value,常见的字符串拼接,print(“name=%s age=%d” % (name, age))

2. self

对象方法必须有参数,而且第一个参数必须是self。注意:self并不是Python的关键字,处于习惯大家都默认使用self,Java中使用关键字this。

publicclassUser{privateStringname;privateIntegerage;publicUser(Stringname,Integerage){this.name=name;this.age=age;}@OverridepublicStringtoString(){return"User{name='"+name+'\''+", age="+age+'}';}}
classUser:def__init__(self,name,age):self.name=name self.age=agedef__str__(self):returnf"User(name={self.name}, age={self.age})"

Python初始化方法init相当于 Java的构造方法,只不过不用在最上面声明属性,相对来说更简洁。

importkeyword# 查看Python中的关键字列表print(keyword.kwlist)

3. 访问权限约定

Python所提倡的用更多的符号来代替关键字,在Java中定义私有变量要使用private关键字。默认是继承object

  • 私有属性在属性名前使用双下划线命名规则。如:__password
  • 类的私有方法也是在方法名前使用双下划线前缀。如 __set_password
classPerson:country="China"defsay_hello(self):print("I'm Chinese")classStudent(Person):name=Noneage=0__weight=60def__init__(self):passdef__init__(self,name,age):self.name=name self.age=agedefsay_hello(self):print("I'm Student")def__private_func(self):print("私有函数")def__add__(self,other):returnStudent(self.name+other.name,self.age+other.age)zhangsan=Student("zhangsan",26)zhangsan.say_hello()super(Student,zhangsan).say_hello()lisi=Student("lisi",24)zhangli=zhangsan+lisiprint(zhangli.age)

4. 静态方法和类方法

  • 静态方法@staticmethod相对于对象方法的区别是第一个参数不需要声明self
  • 类方法@classmethod和静态方法的区别是类方法需要显式定义cls参数
classPerson:def__init__(self,name=None,age=None):self._name=name self._age=age@staticmethoddefhello():print('hello')@classmethoddefinstance(cls,name,age):returncls(name,age)if__name__=='__main__':# helloPerson.hello()person=Person.instance('张三',30)# 张三print(person._name)

5. 抽象方法

Python认为一个方法没有方法体,即方法体位pass就可以认为是一个抽象方法,Python一直在倡导约定大于语法,所以也没有提供什么语法强制校验,毕竟程序员要对自己写的代码负责。Python虽然没有把抽象方法作为一级语法,但是也可以在运行时检测抽象方法有没有实现,没有实现就抛异常,需要通过abc模块来检查。TypeError: Can't instantiate abstract class Chinese with abstract method hello

Python中只有class关键字,没有接口interface关键字,Python认为一个类中的所有方法的方法体都是pass,那么这个类就算一个接口。

fromabcimportABCMeta,abstractmethodclassPerson(metaclass=ABCMeta):def__init__(self,name=None,age=None):self._name=name self._age=age@abstractmethoddefhello(self):passclassChinese(Person):passif__name__=='__main__':chinese=Chinese()chinese.hello()
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/30 11:14:16

简单三步掌握PinWin:Windows窗口置顶的终极免费方案

简单三步掌握PinWin:Windows窗口置顶的终极免费方案 【免费下载链接】PinWin Pin any window to be always on top of the screen 项目地址: https://gitcode.com/gh_mirrors/pin/PinWin 你是否曾经在写文档时需要同时查看参考资料?或者在进行数据…

作者头像 李华
网站建设 2026/4/30 11:01:20

终极指南:如何突破SymPy限制开发第三方扩展

终极指南:如何突破SymPy限制开发第三方扩展 【免费下载链接】sympy A computer algebra system written in pure Python 项目地址: https://gitcode.com/GitHub_Trending/sy/sympy SymPy是一个用纯Python编写的计算机代数系统(CAS)&am…

作者头像 李华
网站建设 2026/4/30 11:01:00

终极指南:MLX框架如何让FLUX.1模型在苹果设备上飞速运行

终极指南:MLX框架如何让FLUX.1模型在苹果设备上飞速运行 【免费下载链接】mlx-examples Examples in the MLX framework 项目地址: https://gitcode.com/GitHub_Trending/ml/mlx-examples MLX框架是苹果设备上的机器学习框架,而FLUX.1模型是一款强…

作者头像 李华
网站建设 2026/4/30 11:01:00

从零搭建 PostgreSQL CDC:Debezium 嵌入式引擎实战指南

🧑 博主简介:CSDN博客专家,「历代文学网」(PC端可以访问:https://lidaiwenxue.com/#/?__c=1000,移动端可关注公众号 “ 心海云图 ” 微信小程序搜索“历代文学”)总架构师,首席架构师,也是联合创始人!16年工作经验,精通Java编程,高并发设计,分布式系统架构设计,…

作者头像 李华