python基础4

十四.函数

当我们要用python来帮助我们做一些算法时,我们就会发现有些算法中只是算法里面的参数不同,难道我们还要根据这些不同的参数再分开对应编程吗,在此之前我们要知道在软件开发里面有一条原则叫做DRY(Don't Repeat Yourself不要重复你自己),那显而易见,这些算法只是参数不同,其他都一样的,那么函数就可以很好的解决这个问题,我们之前很早就见过函数了,例如print、sum、type,这些都是python自带的函数,每个函数都负责完成某项特定任务,使用函数的时候,我们用函数名(),括号里面放入想要传入的参数来进行调用

函数名.()

但我们不仅可以调用函数,也可以定义自己的函数,,我们可以把定义函数想象成是制作一个负责某一特定任务的机器,一旦制作好后,当我们在需要完成这个任务的时候,直接用这个函数就好了,不需要在反复定义,定义一个由自己想要功能的函数,以下是简单的规则:

  1. 函数代码块以 def 关键词开头(表示开始定义函数),后接函数标识符名称和圆括号 ()
  2. 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
  3. 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
  4. 函数内容以冒号 : 起始,并且缩进。
def 函数的名字():
    #接下来是一些定义函数的代码
    #...

需要注意的是定义函数的时候,里面的代码都不会被执行

def circular_circumference_1():
    circular_radius=3
    circular_circumference=2*3.14*circular_radius
    print(f"此圆的周长为:{circular_circumference}")

只有在调用时函数的时候,才是里面代码被实施执行的时候

def circular_circumference_1():
    circular_radius=3
    circular_circumference=2*3.14*circular_radius
    print(f"此圆的周长为:{circular_circumference}")
circular_circumference_1()

但这个函数仍然存在一些问题,如果我要打印第二个、第三个、第四个...圆的周长,还要再定义一个circular_circumference_2、3、3.....个函数吗,如果真这么做了那就跟刚开始提到的一样,带来了重复的代码。我们可以通过参数,来让这个函数变得更加通用,我们可以把参数放在函数名的括号里面,一但我们给了参数就不需要对变量进行赋值

def circular_circumference(circular_radius):
    circular_circumference=2*3.14*circular_radius
    print(f"此圆的周长为:{circular_circumference}")

因此我们在调用时只需要在函数名后面的括号里加入数据就行了,而添加的数据就会像变量被赋值为你传入的值

def circular_circumference(circular_radius):
    circular_circumference=2*3.14*circular_radius
    print(f"此圆的周长为:{circular_circumference}")
circular_circumference(6)

 现在又出现了新的问题,之前我们一个一个定义,结果是被一个一个保存下来的,当我们要用的时候,只要调用相对的函数名就行了,而现在我们并没用任何变量来存储这些计算结果,无法进行后续使用,肯定有人有疑惑这个circular_circumference不是被赋值成了计算结果吗,这里我们得先了解下作用域的概念,我们在定义函数的变量都只是局部变量,出到函数外就访问不到了比如在函数里面定义变量a的值为1,那么在这个函数里面我们可以顺利获取到a的值

def abc():
    a=1
    print(a)
abc()

 但在这个函数之外,不管是运行这个函数前,还是运行函数后,python都会说a不存在,因为a在这个函数里被定义,只是局部变量,只作用于函数里面

def abc():
    a=1
    print(a)
print(a)

 因此通过调用函数来运行某段代码和直接运行某段代码并不是完全一样的,从这一段角度看,函数虽然可以让我们不当复读机,但获取不到里面变量的值,这时return语句的作用就在此体现出来了,return写在函数的最后一行,后面跟上我们想要它返回的东西,那么函数在执行时,不仅会逐行运行里面的语句,还会在函数完成调用后返回那个东西,这个值不管是用来给变量赋值还是被打印出来,还是其他都无所谓,最总要的是他给了我们在函数之外继续用那个值得机会

def abc():
    a=1
    print(a)
    return(a)
abc()

事实上,在你没写return语句的时候,python函数的返回值会默认为None,即返回空值,如果你把某个变量赋值为没有return语句函数的执行结果,就会发现变量值为None,比如print、append等实质上都是返回为None的函数,所以我们一般直接调用,不进行变量赋值,而len、sum这些都是带返回值的函数,所以我们一般会把它们的调用结果赋值给变量。

十五.面向对象编程

很多刚学习编程的人,都会有一个躲不过去的坎那就是面向对象编程,也叫OOP(Object Orien Programming),面向对象一般会和面向过程对比,接触对象前我们基本上都是在面向过程编程,过程是负责完成某个具体任务的代码,基本可以理解为函数,面向过程的核心就是把要实现的事情拆分成一个个步骤依次完成,比如我们写个ATM的程序,要往里面依次存入100块和取出200块

def 存钱(面值):
    ...
def 取钱(面值):
    ...

存钱(100)
取钱(200)

假如我们还需要记录存钱和取钱、是哪个ATM机执行的、ATM是属于哪个银行以及纸币的编号

def 存钱(面值,ATM编号,银行,纸币编号):
    ...
def 取钱(面值,ATM编号,银行,纸币编号):
    ...

存钱(100,"1","xxx银行","AA0001")
取钱(200,"2","xxx银行","AA0002")

这样写没什么问题,但如果还要记录更多性质,这些散落的数据一方面会增加函数参数的数量,另一方面,有些数据在会在传参过程中混在一起,不利于我们理解其具体含义,随着程序长度和逻辑复杂度的增加,代码的清晰度可能由此降低,但如果我们用面向对象编程呢,正如字所言,相比过程,他以对象为核心,面向对象编程不会聚焦于第一步而是模拟真实世界,先考虑各个对象有什么性质、能做什么事情(把事物先分解到对象身上,描述各个对象的作用,然后才是他们之间的交互)就比如刚刚的ATM的程序,我们可以先提取出ATM有的性质,定义ATM的类,然后用类创建对象

calss ATM:
    def __init__(self,ATM编号,银行,纸币编号)
        self.ATM编号=ATM编号
        self.银行=银行
        self.纸币编号=纸币编号
atm1=ATM("1","xxx银行","AA0001")
atm2=ATM("2","xxx银行","AA0002")

类和对象之间的关系是:类是创建对象的模板,对象是类的实例(通俗的说可以把类想象成具体对象的图纸,图纸上说这个对象可以有几个属性,可以通过这图纸创建相对应的的对象)面向对象除了能让参数更少之外,用对象把相关属性绑定在一起,还有利于让程序逻辑更加清晰,让人更加清楚性质所属的对象是什么,除了属性能和对象绑定在一起,另一个能和对象绑定的是方法(正如真实世界里,对象拥有不同的属性,并且能作不同的事情,那属性就对应对象拥有的性质,所谓方法就是放在类里面的函数,所谓属性就是放在类里面的变量)

面向对象的特征:

  • 封装(写类的人将内部实现细节隐藏起来,使用类的人指通过外部接口访问和使用,接口可以大致被理解为提供使用的方法),封装能减少我们对不必要细节的精力投入
  • 继承(面向对象编程允许创建有层次的类),类可以有子类和父类来表示从属关系,父类的属性、方法都可以被子类继承,不需要反复定义减少代码的冗余
  • 多态(同样的接口因为对象具体类的不同而有不同表现)多态可让你无需判断,统一调用同一名称的方法

类是创建对象的模版,对象是类的实例,类定义了对象有何种属性和方法,而对象拥有的具体属性则可以不尽相同,这里我给大家讲解的是面向对象编程的一些概念,让大家了解何为面向对象编程下期我会具体讲解其语法。

至此python的基础就讲解完了,后面我会继续给大家分享其他的内容

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值