知识点1函数的参数_第1页
知识点1函数的参数_第2页
知识点1函数的参数_第3页
知识点1函数的参数_第4页
知识点1函数的参数_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

函数的参数摘要定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了。对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数内部的复杂逻辑被封装起来,调用者无需了解。Python的函数定义非常简单,但灵活度却非常大。除了正常定义的必选参数外,还可以使用默认参数、可变参数和关键字参数,使得函数定义出来的接口,不但能处理复杂的参数,还可以简化调用者的代码。关键词位置参数形参和实参传递列表字典等可修改对象的参数关键字参数默认参数可变参数解包参数2传递参数上一节可以看出参数是通过赋值来传递的,Python中参数传递有如下特点:•参数的传递是通过自动将对象赋值给本地变量名来实现的。•在函数内部的参数名的赋值不会影响调用者。•改变函数的可变对象参数的值也许会对调用者有影响。3位置参数一个计算X平方的函数:4

对于power(x)函数,参数x就是一个位置参数。当调用power函数时,必须传入有且仅有的一个参数x。

参数的顺序必须一一对应,且少一个参数都不可以。上面的例子中a和b都是位置参数,调用函数时传入的两个值按照位置顺序依次赋给参数a和b。5形参和实参实参是一个实实在在存在的参数,是实际占用内存地址的,而形参只是意义上的一种参数,在定义的时候是不占内存地址的。通常,函数名后面的括号里的参数我们称为形参,而实际调用时候提供的值为实参:注:当执行change(a)函数时,程序会将a的值赋值给n,所以第一次会输出0,执行完n=10,接下来会输出10,`change函数执行完毕后,拷贝的n会被销毁,再执行print是显示的就是a的值。正好应证了:在函数内部的参数名的赋值不会影响调用者。

如果要改变a的值只需要加入返回值:6

传递列表,字典等可修改对象的参数•不可变对象,该对象所指向的内存中的值不能被改变。当改变某个变量时候,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一个新的地址,变量再指向这个新的地址。•可变对象,该对象所指向的内存中的值可以被改变。变量(准确的说是引用)改变后,实际上是其所指的值直接发生改变,并没有发生复制行为,也没有开辟新的出地址,通俗点说就是原地改变。Python中,数值类型(int和float)、字符串str、元组tuple都是不可变类型。而列表list、字典dict、集合set是可变类型。

不可变对象的例子:is就是判断两个对象的id是否相同,而==判断的则是内容是否相同。7

再来看字符串8和数值类型的结果一样。如果是下面这种情况,变量修改后不在是good:9

由于是不可变对象,变量对应内存的值不允许被改变。当变量要改变时,实际上是把原来的值复制一份后再改变,开辟一个新的地址,astr再指向这个新的地址(所以前后astr的id不一样),原来astr对应的值因为不再有对象指向它,就会被销毁t和float类型也是一样的。再来看下可变对象:10赋值的情况下:

所以,当参数传递像列表和字典这样的可修改对象的时候,需要注意,对这样的对象的原处修改可能在函数退出后依然有效,并由此影响到调用者。11

如果不想函数内部在原处的修改影响传递给它的对象,那么,可以简单地创建一个明确的可变对象的拷贝。也可以在函数内部进行拷贝:12关键字参数关键字参数允许通过变量名进行匹配,而不是位置示例:13

这个调用中,c=3,意味着将3传递给参数c。注意到这时关键字参数使用时参数从左至右的关系不再重要了,因为参数是根据变量名进行传递的,而不是根据位置。甚至在一个调用中混合使用基于位置的参数和基于关键字的参数都可以。在这种情况下,所有基于位置的参数先按照从左至右的顺序匹配头部的参数,之后再进行基于变量名进行关键字的匹配。示例:14

关键字参数在Python中扮演了两个典型的角色,首先,它们使调用显得更文档化一些(假设使用了比a,b,c更好的参数名),例如:

这种形式的调用比直接进行一个由逗号分隔的三个值的调用明了得多:关键字参数在调用中起到了数据标签的作用。默认参数默认参数允许创建函数可选的参数,如果没有传入值的话,在函数运行前,参数就被赋了默认值。示例:15

当调用这个函数的时候,必须为a提供值,无论是通过位置参数还是关键字参数来实现。然而,为b和c提供值是可选的,如果不给它们赋值,它们会默认分别赋值2和3.

当给函数传递两个值的时候,只有c得到默认值,并且当有三个值传递时,不会使用默认值:16

关键字和默认参数一起使用后的情况:

这里,a通过位置得到了1,c通过关键字得到了6,而b在两者之间,通过默认值获得了2.如果利用可变参数,调用函数的方式可以简化成这样:17把函数的参数改为可变参数:

定义可变参数和定义一个列表或元组参数相比,仅仅在参数前面加了一个*号。在函数内部,参数number接收到的是一个元组,因此,函数代码完全不变。但是,调用该函数时,可以传入任意个参数,包括0个参数。如果已经有一个列表或者元组,要调用一个可变参数怎么办?可以这样做:18

这种写法当然是可行的,问题是太繁琐,所以Python允许你在列表或元组前面加一个*号,把列表或元组的元素变成可变参数传进去:**和*特性类似,但是它只对关键字参数有效。将这些关键字参数传递给一个新的字典,这个字典之后将能够通过一般的字典工具进行处理。如下所示:19

函数头部能够混合一般参数、*参数以及**去实现更加灵活的调用方式。例如:

在上述代码中,1按照位置传递给a,2和3收集到pargs位置元组中,x和y放入kargs关键字字典中。解包参数在调用函数时能够使用*语法。在这种情况下,它与函数定义的意思相反。它会解包参数的集合,而不是创建参数的集合。例如,我们能够通过一个元祖给一个函数传递四个参

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论