函数的定义和调用
文章目录
函数的定义
def 函数名(参数1, 参数2, ...):
# 函数体
# 执行一系列操作
return 返回值
实例:计算两个数的和
def add_numbers(x, y):
result = x + y
return result
# 调用函数
sum_result = add_numbers(5, 3)
print(sum_result) # 输出 8
格式:
def 函数名(参数1, 参数2,参数3....): 函数体 return 返回值
在函数中可以不定义返回值,这样就会没有返回值(如果没有返回值,调用的时候直接调用就行,不用print)
函数调用的格式
格式:
函数名(参数1,参数2,参数3.....)
设定多少个参数,就要传递多少参数,除非参数设定了默认值
函数的调用顺序
函数要先定义然后才调用,
函数的参数
函数的参数传入时可以给出参考数据类型 格式: 变量:类型
在定义时传入的参数叫形参,只能在函数体内使用
位置参数要在不定长参数的前面,关键字参数要放在最后面
在调用的时候传入的参数就叫实参 被赋值的变量
形参
定义函数时使用的参数,没有具体数值,等待调用的时候传递值
形参和缺省参数的位置关系
先是正常的形参,然后才是缺省参数
有默认值的参数只能放到没有默认值的后面,
参数传值逻辑
传值逻辑如下:1.先给位置参数赋值 2.多余的未接收数据,被args打包为一个元组进行接收 3.缺省参数一般情况下不赋值,如果需要赋值,使用关键字参数赋值
# 在官方文档或者系统模块中,都是这种顺序书写的
实参
调用函数的时候传入的参数就是实参
实例
def sum1(a, b):
print(a + b)
sum1(a=1, 2)
位置参数
通过位置来传递参数只能一个一个的传递,不能跳过某个参数取传递
def eat(who, food): # 在定义时传入的参数叫做形参,只能在函数体内部使用
print(f'{who}吃{food}')
eat('猫', '🐟')
# 在传递参数的时候不传递具体谁的值为谁, 只通过位置为形参赋值
位置 不定长参数
*args
相当于直接把传入的参数打包为元组
调用*args就等于调用元组,所有元组可以进行的操作,这个都可以操作
可以传递多个参数,不限定数量,但是传入的数量不能少于函数内需要传入的参数
案例:查询输入的字符中最大的值
def max1(*args):
max_num = args[0] # 如果max_num = 0 这个时候我们所有值都没负的时候会判断出错
for i in args:
if i > max_num:
max_num = i
return max_num
print(max1(1, 4, 5, 3, 6, 12, 3))
print(max1(-1, 1, -5))
def add_numbers(*args):
total = 0
for num in args:
total += num
return total
result = add_numbers(1, 2, 3, 4, 5)
print(result) # 输出:15
位置不定长参数传入的值是一个元组,建议配合for循环或者索引使用
缺省参数
在定义函数的时候对参数定义了具体数值
如果不对其传递参数的话,在函数执行的时候会调用自身的默认参数
def sum1(b, a = 1):
print(a + b)
sun(2)
关键字参数
传入的时候使用了, 参数=赋值, 进行传递
def sum1(a, b):
print(a + b)
sum1(a = 1, b= 3)
# 使用关键字参数,不需要按照顺序赋值,只要参数名称正确即可
func(d=4, a=1, c=3, b=2)
使用参数==值的形式进行赋值的,就是关键字参数
在使用关键字参数的时候最好确定好参数名称
要注意不要给关键字参数重复赋值
关键字不定长参数
可以接受多个未定义的参数的关键字赋值
格式:
关键字不定长参数的格式:
def 函数名(**kwargs):
函数体
**kwargs 相当于对函数输出了不定量的关键字参数
def func(**kwargs):
print(**kwargs) # 相当于给print输入了多个关键字参数 print(a=1, b=2, c=3)
func(a=1, b=2, c=3
案例:
# 案例:
# 使用创建一个函数可以保存学员的全部信息,并将其储存到字典当中
def student_info(**kwargs):
print(f'学员信息为:{kwargs}')
student_info(name='xiaoming', age=18, gender='男')
函数的返回值
函数的返回值是给函数一个出口,让函数存在的意义增加,如果函数的最终的结果是打印某个数据就建议使用返回值
在调用的时候没有使用任何的返回值, 而且在没有设置返回值的时候打印函数,会返回空值
# 返回值只能是一个元素,如果要返回多个值只能通过容器类型进行打包
def compute(num1, num2, symbol):
if symbol == '+':
return num2 + num1
elif symbol == '-':
return num1 - num2
elif symbol == '*':
return num1 * num2
elif symbol == '/':
return num1 / num2
else:
print('输入错误')
print(compute(2, 3, '+'))
print(compute(2, 3, '*'))
如果在函数中有多个 return 但是指挥执行第一个, 剩余会报错
def function():
print('hello python')
return
return
# 同一分支中,在return之后的所有代码不会被执行
print('hello bigdata')
函数说明文档
在函数定义 时的第一行书写的一个多行注释
在函数的第一行输入三对引号,在中间书写内容
当你在调用函数的时候,鼠标悬停到函数名的上面是会自动提示函数说明文档上面的文字
以提供关于函数的说明和文档。 文档字符串是包含在函数定义内部的字符串,通常出现在函数的开头,并用来描述函数的用途、参数、返回值以及其他相关信息。
实例:
def compute(num1, num2, symbol):
"""
用于计算两个数的和差积商
:param num1: 第一个参与计算的数字
:param num2: 第二个参与计算的数字
:param symbol: 计算的符号(+ - * /)
:return: 两个数字运算的结果
"""
if symbol == '+':
return num2 + num1
elif symbol == '-':
return num1 - num2
elif symbol == '*':
return num1 * num2
elif symbol == '/':
return num1 / num2
else:
print('输入错误')
def add_numbers(x, y):
"""
这个函数接受两个参数 x 和 y,并返回它们的和。
参数:
x (int): 第一个加数
y (int): 第二个加数
返回值:
int: x 和 y 的和
"""
result = x + y
return result
要查看函数的文档字符串,可以使用内置的help函数和__doc__属性
# 使用 help() 函数查看文档字符串
help(add_numbers)
# 或者查看 __doc__ 属性
print(add_numbers.__doc__)
函数嵌套
在函数定义的时候,在函数内部嵌套了另一个函数的调用
# 函数的嵌套,就是在一个函数的内部嵌套了另一个函数的调用
def function2():
print('我是func2-----')
function1()
print('我是func2-----')
def function1():
print('func1执行开始')
print('func1执行结束')
function2()
执行顺序, 只要是在函数调用之前,定义了该函数就行
函数案例
def sum_three(num1, num2, num3):
"""求三个数的和"""
return num1 + num2 + num3
def average(num1,num2,num3):
"""求三个数的平均值"""
return sum_three(num1, num2, num3) / 3
print(average(1, 2, 3))
函数变量
局部变量(Local Variables):局部变量是在函数内部定义的变量,只能在函数内部访问。 它们在函数执行时创建,并在函数执行完毕后销毁。 局部变量的作用范围限定在函数的内部,函数之外无法访问它们。
全局变量(Global Variables):全局变量是在函数外部定义的变量,可以在整个程序中的任何地方访问,包括函数内部。 要在函数内部访
局部变量
在函数体内定义的变量,出了函数就会报错,除非使用其他函数将它转变为全局变量
# 在函数内部定义的变量可以直接在函数内调用
def sum1():
a = 1
b = 2
print(a + b)
sum1()
print(a)
print(b)
# 这个时候调用的变量就会直接报错
全局变量
在该py文件中可以随意调用都不会报错的变量叫全局变量
全局变量有两个定义标准,一个是直接在函数体外定义变量
还有一个是,在函数体内部定义一个变量,但是用 global函数给转换为全局变量
b = 10
# 这是全局变量
def liang():
a = 6
# 这是局部变量
print(a)
# 这样会直接报错,因为在函数体外并没有a这个变量
globa
请注意,修改全局变量时不需要使用 global
关键字。 但是,如果您想在函数内部重新分配全局变量的值,必须使用 global
关键字。 否则,Python将创建一个新的局部变量,而不是修改全局变量。
# 这是一个全局变量
global_variable = "I am a global variable"
def my_function():
# 使用 global 关键字声明变量为全局变量
global global_variable
print("Inside the function:", global_variable)
my_function() # 调用函数
print("Outside the function:", global_variable) # 在函数外部访问全局变量
改进
def liang():
a = 6
global a
# 这样可以直接将局部变量转换为全局变量
print(a)
# 这样就能在全局变量中查找到 a 这个变量
` 关键字。 否则,Python将创建一个新的局部变量,而不是修改全局变量。
# 这是一个全局变量
global_variable = "I am a global variable"
def my_function():
# 使用 global 关键字声明变量为全局变量
global global_variable
print("Inside the function:", global_variable)
my_function() # 调用函数
print("Outside the function:", global_variable) # 在函数外部访问全局变量
匿名函数
只能实现 只用一句话就能完成功能的函数,如果不能就只能使用正常函数
lambda
格式 lambda 形参列表:返回值
lambda arguments: expression
sum2 = Lambda num1,num2 = 2: num1 + num2
匿名函数中的形参列表的值最少必须有一个
匿名和普通函数的区别是没有函数名不能二次调用,但是可以用变量接受
接受匿名函数的返回值
"""
匿名函数的本质还是函数,除了定义方式和普通函数不同,其他的和普通函数一样。
语法:
函数名=Lambda形参列表:返回值
相当于:
def函数名(形参列表):
return返回值
"""
#案例:定义一个函数求两个数的和
sum2 Lambda num1 num2:num1 num2
实参高阶函数
参数是函数的函数就是实参高阶函数
只要求其中一个参数是函数,其他参数可以是正常的
被调用函数不传参
def func1(x):
x func2
x()
func2()
def func2():
pass
func1(func2
被调用函数接受参数
如果要对被调用的函数进行操作,例如乘除加减等操作,必须要求函数必须有返回值
传入匿名参数
常见实参高阶函数
实例
sorted
sc0res=[90,'89',68,34',99]
result sorted(scores,key=Lambda item:int(item))
print(result)
sort
students =
{'name':'张三','score':38},
{'name':'小明','score':99},
{'name':'李四','score':89},
{'name':'老王','score':70},
{'name':'小花','score':65}
]
students.sort(key=lambda item:item['score'],reverse=True)
print(students)
min
# 练习1:求nums中个位数最小的元素
nums = [78, 67, 92, 56, 71]
a = min(nums, key=lambda i: i % 10)
print(a)
max
# 练习3:求students中年龄最大的学生
students = [
{'name': '张三', 'score': 38, 'age': 18},
{'name': '小明', 'score': 99, 'age': 25},
{'name': '李四', 'score': 89, 'age': 19},
{'name': '老王', 'score': 70, 'age': 30},
{'name': '小花', 'score': 65, 'age': 26}
]
a = max(students, key=lambda i: i["age"])
print(a)
map 函数
map(函数, *容器) # 容器可以有无限个
nums=[19,45,1,90,67]
#案例1:创建一个新的容器,容器中的元素是Ums中的元素乘以10的结果
#[190,450,10,900,670]
result map(lambda item:
item 10
nums)
print(list(result))
#案例2:将nUms1和nUms2中的元素相加(相同位置上的元素相加)
nums1=[10,20,30,40,50]
nums2=[2,3,5,3,2]
result list(map(Lambda item1,item2:item1 item2,nums1,nums2))
print(result)
# 练习1:提取nums中所有元素的个位数
nums = [19, 108, 44, 37, 82, 91, 86]
a = list(map(lambda i: i % 10, nums))
# 练习2:将scores中分数转换成对应及格关系True或者False
scores = [90, 56, 89, 99, 45, 34, 87]
# [True, False, True, True, False, False, True]
aa = ["True" if i >= 60 else "Flase" for i in scores]
# 练习3:将scores中的分为转换成对应的通过关系
scores = [90, 56, 89, 99, 45, 34, 87]
# ['通过', '不通过', '通过', ....]
aaa = list(map(lambda i: True if i >= 60 else False, scores))
filter
删选出满足条件的元素
filter(函数, 容器)
reduce
reduce(函数, 容器, 初始值)
每次传值给函数是传入两个,
初始值:如果是求和计算 0
字符拼接: “ ”