详解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而不是Matlab和R语言
Nov 14 Python
python+django+sql学生信息管理后台开发
Jan 11 Python
python用户评论标签匹配的解决方法
May 31 Python
详解Python中的type和object
Aug 15 Python
解决每次打开pycharm直接进入项目的问题
Oct 28 Python
Python给图像添加噪声具体操作
Mar 03 Python
用Python抢火车票的简单小程序实现解析
Aug 14 Python
python实现FTP循环上传文件
Mar 20 Python
Python3 ID3决策树判断申请贷款是否成功的实现代码
May 21 Python
pandas创建DataFrame的7种方法小结
Jun 14 Python
python如何运行js语句
Sep 09 Python
关于多种方式完美解决Python pip命令下载第三方库的问题
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
用PHP创建PDF中文文档
2006/10/09 PHP
第二节--PHP5 的对象模型
2006/11/16 PHP
手把手教你使用DedeCms的采集的图文教程
2007/03/11 PHP
php后退一页表单内容保存实现方法
2012/06/17 PHP
Laravel中Trait的用法实例详解
2016/03/16 PHP
纯JavaScript实现的完美渐变弹出层效果代码
2010/04/02 Javascript
JavaScript中也使用$美元符号来代替document.getElementById
2010/06/19 Javascript
jQuery下扩展插件和拓展函数的写法(匿名函数使用的典型例子)
2010/10/20 Javascript
jquery动态加载图片数据练习代码
2011/08/04 Javascript
iframe异步加载实现点击左边菜单加载右边内容实例讲解
2013/03/04 Javascript
JS实现侧悬浮浮动实例代码
2013/11/29 Javascript
给html超链接设置事件不使用href来完成跳
2014/04/20 Javascript
浅析JavaScript 调试方法和技巧
2015/10/22 Javascript
利用jQuery设计一个简单的web音乐播放器的实例分享
2016/03/08 Javascript
基于bootstrap实现广告轮播带图片和文字效果
2016/07/22 Javascript
js实现刷新页面后回到记录时滚动条的位置【两种方案可选】
2016/12/12 Javascript
vue 封装自定义组件之tabal列表编辑单元格组件实例代码
2017/09/07 Javascript
Vue2几种常见开局方式详解
2017/09/09 Javascript
利用weixin-java-miniapp生成小程序码并直接返回图片文件流的方法
2019/03/29 Javascript
python使用paramiko实现远程拷贝文件的方法
2016/04/18 Python
python日期时间转为字符串或者格式化输出的实例
2018/05/29 Python
Python操作MySQL数据库的两种方式实例分析【pymysql和pandas】
2019/03/18 Python
python仿evething的文件搜索器实例代码
2019/05/13 Python
利用Python绘制有趣的万圣节南瓜怪效果
2019/10/31 Python
使用Rasterio读取栅格数据的实例讲解
2019/11/26 Python
python实现12306登录并保存cookie的方法示例
2019/12/17 Python
Python定时从Mysql提取数据存入Redis的实现
2020/05/03 Python
Python实现一个简单的毕业生信息管理系统的示例代码
2020/06/08 Python
python 解决selenium 中的 .clear()方法失效问题
2020/09/01 Python
size?爱尔兰官方网站:英国伦敦的球鞋精品店
2019/03/31 全球购物
Raffaello Network德国:意大利拉斐尔时尚购物网
2019/05/01 全球购物
巴西24小时在线药房:Droga Raia
2020/05/12 全球购物
英国独特家具和家庭用品购物网站:Cuckooland
2020/08/30 全球购物
教师个人自我鉴定
2014/02/08 职场文书
优秀食品类广告词
2014/03/19 职场文书
日语系毕业求职信
2014/07/27 职场文书