第十一章:函数(python version 3.7.2)
函数的概念
- 函数是指一段可以直接被另一段程序或代码引用的程序或代码,也叫做子程序,方法.
- 现阶段可以理解成函数是带名字的代码块.
- 之前用过的input() ,print(), range(), len(), id() 等等都是函数,这些都是 python的内置函数,它们是由有经验的程序员提前定义好的,可以直接调用使用.
- 控制结构的条件之后也是代码块,只不过它们没有单独指定名字,没法直接使用它们.
函数的作用
- python内置函数虽然很丰富但并不能满足我们的个性化功能需求,这时就需要我们自己创建函数.
- 可以将功能复杂的程序进行细化后交由多人开发,这样有利于团队分工,缩短开发周期.
- 通过功能细化,可以有效缩减代码的长度,代码复用得以体现,当再次开发类似功能的产品时,只要稍作修改或直接引用就可以重复使用.
- 程序可读性得到提高,代码调试和后期维护难度降低.
定义函数
python定义函数的语法:
def 函数名([参数1, 参数2, ..., 参数n]): ????????'''函数文档注释''' ????????函数体 注意以下几点:
- 函数定义以
def 关键词开头,后面接上函数名称 和圆括号 () . - 传入参数须放在圆括号之内,不同的参数用
逗号 隔开,即使一个参数也没有,这对圆括号也必须保留 . - 参数是变量,会在函数体中用到它,目的在于提高函数的灵活性和可复用性,定义函数时的参数是形参.
- 函数的第一行语句可以选择性地使用注释文字,用于存放函数功能和使用说明.
- 函数体是
以冒号起始 的一个缩进统一的代码块,负责函数具体内容的执行. return [表达式] 结束函数,选择性地返回一个值给调用方.不带表达式的return相当于返回None .- 若有多个返回值时,则返回值之间必须用
逗号 分隔,调用时要有多个变量来接收返回值 .
函数创建后并不会执行,必须在程序中调用该函数才会执行.
调用函数
python调用函数的语法.
[变量 = ]函数名称([参数1, 参数2, ..., 参数n]) 注意以下几点:
- 如果函数定义的有形参,那么在调用时必须传参(特殊情况下面说).
- 如果函数有返回值,可以使用变量来存储返回值.
- 在函数的返回值对于调用不重要时可以忽略,即不使用变量存储函数返回值.
- 函数定义时的参数称为形参,函数调用时的参数称为实参.
函数的返回值
return 关键字 + 表达式 来指定函数返回的结果.
可以只使用return关键字而不加表达式来纯粹的结束函数,等价于return None.
没有return语句时,默认 return一个None .
多个return语句时,运行到第一个return语句即返回,不再执行其它代码.
如果函数的返回值不那么重要,我们就不需要用变量去存储返回值.
形参和实参
定义函数的时候写的是形参,调用函数的时候写的是实参.(简单理解:形参就是占位符,等待实参的到来,在使用形参时实际用的是实参的值)
以这段代码为例,来看看传参的过程.
首先变量x 会在栈内存中记录变量的名称,并在引用中记录堆内存中的地址,假设是10002,这个地址用于找到值100.
当调用函数increment_one时,形参会在栈内存登记变量名number,引用则是复制传入的实参的引用.当使用number时,一样可以找到值100.
在这段代码中,对形参的值进行更改,并不影响实参的值.虽然他们指向同一块内存空间.
执行到 number += 1的时候会开辟一块新内存,存储 number+1的值
情况并不总是这样,有些情况就会改变到实参的值.
- 列表中实际存储的是元素的地址引用.
- 出于对列表性能的考虑,存放的元素地址会放在连续的内存空间中.
- 既然是连续的内存,只要知道列表的地址,按照与列表地址的距离给每个元素标上号,这个标号称为偏移量.
- 也就是在获取列表内部元素时使用的索引.当找到元素在列表中的引用时,就可以访问到元素实际的值了.
例如: 当调用函数时,参数data会复制变量list1的引用,如果我们使用data加索引的形式访问或修改元素,实际访问或修改的就是list1的元素. 当我们使用赋值语句data[i] += 10 的时候,会用当前值加上10并开辟一块新的内存存储这个计算结果,然后赋值操作会让data中对应元素的所在地址变更为这个新地址,此时list1同样指向这个列表,这样看list1中的元素就改变了.
理解以下规则即可:
- 当实参类型是可变类型时,那么函数体修改形参的内容会影响到函数外作为实参的值.
- 而当实参类型是不可变类型时,那么函数体修改形参的值不会影响到函数外作为实参的值.
- 所谓可变对象是指,对象的内容可变,而不可变对象是指对象内容不可变.
- 可变数据类型的值改变,id值不变.
- 不可变数据类型的值改变,id值随之改变.
现在只需要知道:
- 内置可变类型有:列表,集合,字典.
- 内置不可变类型有:数值,字符串,元组,布尔,None类型.
如有错误还望指出
|