网站首页 > 技术文章 正文
说明:本文是在上一篇的基础上写的,上一篇图文见:零基础如何自学python? 这些知识点是你进阶的必经之路
1.python函数
所谓的函数,就是具有特定功能的代码块,比如说登录,本身可以使用函数来实现登录的功能。
若要通过函数实现功能,一般都会要两个步骤:
- 函数的定义
- 函数的调用
1.1 函数的定义
函数的定义一般会包括5个部分,分别是关键字,函数名字,圆括号,函数体,以及返回语句。需要说明的是,有的函数可以不用返回语句 。
1.2 函数的调用
函数的调用其实就是要使用函数这个功能了,如我们实现了一个加法的函数,这时我们要使用它来计算,就需要进行调用。调用时也非常简单,直接在调用处编写函数名即可,如上面的定义的函数,如果调用的话,如下:
那么编写函数的函数从这里也可以看出,通过函数的调用,可以是函数进行重复使用,减少代码量 。
1.3 函数名
函数名可以随便起,但是在同一个文件不能重复起相同的名字 。同时为了函数在调用时被更好的理解,一般其的函数名要有语义,什么是语义呢 ? 简单的说就是通过函数的名字,就知道你这个功能是干什么用的 ? 比如我们要实现的是加法操作,那么就可以使用add来表示 。
有时候函数名字会用到多个英文名,这时要用_将多个英文隔开,同时需要注意的是,函数名字都需要小写 。如:get_info()函数 。
比较规范的函数命名:
- login()
- get_info()
- get_total_score()
不规范的函数命名:
- xxx()
- getInfo()
- GetInfo()
需要说明的是,虽然以上命名的函数不太规范,但是它不会报错,只是在python不提倡如上方式命名。
1.4 函数体
函数体就是具体的业务,如果你定义的函数是登录,那么函数体实现的就是登录的业务,如果你定义的函数是订单,那么函数体实现的就是订单。
函数的执行体其实并非以上这么简单 。一般来说,函数体其实就是由多行代码组成的业务逻辑代码 。
1.5 函数的返回
函数的返回是用于退出该函数,函数的返回使用return来表示,也就是说遇到了return语句,意味着一个分支的结束或者整个一个业务的结束 。
return语句后面的值是非常灵活的,它不仅可以跟任意数据类型,而且也支持表达式,函数。如果return后面没有任何值,默认为None
- return None,如果是None,可以忽略不写 。
- return value,value可以是代码块中计算出来的值,也可以是一个表达式 。
- return val1,...,valn。return也可以返回多个值。
1.6 函数的参数
函数的参数,就是圆括号()内定义的名字;为了能使函数更好的满足各种业务需求,就要求函数的参数接收不同类型的数据;不同个数的数据,这时函数的参数就派上用场了 。在函数的参数中,一般包括如下四种参数:
- 位置参数
- 默认参数
- 关键字参数
- 可变参数
形式参数和实际参数
在介绍函数的参数之前,就不得不提到形式参数和实际参数 。
- 形式参数,是在括号内的参数就叫形式参数,也称形参
- 实际参数,调用函数时,实际传入到函数内的值 ,也称实参。
位置参数
所谓的位置参数,主要是指调用函数时的参数数量和位置要和定义的形参中的一致。传多或传少都会报异常(TypeError)。
关键字参数
使用位置参数有个弊端就是,如果参数很多的话,你就很难记住那个参数在前,那个参数在后,这样可能会导致本来要给第一个参数传值,结果传给了第二个参数 。
那么,使用关键字参数就可以解决以上的问题 。
关键字参数是指传值时要以key=value形式,key代表函数中的形参名称,value就是传递给函数的实际的值。
默认参数
如果函数调用时,传递的实际参数经常会是一个值,那我们就可以给这个参数设置默认值 。如果设置默认参数,需将在位置参数后 。
可变化参数
这里的可变化参数指的传递参数的数量可以发送变化,比如我可以传递3个参数,也可以传递6个,甚至更多 。
可变化参数有两种类型:
- 分别是用来接收列表形式的可变参数,调用函数时跟位置参数一样
- 用来接收字典形式的可变参数 。调用函数时跟为关键字参数一样。
那么可变参数和位置参数,关键字参数最大的不同就是传递参数的数量不受限制 。
以下为列表形式的可变参数:
以下为字典形式的可变参数:
也可以将两种可变形式的参数结合起来使用
1.7 匿名函数
在前面介绍的函数中,每个函数都会有一个唯一的名称用于标识,在python语法中还有一种无名字的函数,简称匿名函数。它使用关键字lambda表示,普通的函数若可以用一行进行实现的话,那么该函数就可以使用匿名函数来代替。
2.面向对象
面向对象编程(Object-oriented Programming,简称 OOP),面向对象是一种编程思想。
面向对象将现实的事物抽象出来,然后抽象成 类 ( class ),给类定义属性和方法后,再将类实例化成 实例 ( instance ) ,通过访问实例的属性和调用方法来进行使用。
2.1 类的定义
类是具有相同特性(数据元素)和行为(功能)的对象的抽象。因此,对象的抽象是类,类的具体化就是对象,也可以说类的实例是对象,
语法格式:
class 类名():
多个(≥0)类属性...
多个(≥0)类方法...
从上图我们可以看出:
- 类 : 通过class + 类名 申明一个类。
- 属性 : 在类中可以申明变量,类中的变量称为属性
- 方法:在类中的函数称为方法
2.2 类的实例
当我们创建一个类后,这个类并不能直接使用,必须需要创建具体的对象才能使用类中的属性和方法。
创建类的对象,也叫类的实例化对象 ,或者类申明对象 。 同时类的对象可以申明多个对象 。每个对象就是类的一个具体化实例 。
2.3 构造方法
虽然通过以上案例可知,通过实例化的对象直接调用类属性,但是一般不会这么写,理由是直接调用的属性如果写错会报错,而且也可以通过构造方法来赋值更加方便。
python的构造方法使用 __init__() 方法来表示,每次调用类的时候会自动被调用 ,主要用来初始化数据。
2.4.self介绍
python规定,类内的方法,至少要包括一个参数,这个参数名就是self.当然如果你改成其它的名称也不会报错 。 只是python中这只是一种约定的俗称。
这个self其实就是代表对象自己,当同一个类中实例化了多个对象,当不同的对象调用类中的方法时,就会把对象的引用作为第一个参数自动传给被调用的方法.这样python解释器就就知道到底是哪个对象调用的该方法.
2.5 类的方法
在python中,类的方法包括普通方法,静态方法,类方法。
普通方法:就是上面案例中使用到的方法,在方法内都会默认带个self参数,且只能被对象调用;
静态方法:在方法前使用@staticmethod装饰的且不带self参数的方法叫静态方法,类的静态方法可以有参数也可以没有参数,直接使用类名调用
类方法:默认带个cls参数,可以被类和对象调用,需要在方法前加@classmethod装饰器
2.6 类的变量
在类中的变量主要包括类变量,实例变量和局部变量,其主要区别就是作用范围不同 。作用范围从大到小来进行排序的话依次是:类变量>实例变量>局部变量
类变量
- 类变量是定义在类内,方法之外的变量 。
- 类方法的调用方式有 2 种,既可以使用类名直接调用,也可以使用类的实例化对象调用。
实例变量
- 实例变量指的是在任意类方法内部,以“self.变量名”的方式定义的变量,其特点是只作用于调用方法的对象。
- 定义的实例变量可以在类中的不同方法间共享数据 。
- 实例变量只能通过对象名访问,无法通过类名访问。
局部变量
- 局部变量是直接在方法内定义的变量且以“变量名=值”的方式进行定义
- 局部变量的使用范围也仅限于所定义的方法内
2.7 封装
面向对象有三大特性,分别是分装,继承和多态 。
那么什么是封装呢 ? 简单的来说就是给数据和行为设置权限,从而保护隐私数据。也就是说该让用户访问到的数据,我们可以开放给用户,让用户可以直接使用,不该让用户访问的数据,我们可以通过将数据隐藏起来,从而达到无法访问的目的。
就好比我们使用的鼠标和键盘,至于鼠标内部的零件长什么样,我们不知道,也不用关注,只需要将按键和操作的部件提供给用户即可。那么这个就是一个封装的例子 。
python的封装其实就是将不该让用户访问的数据设置为私有的,从而达到隐藏的目的。
- 默认情况下,python类的变量和方法都是共有的,他们的名称前都没有下划线
- 如果类中的变量和函数,其名称以双下划线“__”开头,则该变量和函数就为私有的,只有在类内访问 。
- 如果是以_下划线开头的方法和属性,则是无法导入的。
上面通过_设置的私有变量和方法还能被访问,这是因为在python中并不会真正的限制你调用,这种设置更多的是一种约定的俗称 。
以下是将变量和方法通过双下划线设置
注意:以上说的是并不能被直接被调用,而非不能被调用 。
2.8 继承
类的继承是两个或多个类产生了一定的关系,其中一个是父类,另外一个就是子类。这就像生活中父与子的关系 。在python中的子类会继承会获得父类的所有非私有的功能 。对于父类中的功能,都是拿来即用。
2.9 多态
有时候我们在父类中定义了一个方法,但是由于父类的方法又不满足要求,我们想在父类的方法基础上进行扩展,怎么办呢 ? 这时就用到了多态 。要使用到多态就必须满足两个条件:
- 继承:多态一定是发生在父类和子类之间的。
- 重写:子类重写父类的方法,注意两个方法的名字一定是一样的,否则不叫重写 。
那如果想通过子类对象调用父类的方法呢 ? 就可以通过super关键字来进行调用
本文未完待续,欢迎感兴趣的同学关注和转发,谢谢 。
- 上一篇: Python 爬虫实战一之爬取糗事百科段子
- 下一篇: 面向对象 3(面向对象3个特性)
猜你喜欢
- 2024-09-09 序列化 Python 对象(序列化对象需要实现的接口)
- 2024-09-09 一篇文章读懂系列-2.二叉树及常见面试题
- 2024-09-09 Meta 如何将缓存一致性提高到 99.99999999
- 2024-09-09 自学Python笔记2(python0基础自学书)
- 2024-09-09 找到两个链表的第一个公共节点(找出两个链表的第一个公共节点)
- 2024-09-09 详解SkipList跳跃链表(跳表遍历)
- 2024-09-09 Python画豪华版圣诞树,带漂亮彩灯与文字背景
- 2024-09-09 零基础Python完全自学教程23:函数的返回值、作用域和匿名函数
- 2024-09-09 redis的内存满了之后,redis如何回收内存
- 2024-09-09 「python小游戏」据说这是一款还原度超高的小游戏,你感受下....
- 02-21走进git时代, 你该怎么玩?_gits
- 02-21GitHub是什么?它可不仅仅是云中的Git版本控制器
- 02-21Git常用操作总结_git基本用法
- 02-21为什么互联网巨头使用Git而放弃SVN?(含核心命令与原理)
- 02-21Git 高级用法,喜欢就拿去用_git基本用法
- 02-21Git常用命令和Git团队使用规范指南
- 02-21总结几个常用的Git命令的使用方法
- 02-21Git工作原理和常用指令_git原理详解
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)