详解Python传入参数的几种方法


Posted in Python onMay 16, 2019

Python传入参数的方法有:位置参数、默认参数、可变参数、关键字参数、和命名关键字参数、以及各种参数调用的组合

写在前面

Python唯一支持的参数传递方式是『共享传参』(call by sharing)

多数面向对象语言都采用这一模式,包括Ruby、Smalltalk和Java(Java的引用类型是这样,基本类型按值传递)

共享传参是指函数的各个形式参数获得实参中各个引用的副本;也就是说,函数内部的形参是实参的别名(alias)

这种方案的结果是,函数可能会修改作为参数传入的可变对象,但是无法修改那些对象的标识(即不能把一个对象替换为另一个对象)

位置参数

位置参数是最简单的传入参数的方式,在其它的语言中也常常被使用

演示一:

def func(a, b):
  print(a+b)

func(1, 2) #3

演示二:

def power(x, n):
  s = 1
  while(n > 0):
    n -= 1
    s *= n
  return s

power(2, 3) #8

默认参数

默认参数就是在调用函数的时候使用一些包含默认值的参数

def power(x, n=2):
  s = 1
  while(n > 0):
    n -= 1
    s *= n
  reutrn s

power(3)  #9
power(2, 3) #8

定义默认参数要牢记一点:默认参数必须指向不变对象!

#以下这个函数如果被多次调用会在默认添加多个END字符串
def add_end(l = []):
  l.append('END')
  return l
#为了避免这个问题,应该把传入的默认参数设置为不可变的
def add_end(l = None):
  l = []
  l.append('END')
  return l

可变参数

可变参数就是允许在调用参数的时候传入多个(≥0个)参数(类似于列表、字典)

#这才是可变参数,虽然在使用上和列表没有区别,但是参数nums接收到的是一个tuple(这些参数在传入时被自动组组装为一个元祖)
def calc(*nums):
  sum = 0
  for n in nums:
    sum += n
  return sum

>>> calc(1,2,3)
7

>>> my_ls = [1,2,3]
>>> calc(*my_ls)
7

关键字参数

可变参数允许传入0个~多个参数,而关键字参数允许在调用时以字典形式传入0个或多个参数(注意区别,一个是字典一个是列表);在传递参数时用等号(=)连接键和值

#用两个星号表示关键字参数
def person_info(name, age, **kw):
  print("name", name, "age", age, "other", kw)

>>> person_info("Xiaoming", 12)
name Xiaoming age 12 other{}
>>> person_info("Dahuang", 35, city = "Beijing")
name Dahuang age 35 other {'city':'Beijing'}

命名关键字参数

命名关键字参数在关键字参数的基础上限制传入的的关键字的变量名

和普通关键字参数不同,命名关键字参数需要一个用来区分的分隔符*,它后面的参数被认为是命名关键字参数

#这里星号分割符后面的city、job是命名关键字参数
person_info(name, age, *, city, job):
  print(name, age, city, job)

>>> person_info("Alex", 17, city = "Beijing", job = "Engineer")
Alex 17 Beijing Engineer  #看来这里不再被自动组装为字典

不过也有例外,如果参数中已经有一个可变参数的话,前面讲的星号分割符就不要写了(其实星号是写给Python解释器看的,如果一个星号也没有的话就无法区分命名关键字参数和位置参数了,而如果有一个星号即使来自变长参数就可以区分开来)

#args是变长参数,而city和job是命名关键字参数
person_info(name, age, *args, city, job):
  print(name, age, args, city)

>>> person_info("Liqiang", 43, "balabala", city = "Wuhan", job = "Coder")
Liqiang 43 balabala Wuhan Coder

参数组合

总结一下,在Python中一种可以使用5中传递参数的方式(位置参数、默认参数、变长参数、关键字参数、命名关键字参数)

注意,这些参数在书写时要遵循一定的顺序即:位置参数、默认参数、变长参数、关键字参数、命名关键字参数(和本文的行文顺序一致)

这里简单举两个栗子

def f1(a, b, c=0, *args, **kw):
  print("a = ", a, "b = ", b, "args = ", args, "kw = ",kw)
def f2(a, b, c=0, *, d, **kw):
  print("a = ", a, "b = ", b, "c = ", c, "d = ", d, "kw = ", kw)

>>> f1(1, 2)
a = 1 b = 2 c = 0 args =() kw = {}
>>> f1(1, 2, c=3)
a = 1 b = 2 c = 3 args = () kw = {}
>>> f1(1, 2, 3, 'a', 'b')
a = 1 b = 2 c = 3 args = ('a', 'b') kw = {}
>>> f1(1, 2, 3, 'a', 'b', x = 99)
a = 1 b = 2 c = 3 args = ('a', 'b') kw = {'x':99}
>>> f2(1, 2, d = 99, ext = None)
a = 1 b =2 c = 0 d = 99 kw = {'ext':None}

写在后面

关于Python参数传递,有以下几点提请注意:

1)参数的传递是通过自动将对象赋值给本地变量名来实现的
函数参数在实际中只是Python赋值的另一个实例而已,因为引用可以是以指针的形式来实现的,所有的参数实际上都是通过指针进行传递的,作为参数被传递的对象从来不自动拷贝

2)在函数内部的参数名的赋值不会影响调用者
在函数运行时,在函数头部的参数名时一个新的、本地的变量名,这个变量名是在函数的本地作用域内的,函数参数名和调用者作用域中的变量是没有区别的

3)改变函数的可变对象参数的值也许会对调用者有影响
换句话说,因为参数是简单地赋值给传入的对象,函数就能够就地改变传入的可变对象,因此其结果会影响调用者;可变参数对函数来说可以做输入和输出的

Python的通过赋值进行传递的机制与C++的引用参数选项不完全相同,但是实际中,它与C语言的参数传递模型相当类似:

1)不可变参数“通过值”进行传递
像整数和字符串这样的对象是不可变对象,它们通过对象引用而不是拷贝进行传递的,但是因为无论如何都不可能在原处改变不可变对象,实际的效果就很像创建了一份拷贝

2)可变对象是通过“指针”进行传递的
列表和字典这样的对象也是通过对象引用进行传递的,这一点与C语言使用指针传递数组很相似,可变对象能够在函数内部进行原处的改变,这一点和C数组很像

详解Python传入参数的几种方法

详解Python传入参数的几种方法

总而言之,理解Python的变量、函数的关键就是理解『绑定』的概念——绑定就是绑定对象,理解了这一点就好办了

以上所述是小编给大家介绍的Python传入参数的几种方法详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
Python实现从订阅源下载图片的方法
Mar 11 Python
Java Web开发过程中登陆模块的验证码的实现方式总结
May 25 Python
使用python爬虫获取黄金价格的核心代码
Jun 13 Python
Python过滤txt文件内重复内容的方法
Oct 21 Python
python 划分数据集为训练集和测试集的方法
Dec 11 Python
python实现倒计时小工具
Jul 29 Python
django drf框架自带的路由及最简化的视图
Sep 10 Python
python列表推导式操作解析
Nov 26 Python
python属于跨平台语言码
Jun 09 Python
keras.layer.input()用法说明
Jun 16 Python
python安装后的目录在哪里
Jun 21 Python
OpenCV+python实现膨胀和腐蚀的示例
Dec 21 Python
[机器视觉]使用python自动识别验证码详解
May 16 #Python
Python redis操作实例分析【连接、管道、发布和订阅等】
May 16 #Python
Python操作redis实例小结【String、Hash、List、Set等】
May 16 #Python
Python 实现数据结构中的的栈队列
May 16 #Python
Python 一键制作微信好友图片墙的方法
May 16 #Python
Python实现京东秒杀功能代码
May 16 #Python
使用Python进行体育竞技分析(预测球队成绩)
May 16 #Python
You might like
在Windows系统下使用PHP生成Word文档的教程
2015/07/03 PHP
php 三大特点:封装,继承,多态
2017/02/19 PHP
js判断背景图片是否加载成功使用img的width实现
2013/05/29 Javascript
一个可以增加和删除行的table并可编辑表格中内容
2014/06/16 Javascript
Extjs grid panel自带滚动条失效的解决方法
2014/09/11 Javascript
详解JavaScript中的异常处理方法
2015/06/16 Javascript
js立即执行函数: (function ( ){})( ) 与 (function ( ){}( )) 有什么区别?
2015/11/18 Javascript
Angularjs中使用Filters详解
2016/03/11 Javascript
JS获取复选框的值,并传递到后台的实现方法
2016/05/30 Javascript
JavaScript第一篇之实现按钮全选、功能
2016/08/21 Javascript
jQuery ajax MD5实现用户注册即时验证功能
2016/10/11 Javascript
JS弹出窗口的运用与技巧大全
2016/11/01 Javascript
js封装tab标签页实例分享
2016/12/19 Javascript
Vue 中文本内容超出规定行数后展开收起的处理的实现方法
2019/04/28 Javascript
Vue+Django项目部署详解
2019/05/30 Javascript
python计算对角线有理函数插值的方法
2015/05/07 Python
Python实现简单的文件传输与MySQL备份的脚本分享
2016/01/03 Python
python 读取txt,json和hdf5文件的实例
2018/06/05 Python
Python使用装饰器模拟用户登陆验证功能示例
2018/08/24 Python
Python Excel处理库openpyxl使用详解
2019/05/09 Python
Python OpenCV实现视频分帧
2019/06/01 Python
python连接PostgreSQL数据库的过程详解
2019/09/18 Python
python批量替换文件名中的共同字符实例
2020/03/05 Python
Python爬虫代理池搭建的方法步骤
2020/09/28 Python
canvas需要在标签里直接定义宽高
2014/12/17 HTML / CSS
AmazeUI中模态框的实现
2020/08/19 HTML / CSS
荟萃全球保健品:维他购
2018/05/09 全球购物
在线吉他课程,学习如何弹吉他:Fender Play
2019/02/28 全球购物
PatPat阿根廷:妈妈们的购物平台
2019/05/30 全球购物
Douglas意大利官网:购买香水和化妆品
2020/05/27 全球购物
Linux操作面试题
2015/02/11 面试题
学生安全承诺书
2014/05/22 职场文书
好的旅游活动方案
2014/08/19 职场文书
党委班子纠正“四风”问题整改措施
2014/10/28 职场文书
2015年爱牙日活动总结
2015/02/05 职场文书
Android自定义ScrollView实现阻尼回弹
2022/04/01 Java/Android