1. 构建有默认参数的函数

当我们在构建一个函数或者方法时,如果想使函数中的一个或者多个参数使可选的,并且有一个默认值,那么可以在函数定义中给参数指定一个默认值,并且放到参数列表的最后就行了。比如:

def func(a, b=42):
print(a, b)
func(1) #a=1, b=42
func(1,2) #a=1, b=2

如果默认参数使一个可以修改的容器,比如一个列表,集合或者字典,可以使用None作为默认值。比如:

#使用列表list作为默认值
def func(a, b=None):
if b is None:
b = []
···

但是,如果你并不是想提供一个默认值,而仅仅知识想测试下某个默认参数是不是有值传递进来,可以这样写:

_no_value = object()
def func(a, b=_no_value):
if b is _no_value:
print("b没有值")
else:
print(a, b) func(1) # b没有值
func(1, None) # 1 None

仔细通过测试可以发现,传递一个None值和不传值两种情况是有差别的。

2. 参数陷阱

2.1 默认参数的值

默认参数的值仅仅在函数定义的时候赋值一次,示例代码如下:

x = 42
def func(a, b=x):
print(a, b) func(1) #1 42
x = 23
func(1) #1 42

从上面例子中可以看出,当我们改变x的值的对默认参数值并没有影响,这是因为在函数定定义的时候就已经确定了它的默认值了。

2.2 默认参数值的类型

默认参数值的类型应该是不可变对象,比如None,True,False,数字或字符串,而不能使用列表,字典等可变类型。

不要像下面这样写代码:

def func(a, b=[]):          #不能这么写
···

如果这样写了,当默认值在某些地方被修改之后,程序就会出现问题。

这些被修改的程序会影响到下次调用这个参数时的默认值。比如:

def func(a, b=[]):
return b
x = func(1)
print(x) #[]
x.append("a")
x.append("b")
print(x) #['a', 'b']
y = func(1)
print(y) #['a', 'b']

可以看到,b的默认值从一个空list,变成了[“a”, “b”],这种不会是你想要的默认参数。

为了避免这种情况的发生,最好是将默认值设置为None,然后在函数里面检查它。

但是在将默认值设置为None之后,测试None值时使用is操作符是很重要的,is是这种方法的关键点。
有人可能会这样写:

def func(a, b=None):
if not b:
b = []
···

这么写有有一个问题,就是虽然None确实会被当成False,但是还有其他的对象(比如长度为0的字符串,列表,元组,字典等)都会被当作False。因此上面的代码会误将一些其他输入也会当作没有输入。比如:

def func(a, b=None):
if not b:
b = []
return b print(func(1)) # []
print(func(1, [])) # []
print(func(1, 0)) # []
print(func(1, "")) # []

从结果中就可以看到,b的值并没有发生改变,这不是我们想要的结果。

2.3 测试某个可选参数

当一个函数需要测试某个可选参数是否被使用者传递进来。这个时候需要小心的是不能用某个默认值,比如None,0或者False值来测试用户提供的值(因为这些值都是合法的值,是可能被用户传递进来的)。

你可以创建一个独一 无二的私有对象实例,就像上面的_no_value变量一样。在函数里面,你可以通过检查被传递参数值跟这个实例是否一样来判断。

这里的思路就是用户不可能去传递这个_no_value实例作为输出。因此这里通过检查这个值就能确定某个参数是否被传递进来了。

Python基础之定义有默认参数的函数的更多相关文章

  1. python 定义带默认参数的函数

  2. Python基础之只接收关键字参数的函数

    当我们希望函数的某些参数强制使用关键字参数时,可以将强制关键字参数放到某个*后面就能得到这种效果.比如: def recv(maxsize, *, block): """ ...

  3. PHP_零基础学php_3PHP函数、传参函数、默认参数、函数返回值

    <?php function say_hello() //无参数 { $name="tang"; echo "hello,".$name; echo &q ...

  4. Python基础知识总结笔记(四)函数

    Python基础知识总结笔记(四)函数python中的函数函数中的参数变量作用域偏函数PFA递归函数高阶函数BIFs中的高阶函数匿名函数lambda闭包Closure装饰器Decorator函数式编程 ...

  5. c++有默认参数的函数---4

    原创博客:转载请标明出处:http://www.cnblogs.com/zxouxuewei/ 1.默认参数的目的 C++可以给函数定义默认参数值.通常,调用函数时,要为函数的每个参数给定对应的实参. ...

  6. [C++程序设计]有默认参数的函数

    实参与形参的结合是从左至右顺序进行的.因此指定默认值的参数必须放在形参表列中的最右端,否 则出错.例如: void f1(float a,int b=0,int c,char d=′a′); //不正 ...

  7. C++ 函数 函数的重载 有默认参数的函数

    函数的重载 C++允许用同一函数名定义多个函数,这些函数的参数个数和参数类型不同.这就是函数的重载(function overloading). int max1(int a,int b, int c ...

  8. 【c++】类中带默认参数的函数

    反思两个问题 1. 带默认参数的函数,为何声明.定义不能同时有参数? 2. 带默认参数的函数, 为何带默认参数的参数靠后站? 上程序 #include <iostream> #includ ...

  9. php课程 3-12 带默认参数的函数怎么写

    php课程 3-12 带默认参数的函数怎么写 一.总结 一句话总结:多看学习视频啊 1.带默认参数的函数怎么写? 直接等于号接默认参数,和js里面一模一样 2.带默认参数的函数的注意事项是什么? 默认 ...

随机推荐

  1. Visual Web Developer 2012安裝教程

    1.打开网页链接http://www.w3school.com.cn/aspnet/mvc_intro.asp 点击Visual Web Developer 2012进行安装安装平台(WebPlatf ...

  2. springboot之手动控制事务

    一.事务的重要性,相信在实际开发过程中,都有很深的了解了.但是存在一个问题我们经常在开发的时候一般情况下都是用的注解的方式来进行事务的控制,说白了基于spring的7种事务控制方式来进行事务的之间的协 ...

  3. 如何将SolidWorks文件另存为.obj文件及如何打开.obj格式文件

    原网站:http://fans.solidworks.com.cn/forum.php?mod=viewthread&tid=40238) OBJ文件是Alias Wavefront公司为它的 ...

  4. 一行css代码搞定响应式布局

    在这篇文章中,我将教你如何使用 CSS Grid 来创建一个超酷的图像网格图,它将根据屏幕的宽度来改变列的数量.最精彩的地方在于:所有的响应特性被添加到了一行 css 代码中.这意味着我们不必将 HT ...

  5. iOS - Scenekit3D引擎初探之 - 给材质贴图

    今天简单说一下 SceneKit 给材质贴图. 1,最简单的一种方法,直接打开dae 或者 scn 文件直接设置  如上图,这个dae 文件中只有一个几何体,几何体中只有一个材质球,然后设置材质球的d ...

  6. 爬虫请求库 requests

    requests模块   阅读目录 一 介绍 二 基于GET请求 三 基于POST请求 四 响应Response 五 高级用法 一 介绍 #介绍:使用requests可以模拟浏览器的请求,比起之前用到 ...

  7. RMAN恢复数据文件

    实验之前先备份数据库 RMAN>backup database; 在操作系统中删除数据文件 5 SQL> startup ORACLE 例程已经启动. Total System Globa ...

  8. Flutter——AlertDialog组件、SimpleDialog组件、showModalBottomSheet组件(弹窗组件)

    AlertDialog组件 import 'package:flutter/material.dart'; void main() { runApp(MaterialApp( title: " ...

  9. [Jenkins][GitHub]2 持续集成环境初探

    预计阅读时间:30分钟 部署环境:Jenkins ver. 2.61 + Centos7 + Java 1.8 参考链接: http://www.jianshu.com/p/22b7860b4e81 ...

  10. Win10安装MySQL5.7版本 解压缩版方法

    1.下载地址:https://dev.mysql.com/downloads/mysql/5.7.html#downloads 直接点击下载项 下载后: 2.可以把解压的内容随便放到一个目录,我的是如 ...