python(三)函数

python(三)

为什么要使用函数 ?

​ 有时程序中要多次实现某一功能,就需要多次重复编写实现此功能的程序代码,这使程序冗长,不精炼 ,在程序设计中要善于利用函数,可以减少重复编写程序段的工作量,同时可以方便地实现模块化的程序设计

函数的作用

  • 函数是Python为了代码最大程度的重用和最小化代码冗余而提供的基本程序结构

  • 函数是一种设计工具,它能让程序员将复杂的系统分解为可管理的部件

  • 函数用于将相关功能打包并参数化

  • Python提供了很多的内置函数

  • Python中函数作用域查找,LEGB原则:

    ​ L: Local 函数内部作用域

    ​ E: Enclosing 函数内部与内嵌函数之间

    ​ G: Global 全局作用域

    ​ B: Build-in 内置作用域

函数的定义

Python 定义函数使用 def关键字,函数名为用户自定义名称,参数列表为传给此函数使用的参数,下面是函数体。一般格式如下:

def 函数名(参数列表):
	函数体
	
规则:
	1 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()。
	2 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
	3 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
	4 函数内容以冒号起始,并且缩进。
	5 return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
  • 必须参数

    参数在函数中相当于一个变量,而这个变量的值是在调用函数的时候被赋予的。在函数内部,你可以像过去使用变量一样使用它。

    必需参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样

def add(a,b):
	return a+b
c = add(2,3)
print(c)

5
  • 关键字参数

    关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为Python解释器能够用参数名匹配参数值

def add(a,b):
	return a+b
c = add(b = 2,a = 3)
print(c)

5
  • 默认参数

    调用函数时,如果没有传递参数,则会使用默认参数。需要函数声明时指定默认值

def add(a = 5,b = 5):
	return a+b
c = add(b = 2,a = 3)
d = add()
print('c的值为',c)
print('d的值为',d)

c的值为 5
d的值为 10
  • 不定长参数(可变参数)
  1. 你可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数
  2. 和上述2种参数不同,声明时不会命名
  3. 加了星号(*)的变量名会存放所有未命名的变量参数。如果在函数调用时没有指定参数,它就是一个空元组
def add(a,b = 3,*mut):
    d = a+b*mut[0]
    return d
c = add(1,2,3,4,5,6,7,8)
print(c)

7
  • 关键字可变数量参数

    允许在调用函数时,传入任意个含参数名的参数

def user_info(name,age,**other):
    print(f'用户的名字为{name},年龄为{age},其他信息为{other}')
user_info('zhangsan',34,**{'phone':'1'})

用户的名字为zhangsan,年龄为34,其他信息为{'phone': '1'}

作用域

Pyhton 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的。

变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称。

两种最基本的变量:全局变量和局部变量。

m = 10			#全局变量
def muti():
    m = 5		#局部变量
    print('m的值为',m)
muti()
print('m的值为',m)

m的值为 5
m的值为 10

m = 10			#全局变量
def muti():
    global m	#引用全局变量
    m = 5
    print('m的值为',m)
muti()
print('m的值为',m)

m的值为 5
m的值为 5

Lambda函数

lambda关键词能创建小型匿名函数。lambda函数能接收任何数量的参数但只能返回一个表达式的值,它的一般形式如下:

lambda [arg1 [,arg2,.....argn]] : expression

例:
	func = lambda f : f.center(50,'*')
	print(func('这是lambda函数'))

	********************这是lambda函数********************

注意:
lambda定义的是单行函数,如果需要复杂的函数,应该定义普通函数
lambda参数列表可以包含多个参数,如 lambda x, y: x + y
lambda中的表达式不能含有命令,而且只限一条表达式

作用:
对于单行函数,使用lambda可以省去定义函数的过程,让代码更加精简。
在非多次调用的函数的情况下,lambda表达式即用既得,提高性能。

递归函数

在函数体内,可以调用其他函数;当一个函数在函数体内调用其本身时,这个函数就称为递归函数。

如求1到100各位数相加之和,我们可以用for循环实现累加,代码如下:
	def add_100():
		sum = 0
		for i in range(101):
			sum += i
		return sum
	Sum = add_100()
	print(Sum)

    5050

若用递归函数来实现,我们可以得到:
	def add_100(n):
		if n == 1:
			return 1
		return n + add_100(n-1)
	print(add_100(100))
	
	5050
	
注意:
递归函数的优点是定义简单,逻辑清晰;理论上,所有的递归函数都可以写成循环的方式。但是使用递归函数需要注意防止栈溢出。
在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。

当把上述实参改为1000时,就会导致栈溢出,报错提示递归超过最大深度
	RecursionError: maximum recursion depth exceeded in comparison
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值