⑩ 函数

函数


1、函数的定义和使用


def 函数名(参数)# 形参
	代码1
    代码2
    .....
# 调用函数
函数名(参数)   # 实参

函数有实参和形参,必须先定义再调用

例子:

def add_num(a,b):
    result = a + b
    print(result)
# 调用函数传入真实数据 10 和 20,真实数据为实参。
add_num(10,20)   
————————————————————————————————————————————————————————————————————
# 输出结果
30

2、函数返回值


return的作用:

  • 负责函数返回值(需用变量接收)。
  • 退出当前函数 导致return下方的所有代码不执行

return返回多个值:

  • return a,b,返回多个数据时,默认是元组类型
  • return后面可以连接列表、元组或字典,以返回多个值。
def 函数名(参数)return 返回值

变量 = 函数名(参数)

例子:

def add_num1(a,b):
    return a + b

def add_num2(a,b):
    return a,b # 返回的是元组类型

c = add_num1(4,6)
d = add_num2(8,9)
print(c)
print(d)
————————————————————————————————————————————————————————————————————
# 输出结果
4
(8, 9)

3、函数的说明文档


函数文档 初级写法

def 函数名(参数):
    """ 说明文档位置 """
    执行的代码1
    ....

例子:

def sum_num(a,b):
    """ 求和函数 sum_num1 """
    return a + b

help(sum_num)
————————————————————————————————————————————————————————————————————
# 输出结果
Help on function sum_num in module __main__:

sum_num(a, b)
    求和函数 sum_num1
    
函数文档 高级写法

def 函数名(参数):
    """
    说明文档位置
    :param a: 参数1
    :param b: 参数2
    :return : 返回值  
    """
    执行的代码1
    .....
查看说明文档

help(函数名)
# 例子
help(add_num)

4、函数嵌套


所谓函数嵌套调用指的是一个函数里面又调用了另外一个函数。

体验函数嵌套实例

# 1、任意三个数之和
def sum_num(a,b,c):
    return a + b + c

# 2、求三个数的平均值
def average_num(a,b,c):
    sumresult = sum_num(a,b,c) # 调用前一个函数:嵌套
    return sumresult/3

result = average_num(10,20,30)
print(result)
————————————————————————————————————————————————————————————————————
# 输出结果
20.0

5、变量 作用域


局部变量

所谓局部变量是定义在函数体内部的变量,在函数外部访问则立即报错

def testA():
	a = 100
	print(a)

testA() # 100
print(a) # 报错:name 'a' is not defined

变量a是定义在testA函数内部变量,在函数外部访问则立刻报错。

**局部变量的作用:**在函数体内部临时存储数据,即当函数调用完成后,则销毁局部变量。

全局变量

所谓全局变量,指的是在函数体内、外都能生效的变量。

如果当有一个数据,在函数A和函数B都要使用,这时候使用全局变量最合适。

a = 100
def testA():
	print(f'函数A:{a}')

def testB():
	print(f'函数B:{a}')

testA()
testB()
————————————————————————————————————————————————————————————————————
# 输出结果
函数A:100
函数B:100

全局变量的修改

a = 100
def testA():
    a = 300 # 局部修改,不影响全局。
    print(f'函数A:{a}')

def testB():
    global a  # global 关键字声明a是全局变量
    a = 5
    print(f'函数B:{a}') 

testA()	# 函数A:300
print(a) # 100,并不会改变
testB()	# 函数B:5
print(a) # 5,使用global声明了全局变量,所以改变。
————————————————————————————————————————————————————————————————————
# 输出结果
函数A:300
100
函数B:5
5

6、函数的参数(进阶)


位置参数

位置参数:

  • 调用函数时根据函数定义的参数位置传递参数
  • 传递定义参数的顺序及个数必须一致,否则会报错。
# info(信息)
def user_info(name,age,gender):
    print(f'你的名字是{name},年龄是{age},性别是{gender}。')

user_info('zjh',15,'男')
————————————————————————————————————————————————————————————————————
# 输出结果
你的名字是zjh,年龄是15,性别是男

关键字参数

函数调用,通过“键 = 值”形式加以指定。可以让函数更加清晰,容易使用,同时也清除了参数的顺序需求。

  • 位置参数必须写在关键字参数前面。否者会报错。
def user_info(name,age,gender):
    print(f'你的名字是{name},年龄是{age},性别是{gender}')
    
# 调用函数传参
user_info('Rose', age=20, gender='女')
user_info('zjh', gender='男',age = 18)

# 位置参数必须写在关键字参数的前面 (下面是错误示范(报错))
user_info(age=20,gender='男','Tom')
user_info('zjh',age=18,'女')
————————————————————————————————————————————————————————————————————
# 输出结果
你的名字是Rose,年龄是20,性别是女
你的名字是zjh,年龄是18,性别是男

缺省参数(默认值)

缺省参数也叫默认参数,用于定义函数,为参数提供默认值,调用函数时可以不传入该默认参数的值

  • 注意:所有位置参数必须出现在默认参数前,包括函数定义使用
def user_info(name,age,gender='男')
	print(f'你的名字是{name},年龄是{age},性别是{gender}')

user_info('Rose',18,gender='女')
user_info('zjh',18)
————————————————————————————————————————————————————————————————————
# 输出结果
你的名字是Rose,年龄是18,性别是女
你的名字是zjh,年龄是18,性别是男

不定长参数(位置参数、关键字参数)

不定长参数指的就是不设定个数的参数。用于不确定调用的时候会传递多少个参数(不传递也可以)的场景。此时,可以用包裹位置参数,或者包裹关键字参数,来进行参数传递,会显得非常方便。

包裹 位置传递

  • 传进的所有参数都会被args变量收集,它会根据传进去参数的位置合并成一个元组(tuple)
  • *args 作为 不定长位置参数传递,返回一个元组
# *args 作为 不定长位置参数传递
def user_info(*args):
    print(args)

# 接收所有位置参数,返回一个元组
user_info('TOM')
user_info('TOM',20,'man')
user_info()
————————————————————————————————————————————————————————————————————
# 输出结果
('TOM',)
('TOM', 20, 'man')
()
包裹 关键字传递

  • 传进的所有关键字参数都会被kwargs变量收集,它会根据传进去关键字参数的位置合并成一个字典(dict)
  • **kwargs 作为 不定长关键字参数传递,返回一个字典
# **kwargs 作为 不定长关键字参数传递
def user_info(**kwargs):
    print(kwargs)
    
# 接收所有关键字参数,返回一个字典。
user_info()
user_info(name='Tom',age=19,id=110)
————————————————————————————————————————————————————————————————————
# 输出结果
{}
{'name': 'Tom', 'age': 19, 'id': 110}

注意:无论是包裹位置传递还是包裹关键字传递,都是一个组包的过程。

组包:收集所有传入数据(输入的零散数据),返回一个整体

7、拆包和交换变量值


元组 拆包

拆包: 将一个整体数据单独拆开。

def return_num():
	return 100,200

# 默认返回类型:元组
num = return_num()
print(num)

# 元组拆包
num1,num2 = return_num()
print(num1)
print(num2)
————————————————————————————————————————————————————————————————————
# 输出结果	
(100, 200)
100
200

字典 拆包

拆包: 将一个整体数据单独拆开。

  • 字典进行拆包,只能获取到key值,只能通过key值查找访问字典数据。
dict1 = {'name':'Tom','age':18}
a,b = dict1

# 字典进行拆包 取出来值是key
print(a) # name
print(b) # age

# 获取字典的数据
print(dict1[a])
print(dict1[b])
————————————————————————————————————————————————————————————————————
# 输出结果	
name
age
Tom
18

交换变量的值

a, b = 1, 2
a, b = b, a

print(a) # 2
print(b) # 1

8、函数递归 与 lambda表达式


递归

递归是一种编程思想,应用场景:

  • 日常开发中,如果要遍历一个文件夹下面所有的文件,通常会使用递归来实现;
  • 快速排序 使用递归

递归的特点:

  • 函数内部自己调用自己
  • 必须有出口
  • 返回值 返回函数上一次调用的地方(理解流程图

应用:3以内数字 累加和

# 需求:3以内数据累加和:3 + 2 + 1 = 6
def sum_number(num):
    # 出口
    if num == 1:
        return 1
    # 函数内部调用自己
    return num + sum_number(num-1)

a = sum_number(3)
print(a) # 6

流程图:

image-20221024093245399
lambda 表达式(匿名函数)

lambda的应用场景:

  • 如果一个函数有一个返回值,并且只有一句代码,可以使用lambda简化。

lambda 表达式语法:

lambda 参数列表 :表达式(或返回值)

注意点:

  • lambda 表达式的参数可有可无,函数的参数在lambda表达式中完全适用。
  • lambda 表达式能接收任何数量的参数,但只能返回一个表达式的值

实例对比:

实例1:无参数的写法

# 函数
def fn1():
    return 100

print(fn1)  # 内存地址
print(fn1()) # 返回值
--------------------------------------------------------------------
# lambda 是一个匿名函数
# lambda 参数列表:表达式
fn2 = lambda:100

print(fn2)	# lambda内存地址
print(fn2()) # 返回值
————————————————————————————————————————————————————————————————————
<function fn1 at 0x00000193CA4AE040>
100
<function <lambda> at 0x000001DC3C0DB940> 
100

实例2:有参数写法

# 设计 a + b函数
def add(a,b):
    return a + b

result = add(3,2)
print(result)
--------------------------------------------------------------------
# lambda 表达式简化
fn1 = lambda a,b:a+b

print(fn1(3,2))

lambda的参数形式:

  • 无参数
fn1 = lambda:100
print(fn1())
  • 一个参数
fn1 = lambda a:a
print(fn1('Hello World'))
  • 默认参数
# 位置参数必须在默认参数前
fn1 = lambda a,b,c=100:a+b+c
print(fn1(10,20)) # 130
  • 不定长位置参数:*agrs
fn1 = lambda *args:args
print(fn1(1,2,4))	# (1, 2, 4)
print(fn1(10))	# (10,)

*args 作为 不定长位置参数传递,返回值是一个元组

  • 不定长位置参数:**kwargs
fn1 = lambda **kwargs:kwargs
print(fn1(name='python',age=20))

**kwargs 作为 不定长关键字参数传递,返回一个字典

lambda的应用:

  • 判断的lambda
# lambda 两个数字比大小,谁大返回谁
fn1 = lambda a,b:a if a>b else b
fn1(1000,500)   # 1000

  • 列表数据按字典key的值排序
student = [
    {'name':'TOM','age':20},
    {'name':'ROSE','age':19},
    {'name':'Jack','age':22}
]
# sort(key=None,reverse=False)
# 1、name key对于的值进行 升序排序
student.sort(key=lambda x:x['name'])
print(student)
student.sort(key=lambda x:x['name'],reverse=True)
print(student)
student.sort(key=lambda x:x['age'])
————————————————————————————————————————————————————————————————————
[{'name': 'Jack', 'age': 22}, {'name': 'ROSE', 'age': 19}, {'name': 'TOM', 'age': 20}]
[{'name': 'TOM', 'age': 20}, {'name': 'ROSE', 'age': 19}, {'name': 'Jack', 'age': 22}]
[{'name': 'ROSE', 'age': 19}, {'name': 'TOM', 'age': 20}, {'name': 'Jack', 'age': 22}]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值