详解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 03 Python
Python使用redis pool的一种单例实现方式
Apr 16 Python
Pandas 数据框增、删、改、查、去重、抽样基本操作方法
Apr 12 Python
python实现一组典型数据格式转换
Dec 15 Python
python中pip的使用和修改下载源的方法
Jul 08 Python
我们为什么要减少Python中循环的使用
Jul 10 Python
Python实现滑动平均(Moving Average)的例子
Aug 24 Python
解决python明明pip安装成功却找不到包的问题
Aug 28 Python
python3 动态模块导入与全局变量使用实例
Dec 22 Python
没编程基础可以学python吗
Jun 17 Python
Python try except else使用详解
Jan 12 Python
在python中实现导入一个需要传参的模块
May 12 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
文件系统基本操作类
2006/11/23 PHP
laravel安装和配置教程
2014/10/29 PHP
PHP 与 UTF-8 的最佳实践详细介绍
2017/01/04 PHP
PHP实现的各类hash算法长度及性能测试实例
2017/08/27 PHP
Laravel5.4框架中视图共享数据的方法详解
2019/09/05 PHP
使用JS+plupload直接批量上传图片到又拍云
2014/12/01 Javascript
基于JQuery制作可编辑的表格特效
2014/12/23 Javascript
jQuery UI插件自定义confirm确认框的方法
2015/03/20 Javascript
javascript获取select值的方法分析
2015/07/02 Javascript
完美JQuery图片切换效果的简单实现
2016/07/21 Javascript
window.open打开窗口被拦截的快速解决方法
2016/08/04 Javascript
探讨AngularJs中ui.route的简单应用
2016/11/16 Javascript
在vue-cli脚手架中配置一个vue-router前端路由
2017/07/03 Javascript
JavaScript中this关键字用法实例分析
2018/08/24 Javascript
element vue validate验证名称重复 输入框与后台重复验证 特殊字符 字符长度 及注意事项小结【实例代码】
2018/11/20 Javascript
JavaScript栈和队列相关操作与实现方法详解
2018/12/07 Javascript
回顾Javascript React基础
2019/06/15 Javascript
jQuery实现文本显示一段时间后隐藏的方法分析
2019/06/20 jQuery
Vue中使用better-scroll实现轮播图组件
2020/03/07 Javascript
基于vue+echarts 数据可视化大屏展示的方法示例
2020/03/09 Javascript
利用Python开发微信支付的注意事项
2016/08/19 Python
[原创]pip和pygal的安装实例教程
2017/12/07 Python
Python cookbook(数据结构与算法)从序列中移除重复项且保持元素间顺序不变的方法
2018/03/13 Python
python中怎么表示空值
2020/06/19 Python
新西兰网上购物,折扣店:BestDeals.co.nz
2019/03/20 全球购物
运动会广播稿50字
2014/01/26 职场文书
个人简历自我评价范文
2014/02/04 职场文书
应用外语系自荐信
2014/06/26 职场文书
超市创意活动方案
2014/08/15 职场文书
医德医魂心得体会
2014/09/11 职场文书
开展党的群众路线教育实践活动总结报告
2014/10/31 职场文书
个人思想政治总结
2015/03/05 职场文书
2016年习主席讲话学习心得体会
2016/01/20 职场文书
2016年少先队活动总结
2016/04/06 职场文书
如何写好竞聘报告
2019/04/03 职场文书
vue中使用mockjs配置和使用方式
2022/04/06 Vue.js