当前位置: 首页 > news >正文

Python函数(十二):函数的创建和调用、参数传递、返回值

前言:在编程的世界里,函数是一种基本的构建块,它允许我们将代码封装成可重复使用的单元。在Python中,函数的使用尤为重要,因为它不仅有助于代码的模块化,还提高了代码的可读性和可维护性。本章节,我们将深入探讨Python函数的创建和调用、参数传递以及返回值这三个核心概念。

函数的创建和调用:

函数的创建,也就是定义一个函数,涉及到指定函数名、定义参数以及编写函数体。这个过程就像是在告诉Python,“嘿,当有人叫我的时候,按照这些步骤来执行”。函数的调用则是触发这个预定义行为的过程,它允许我们利用函数封装的代码来执行特定的任务。

参数传递:

参数传递是函数使用中的一个关键特性,它允许我们将数据传递给函数。这些数据,也就是参数,可以是数字、字符串、列表,甚至是其他函数。通过参数传递,我们可以定制函数的行为,使其能够处理不同的输入,从而更加灵活和强大。

返回值:

返回值是函数执行完毕后提供的结果。通过返回值,函数可以将处理后的数据传递回给调用者。这不仅使得函数可以执行计算和数据处理的任务,还可以作为程序流程控制的一部分,根据返回值来决定后续的操作。

在接下来的内容中,我们将通过具体的代码示例来详细解释这些概念,并展示如何在实际编程中应用它们。通过学习这些基础知识,你将能够更好地理解和使用Python函数,从而编写出更加高效和优雅的代码。让我们开始吧!

一、函数的创建和调用

函数是执行特定任务的代码块。在Python中,我们使用def关键字来定义一个函数。

1、创建函数

理解函数的基本概念:

  • 函数是一段可重用的代码,用于执行特定任务。
  • 函数可以带有参数,这些参数是函数执行时需要的输入。
  • 函数可以返回值,这是函数执行后的结果。

定义一个函数的基本语法如下:

def function_name(parameters):# 函数体
  • function_name 是你为函数选择的名字。
  • parameters 是函数的参数,用于接收传递给函数的数据。

注意:即使参数没有参数,也必须保留一对空的“()”,否则语法不对会报错。

2、调用函数

一旦函数被定义,你可以通过函数名后跟括号来调用它,如果函数需要参数,则在括号内传递相应的参数。

function_name(arguments)
  • function_name函数名称,要调用的函数名称必须是已经创建好的。
  • arguments 可选参数,用于指定各个参数的值。如果需要传递多个参数值,则各参数值间使用逗号分隔。

示例

def greet(name):print(f"Hello, {name}!")
greet("Alice")  # 输出: Hello, Alice!

实例训练46 -输出每日一贴(共享版)

def function_tips():'''功能:每天输出一条励志文字'''import datetime#定义一个列表mot = ["今天星期一: \n坚持下去不是因为我很坚强,而是因为我别无选择","今天星期二: \n含泪播种的人一定能笑着收获","今天星期三: \n做对的事情比把事情做对重要","今天星期四: \n命运给予我们的不是失望之酒,而是希望之杯","今天星期五: \n不要等到明天,明天太遥远,今天就行动","今天星期六: \n求知若饥,虚心若愚","今天星期日: \n成功将属于那些从不说”不可能“的人"]day = datetime.datetime.now().weekday()  #获取当前日期print(mot[day])  #输出每日一贴#***************************调用函数***************************#
function_tips()

二、参数传递

参数传递是函数使用中的一个重要概念,它允许函数接收外部数据。

1、形式参数与实际参数

  • 形式参数:在定义函数时,函数后面括号中的参数为“形式参数”。
  • 实际参数:在调用一个参数时,函数名后面括号中的参数为“实际参数”,也就是将函数的调用者提供给函数的参数为实际参数。

示例

#定义函数
def demo(obj):print("原值: ",obj)obj += obj
# 调用函数
print("=========値传递========")
mot = "唯有在被追赶的时候,你才能真正地奔跑。"
print("函数调用前: ",mot)
demo(mot)                         #采用不可变对象————字符串
print("函数调用后: ",mot)
print("=========引|用传递========")
list1 = ['绮梦','冷伊一','香凝','黛兰']
print("函数调用前: ",list1)
demo(list1)                       #采用可变对象--列表   
print("函数调用后: ",list1)

实例训练47 -根据身高、体重计算BMI指数(共享版)

def fun_bmi(person, height, weight):'''功能:根据身高和体重计算BMI指数person:姓名height:身高,单位:米weight:体重,单位:千克'''print(person + "的身高: " + str(height) + "米 \t 体重: " + str(weight) + "千克")bmi = weight / (height * height)  # 用于计算BMI指数,公式为:BMI=体重/身高的平方print(person + "的BMI指数为: " + str(bmi))  # 输出BMI指数# 判断身材是否合理if bmi < 18.5:print("您的体重过轻 ~@_@~\n")elif bmi >= 18.5 and bmi < 24.9:print("正常范围,注意保持 (-_-)\n")elif bmi >= 24.9 and bmi < 29.9:print("您的体重过重 ~@ @~\n")elif bmi >= 29.9:print("肥胖 ^@_@^\n")# *************************调用函数************************* #
fun_bmi("路人甲", 1.83, 60)  # 计算路人甲的BMI指数
fun_bmi("路人乙", 1.60, 50)  # 计算路人乙的BMI指数

2、位置参数

位置参数依赖于参数的顺序。调用函数时,实际参数的位置必须与定义函数时的形式参数顺序相匹配。

① 数量必须与定义时一致

在调用函数时,指定的实际参数的数量必须与形式参数的数量一致,否则会报错。如:

② 位置必须与定义时一致

在调用函数时,指定的实际参数的位置必须与形式参数的位置一致,否则会报错。如:

示例

def add(a, b):return a + bresult = add(5, 3)  # result 为 8

3、关键字参数

关键字参数通过参数名传递,提高了代码的可读性。

示例

def greet(name, job):print(f"Hello, {name}. You are a {job}.")greet(name="Alice", job="Engineer")  # 输出: Hello, Alice. You are a Engineer.

4、为参数设置默认值

调用函数时,如果没有指定某个参数将抛出异常。为了解决这个问题,我们可以为参数设置默认值,即在定义函数时,直接指定形式参数的默认值。这样,当没有传入参数时,则直接使用定义函数时设置的默认值。定义带有默认值参数的函数语法格式如下:

def functionname(...,[parameter1 = defaultvalue1]):[functionbody]
  • functionname:函数名称,在调用函数时使用。
  • parameter1 = defaultvalue1:可选参数,用于指定向函数中传递的参数,并且为该参数设置默认值为defaultvalue1。
  • functionbody:可选参数,用于指定函数体,即函数被调用后,要执行的功能代码。
    示例
def fun_bmi(height, weight, person = "路人"):'''功能:根据身高和体重计算BMI指数person:姓名height:身高,单位:米weight:体重,单位:千克'''print(person + "的身高: " + str(height) + "米 \t 体重: " + str(weight) + "千克")bmi = weight / (height * height)  # 用于计算BMI指数,公式为:BMI=体重/身高的平方print(person + "的BMI指数为: " + str(bmi))  # 输出BMI指数# 判断身材是否合理if bmi < 18.5:print("您的体重过轻 ~@_@~\n")elif bmi >= 18.5 and bmi < 24.9:print("正常范围,注意保持 (-_-)\n")elif bmi >= 24.9 and bmi < 29.9:print("您的体重过重 ~@ @~\n")elif bmi >= 29.9:print("肥胖 ^@_@^\n")
fun_bmi(1.73,62)

延申知识点①:

在Python中,每个函数对象都有一个 __defaults__ 属性,它是一个元组,包含了函数定义时给出的默认值参数。这个属性可以用来查看函数的默认参数值。对于您的 fun_bmi 函数,您可以使用以下代码来查看默认值:

print(fun_bmi.__defaults__)

这将输出:

('路人',)  # 表示person参数的默认值为"路人"

延申知识点②:

如果使用可变对象作为函数参数的默认值时,多次调用可能会导致意料之外的情况:

def demo(obj=[]):print("obj的值: ",obj)obj.append(1)
demo()
demo()

以下是对这段 Python 代码的详细解释:

函数定义

def demo(obj=[]):print("obj的值: ", obj)obj.append(1)
  • def demo(obj=[]):定义了一个名为 demo 的函数,它有一个参数 obj,这个参数的默认值是一个空列表 []。在 Python 中,当使用默认参数时,如果该参数是可变对象(例如列表、字典、集合等),并且在函数内部对该参数进行了修改操作,会产生一些意想不到的结果,因为默认参数在函数定义时就已经创建,并且在后续的函数调用中会持续使用这个创建好的对象,而不是每次调用函数时重新创建。
  • print("obj的值: ", obj):在函数内部,首先打印出 obj 的当前值。
  • obj.append(1):对 obj 列表进行修改操作,向列表中添加元素 1

函数调用

demo()
  • 第一次调用 demo() 函数:
    • 由于没有传递参数,使用 obj 的默认值,也就是一个空列表。
    • 首先打印 obj 的值,此时 obj 的值是 []
    • 然后执行 obj.append(1),将元素 1 添加到 obj 列表中,此时 obj 列表变为 [1]
demo()
  • 第二次调用 demo() 函数:
    • 仍然没有传递参数,使用 obj 的默认值。但是,由于默认参数 obj 在函数定义时就已经创建了一个列表,而且这个列表在第一次调用时已经被修改为 [1],所以这个列表不会重新初始化为空列表。
    • 首先打印 obj 的值,此时 obj 的值是 [1](因为第一次调用时添加了元素 1)。
    • 然后执行 obj.append(1),将元素 1 再次添加到 obj 列表中,此时 obj 列表变为 [1, 1]

总结
这段代码的主要问题在于使用了可变对象作为函数的默认参数。在 Python 中,函数的默认参数在函数定义时只创建一次,而不是每次调用函数时都创建。所以,如果使用可变对象作为默认参数,并且在函数内部修改了这个对象,那么后续调用函数时,该对象会保留之前修改的状态。如果想要避免这种情况,可以这样修改函数:

def demo(obj=None):if obj is None:obj = []print("obj的值: ", obj)obj.append(1)
demo(obj=None)
demo(obj=None)

这样,每次调用函数时,如果没有传递参数,都会重新创建一个新的空列表作为 obj 的值,而不会受到之前调用的影响。

总之,在使用函数的默认参数时,对于可变对象要格外小心,避免因为默认参数的特性而导致函数的行为不符合预期。

5、可变参数

  • *args:允许你传递任意数量的位置参数。
  • **kwargs:允许你传递任意数量的关键字参数。

在Python中,可变参数允许函数接受任意数量的参数。这包括两种类型:*args(用于接收任意数量的位置参数)和**kwargs(用于接收任意数量的关键字参数)。下面我将分别解释这两种可变参数的使用和区别。

*args:接收任意数量的位置参数

*args 允许你将一个不定数量的位置参数传递给函数,这些参数在函数内部被存储在一个元组中。使用 *args 时,你可以在函数定义中包含其他位置参数,但 *args 必须放在所有位置参数的后面。

示例:

def example(*args):for arg in args:print(arg)example(1, 2, 3)  # 输出:1 2 3
example('a', 'b', 'c')  # 输出:a b c

在这个例子中,example 函数可以接受任意数量的位置参数,并将它们打印出来。

实例训练48 -根据身高、体重计算BMI指数(共享升级版)

def fun_bmi_upgrade(*person):'''功能:根据身高和体重计算BMI指数*person:可变参数,该参数中需要传递3个元素的列表。分别为姓名、身高(单位:米)和体重(单位:千克)'''for list_person in person:for item in list_person:person = item[0]           # 姓名height = item[1]           # 身高(单位:米)weight = item[2]           # 体重(单位:千克)print("\n" + "="*13,person,"="*13)print("身高: " + str(height) + "米 \t 体重: " + str(weight) + "千克")bmi = weight / (height * height)                     # 用于计算BMI指数,公式为:BMI=体重/身高的平方print("的BMI指数为: " + str(bmi))                     # 输出BMI指数# 判断身材是否合理if bmi < 18.5:print("您的体重过轻 ~@_@~\n")elif bmi >= 18.5 and bmi < 24.9:print("正常范围,注意保持 (-_-)\n")elif bmi >= 24.9 and bmi < 29.9:print("您的体重过重 ~@ @~\n")elif bmi >= 29.9:print("肥胖 ^@_@^\n")# *************************调用函数************************* #
list_w = [('绮梦',1.70,65),('零语',1.78,50),('黛兰',1.72,66)]
list_m = [('悻轩',1.80,75),('冷少',1.75,70)]
fun_bmi_upgrade(list_w ,list_m)  # 调用函数指定可变参数

注意事项

写到这里其实可以发现有个问题就是for里嵌套了个内循环,这一点是可以优化的:
以上代码将内循环一段除掉了改成:

    for list_person in person:name = list_person[0]  # 姓名height = list_person[1]  # 身高(单位:米)weight = list_person[2]  # 体重(单位:千克)

语法纠正:

修改原因

  • 原代码中的内循环 for item in list_person: 是多余的。当调用函数 fun_bmi_upgrade(list_w, list_m) 时,list_wlist_m 是列表,其中的元素是元组,例如 list_w = [('绮梦',1.70,65),('零语',1.78,50),('黛兰',1.72,66)] 。在 for list_person in person: 循环中,list_person 会遍历这些元组,例如 ('绮梦',1.70,65) 。如果不修改,使用原代码的内循环 for item in list_person: 会导致以下问题:

    • item 会依次为 '绮梦'1.7065 ,它们是元组 ('绮梦',1.70,65) 的各个元素。
    • 然后使用 person = item[0]height = item[1]weight = item[2] 去访问这些元素的元素,这是错误的,因为 item 已经是元组的元素,而不是包含姓名、身高、体重的列表或元组。
    • 对于字符串 '绮梦' 来说,它没有 [1][2] 索引,对于数字 1.7065 来说,它们也没有 [0][1][2] 索引,会导致 IndexError 或逻辑错误。
  • 修改为 name = list_person[0]height = list_person[1]weight = list_person[2] 的原因:

    • list_person 本身就是存储个人信息的元组,例如 ('绮梦',1.70,65)
    • list_person[0] 可以直接提取出姓名,list_person[1] 可以直接提取出身高,list_person[2] 可以直接提取出体重。这样的代码更简洁,逻辑更清晰,避免了多余的循环和错误的索引访问。
    • 这种方式准确地从存储人员信息的元组中提取出所需的信息,符合函数的预期输入,即 *person 是包含三个元素(姓名、身高、体重)的列表或元组,并且在后续的计算和判断中能够正确使用这些信息。

代码解释

  • def fun_bmi_upgrade(*person)::定义了一个名为 fun_bmi_upgrade 的函数,使用 *person 作为可变参数,可以接收多个参数,这些参数会被存储在 person 元组中。
  • for list_person in person::遍历 person 元组,其中 list_person 是存储个人信息的元组,如 ('绮梦',1.70,65)
  • name = list_person[0]:从元组中提取姓名。
  • height = list_person[1]:从元组中提取身高。
  • weight = list_person[2]:从元组中提取体重。
  • bmi = weight / (height * height):根据公式计算 BMI 指数。
  • 一系列 if-elif 语句:根据计算得到的 BMI 指数判断体重状态并输出相应信息。

调用部分

  • list_wlist_m 是存储人员信息的列表,每个元素是一个元组,包含姓名、身高和体重。
  • fun_bmi_upgrade(list_w, list_m):调用函数并将存储人员信息的列表作为参数传入。

    通过这种修改,代码能够更清晰地提取元组中的信息,避免了多余的循环和潜在的错误,使代码更简洁、准确地完成计算 BMI 指数和给出体重状态判断的功能。

**kwargs:接收任意数量的关键字参数

**kwargs 允许你将一个不定数量的关键字参数传递给函数,这些参数在函数内部被存储在一个字典中。使用 **kwargs 时,你可以在函数定义中包含其他关键字参数,但 **kwargs 必须放在所有关键字参数的后面。

示例:

def example(**kwargs):for key, value in kwargs.items():print(f"{key}: {value}")example(name="Alice", age=25)  # 输出:name: Alice age: 25
example(country="Wonderland", book="Alice's Adventures in Wonderland")  # 输出:country: Wonderland book: Alice's Adventures in Wonderland

在这个例子中,example 函数可以接受任意数量的关键字参数,并将它们打印出来。

以下是一个使用生辰八字作为示例,结合 **kwargs 语法的 Python 代码:

def analyze_birth_chart(**kwargs):"""此函数接收任意数量的关键字参数,其中关键字为生辰八字的部分,值为相应的信息函数将打印出每个生辰八字部分及其相关信息"""for part, info in kwargs.items():print(f"生辰八字部分: {part}")print(f"信息: {info}\n")# 调用函数并传递不同生辰八字部分的信息
analyze_birth_chart(年柱="代表祖先和幼年时期,对人一生的根基和起点有重要影响,其五行属性影响一个人的基本性格和命运走势。",月柱="反映一个人的青年时期运势,与家庭、父母的关系密切,其地支所藏人元会影响人的情绪和气质。",日柱="代表自己和中年时期,是生辰八字的核心,决定了一个人的主要性格和命运特征,被称为日主。",时柱="体现一个人的晚年运势,与子女后代有关,也会影响一个人最终的归宿和晚年生活状态。"
)

代码解释

  • def analyze_birth_chart(**kwargs)::定义了一个名为 analyze_birth_chart 的函数,使用 **kwargs 作为参数,允许接收任意数量的关键字参数。
  • for part, info in kwargs.items()::使用 kwargs.items() 方法获取 kwargs 字典中的键值对。part 存储关键字(生辰八字部分),info 存储相应的值(信息)。
  • print(f"生辰八字部分: {part}")print(f"信息: {info}\n"):使用 f-string 格式化字符串将生辰八字部分及其信息打印出来,并添加一个换行符以提高可读性。

调用部分

  • 在调用 analyze_birth_chart 函数时,我们传递了多个关键字参数,每个关键字是生辰八字的一部分,相应的值是该部分的描述。这些关键字参数将被自动存储在 kwargs 字典中。

使用场景

  • *args:当你需要传递一个不确定数量的位置参数时,比如在函数需要接受多个值但具体数量未知的情况下。
  • **kwargs:当你需要传递一个不确定数量的命名参数时,比如在函数需要接受多个命名参数但具体哪些参数未知的情况下。

注意事项

  • *args**kwargs 只能出现在函数参数列表的最后。
  • 你可以在同一个函数中同时使用 *args**kwargs,但 *args 必须在 **kwargs 之前。
  • 使用 *args**kwargs 可以让你的函数更加灵活,但过度使用可能会导致代码难以理解和维护。

通过使用这些可变参数,你可以编写出更加通用和灵活的函数,以适应不同的调用场景。

三、返回值

函数可以通过return语句返回一个值给调用者。如果函数没有return语句,则默认返回None。格式:
return [value]
参数说明:value可选参数,用于指定要返回的值,可以返回一个值,也可以返回多个值。

示例

def add_numbers(a, b):return a + bresult = add_numbers(3, 4)  # result 现在是 7

实例训练49 -模拟结账功能-计算实付金额

def fun_checkout(money):'''功能:计算商品合计金额并进行折扣处理money:保存商品金额的列表返回商品的合计金额和折扣后的金额'''money_old = sum(money)           #计算合计金额money_new = money_oldif 500 <= money_old < 1000:      #满500可享受9折优惠money_new = '{:.2f}'.format(money_old * 0.9)elif 1000 <= money_old <= 2000:  #满1000可享受8折优惠money_new = '{:.2f}'.format(money_old * 0.8)elif 2000 <= money_old <= 3000:  #满2000可享受7折优惠money_new = '{:.2f}'.format(money_old * 0.7)elif money_old >= 3000:          #满3000可享受7折优惠money_new = '{:.2f}'.format(money_old * 0.6)return money_old, money_new      #返回总金额和折扣后的金额
# **********************调用函数********************** #
print("\n开始结算......\n")
list_money = []                  #定义保存商品金额的列表
while True:# 请不要输入非法的金额,否则将抛出异常inmoney = float(input("输入商品金额 (输入0表示输入完毕): "))if int(inmoney) == 0:break                    #退出循环else:list_money.append(inmoney)   #将金额添加到金额列表中
money = fun_checkout(list_money)     #调用函数
print("合计金额: ",money[0], "应付金额: ", money[1])   #显示应付金额

总结

通过本文,我们了解了如何在Python中创建和调用函数,以及如何通过不同的方式传递参数和从函数中返回值。掌握这些基础知识,将帮助你编写更加模块化和可重用的代码。

相关文章:

Python函数(十二):函数的创建和调用、参数传递、返回值

前言&#xff1a;在编程的世界里&#xff0c;函数是一种基本的构建块&#xff0c;它允许我们将代码封装成可重复使用的单元。在Python中&#xff0c;函数的使用尤为重要&#xff0c;因为它不仅有助于代码的模块化&#xff0c;还提高了代码的可读性和可维护性。本章节&#xff0…...

掌握Docker命令与Dockerfile实战技巧:快速构建高效容器化应用

1. 介绍 Docker 是现代开发和运维的必备工具&#xff0c;集成了容器技术的优势。本文将记录 Docker 的常用指令&#xff0c;并会随着使用经验的积累进行不定期更新。 2. 常用命令 2.1 启动容器&#xff08;前台交互模式&#xff09; docker run --privileged --volume /hom…...

Virtualbox硬盘扩容

前言 有没有使用虚拟机安装操作系统的时候&#xff0c;虚拟硬盘一开始分配的虚拟硬盘空间不够用&#xff1f;在后期去扩容的伙伴们&#xff0c;下面我看看如何扩容virtualbox的虚拟硬盘&#xff1f; 重新分配虚拟硬盘大小 在virtualbox菜单选择【管理】-【工具】-【虚拟介质…...

10G光纤反射内存卡

在科技日新月异的今天&#xff0c;数据存储技术正以前所未有的速度发展&#xff0c;其中&#xff0c;“10G光纤反射内存卡”作为新一代存储技术的佼佼者&#xff0c;正逐步引领着数据存储领域的新风尚。本文将深入探讨这一创新产品的技术原理、性能优势、应用场景以及未来展望&…...

信创数据防泄漏中信创沙箱是什么样的安全方案

在信息化与工业化融合创新&#xff08;信创&#xff09;的快速发展中&#xff0c;企业面临着日益复杂的数据安全挑战。SDC沙盒技术以其独特的安全机制和先进的设计理念&#xff0c;为信创环境提供了强有力的数据保护支持。以下是SDC沙盒在信创领域支持能力的几个关键侧重点&…...

虚幻引擎结构之TArray

1.TArray 简介 TArray 是虚幻引擎提供的一个动态数组容器&#xff0c;用于存储相同类型的元素集合。它是一个模板类&#xff0c;能够容纳任意类型的数据&#xff0c;为用户提供了一套简便的方法来添加、删除、访问和操作数组中的元素。作为虚幻引擎的核心数据结构之一&#xff…...

【搭建一个网上商城系统】

搭建一个网上商城系统是一个复杂但有序的过程&#xff0c;涉及多个关键步骤。以下是一些主要的步骤&#xff1a; 确定运营模式 选择适合的模式&#xff1a;根据企业的规模、业务形态和目标市场&#xff0c;选择合适的电商平台运营模式&#xff0c;如B2C&#xff08;商对客&am…...

【gopher的java学习笔记】Spring Boot Starter初探

转到java这边后&#xff0c;这天需要搭一个java的web service出来&#xff0c;如果是以前golang的话&#xff0c;那我就可以非常熟练的用gin搭建一个web service出来&#xff0c;核心逻辑就是写好一些rest接口实现后再加上最为灵魂的一句&#xff1a; // 启动Gin服务器在8080端…...

web服务器之云主机、物理机租用、服务器托管的区别

云主机、物理机租用和服务器托管是三种不同的Web服务器部署方式&#xff0c;它们各有特点&#xff0c;适用于不同需求的用户。以下是这三种服务的区别&#xff1a; 云主机&#xff08;Cloud Hosting&#xff09;&#xff1a; 资源分配&#xff1a;基于虚拟化技术&#xff0c;多…...

centos制作离线安装包

目录 1.yumdownloader与repotrack怎么选择&#xff1f; yumdownloader --resolve repotrack 总结 2.环境准备 3.安装 1.yumdownloader与repotrack怎么选择&#xff1f; yumdownloader --resolve 和 repotrack 都是与 YUM&#xff08;Yellowdog Updater Modified&#xf…...

论文解读——掌纹生成网络 RPG-Palm升级版PCE-Palm

该文章是2023年论文RPG-Palm的升级版 论文&#xff1a;PCE-Palm: Palm Crease Energy Based Two-Stage Realistic Pseudo-Palmprint Generation 作者&#xff1a;Jin, Jianlong and Shen, Lei and Zhang, Ruixin and Zhao, Chenglong and Jin, Ge and Zhang, Jingyun and Ding,…...

Android修行手册 - 移动端几种常用动画方案对比

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…...

16 循环语句——for循环

#字符串是可以进行迭代的 for 循环: for 变量 in 可迭代的东西: 代码 把可迭代的东西中的每一项内容拿出来&#xff0c;挨个的赋值给变量&#xff0c;每一次的赋值都要执行一次循环体(代码) s "你好呀&#xff0c;我叫赛利…...

代码随想录-笔记-其八

让我们开始&#xff1a;动态规划&#xff01; 70. 爬楼梯 - 力扣&#xff08;LeetCode&#xff09; 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; class Solution { public:int climbStairs(i…...

Effective C++ 条款 15:在资源管理类中提供对原始资源的访问

文章目录 条款 15&#xff1a;在资源管理类中提供对原始资源的访问核心思想原始资源的访问方式标准库中的实现示例设计建议总结 条款 15&#xff1a;在资源管理类中提供对原始资源的访问 核心思想 为什么需要访问原始资源&#xff1f; 在使用 RAII&#xff08;Resource Acquis…...

Linux高并发服务器开发 第五天(压缩解压缩/vim编辑器/查找替换/分屏操作/vim的配置)

目录 1.压缩和解压缩 1.1压缩 1.2解压缩 2.vim编辑器 2.1vim的3种工作模式 2.2切换编辑模式 2.3保存和退出 2.4光标移动 2.5复制粘贴 2.6剪切、删除 2.7查找 替换 2.7.1查找 2.7.2替换 3.分屏操作 3.1快速翻屏 3.2分屏 4.vim的配置 4.1系统配置 4.2用户配置…...

C++ 面向对象编程:关系运算符重载、函数调用运算符重载

对 、<、> 三个运算符分别进行重载&#xff0c;可见以下代码&#xff1a; #include<iostream> using namespace std;class location { public:location(int x1, int y1) :x(x1), y(y1){};bool operator(const location& l1) const{return x l1.x && …...

拉普拉斯分布极大似然估计

在拉普拉斯分布中&#xff0c;概率密度函数 (PDF) 表示为&#xff1a; f ( x ∣ μ , b ) 1 2 b exp ⁡ ( − ∣ x − μ ∣ b ) , f(x | \mu, b) \frac{1}{2b} \exp\left(-\frac{|x - \mu|}{b}\right), f(x∣μ,b)2b1​exp(−b∣x−μ∣​), 其中 μ \mu μ 是位置参数&…...

VLMs之Gemma 2:PaliGemma 2的简介、安装和使用方法、案例应用之详细攻略

VLMs之Gemma 2&#xff1a;PaliGemma 2的简介、安装和使用方法、案例应用之详细攻略 导读&#xff1a;2024年12月4日&#xff0c;PaliGemma 2是一个基于Gemma 2系列语言模型的开源视觉语言模型 (VLM) 家族。PaliGemma 2 通过提供一个规模化、多功能且开源的VLM家族&#xff0c;…...

qwenvl 代码中的attention pool 注意力池如何理解,attention pool注意力池是什么?

qwenvl 中的attention pool如何理解&#xff0c;其实这就是一个概念的问题 看qwenvl的huggingface的代码的时候&#xff0c;发现代码里有一个Resampler 以及attn_pool&#xff0c;这和之前理解的连接池 线程池 表示资源复用的意思不太一样&#xff0c;查了一下&#xff1a; 注…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要&#xff1a; 近期&#xff0c;在使用较新版本的OpenSSH客户端连接老旧SSH服务器时&#xff0c;会遇到 "no matching key exchange method found"​, "n…...

站群服务器的应用场景都有哪些?

站群服务器主要是为了多个网站的托管和管理所设计的&#xff0c;可以通过集中管理和高效资源的分配&#xff0c;来支持多个独立的网站同时运行&#xff0c;让每一个网站都可以分配到独立的IP地址&#xff0c;避免出现IP关联的风险&#xff0c;用户还可以通过控制面板进行管理功…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...