python之旅第十一站(函数上)

本文详细介绍了Python中的函数概念,包括其作用、定义方式、调用方法以及返回值。强调了函数在代码复用、模块化和可读性提升上的重要性。函数的参数分为形式参数(形参)和实际参数(实参),对于可变类型和不可变类型的参数传递,函数体内对形参的修改可能影响实参。最后,讨论了Python内置的可变和不可变数据类型在函数中的行为差异。
摘要由CSDN通过智能技术生成

第十一章:函数(python version 3.7.2)

函数的概念

  1. 函数是指一段可以直接被另一段程序或代码引用的程序或代码,也叫做子程序,方法.
  2. 现阶段可以理解成函数是带名字的代码块.
  3. 之前用过的input() ,print(), range(), len(), id() 等等都是函数,这些都是 python的内置函数,它们是由有经验的程序员提前定义好的,可以直接调用使用.
  4. 控制结构的条件之后也是代码块,只不过它们没有单独指定名字,没法直接使用它们.

函数的作用

  1. python内置函数虽然很丰富但并不能满足我们的个性化功能需求,这时就需要我们自己创建函数.
  2. 可以将功能复杂的程序进行细化后交由多人开发,这样有利于团队分工,缩短开发周期.
  3. 通过功能细化,可以有效缩减代码的长度,代码复用得以体现,当再次开发类似功能的产品时,只要稍作修改或直接引用就可以重复使用.
  4. 程序可读性得到提高,代码调试和后期维护难度降低.

定义函数

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的值

在这里插入图片描述
情况并不总是这样,有些情况就会改变到实参的值.

  1. 列表中实际存储的是元素的地址引用.
  2. 出于对列表性能的考虑,存放的元素地址会放在连续的内存空间中.
  3. 既然是连续的内存,只要知道列表的地址,按照与列表地址的距离给每个元素标上号,这个标号称为偏移量.
  4. 也就是在获取列表内部元素时使用的索引.当找到元素在列表中的引用时,就可以访问到元素实际的值了.

例如:
在这里插入图片描述
当调用函数时,参数data会复制变量list1的引用,如果我们使用data加索引的形式访问或修改元素,实际访问或修改的就是list1的元素.
在这里插入图片描述
当我们使用赋值语句data[i] += 10 的时候,会用当前值加上10并开辟一块新的内存存储这个计算结果,然后赋值操作会让data中对应元素的所在地址变更为这个新地址,此时list1同样指向这个列表,这样看list1中的元素就改变了.
在这里插入图片描述

理解以下规则即可:

  1. 当实参类型是可变类型时,那么函数体修改形参的内容会影响到函数外作为实参的值.
  2. 而当实参类型是不可变类型时,那么函数体修改形参的值不会影响到函数外作为实参的值.
  3. 所谓可变对象是指,对象的内容可变,而不可变对象是指对象内容不可变.
  4. 可变数据类型的值改变,id值不变.
  5. 不可变数据类型的值改变,id值随之改变.

现在只需要知道:

  1. 内置可变类型有:列表,集合,字典.
  2. 内置不可变类型有:数值,字符串,元组,布尔,None类型.

如有错误还望指出

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值