精华内容
下载资源
问答
  • 可变参数列表解析

    2019-03-12 19:37:22
    解析可变参数列表之前,我们需要了解什么是可变参数及它的作用与实质。 可变参数:指某一个函数被调用的时候,并不知道具体传递进来的参数类型和参数的数目。 作用:通过将函数实现为可变参数的形式,使得函数...

      解析可变参数列表之前,我们需要了解什么是可变参数及它的作用与实质。

      可变参数:指某一个函数被调用的时候,并不知道具体传递进来的参数类型和参数的数目。

      作用:通过将函数实现为可变参数的形式,使得函数可以接受一个以上不固定数目的参数。

      实质:可变参数列表实际上是宏的使用,实质是栈帧结构的运用。

      在库函数中也存在一些可变参数的函数,比如 printf() ,我们来看一下它的定义:

          

       我们发现它的参数列表,最后有着 ( ... ),它代表着参数个数未知。

      下面我们通过使用可变参数,实现求 n 个数的平均值来观察一下,我们将在注释部分注释有关部分在VC6.0中的定义:

    #include <stdio.h>
    #include <stdarg.h>
    
    int average(int n, ...)
    {
        va_list arg;     //typedef char * va_list;
        
        int i = 0;
        int sum = 0;
    
        va_start(arg, n);     //#define va_start(ap, v) (ap = (va_list)&v + _INTSIZZEOF(v))
                              //其中_INTSIZEOF的定义为  
                              //#define _INTSIZEOF(n) ((sizeof(n) + sizeof(int) - 1)&~(sizeof(int) - 1))
                              //下面这个宏的意思是,当 n 的字节为一个或两个或三个或四个时,返回 4;
                              //当 n 的字节为五个或六个或七个或八个时,返回 8 ;以此类推。
    
       
        for(i = 0; i < n; i++)
        {
            sum += va_arg(arg, int);      //#define va_arg(ap, t) 
                                          //        (*(t*)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)))
    
        }
    
        va_end(arg);    //#define va_end(ap) (ap = (va_list)0)
    
        return sum / n;
    }
    
    int main()
    {
        int avg1 = average(3, 1, 2, 3);
        int avg2 = average(5, 1, 2, 3, 4, 5);
        printf("avg1 = %d\n", avg1);
        printf("avg2 = %d\n", avg2);
    
        return 0;
    }

        通过上面的函数的实现,我么可以将代码更换为

    int average(int n, ...)
    {
        //va_list arg;
        char* arg;
    
        int i = 0;
        int sum = 0;
    
        //va_start(arg, n);
        arg = (char*)&n + 4;    //将 arg 指向第一个参数
    
        for(i = 0; i < n; i++)
        {
            //sum += va_arg(arg, int);
            sum += (*(int *)((arg += 4) - 4 ));      //拿 arg 此时指向第一个未知参数来讲,首先 arg 自加 4,
                                                     //此时 arg 指向第二个参数的地址,再减 4 ,进行整型提升后解引用,
                                                     //值为第一个参数的值,达到了依此访问的目的。
        }
    
        //va_end(arg);
        arg = (char *)0;     //把 arg 赋成空指针
    }

    相比大家都了解了可变参数列表的求解过程,我们总结一下:

    (1)、声明一个 va_list 类型的变量 arg ,它用于访问参数列表的未确定部分。

    (2)、这个变量的调用 va_stsart 来初始化。它的第一个参数是 va_list 的变量名,第二个参数是省略号前最后一个命名变量的参数。初始化过程把 arg 变量设置为指向可变参数部分的第一个参数。

    (3)、为了访问参数,需要使用 va_arg ,这个宏接受两个参数: va_list 变量和参数列表中下一个参数的类型,在这个例子中所有的可变参数都是整型。va_arg 返回这个参数的值, 并且使 arg 指向下一个参数。

    (4)、最后,当访问完毕最后一个可变参数之后,我们需要使用 va_end 使我们一开始定义的变量 arg 为空。

    可变参数的限制:

      (1)、可变参数必须从头到尾逐个访问。如果你在访问了几个可变参数之后想要中途终止,这是可以的,但是,如果你一开始就要访问中间的参数是不可以的。

     (2)、参数列表中至少有一个命名参数。如果一个命名擦拭农户都没有,无法使用 va_start。

     (3)、这些宏是无法判断实际存在的参数的个数。

     (4)、如果 va_arg 中指定了错误的类型,那么其后果是不可预测的。

     

    根据上面所阐述的内容,下面我们进行一个练习题:

    题目:使用可变参数列表,实现求 n 个数中的最大值

    #include <stdio.h>
    #include <stdarg.h>
    
    int Max(int n, ...)
    {
        va_list arg;
        int i = 0;
        int Max = 0;
        int tmp = 0;
        va_start(arg, n);       //初始化 arg 为未知参数列表的第一个参数的地址
        
        Max = va_arg(arg, int);
        for(i = 0; i < n; i++)
        {
            tmp = va_arg(arg, int);
            if(tmp > Max)
            {
                Max = tmp;
            }
        }
        va_end(arg);
        return Max;
    }
    
    int main()
    {
        int max1 = Max(3, 1, 2, 3);
        int max2 = Max(5, 1, 2, 3, 4, 5);
        printf("max1 = %d\n", max1);
        printf("max2 = %d\n", max2);
     
        return 0;
    }

     

    展开全文
  • 虚拟dom:用一个简单的对象去替代复杂的dom对象,该对象存储了对应dom的一些重要参数,在改变dom之前,会先比较相应的虚拟dom,如果需要改变,才会将相应的改变应用到真实dom上 diff算法(差异算法):用新渲染的...

    首先了解一下虚拟dom和diff算法

    • 虚拟dom:用一个简单的对象去替代复杂的dom对象,该对象存储了对应dom的一些重要参数,在改变dom之前,会先比较相应的虚拟dom,如果需要改变,才会将相应的改变应用到真实dom上
    • diff算法(差异算法):用新渲染的对象树和旧的树进行对比,记录这两颗树的差异,记录下来的不同就是我们需要对页面正真的dom操作,然后把他们应用到正真的dom操作中,进行页面的变更;虽然每次视图结构都是整个全新的渲染,但是最后操作的只是dom不同的地方

    写key的作用相当于给每一个vnode绑定一个id,可以根据这个key,更准确,更快的拿到oldVNode对应的VNode(diff算法中比较的对象)

    • 更准确:带key就不是就地复用,在sameNode函数 a.key === b.key对比中可以避免就地复用的情况。所以会更加准确。
    • 更快:利用key的唯一性生成map对象来获取对应节点,比遍历方式更快。

    其实我们在正真写循环的时候,有时候不写key也不会出现什么问题,页面也会正常的渲染,我们的一些操作也能正确的得到相应,只是会跳出警告让你加上key,有时候我们为了省事直接让key = index,其实这些做法都是有一定的弊端的;

    在一些情况下,不加key的速度会比加上key的速度更快,但是这并不是不加key的作用,而实没有key的情况下对节点的就地复用,可能提高性能;所谓的就地复用是不加key的一种渲染机制,因为没有key,就没有一个对象的一个标识,如果对里面内容进行调换位置,只是用需要修改的内容去替换已有的内容,增加也是相当于在最后多添加了一个对象;但是如果拥有了key,那么已经渲染的内容就相当于拥有了一个id,如果是调换位置,那么不回去修改内容,而是实现真正的去改变对应的位置

    为了更好理解就地复用,可以这样想象,相当于每个人都有一个个座位,但是这些座位是没有名字的,谁都可以使用,今天可以我坐一号,明天别人也可以坐一号;而加上key,就相当于给这些座位写了每个人的名字,每个人每次都是坐自己的,如果某个人走了,顺带着自己的位置也走了,不会应该又来了一个人把这个位置分给他。

    不加key的副作用:可能不会产生过度效果,或者在某些绑定节点数据(表单)状态,会出现错位,Vue的文档也声明了,”这个默认的模式是搞笑的,但是只适用于不依赖子组件状态或临时dom状态(如:表单输入值)的列表渲染输出“

    有时习惯使用key = index,这样做虽然给了一个key,但是如果删除某个内容,重新渲染之后,删除中间的任意一项(假如由三项,删除2),index会从123 ----> 12,而不是期待的由123 ----> 13,如果只为渲染可以使用

    所以尽量在列表组中写key,不仅可以避免一些莫名的bug,也可以提高代码规范

    可以看看前两个回答Vue2.0 v-for 中 :key 到底有什么用?

    展开全文
  • 再谈参数列表

    2007-11-12 21:12:00
    实践证明,这种做法正确的,只是有的时候,过长的参数列表让代码看起来不舒服(不是有编码规范吗,规定参数列表中的参数不能超过5个)。但是对于降低代码的bug产出率来说,这点不舒服必须忍受的,哪里有什么便宜...

     我记得上次写了一篇文章,说用参数传递的方式来缩小类中的成员变量的作用范围。实践证明,这种做法是正确的,只是有的时候,过长的参数列表让代码看起来不舒服(不是有编码规范吗,规定参数列表中的参数不能超过5个)。但是对于降低代码的bug产出率来说,这点不舒服是必须忍受的,哪里有什么便宜都占尽的道理呀(又啰嗦了:))。

    今天我想说的是,传递参数引用的话题。这个话题源于我今天遇到的一个bug。一个对象的ProcessID不知在什么地方被重置了。ProcessID是一个对象的属性,这个属性是可读写的。而在那些要使用ProcessID的函数中,它们的参数列表传递的都是那个对象。这样的函数有很多,所以要找到那个重置了ProcessID的位置,就变得有点像大海捞针了。

    如何避免这个问题呢,后来我想了一下,可能还要从参数列表中下手,参数列表最好是传递简单的数据或是结构,而不是对象引用,或者是在传递对象引用之前,将这个对象复制一份,将备份的对象引用传进去。这样就可以很大程度上避免这个问题。当然这会带来一些性能上的损失,但是要少出bug,可能也只有这样了。

    我不知道我的这个想法是否合理,还望各位高手,特别是构架师们多多指教。

    展开全文
  • 当def函数参数默认值为对象时,例如列表[],字典{}示例1:猜测一下,会输出什么???def ddd(a,b=[]):b.append(a)return bprint(ddd(1))print(ddd(2,['a','b','c']))print(ddd(3))[1] ['a','b','c','2'] [3] ?????你...

    当def函数参数默认值为对象时,例如列表[],字典{}

    示例1:猜测一下,会输出什么???

    def ddd(a,b=[]):

    b.append(a)

    return b

    print(ddd(1))

    print(ddd(2,['a','b','c']))

    print(ddd(3))

    [1]  ['a','b','c','2'] [3]   ?????你是否认为是这样? 输出一下看看

    输出结果:

    D:\Python27\python.exe D:/untitled1/temp5.py

    [1]

    ['a', 'b', 'c', 2]

    [1, 3]

    看到以上结果有什么想法,为什么呢???[1, 3]而不是[3],那么修改一下代码,输出b变量的内存地址看一下。我想,可以找到我要的答案

    def ddd(a,b=[]):

    b.append(a)

    print(id(b)) #查看内存地址

    return b

    print(ddd(1))

    print(ddd(2,['a','b','c']))

    print(ddd(3))

    输出结果:

    D:\Python27\python.exe D:/untitled1/temp5.py

    170580872

    [1]

    171586568

    ['a', 'b', 'c', 2]

    170580872

    [1, 3]

    从输出中,可以看出,除了,第二个print,其它两个内存是一们的。那么考虑一下为什么第二个为被改变。结果显而易见,因为第二个print改变了,b对象,重新创建了一个对象。

    那么如果不想出现,每次调用,默认值对象不变的问题,可以这样改一下:

    def ddd(a,b=None):

    if type(b).__name__!='list':

    b = []

    b.append(a)

    print(id(b)) #查看内存地址

    return b

    print(ddd(1))

    print(ddd(2,['a','b','c']))

    print(ddd(3))

    初始值设置为None,通过类型判断来,进行内处理

    小结:

    1.python定义def的时候,如果参数做为对象,那么,如果没有改变这个对象的前提下,那么即使,多次调用该函数也,不会创建新的对象。

    那么就会出现多次调用函数,有可能都进行了处理。

    2.如果,没有特殊需求,函数参数,尽量不采用对象,如果一有需要,对象进行内处理。传默认值None

    【转】Python函数默认参数陷阱

    [转]Python函数默认参数陷阱 阅读目录 可变对象与不可变对象 函数默认参数陷阱 默认参数原理 避免 修饰器方法 扩展 参考 请看如下一段程序: def extend_list(v, li=[]) ...

    Python面试题目之Python函数默认参数陷阱

    请看如下一段程序: def extend_list(v, li=[]): li.append(v) return li list1 = extend_list(10) list2 = extend_l ...

    使用可变对象作为python函数默认参数引发的问题

    写python的都知道,python函数或者方法可以使用默认参数,比如 1 def foo(arg=None): 2 print(arg) 3 4 foo() 5 6 foo("hello ...

    python函数默认参数陷阱

    对于学习python的人都有这样的困惑 def foo(a=[]): a.append(5) return a Python新手希望这个函数总是返回一个只包含一个元素的列表:[5].结果却非常不同,而 ...

    python函数默认参数为可变对象的理解

    1.代码在执行的过程中,遇到函数定义,初始化函数生成存储函数名,默认参数初识值,函数地址的函数对象. 2.代码执行不在初始化函数,而是直接执行函数体. 代码实例 这要从函数的特性说起,在 Python ...

    Python 函数&lpar;默认参数)

    默认参数 设置默认参数时,有两点需要注意:一是必选参数在前,默认参数在后,否则python的解释器会报错二是当函数有多个参数时,把变化大的参数放前面,变化小的放后面,变化小的参数就可以作为默认参数 d ...

    &lbrack;python&rsqb;函数默认参数顺序问题

    python 函数参数定义有四类: 1.必选参数:调用函数时候必须赋值的参数. a,须以正确的顺序传入函数b,调用时的数量必须和声明时的一样 def exa(x): return x #b作为参数进入 ...

    Python函数默认参数的陷阱

    默认参数实际上只有一个值 代码1 def func(l = 1): l += 1 print(l) func() func() func() 代码2 lst = [] def func(a,l = l ...

    python函数默认参数坑

    def add(a=3,b): print a,b add(4) 这样写的话,运行的话就会报错:SyntaxError: non-default argument follows default ar ...

    随机推荐

    HDU-2084 数塔 经典dp,水

    1.HDU-2084   数塔 2.链接:http://acm.hdu.edu.cn/showproblem.php?pid=2084 3.总结:从下往上推,最后归于顶点.方程为  dp[i][j] ...

    移动端H5页面遇到的问题总结

    最近刚做完一个移动端的项目,产品之无敌,过程之艰辛,我就不多说了,记录下在这个项目中遇到的问题,以防万一,虽然这些可能都是已经被N多前辈解决掉了的问题,也放在这里,算是为自己漫漫前端路铺了一颗小石子儿 ...

    万里长征第一步:Python进程池的一点点小坑

    # -*- coding: utf- -*- """ Created on Thu Mar :: @author: lilide """ # ...

    Java Rest客户端框架有哪些

    HttpClient HtmlUnit Jsoup HttpUrlConnection(java原生) Http4j

    beta阶段贡献分配实施

    作业要求[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2281] 要求1 每位组员的贡献分值   刘莹莹 王玉潘 潘世维 周昊 赵美增 ...

    《SQL Server 2000设计与T-SQL编程》

    笔记1 http://dukedingding.blog.sohu ...

    DJango小总结一

    views.py                        def func(request):                # 包含所有的请求数据                ...     ...

    VS2012 Getting Started with Owin and Katana

    参考地址:http://www.asp.net/aspnet/overview/owin-and-katana/getting-started-with-owin-and-katana 小提示: 该示 ...

    iOS开发 - 如何跳到系统设置里的各种设置界面

    在iOS开发中,有时会有跳转系统设置界面的需求,例如提示用户打开蓝牙或者WIFI,提醒用户打开推送或者位置权限等.在iOS6之后,第三方应用需要跳转系统设置界面,需要在URL type中添加一个pre ...

    关于Xcode6&period;0&period;1创建项目不自动创建Prefix&period;pch文件的解决办法

    1. 新建工程 2. 创建pch文件: 新建文件->Other->PCH File  新建一个pch文件 3. 在setting里面进行设置: 项目配置->Build Setting ...

    展开全文
  • 很多Python函数或者类的方法中,帮助文档都显示最后有一个斜线,但是自己定义函数时却不允许这样用,请问这个斜线的作用是什么呢? >>> help(sum) Help on built-in function sum in module builtins: sum...
  • 首先,我们需要知道可变参数列表到底是什么,它又有什么作用? 一般我们在编程的时候,函数中形参的个数通常是确定的,在调用时要依次给出与形参对应的实参。但在某些情况下我们希望函数的参数个数可以根据需要确定...
  • 列表前面加星号是什么用法

    千次阅读 2018-09-09 17:23:35
    作用是列表解开成两个独立的参数,传入函数,还有类似的有两个星号,是将字典解开成独立的元素作为形参。 def add(a, b):  return a+b data = [4,3] print add(*data) #equals to print add(4, 3)...
  • 什么是重载?重载的作用

    万次阅读 多人点赞 2017-02-13 10:17:46
    重载,从简单说,就是函数或者方法有相同的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法。在java中同一个类中的2个或2个以上的方法可以有同一个名字,只要...
  • 例如:from operator import addadd(*[1,5])6作用是列表解开成两个独立的参数,传入函数,还有类似的有两个星号,是将字典解开成独立的元素作为形参。# -*- coding:utf-8 -*-def add(a, b):return a+bdata = [4,3]...
  • 之前我们学习Java基础知识的时候,就知道了main一个方法,也一个程序的入口,同时也了解了什么是参数列表,在重载章节中,我们也深刻了解了参数列表作用,那是不是认为你真正的了解了参数列表的含义呢?...
  • y=f(x0, x1, ..., xn)Python函数1、由若干语句组成的语句块、函数名称、参数列表构成,它组织代码的最小单元2、完成一定的功能函数的作用1、结构化编程对代码的最基本的封装,一般按照功能组织一段代码2、封装的...
  • Params的作用是什么?如何使用?

    千次阅读 2009-12-21 20:23:00
    C#允许为函数指定一个且... params关键字在方法成员的参数列表中使用,为该方法提供了参数个数可变的能力.它只能出现一次并且不能在其后再有参数定义,之前可以。 案例: 案例说明 params 关键字可以指定在参数数目可变处
  • groupby(by,axis,level),by指分组依据(列表、字典、函数),axis是作用维度(0为行,1为列),那level什么? 最好可以举个简单的例子,谢谢
  • 并没有看懂C++primer上的解释。我这里说的引用限定符成员函数的参数列表后加的&或&&,谢谢各位大神了。
  • 这篇文章我们来学习一下关于python字典之中的python items函数的相关知识,items函数是什么意思,这个函数有什么作用都将会在接下来的文章之中得到解答。描述Python 字典(Dictionary) items() 函数以列表返回可遍历...
  • 列表、元组前面加星号作用是列表解开成两个独立的参数,传入函数,字典前面加两个星号,是将字典解开成独立的元素作为形参。 1、列表 def add(a, b): return a+b data = [1,2,4,3] print("原始列表:", data) ...
  • 文 / 菜鸟搞机· 吃瓜市民王先生大家在安装黑苹果或者对系统进行优化调试时避免不了要学会操作,添加/删除启动参数。...引导参数含义列表以下为mac OS系统可以使用的启动参数列表和相关解释。引导...
  • call()、apply()的区别: 相同点: 1.call()和apply()都可以用来间接调用函数,都可以显式调用所需的this。即,任何函数可以作为任何...call():使用其自有的实参列表作为函数的参数; apply():要求以数组的形式...
  • pop()方法语法:list.pop(obj=list[-1])参数obj -- 可选参数,要移除列表元素的对象。返回值该方法返回从列表中移除的元素对象。相关推荐:《Python视频教程》实例以下实例展示了 pop()函数的使用方法:#!/usr/bin/...
  • pop()方法语法:list.pop(obj=list[-1])参数obj -- 可选参数,要移除列表元素的对象。返回值该方法返回从列表中移除的元素对象。实例以下实例展示了 pop()函数的使用方法:#!/usr/bin/pythonaList = [123, 'xyz', '...
  • 1、什么是函数? 函数可以重复执行的语句块,可以重复使用。 2、作用: 用于封装语句块,提高代码的重用性。 定义用户级别的函数。 3、函数定义(创建)语句 def语句的语法: def 函数名(形参列表) 语句块 4、用法...
  • 作用是:将列表解开成几个独立的参数,传入函数。类似的运算符还有两个星号(**),是将字典解开成独立的元素作为形参。 例如:add(a,b)函数需要输入两个数,在主函数中list = [1, 2] c = add(*list),此处*list就...
  • 它的作用是获取一个字符串,然后将这个字符串拆分成一个包含许多子字符串的列表。在它有两个参数(第二个参数是拆分的次数,应该保留为默认值),第一个参数是分隔符。这是拆分字符串时代码应该查找的字符串。默认情况...
  • Python中,单星号 * 和双星号 ** 除了作为“乘”和“乘方”的数值运算符外,还在列表、元组、字典的操作中有看到,下面对其进行解释:单星号 *单星号 * 用于对列表LIST或元组tuple中的元素进行取出(unpacke)。...
  • 1.用户程序自定义的异常和应用程序特定的异常,必须借助于 throws 和 throw 语句来...(用在声明方法时,表示该方法可能要抛出异常)语法:[(修饰符)](返回值类型)(方法名)([参数列表])[throws(异常类)]{......}public ...
  • 传递给已创建的嵌套作用域的一个参数.列表解析中的所有内容都在单独的范围内运行(作为一个函数,基本上),除了用于最左边for循环的iterable之外.你可以在字节码中看到这一点:>>> def foo():... return ...
  • 什么是函数重载?

    2019-09-17 21:42:42
    重载指的函数具有不同的参数列表,而函数名相同的函数。重载要求参数列表个数不同,或者参数的类型不同,参数的顺序不同。都可以实现重载,但是仅仅函数的返回值不同没办法重载的。编译器会根据传递的实参来...
  • 因为我们从外部取得的参数可以多个,所以获得的一个列表(list),也就是说sys.argv其实可以看作一个列表,所以才能用[]提取其中的元素。其第一个元素程序本身,随后才依次外部给予的参数。下面我们通过一个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 934
精华内容 373
关键字:

参数列表作用是什么