IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> python学习笔记--参数传递 -> 正文阅读

[Python知识库]python学习笔记--参数传递

调用函数时,主调函数和被调用函数之间有数据传递关系,这就是有参数的函数形式。函数参数的作用是传递数据给函数使用,函数利用接受的数据进行具体的操作处理。

一、了解形式参数和实际参数

使用函数时,常会看到形式参数和实际参数,都被称作为参数。

1.通过作用理解

形式参数:在定义函数时,函数名后面括号中的参数为”形式参数“。

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

根据设计的参数的类型不同,可以分为两种情况:当实际参数为不可变对象时,进行的是值传递;当实际参数为可变对象时,进行的是引用传递。

值传递后,改变形式参数的值,实际参数不变(例如字符串);

引用传递后,改变形式参数的值,实际参数的值也一同改变(例如列表)。

2.通过一个比喻来理解形式参数和实际参数

函数定义是参数列表中的参数就是形式参数,而函数调用时传递进来的参数就是实际参数,就像剧本选主角一样,剧本的角色相当于形式参数,而演角色的演员就相当于实际参数。

例子:根据身高、体重计算BMI指数

def BMI(person,weight,height):
    '''
    功能:通过输入身高、体重来计算个人的BMI指数
    person:个人姓名
    height:个人身高(m
    weight:个人体重(kg
    '''
    #计算BMI数值
    BMI_num=weight/(height**2)
    print(person,'的体重为',str(weight),'kg','身高为',str(height),'m')
    print(person,'的BMI值为',BMI_num)
    #判断体重是否合理
    if BMI_num<18.5:
        print('您的体重过轻')
    if BMI_num>=18.5 and BMI_num<24.9:
        print('正常范围,注意保持')
    if BMI_num>=24.9 and BMI_num<29.9:
        print('您的体重过重')
    if BMI_num>=29.9:
        print('肥胖')

其中,person、height和weight称为形式参数,而在调用BMI()函数时,需要输入的数据都是实际参数,在调用时,这些值将被传递给相应的形式参数

二、位置参数

位置参数也称必备参数。必须按照正确的顺序将其传到其函数中,即调用时的数量和位置必须和定义时是一样的。

1.数量必须与定义时一致

在调用函数时,指定的实际参数的数量必须与形式参数的数量一致,否则将抛出typeerror异常,提示缺少必要的位置参数。

例如,上例中

BMI('zhi',50)

#***********************输出后************************#
Traceback (most recent call last):
  File "D:\Python\filepy\草稿.py", line 22, in <module>
    BMI('zhi',50)
TypeError: BMI() missing 1 required positional argument: 'height'

?少传递一个参数,就会报错“BMI()函数缺少一个必要的位置参数”

2.位置必须与定义时一致

在调用函数时,指定的实际参数的位置必须与形式参数一致,否则将产生

抛出TypeError的异常信息

BMI(50,'zhi')

#***********************输出后*********************#
Traceback (most recent call last):
  File "D:\Python\filepy\草稿.py", line 22, in <module>
    BMI(50,'zhi')
TypeError: BMI() missing 1 required positional argument: 'height'

或者产生的结果与预期不符,在调用函数时,尽管所传递的实际参数的位置与形式参数的位置不一致,但并不会出异常,因此这个Bug不容易被发现,要确定好位置。

在例子中就是体重(weigh)和身高(height)互换了,导致数据与预期不符

BMI('zhi',1.72,50)

三、关键字参数

关键字参数是指使用形式参数的名字来确定输入的参数值。通过该方式指定实际参数时,不再需要与实际参数的位置完全一致。这样可以避免用户需要牢记参数位置的麻烦,使得函数的调用和参数传递更加灵活方便。

上例中可以如下:

BMI(height='1.72',weight='50',person='zhi')   #计算zhi的BMI指数

这样虽然在指定实际参数时,顺序与定义函数时不一致,但是运行结果与预期是一致的。

四、为参数设置默认值

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

def functionname(...,[parameter1=defaultvalue1]):
    [functionbody]

参数说明如下:

functionname:函数名称,在调用函数时使用

parameter1=defaultvalue1:可选参数,用于指定像函数中传递的参数,并且为该参数设置默认值为defaultvalue1

functionbody:可选参数,用于指定函数体,即该函数被调用后,要执行的功能代码

在定义函数时,指定默认的形式参数必须在所有参数的最后,否则将产生语法错误

例子:修改后的上例

def BMI(weight,height,person='路人甲'):      #这里与上面的例子不同,最后一个person加入了默认值
    '''
    功能:通过输入身高、体重来计算个人的BMI指数
    person:个人姓名
    height:个人身高(m
    weight:个人体重(kg
    '''
    #计算BMI数值
    BMI_num=weight/(height**2)
    print(person,'的体重为',str(weight),'kg','身高为',str(height),'m')
    print(person,'的BMI值为',BMI_num)
    #判断体重是否合理
    if BMI_num<18.5:
        print('您的体重过轻')
    if BMI_num>=18.5 and BMI_num<24.9:
        print('正常范围,注意保持')
    if BMI_num>=24.9 and BMI_num<29.9:
        print('您的体重过重')
    if BMI_num>=29.9:
        print('肥胖')

然后调用BMI()函数,不指定person,如下:

BMI(50,1.72)                 #计算BMI指数

执行结果如下:

路人甲 的体重为 50 kg 身高为 1.72 m
路人甲 的BMI值为 16.901027582477017
您的体重过轻

在python中,可以使用“函数名.__defaults__”查看函数的默认值参数的当前值,其结果是一个元组。例如,显示上面定义的BMI()函数的默认值参数的当前值,可以使用“BMI.__default__”。

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

def demo(obj=[]):                  #定义函数并为参数obj指定默认值
    print('obj的值:',obj)
    obj.append(1)
#**********调用参数**********#
demo()
demo()
demo()

显示一下结果:

obj的值: []
obj的值: [1]
obj的值: [1, 1]

显然上述结果不是我们想要的,为了防止这种情况,最好使用None作为可变对象的默认值,此时还需要加上检查代码,如下:

def demo(obj=None):
    if obj==None:
        obj=[]
    print('obj的值:',obj)
    obj.append(1)
#**********调用参数**********#
demo()
demo()
demo()

显示一下结果:

obj的值: []
obj的值: []
obj的值: []

定义函数时,为形式参数设置默认值要牢记一点:默认参数必须指定不可变对象。

五、可变参数

在python中,还可以定义可变参数,可变参数也称不定长参数,即传入函数中的实际参数可以是零个、一个、两个到任意个。

定义可变参数时,主要有两种形式:一种*parameter:另一种是**parameter。下面分别进行介绍。

1.*parameter

我的理解:遍历中把我搞糊涂的点,1.如果是已经被定义整合好的元组和列表,遍历的时括号内的元素,已经被整合好的元组和列表就是其中的一个元素2.如果是直接写在括号里的字符串则是散的,会挨个遍历,而“*”的作用就是把已经成整合好的元组和列表拆解散。

*parameter形式表示接受任意多个实际参数并将其放到一个元组中。

如果想要使用一个已经存在的列表最为函数的可变参数,可以在列表的名称前加“*”。

例子:

def printcoffee(*coffeename):
    print('\n我喜欢的咖啡有:')
    for item in coffeename:
        print(item)
###################################################
#定义一个列表
lie_biao=['蓝山','卡布奇诺','土耳其']
printcoffee(lie_biao)
printcoffee(*lie_biao)
#定义一个元组
yvan_zu=('蓝山','卡布奇诺','土耳其')
printcoffee(yvan_zu)
printcoffee(*yvan_zu)
#直接输出
printcoffee('蓝山')
printcoffee('蓝山','卡布奇诺','土耳其')

无论元组还是列表要遍历都要加上“*”

def printcoffee(*coffeename):
    print('\n我喜欢的咖啡有:')
    for item in coffeename:
        print(item[0])
###################################################
#定义一个列表
lie_biao=['蓝山','卡布奇诺','土耳其']
printcoffee('蓝山','卡布奇诺','土耳其')
printcoffee(lie_biao)
printcoffee(*lie_biao)
printcoffee(tuple(lie_biao))



************************* 输出后 **************************
我喜欢的咖啡有:
蓝
卡
土

我喜欢的咖啡有:
蓝山

我喜欢的咖啡有:
蓝
卡
土

我喜欢的咖啡有:
蓝山

疑问:

01.?

例子:根据身高、体重计算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指数,公式为“体重/身高的平方”
            print("BMI指数:"+str(bmi))          # 输出BMI指数
            # 判断身材是否合理
            if bmi<18.5:
                print("您的体重过轻 ~@_@~")
            if bmi>=18.5 and bmi<24.9:
                print("正常范围,注意保持 (-_-)")
            if bmi>=24.9 and bmi<29.9:
                print("您的体重过重 ~@_@~")
            if bmi>=29.9:
                print("肥胖 ^@_@^")
#*****************************调用函数***********************************#
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)  # 调用函数指定可变参数

2.**parameter

**parameter形式表示接受任意多个类似关键字参数一样显显式赋值的实际参数,并将其放到一个字典中。例如,定义一个函数,让其可以接受任意多个显式赋值的实际参数,代码如下:

def printsign(**sign):
    print()
    for key,value in sign.items():               #遍历字典
        print('['+key+'] 的星座是:'+value)

调用两次printsign()函数,代码如下:

printsign(沂蒙='水瓶座',冷毅毅='射手座')

疑问:

01.为什么“沂蒙”和“冷毅毅”这个字符串不用加""???

执行结果如下:

[沂蒙] 的星座是:水瓶座
[冷毅毅] 的星座是:射手座

如果想要使用一个已经存在的字典作为函数的可变参数,可以在字典的名称前加“**”。例如:

def printsign(**sign):
    print()
    for key,value in sign.items():               #遍历字典
        print('['+key+'] 的星座是:'+value)

zi_dian={'沂蒙':'水瓶座', '冷毅毅':'射手座'}
printsign(**zi_dian)

调用了之后,显示一下结果:

[沂蒙] 的星座是:水瓶座
[冷毅毅] 的星座是:射手座

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-01-14 01:55:36  更:2022-01-14 01:57:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 3:22:49-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码