【Python】类,变量,函数一一CSDN21天学习挑战赛
本系列文章为参与【Python】CSDN21天学习挑战赛,成为更好的自己,根据自身的学习进度并记录自己的学习过程。我也是Python纯小白,和大家一起学习,保持热爱学习的好习惯😁
活动地址:CSDN21天学习挑战赛
类
类定义
类的简要描述
- 类其实就是存放了许多函数的一个集
- 类中的函数必须实例类后才能调用
- 类与类可以继承,子类可以使用父类中的函数,如果父类中的函数不能满足需求,可以对父类中的函数进行重写
override
(不是重载
)
类的命名规范
- 不要使用其他特殊符号,包括下划线_
- 使用大驼峰命名(每个单词首字母大写)例:Person,RequestsHelper,ConfigurationFileTool
例:
# 默认类,继承object。python3以后object写不写都可以,不写默认就继承的object class 类名: # 这是构造函数,当创建类的(实例)对象时,会自动调用,从而实现对类进行初始化操作, # self类似其他语言里的this,代表对象自己。 # 在类中的方法(函数)里,self永远是第一个参数 # 必须要有一个self参数 def __init__(self, parameter1, parameter2): """ 构造函数 创建实例,必须要传入parameter1和parameter2,在类的方法中调用参数,只需要self.parameter1就可以获取当前类参数值 """ self.parameter1 = parameter1 self.parameter2 = parameter2 # 这里写类方法(函数) # 继承父类 class 类名(父类): 类方法(函数) # 继承python根类(object) class 类名(object): # 类方法(函数)
类方法
Python类中常用三种类方法
- 普通方法,第一个参数通常使用self,表示一个具体的实例本身
- 类方法(@classmethod),第一个参数通常使用cls,表示这个类本身,可以类实例调用或直接类.方法名调用
- 静态方法(@staticmethod),类中不需要实例的函数,无self,可以类实例调用或直接类.方法名调用
- 私有方法,Python中私有方法并不需要什么关键字,而是直接在方法前加上
__
,只能在类内部调用
各方法调用示例:
普通方法
class A(object): def method_a(self): print('我是普通方法,我第一个参数是self,我需要类实例调用') # 实例调用 a = A() a.method_a
类方法
class A(object): @classmethod def method_b(cls): print('我是类方法,我第一个参数是cls,我可以类实例调用也可以类直接调用') # 实例调用 a = A() a.method_b # 类调用 A.method_b
静态方法
class A(object): @staticmethod def method_c(): print('我是静态方法,我不需要self和cls,我可以类实例调用也可以类直接调用') # 实例调用 a = A() a.method_c # 类调用 A.method_c
私有方法
class A(object): def __method_e(self): print('我是私有方法') # 外部调用不到方法 a = A() a.__method_e
变量
变量定义
变量指在代码中为某一数据取的名称,在编程过程中使用该名称相当于使用其背后的数据。简而言之,我们可以将变量视为代码中用来保存数据的临时容器。
- 局部变量:就是在函数内部定义的变量,其作用范围是这个函数内部,即只能在这个函数中使用,在函数的外部无法使用
- 全局变量:在函数外边定义的变量,其作用范围能够在所有的函数中进行访问
声明变量:
- 格式:变量名=值
- 必须为变量赋值,可以赋None值
- 不需要关键字,也可以不用指定变量类型
变量的命名规范:
局部变量
- 由字母,数字,下划线组成,不能以数字开头,不能与关键字重名
- 区分大小写,尽量每个单词使用小写,例:name,age,sex
- 如果多个单词,单词与单词之间用英文下划线_连接,例:account_info,request_data
全局变量
采用gl_或g_加变量名,例:gl_url/g_url,gl_user/g_user
常量
常量定义
常量一般指不变的数据,我们就可以把它定义为常量,比如:Π
,但其实在Python中,定义的常量本质上也是变量,是可以修改的,只是我们经常习惯用大写区分,告诉别人这是常量,不应该修改。
常量命名规范
全部单词大写,单词与单词之间用英文下划线_连接,例:ACCESS_TOKEN,PI,APP_KEY
函数
函数定义
函数是可重复使用的,一般用来实现单一或强相关联功能的代码段。函数能提高应用的模块性,和代码的重复利用率。Python中有很多默认函数,比如print()
,input()
。我们自己写的函数称为自定义函数。
定义
- 以def 关键字开头,后接定义函数的名称和英文括号(),以冒号:结尾
- 括号中可为空,也可以传入参数
- 定义函数的内容,需要与def保持缩进
- 调用函数基本格式:函数名称(),无参数括号中则不填内容,有参数则填写对应的函数参数
- 函数中return结束函数,调用函数会返回对应值,没有return则调用函数返回None
函数的命名规范
- 函数名尽量简洁易懂
- 每个单词小写,单词与单词之间使用英文下划线_连接,例:save_userinfo,delete_user
- 使用小驼峰命名(第一个单词首字母小写,后面单词首字母大写),例:saveUserinfo,deleteUser
其实很多时候命名也是一种能力,要让别人阅读代码容易看懂,知道这是干嘛的,甚至好的命名可以替代注释的,这在所有语言中都是一样的;
具体什么操作,就以这个函数具体执行的操作的单词开始,这样别人阅读代码的时候,看函数名就大致知道这个函数是干什么的,尽可能一个函数只做一件事情,这样可以降低代码耦合度,后期维护也更省心;
例如:
获取文件内容:get_file_content;
根据id获取用户信息:get_userinfo_by_id;
发送邮件:send_email;
批量发送电子邮件:batch_send_email
- …
函数参数
函数中定义的参数成为形式参数,简称:形参
# p1 p2 p3称为形参;p4称为默认参数,可以传可以不传,注意:默认参数必须放在参数后,字典**kwargs前;后面有介绍到**kwargs def fun1(p1, p2, p3, p4="4"): print(p1 + p2 + p3)
调用函数中定义的参数成为实际参数,简称:实参
# "1" "2" "3"称为实参 fun1("1", "2", "3")
位置传参
# 按照传递的先后顺序 fun2("我是参数1", "我是参数2", "我是参数3") # 结果:我是参数1我是参数2我是参数3 # 按照传递的先后顺序 fun2("我是参数2", "我是参数1", "我是参数3") # 结果:我是参数2我是参数1我是参数3
关键字传参
关键字传参和先后顺序没有关系,可以和位置传参共用,需要注意:位置传参必须在关键字传参前;如果一个实参使用关键字传参,则后面所有实参必须使用关键字传参
# 根据关键字传参, fun3(p1="我是参数1", p3="我是参数3", p2="我是参数2") # 结果:我是参数1我是参数2我是参数3 # 第一个实参用位置传参,第二个参数用关键字传参,第三个实参用位置传参 fun3("我是参数1", p3="我是参数3", p2="我是参数2") # 结果:我是参数1我是参数2我是参数3 # 第一个实参用位置传参,第二个实参用关键字传参,第三个实参用位置传参 fun3("我是参数1", "我是参数2", p2="我是参数3") # 结果:运行报错,TypeError: fun1() got multiple values for argument 'p2',指定了多个p2实参 # 第一个实参用关键字传参,后面实参没有指定关键字 fun3(p1="我是参数1", "我是参数2", "我是参数3") # 结果:编译报错 # 第一个实参用位置传参,第二个实参用关键字传参,第三个实参用位置传参 fun3("我是参数1", p2="我是参数2", "我是参数3") # 结果:编译报错
动态参数传参
*args
:只能按照位置传参,()元组类型
# 该函数只能按照位置传参 def fun4(*args): print(args) # 例:调用函数fun4("1", "2", 3),args[1]结果:2,取元组中值用索引获取,从0开始 # 如果没有传参,结果报错:tuple index out of range,元组索引超出范围 print(args[1]) # 取元组中值 # 可以不传参 fun4() # 结果:() # 可以传1个参数 fun4("1") # 结果:('1',) # 可以传2个参数 fun4("1", "2") # 结果:("1","2") # 可以传不同类型 fun4("1", "2", 3) # 结果:('1', '2', 3)
**kwargs
:只能按照关键字传参,{}字典类型
# 该函数只能按照关键字传参 def fun5(**kwargs): print(kwargs) # 例:调用函数fun5(a="1", b="2", c=3),kwargs["a"]结果:1,取字典中值用关键字获取 # 如果字典中找不到对应键,结果报错:KeyError: 'd' print(kwargs["a"]) # 取字典中值 # 可以不传参 fun5() # 结果:{} # 可以传1个参数 fun5(a="1") # 结果:{'a': '1'} # 可以传2个参数 fun5(a="1", b="2") # 结果:{'a': '1', 'b': '2'} # 可以传不同类型 fun5(a="1", b="2", c=3) # 结果:{'a': '1', 'b': '2', 'c': 3}
*args
,**kwargs
:可以用位置传参,可以用关键字传参,(){}元组加字典,注意:函数中元组和字典不能切换位置,*args必须在**kwargs前;
# 该函数既可以用位置传参,也可以用关键字传参,注意 def fun6(*args, **kwargs): print(args) print(kwargs) # 可以不传参 fun6() # 结果:(){} # 可以传1个参数,元组 fun6("1") # 结果:('1',) # 可以传1个参数,字典 fun6(a="1") # 结果:{'a': '1'} # 可以传2个参数,元组 fun6("1", "2") # 结果:('1', '2'){},字典为空 # 可以传2个参数,字典 fun6(a="1", b="2") # 结果:(){'a': '1', 'b': '2'},元组为空 # 可以传2个参数,元组+字典 fun6("1", b="2") # 结果:('1',){'b': '2'},元组和字典都有值 # 可以传2个参数,字典+元组 fun6(a="1", "2") # 结果:编译报错,第一个必须为元组参数
参数和动态参数一起使用时,动态参数必须放在参数后
def fun6(p1, p2, *args, **kwargs):
默认参数和动态参数混用,默认参数必须放在字典参数**kwargs前
def fun6(p1, p2="2", *args, p3="3", p4, **kwargs):
函数返回值
返回值可以是任意类型,如果函数中没有return,则默认返回None
# 定义函数打印两个值相加 def fun7(num1, num2): # 结果:2 print(num1 + num2) # 结果:None,函数没有返回值 print(fun7(1, 1)) # 定义函数打印两个值相加,并且返回结果 def fun8(num1, num2): # 结果:2 print(num1 + num2) # 返回结果 return num1 + num2 # 结果:2 print(fun8(1, 1))
return返回值后带有逗号,默认转换为元组类型返回
# 定义函数,返回两个数相加和相减 def fun9(num1, num2): return num1 + num2,num1 - num2 # 结果:(2, 0),返回元组类型结果 print(fun9(1, 1))
函数中遇到return则立即返回终止函数,下面代码将不再执行,注意:循环中return也一样立即返回终止函数
# 定义函数,返回两个数相加和相减 def fun10(num1, num2): print(num1 + num2) return num1 + num2 print(num1 - num2) return num1 - num2 # 结果:2,返回第一个return的结果 print(fun10(1, 1))
总结
这周出差到现场驻场开发,现场真的超级忙,没有空闲时间,只能晚上下班回来学习,虽然辛苦,继续坚持!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?