详解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将阿拉伯数字转换为罗马数字的方法
Jul 10 Python
浅谈python中的getattr函数 hasattr函数
Jun 14 Python
Python中装饰器高级用法详解
Dec 25 Python
Python使用装饰器进行django开发实例代码
Feb 06 Python
python3判断url链接是否为404的方法
Aug 10 Python
python 循环读取txt文档 并转换成csv的方法
Oct 26 Python
Python numpy.array()生成相同元素数组的示例
Nov 12 Python
python单线程下实现多个socket并发过程详解
Jul 27 Python
使用 Python 读取电子表格中的数据实例详解
Apr 17 Python
Python基于callable函数检测对象是否可被调用
Oct 16 Python
Python self用法详解
Nov 28 Python
python实现简单区块链结构
Apr 25 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截取字符串之截取utf8或gbk编码的中英文字符串示例
2014/03/12 PHP
php语言中使用json的技巧及json的实现代码详解
2015/10/27 PHP
jquery中动态效果小结
2010/12/16 Javascript
详解JavaScript的回调函数
2015/11/20 Javascript
Jquery操作cookie记住用户名
2016/03/29 Javascript
BootStrap智能表单实战系列(九)表单图片上传的支持
2016/06/13 Javascript
Angular使用$http.jsonp发送跨站请求的方法
2017/03/16 Javascript
JavaScript实现焦点进入文本框内关闭输入法的核心代码
2017/09/20 Javascript
vue项目中使用百度地图的方法
2018/06/08 Javascript
jquery获取file表单选择文件的路径、名字、大小、类型
2019/01/18 jQuery
JS/jQuery实现简单的开关灯效果【案例】
2019/02/19 jQuery
vue基于Echarts的拖拽数据可视化功能实现
2020/12/04 Vue.js
使用vue3重构拼图游戏的实现示例
2021/01/25 Vue.js
Python Socket编程入门教程
2014/07/11 Python
Python最基本的数据类型以及对元组的介绍
2015/04/14 Python
Python Property属性的2种用法
2015/06/21 Python
python下调用pytesseract识别某网站验证码的实现方法
2016/06/06 Python
Python selenium文件上传方法汇总
2020/11/19 Python
使用PyV8在Python爬虫中执行js代码
2017/02/16 Python
Python对List中的元素排序的方法
2018/04/01 Python
Python中elasticsearch插入和更新数据的实现方法
2018/04/01 Python
Python实现查找数组中任意第k大的数字算法示例
2019/01/23 Python
python循环嵌套的多种使用方法解析
2019/11/29 Python
简单介绍CSS3中Media Query的使用
2015/07/07 HTML / CSS
J2EE系统只能是基于web
2015/09/08 面试题
汽车技术服务英文求职信范文
2014/01/02 职场文书
老师给学生的表扬信
2014/01/17 职场文书
报纸媒体创意广告词
2014/03/17 职场文书
离职证明范本(5篇)
2014/09/19 职场文书
大学生翘课检讨书范文
2014/10/06 职场文书
实习协议书
2015/01/27 职场文书
狮子林导游词
2015/02/03 职场文书
农民工工资支付承诺书
2015/05/04 职场文书
预备党员群众意见
2015/06/01 职场文书
2015年中秋放假通知范文
2015/08/18 职场文书
MySQL 逻辑备份 into outfile
2022/05/15 MySQL