函数的定义

概述:将一段经常使用的函数封装起来,减少重复代码,一个较大的程序,一般分为若干个程序块,每个模块实现特定的功能

于python中,定义函数时要用到def

语法结构:

def 函数名称(参数):

     函数体

     return 返回值

函数在有返回值的情况下会根据实际情况进行返回,如果函数没有返回值则返回None

  1. 在定义函数时,如果暂时还没想法可以用pass进行跳过
  2. 函数可以返回多个值,即return后可以跟多个参数,但函数本身返回只有一个值,其值为元组
  3. 函数名称是指向函数对象的引用,当把一个函数名称赋值给一个变量就是给它起了一个别名

函数的分类

根据有无参数分类:

  • 有参函数
  • 无参函数

根据有无返回值分类:

  • 有返回值函数
  • 无返回值函数

根据定义者分类:

  • 系统自定义函数
  • 第三方函数

全局变量和局部变量

全局变量:定义在py文件中的变量

特点:在代码运行过程中始终有效

局部变量:定义在函数中的变量

特点:函数外部无法访问函数内的变量即局部变量

函数内部可以访问全局变量,但不能修改全局变量,如果需要在函数内部修改全局变量,则要用到global关键字,一般不建议使用

值传递与引用传递

值传递:值传递时,当函数的形参发生变化不会影响实参的值

de794be732654f63a3ba0490a3f5a9dd.jpg

 cad4735d4bd1453bb03415006237c49e.jpg

引用传递:引用传递时,当函数的形参发生变化会影响实参的值

f6948127e1234db0b7d798411fbd89fa.jpg

 2596d04e733a478db7a4d5c1b02cbda9.jpg

其中的a,b都代表的是内存地址,代表的是函数本身,而a(),b()代表的是函数的返回值,当没有返回值时,则返回None

值传递适合于不可变类型的实参(字符串、数字、元组),引用传递适合于可变类型的实参(列表、字典)

在弱数据语言中,函数是可以作为参数传递到另一个函数中

函数的递归

在python中函数可以调用其他函数,而函数递归就是函数自己本身调用自己

函数递归必须要有终止条件,如果没有终止条件,函数就会陷入死循环,python中会报错

7a28b309df9a4a989f34e7709d061901.jpg

0144304c7eef4bf6bd115b7470833dcb.jpg

栈溢出问题:递归调用层次过多,递归函数在运行时会进行压栈操作,当压栈次数过多时,会导致堆栈溢出

解决方法:尾递归优化

尾递归:函数自己调节自己,要有终止条件,return语句中不能包含表达式

2e43dec8a32949f4be0f9f422e2ed16b.jpg

4cedd74753a6497eaf1a43c5eb6211a6.jpg

 递归优缺点:

  • 逻辑简单清晰
  • 过深的递归会造成栈溢出问题

python解释器并没有对尾递归优化,所以在python中任何的递归都会造成栈溢出问题

匿名函数

概念:没有名称的函数,使用lambda关键字来定义

语法结构:lambda 参数 :函数体

由于lambda返回的是函数对象,因此我们需要用一个变量去接收

6814779b7a764b9389a96793f8147a31.jpg

7f40e349f5e74718a9ba5c0e220e4694.jpg

匿名函数可以无参数、一个参数或多个参数,可以作为一个参数进行传递,也可以作函数的返回值

偏函数

在python中,调用函数时我们想要其中的一个值设置为一个固定值,此时我们就需要用到偏函数

python中的functools模块为我们提供了许多功能,其中一个便是partial

当我们只引入偏函数时需输入:

from functools into partial

其中int()将字符型转换为整型,默认为十进制

其中int()提供了baes参数,可以调节转换进制

当我们需要大量转换2进制时,每次传入int(x,base=2)过于麻烦,此时我们会定义一个函数,传入base默认值=2

from functools import partial
def int2(x,base = 2):
   return int(x,base)
print(int2("1000"))

8

全局函数

注意:round() 四舍五入,但是要注意在python中奇数上是标准的四舍五入,在偶数上是以5为分界线 

Logo

华为云1024程序员节送福利,参与活动赢单人4000元礼包,更有热门技术干货免费学习

更多推荐