详解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 30 Python
Python文本相似性计算之编辑距离详解
Nov 28 Python
Python实现调度算法代码详解
Dec 01 Python
pandas 小数位数 精度的处理方法
Jun 09 Python
对Python Pexpect 模块的使用说明详解
Feb 14 Python
深入了解Python枚举类型的相关知识
Jul 09 Python
Python爬取智联招聘数据分析师岗位相关信息的方法
Aug 13 Python
python 实现视频 图像帧提取
Dec 10 Python
pytorch实现MNIST手写体识别
Feb 14 Python
python实现word文档批量转成自定义格式的excel文档的思路及实例代码
Feb 21 Python
Python中用xlwt制作表格实例讲解
Nov 05 Python
Python项目打包成二进制的方法
Dec 30 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
PHP COOKIE设置为浏览器进程
2009/06/21 PHP
yii2 页面底部加载css和js的技巧
2016/04/21 PHP
php面向对象编程self和static的区别
2016/05/08 PHP
PHP实现递归目录的5种方法
2016/10/27 PHP
PHP实现微信提现功能(微信商城)
2019/11/21 PHP
在线编辑器的实现原理(兼容IE和FireFox)
2007/03/09 Javascript
利用location.hash实现跨域iframe自适应
2010/05/04 Javascript
js jquery获取随机生成id的服务器控件的三种方法
2013/07/11 Javascript
JS获取单击按钮单元格所在行的信息
2014/06/17 Javascript
浅析Javascript中“==”与“===”的区别
2014/12/23 Javascript
JS实现刷新父页面不弹出提示框的方法
2016/06/22 Javascript
详解JavaScript模块化开发
2016/12/04 Javascript
你不知道的 javascript【推荐】
2017/01/08 Javascript
jquery使用iscorll实现上拉、下拉加载刷新
2017/10/26 jQuery
vue中的计算属性实例详解
2018/09/19 Javascript
简单了解Javscript中兄弟ifream的方法调用
2019/06/17 Javascript
JavaScript 自定义html元素鼠标右键菜单功能
2019/12/02 Javascript
Vue 解决路由过渡动画抖动问题(实例详解)
2020/01/05 Javascript
浅析Vue 中的 render 函数
2020/02/28 Javascript
如何使用Javascript中的this关键字
2020/05/28 Javascript
用Python PIL实现几个简单的图片特效
2019/01/18 Python
Python代理IP爬虫的新手使用教程
2019/09/05 Python
Python之——生成动态路由轨迹图的实例
2019/11/22 Python
Python3 中作为一等对象的函数解析
2019/12/11 Python
解决python 读取 log日志的编码问题
2019/12/24 Python
python @propert装饰器使用方法原理解析
2019/12/25 Python
Python3读写ini配置文件的示例
2020/11/06 Python
Django用内置方法实现简单搜索功能的方法
2020/12/18 Python
Django2.1.7 查询数据返回json格式的实现
2020/12/29 Python
英国高街电视:High Street TV
2018/05/22 全球购物
斯洛伐克最大的婴儿食品和用品网上商店:Feedo.sk
2020/12/21 全球购物
安全技术说明书
2014/05/09 职场文书
关于随地扔垃圾的检讨书
2014/09/30 职场文书
校园广播稿100字
2014/10/06 职场文书
2015年车间主任工作总结
2015/05/21 职场文书
《小小的船》教学反思
2016/02/18 职场文书