python指定参数教程(详解Python传入参数的几种方法)
python指定参数教程
详解Python传入参数的几种方法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传入参数的几种方法详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对开心学习网网站的支持!
原文链接:https://blog.csdn.net/abc_12366/article/details/79627263- 如何用python编写抽奖(详解用python写一个抽奖程序)
- python的pickle用法(Python multiprocess pool模块报错pickling error问题解决方法分析)
- pythonselenium设置(解决Python selenium get页面很慢时的问题)
- 随意化快排python算法(python快排算法详解)
- python列表反转的方法(Python实现的列表排序、反转操作示例)
- python微信支付接口(Python提取支付宝和微信支付二维码的示例代码)
- python的静态方法和类方法(深入解析python中的实例方法、类方法和静态方法)
- python字符串之基本操作小练习(Python数据类型之String字符串实例详解)
- python 提取微信消息(python实现文件助手中查看微信撤回消息)
- python3常用内建函数(Python3中函数参数传递方式实例详解)
- python爬虫开源代码(Python实现的文轩网爬虫完整示例)
- pythondjango搭建web(PythonWeb项目Django部署在Ubuntu18.04腾讯云主机上)
- pythonhtml文件转换成pdf库(Python3转换html到pdf的不同解决方案)
- 微信昵称python(Python 微信之获取好友昵称并制作wordcloud的实例)
- python 暗弱目标提取(Python提取频域特征知识点浅析)
- python给一个数字md5加密(Python写一个基于MD5的文件监听程序)
- 这8种耐阴植物,营造阴生植物花境,也是一个不错的选择(营造阴生植物花境)
- 览邦G08 Plus SMART WATCH 测评⑱ 全独立这才是智能手表该有的样子(览邦G08PlusSMART)
- 荣耀手表 GS 3 真机亮相 不支持无线充电(荣耀手表GS3)
- 通过体温就能为智能手表充电 原来是用NASA在空间站用的黑科技(通过体温就能为智能手表充电)
- 智能手表兼容Windows和Android 无需充电挑战苹果(智能手表兼容Windows和Android)
- 一天一冲也算表 麦步,一款待机 21 天的智能手表体验评测(一天一冲也算表)
热门推荐
- 查看IO量大的SQL语句及它们的执行计划
- git log命令大全(每天学一分钟使用Git服务器实现查看Debug分支及修复)
- django部署(Django 中间键和上下文处理器的使用)
- linux操作系统的关机指令有哪些(Linux系统关机命令之间的区别及用法详解)
- html的meta标签
- dedecms搜索功能怎么设置详细(删除dedecms 5.7里面烦人的织梦链的方法)
- docker容器和主机端口映射(docker利用单个镜像映射到多个端口操作)
- 组态王如何做按钮弹框(Ratchet 模态框的实现)
- iis配置网站授权(IIS的web.config中跨域访问设置方法)
- dedecms怎么设置翻页(DEDECMS中获取无限栏目子分类的方法)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9