函数参数如何传递
key-value方式传递参数:
下面是非常常见的传递方式,参数名写直白,写死了:
def show_info(name, title): print("姓名为:",name) print("职称为:",title)
我们在使用的时候可以用以下的方式:
- show_info('雷学委', '大学生Python学习社区长')
- show_info(name='雷学委', title='持续学习协会会长')
可以写成这样,使用两个*,这样非常灵活,但是缺点也是明显的(结构灵活有时候需要判断是否漏传,直接取容易出错)
- def show_info_v2(**kv_dict):
- print("姓名为:", kv_dict['name'])
- print("职称为:", kv_dict['title'])
- show_info_v2(name='雷学委', title='大学生Python学习社区长')
下面是效果,看起来一样的。
动态长度参数传递
通常使用*加参数名。
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- # @Time : 2021/10/24 11:39 下午
- # @Author : LeiXueWei
- # @CSDN/Juejin/Wechat: 雷学委
- # @XueWeiTag: CodingDemo
- # @File : func_call.py
- # @Project : hello
- def show_info(name, title):
- print("姓名为:", name)
- print("职称为:", title)
- show_info('雷学委', '大学生Python学习社区区长')
- show_info(name='雷学委', title='持续学习协会会长')
- def show_info_v2(name, title, *info):
- print("姓名为:", name)
- print("职称为:", title)
- print("其他评价:", info)
- show_info_v2('雷学委', '大学生Python学习社区区长', "热爱技术", "热爱生活")
运行效果如下:
参数是否会被函数攥改?
我们看看下面的程序即可:
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- # @Time : 2021/10/24 11:39 下午
- # @Author : LeiXueWei
- # @CSDN/Juejin/Wechat: 雷学委
- # @XueWeiTag: CodingDemo
- # @File : func_call.py
- # @Project : hello
- def compute_v1(list):
- sum = 0
- for x in list:
- sum += x
- list = list + [sum]
- print("新地址:", id(list))
- return sum
- def compute_v2(list):
- sum = 0
- for x in list:
- sum += x
- list[0] = list[0] * 100
- return sum
- _list = [1, 2, 3, 4, 5]
- print("调用计算函数v1之前:", _list)
- print("调用计算函数v1之前内存地址:", id(_list))
- print(compute_v1(_list))
- print("调用计算函数v1之后:", _list)
- print("调用计算函数v1之后内存地址:", id(_list))
- _list = [1, 2, 3, 4, 5]
- print("调用计算函数v2之前:", _list)
- print("调用计算函数v2之前内存地址:", id(_list))
- print(compute_v2(_list))
- print("调用计算函数v2之后:", _list)
- print("调用计算函数v2之后内存地址:", id(_list))
这里两个compute函数,一个修改参数引用地址,一个并没有修改参数引用而是修改了引用内存空间的关联地址(一个变量)的值。
可以说它们都成功了。但是外面的_list 的地址是任何时候都不会被修改的,除非赋值新地址(也就是在调用v2之前重新复制那次)
下面是运行结果:
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注服务器之家的更多内容!
原文链接:https://blog.csdn.net/geeklevin/article/details/121368864