目录
- 类
- 类定义
- 类方法
- 变量
- 变量定义
- 常量
- 常量定义
- 函数
- 函数定义
- 函数参数
- 位置传参
- 关键字传参
- 动态参数传参
- 函数返回值
- 总结
类
类定义
类的简要描述
- 类其实就是存放了许多函数的一个集
- 类中的函数必须实例类后才能调用
- 类与类可以继承,子类可以使用父类中的函数,如果父类中的函数不能满足需求,可以对父类中的函数进行重写
(
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))
# 定义函数,返回两个数相加和相减
def fun10(num1, num2):
print(num1 + num2)
return num1 + num2
print(num1 - num2)
return num1 - num2
# 结果:2,返回第一个return的结果
print(fun10(1, 1))