目录
一、Python缩进规则
通过使用缩进,来区分不同代码块,在Pycharm IDE中,针对缩进有误的脚本,会直接报错。
在循环嵌套或条件选择语句中,缩进显得尤为重要,因为一旦缩进书写存在问题,就极有可能导致一条执行语句从循环或条件判断中去掉。所以在代码书写过程中,需随时注意缩进规则。
具体规则:
- 首行需要顶格,无需缩进
- 保证相同层级的代码保持在同一缩进量中
- 循环和判断语句中,”:”后面通常要进行缩进,表示进入下一级代码层级。
- PEP8 编码规范中明确提出,脚本可用Tab进行缩进,通常标准为4个空格。
二、Python函数
函数是针对一些操作相同,数据引入不同的步骤进行封装而来一种产物。
目的是为了提高代码的重用率,以及后期方便人们对相应代码做优化操作。
2.1、函数分类
内建函数:
内建函数是指python中已经搭建定义好的函数,开发者可根据自身需要直接进行相关调用。例如print,add等
自定义函数:
自定义函数是指通过开发工程师自己构建而来的函数式,通常在调用前会先做该函数具体实现步骤的定义,若工程师本人尚未定义函数便直接引用,则直接报错。
在开发中,函数我们还可以将其赋给一个变量,例如a = get_num,此时调用为print(a(3)),切记在将函数赋值给变量过程中,不可带括号,在实际调用中直接按照形参去赋值即可
2.2、函数格式
Python语言中,函数是由函数名,参数列表和函数体组成,格式如下:
“””
def 函数名(参数列表):
函数体
“””
注意事项:
- 就算函数名后不添加任何参数,括号是必须要写的
- 可在尚未想好函数具体实现时,先放置一个pass放在函数体上,这样代码便可先成功运行。
2.3、参数分类
在Python函数中,函数定义一共分两类,一类为形式参数,另一类为实际参数。
形式参数:
也成为虚拟变量,实在定会一函数体时使用的参数,目的是用来接收调用该函数实际参数时传入的数据。
实际参数:
实际参数是调用时传递给函数的确切参数,可以是常量、变量、函数等。
函数调用过程中,会经历一个实参复制到形参的过程,首先需要型参与实参的数量一致,另外实参必须要有确定值。例如如下用法:
注:如果在调用实际参数过程中是按照add_num(a = 1,b = 2)或add_num(b = 2, a = 1)格式书写,含义与上图一致
按另一个维度划分,参数也可分为可变类型和不可变类型,其中可变类型数据结构为列表、字典等,不可变类型为整数、字符串、元组等。如果传递参数为可变类型,则当这些参数在函数内做了修改,则会影响到外部该变量的值,如果传递参数为不可变类型,则函数无论作何调用或修改,都不会影响到外部变量。如图所示
上图为不可变类型参数,函数内部重新赋值不会影响外部变量的值。归根到底是因为在调用不可变类型参数时,按传值方式复制了变量a,在b=10时,则新生成一个int值对象10,并让b指向刚才a赋值的内存地址上。
上图为可变类型参数,函数内部重新赋值会影响外部变量的值,归根到底是因为在调用可变类型参数时,调用过程中引用对象用的是同一个内存地址,所以会根据变化而变化。
当然,除这两种笼统的分类外,参数类型还可以分成几种类型:
位置参数:调用函数过程中,基于形参的顺序去书写对应的实参,此为位置参数。
默认参数:调用函数过程中,在形式参数中写明实际参数值的参数为默认参数。设置默认参数时,必选参数在前,默认参数在后
不定长参数:函数在调用过程中,形参为列表或字典,此时可根据函数内部实现功能,赋所需数量实参进行处理,此时*num,**kwargs便为不定长参数。
命名关键字参数:如果要限制关键字参数的名字,可以用命名关键字参数。用”*”来做区分,“*”后面的参数均需要在实参引入时按照关键字参数导入命名规范去写,否则算报错
2.4、函数返回值
函数返回值的含义为当函数执行完毕后,根据后续return 的值,返回给外部调用者。函数返回值不一定必须要有一个固定的值,也可以返回None,当一个函数最后没有书写return X时,默认均为return none。
如下图所示为有返回值的函数书写方式:
此为返回值为none时的函数书写方式:
注:返回值和所接收的变量之间需要一一对应,且需要按照顺序去对应
2.5、高阶函数
定义:将函数作为参数进行输入,并得到最终输出的函数被称为高阶函数
2.6、匿名函数
在python中经常通过lambda创建匿名函数,该函数体相较def函数体更加简洁,语法如下图所示:
(注:在函数书写过程中,需要遵循PEP 书写规范,比如逗号、冒号后加空格,均前不加空格;切片中冒号前后均不加空格;#后加一个空格,二元运算符前后均加一个空格)
三、Python类
定义:类是创建对象的模板,对象是类的实例化,所以类的概念在面向对象编程思想中尤其重要。举个例子:类如果代表动物的话,对象就代表”猫、狗、老鼠”等。
3.1、类的创建
Python语言中我们通过class关键字来创建类,其中class是关键字,ClassName是类名,bases是要继承的父类,class_A是类成员,包含属性、方法等。ClassName在实际命名时首字母大写。
注意事项:
1、如果类在构造过程中没有显示指明继承的父类,则默认继承object类
2、当python中子类继承父类时,子类不需要重写构造函数__init__,会自动调用父类的__init__。
3、如果重写了子类的__init__,实例化子类过程中就不会再调用父类的__init__
4、如果重写了__init__,还需要继承父类的方法,使用关键字super(此时getName也进行了方法重写)
3.2、对象的创建
创建完类后,便可以根据类创建对应的对象,此步骤也被称之为类的实例化,创建好一个类后,包含类名、属性和方法三个元素,这三个方面共同可构建实例化对象。A = Aminal(“猴子”,”10KG”)此时A就是类A的一个实例化对象
3.3、类的属性
属性可细分为两种级别,类级别和实例级别两种。
两者之间存在联系,在对象实例未作修改前,其属性值与类实例的属性值保持一致,修改后便独立出来,不再与类属性挂钩。书写格式:类.属性 = value(对象.属性 = value)
类的定义由属性和方法组成,属性是对数据的封装,方法则是对类行为的封装。属性按使用范围分为公有属性、私有属性和内置属性
公有属性:可支持类中以及类之外去调用的属性,默认均为该属性
私有属性:不能被类以外的函数调用的属性,命名规则为:__私有属性
内置属性:系统默认添加的属性,命名规则:__内置属性__
3.4、类的方法
类方法包括公有方法、私有方法、类方法和静态方法。接下来我根据这几种分别去做介绍:
公有方法:不能被类直接调用,只能通过实例化对象进行调用
私有方法:不能被外部的类和方法调用,也是需要使用实例化对象调用(命名:def __私有方法)
类方法:能被类和对象同时调用的方法(被classmethod调用&&通过装饰器@classmethod修饰)
静态方法:可以被类直接调用,也可以被所有实例化对象共享(调用staticmethod方法&&通过装饰器@staticmethod修饰声明)
各方法书写规范如下图所示:
针对类方法中self的使用说明:
1、self是一种针对用类的实例的一种定义,调用时会自动传入。
2、除静态方法外,初学者建议其余方法都把self写到第一个形参处,此处不需要在实际引用时添加参数。特别强调一点,静态方法调用时格式为”类.参数”
3、静态方法相比较类方法而言,执行效率要高,但同时也更加耗费资源。
3.5、内部类
定义:如字面意思,是在一个类内部去做定义的类,一般情况下不做使用。
做简单了解即可,内部类一共两种调用方法:
1、实例化外部类对象,再通过对象调用内部类
2、直接通过外部类调用内部类
3.6、魔术方法
定义:在python语言中,所有以双下划线”__”标识的方法均为魔术方法。在实例化类时,这些方法会自动调用。
__init__()被称为构造函数,是用来初始化类的内部参数的,如果在类中没有书写该方法,则系统默认会给一个__init__()方法
3.7、类间关系
关联关系:一个类的属性类型是另外一个类的类型
(一对一、一对多)
依赖关系:实例执行方法时,需要调用另一个类的实例来完成。
继承关系:存在”is - a”关系,下图定义Person类为父类,从该类中派生出两个子类USA和China。
注意:
1、子类可通过继承父类来获取父类的属性和方法(私有方法和私有属性无法获取)
2、子类可以通过多态性修改自己属性和方法。
3、一个父类可由多个子类继承,一个子类也可继承多个父类。
4、如果父类定义了__init__(),子类也定义了自己的__init__(),此时按照子类所定义的属性去做子类的实例化,如若子类仍需要调用父类的实例化(或子类仅是在父类实例化基础上做扩展),则需在子类构造函数中添加super(子类名称,self).__init__(父类所需调用的形参)。
5、当继承的多个父类中有相同的属性或方法时,会使用最后一个继承父类的属性或方法。