天天看点

【Python】类,变量,函数

目录

  • ​​类​​
  • ​​类定义​​
  • ​​类方法​​
  • ​​变量​​
  • ​​变量定义​​
  • ​​常量​​
  • ​​常量定义​​
  • ​​函数​​
  • ​​函数定义​​
  • ​​函数参数​​
  • ​​位置传参​​
  • ​​关键字传参​​
  • ​​动态参数传参​​
  • ​​函数返回值​​
  • ​​总结​​

类定义

​类的简要描述​

  • 类其实就是存放了许多函数的一个集
  • 类中的函数必须实例类后才能调用
  • 类与类可以继承,子类可以使用父类中的函数,如果父类中的函数不能满足需求,可以对父类中的函数进行重写​

    ​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))      

总结