函数的定义和调用

函数的定义和调用

函数的定义

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

​ 字符拼接: “ ”

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值