位置参数
    调用函数时,传入函数的参数,按照位置顺序依次赋值给函数的参数。
#计算乘方的函数       
        def power(x, n):
            s = 1
            while n > 0:
                n = n - 1
                s = s * x
            return s
        在使用power(1,2)时, 会根据位置顺序,将1赋值给x ,2 赋值给n。

默认参数
    如果希望不指定指数时,默认按照平方进行计算,可以指定函数的默认参数。
#计算乘方的函数,默认计算平方
        def power(x, n=2):
            s = 1
            while n > 0:
                n = n - 1
                s = s * x
            return s
        直接使用power(10) ,则计算10的平方。 如需计算5的3次方,则使用power(5, 3)。
       
    使用默认参数可以简化函数的调用,但是设置默认参数时有几点需要留意:
        1.必选参数在前,默认参数在后,否则会报错。
        2.当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面, 变化小的参数就可以作为默认参数。
        3.默认参数必须指定为不变对象!
默认参数的使用
#在这里对默认参数的几点留意进行一下详解。
    #首先定义一个函数,用来登记身份信息,使用4个参数:姓名,年龄,性别,国籍。
    #在这里,年龄、性别、国籍都可以从某一个维度上根据需要设定为默认参数,例如:班级学生大多数年龄一样大、足球队员性别大多数都是一样的、国籍更是有相当的一致性。
   
    def info(name,age,sex,intl):
        print(name,'来自于',intl,'是一个',age,'岁的',sex,'孩')
        return None
       
    >>> info('小A',10,'男','中国')
    小A 来自于 中国 是一个 10 岁的 男 孩
   
    #假设现在有10个人,都是中国籍的男孩子,其中有两个孩子分别是14岁和12岁,其他人都是10岁,那么这种录入操作就很适合做默认参数了。
   
    def info(name,age=10,sex='男',intl='中国'):
        print(name,'来自于',intl,'是一个',age,'岁的',sex,'孩')
        return None
       
    >>> info('小B')
    小B 来自于 中国 是一个 10 岁的 男 孩
    >>> info('小C')
    小C 来自于 中国 是一个 10 岁的 男 孩
    >>> info('小D',12)
    小D 来自于 中国 是一个 12 岁的 男 孩
    >>> info(age=14,name='小E')
    小E 来自于 中国 是一个 14 岁的 男 孩
   
    #可以看出,在使用默认参数的时候其实很灵活,可以根据顺序传入参数,也可以指定参数名赋值的方式不按照顺序提供参数。
   
默认参数的坑:一定要设为不可变对象。
    先来试试将默认参数设置为可变对象的情况:
        >>> def nn(name,ext=[]):
        ...     ext.append('over')
        ...     print(name,ext)
        ...
        >>> nn('a')
        a ['over']
        >>> nn('a')
        a ['over', 'over']
    可以看到,list作为默认参数时,发生了意料之外的结果。
    函数在定义的时候,默认参数ext的值就被计算出来了,在这里是[],ext参数实际上是一个指向[]的变量,如果改变了ext参数( 就是 [] )的内容,则下次调用时默认参数的内容就变了,指向到了修改后的[]的位置,而不再是最先定义函数时的[]了。
   
    为了避免上面的情况,可以使用这种方式来解决:
        >>> def nn(name,ext=None):
        ...     if ext is None:
        ...             ext = []
        ...             ext.append('over')
        ...     print(name,ext)
        ...
        >>> nn('aa')
        aa ['over']
        >>> nn('aa')
        aa ['over']
        >>> nn('aa','bb')
        aa bb
       
使用不可变对象能够减少由于修改数据导致的错误,由于对象不变,多任务环境下同时读取对象也不需要加锁,可以同时进行读动作。在编写程序时,如果可以设计为不变对象,就尽可能设计成不变对象。

Day5 - 03 函数的参数-位置参数和默认参数的更多相关文章

  1. python函数中的位置参数、默认参数、关键字参数、可变参数区别

    一.位置参数 调用函数时根据函数定义的参数位置来传递参数. #!/usr/bin/env python # coding=utf-8 def print_hello(name, sex): sex_d ...

  2. python函数参数类型:位置参数、默认参数、动态参数、关键字参数

    1.位置参数:调用函数的时候传的参数,参数默认按顺序赋值,如果是指定那个参数赋值,不关注顺序.指定参数a=1,b=2 就在函数体内a=1,b=2 2.默认参数:在定义函数的时候,给某个参数设置默认值 ...

  3. python的位置参数、默认参数、关键字参数、可变参数区别

    一.位置参数 调用函数时根据函数定义的参数位置来传递参数. #!/usr/bin/env python # coding=utf-8 def print_hello(name, sex): sex_d ...

  4. Python虚拟机函数机制之位置参数的默认值(五)

    位置参数的默认值 在Python中,允许函数的参数有默认值.假如函数f的参数value的默认值是1,在我们调用函数时,如果传递了value参数,那么f调用时value的值即为我们传递的值,如果调用时没 ...

  5. [python][oldboy]关键字参数和位置参数,默认参数,可变长参数(无名,有名)

    关键字参数和位置参数是在函数调用的时候定义 关键字参数是以键-值对出现,无序,多一个不行,少一个不行 位置参数,有序,多一个不行,少一个不行 混搭:所有位置参数必须在关键字参数的左边 默认参数是在函数 ...

  6. python函数参数中带有默认参数list的坑

    在python中函数参数中如果带有默认参数list遇到问题 先看一段代码 def f(x,l=[]): for i in range(x): l.append(i*i) print(l) print( ...

  7. js中ajax连接服务器open函数的另外两个默认参数get请求和默认异步(open的post方式send函数带参数)(post请求和get请求区别:get:快、简单 post:安全,量大,不缓存)(服务器同步和异步区别:同步:等待服务器响应当中浏览器不能做别的事情)(ajax和jquery一起用的)

    js中ajax连接服务器open函数的另外两个默认参数get请求和默认异步(open的post方式send函数带参数)(post请求和get请求区别:get:快.简单 post:安全,量大,不缓存)( ...

  8. python3 函数的形参、实参、位置参数、默认参数、关键字参数以及函数的递归

    python 版本 3.5 #Author by Andy#_*_ coding:utf-8 _*_def func(x,y=2): print('我是形参%s'%x) print('我是默认参y-- ...

  9. Python之在函数中使用列表作为默认参数

      本文将介绍笔者在工作中遇到的Python的一个坑,那就是使用列表作为默认参数.   我们知道,在Python中,列表(list)是可变对象,所以列表的内容可能会在函数内改变.另一个需要注意的是,使 ...

随机推荐

  1. js常用通用函数

    //判断是否数字 function isNumber(str){ var n = Number(str); if (!isNaN(n)){ return true; }else{ return fal ...

  2. 04、MyBatis DynamicSQL(Mybatis动态SQL)

    1.动态SQL简介 动态 SQL是MyBatis强大特性之一. 动态 SQL 元素和使用 JSTL 或其他类似基于 XML 的文本处理器相似. MyBatis 采用功能强大的基于 OGNL 的表达式来 ...

  3. 01、MyBatis HelloWorld

    1. MyBatis简介 1)MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架 2)MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集 3)MyB ...

  4. python-网络安全编程第四天(数据库编程&网络编程)

    前言 好几天没更因为寒假放假回家放松了几天 嘿嘿 今天继续开始启动学习模式. python数据库编程 Python DB API访问数据库流程 Python DB API包含的内容 什么是 PyMyS ...

  5. springboot使用swagger2生成开发文档

    一.引入jar包 <dependency> <groupId>io.springfox</groupId> <artifactId>springfox- ...

  6. 面试半年,凭借这份JVM面试题,我终于拿到了字节跳动的offer!

    内存区域 虚拟机栈生命周期与线程相同,描述的是Java 方法执行的内存模型,每个方法在执行的时候都会创建一个栈帧,用于存取局部变量表.操作数栈.动态链接.方法出口等信息本地方法栈与虚拟机栈作用相似,只 ...

  7. 面试官:小伙子,你给我讲一下java类加载机制和内存模型吧

    类加载机制 虚拟机把描述类的数据从 Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的java类型,这就是虚拟机的类加载机制. 类的生命周期 加载(Loadi ...

  8. 对于AQS的理解

    1.JUC包中的 CountDownLatch.CyclicBarrier.ReentrantLock和Semaphore都是基于AQS(AbstractQuenedSynchronizer)实现的 ...

  9. selenium WebDriver提示Unable to find a matching set of capabilities解决方法

    问题出在:应该将火狐浏览器驱动添加到火狐浏览器安装目录下,并且将火狐浏览器安装目录放在path下面.(出现大意,忘了在火狐浏览器下放其对应的驱动) 亲测以下组合方式可用:   pycharm-comm ...

  10. CF1156D 0-1-Tree

    路径考虑顺序. 显然合法的路径只有以下两种: 一段 \(0\) 加一段 \(1\) 或一段 \(1\) 加一段 \(0\). 全 \(0\) 或全 \(1\). 用并查集将边权为 \(0\) 和 \( ...