-
2021-05-05 20:17:24
01-函数形参默认值
<script> // 形参默认值作用:方便调用者,不传参数也有效果,传参就是具体参数的效果 // 形参默认值:在定义函数的时候,给形参直接复制:形参 = 值,这个值就是默认值 function show(msg = '来啊,互相伤害啊') { console.log(msg) } show('滚') // 如果有实参:默认值不生效 show() // 如果没有实参:默认值生效 // 什么时候使用默认值? // 1. 如果当某个参数被传入实参的某个值的概率很高的情况下:就可以给定默认值 function chengFa99(level = 9) { } chengFa99() // 2. 如果参数的值是布尔类型:一般都会给默认值(布尔类型就true和false) // box.addEventListener('click',function(){},true || false) // 第三个参数可以不给,有默认值 // 默认值注意事项 // 1. 如果有多个参数,那么有默认值的一定要放到最后 function test(a = 1, b, c) { } // 传入实参:顺序,如果要给b和c传参:一定会覆盖掉a的默认值 // 2. 没有规定形参默认值的数量:可以每个形参都有默认值(jq就是这样) </script>
注意:
1.形参默认值作用:方便调用者,不传参数也有效果,传参就是具体参数的效果
2.形参默认值:在定义函数的时候,给形参直接复制:形参 = 值,这个值就是默认值
3.如果有实参:默认值不生效 && 如果没有实参:默认值生效
4.如果有多个参数,那么有默认值的一定要放到最后更多相关内容 -
jquery封装插件时匿名函数形参和实参的写法解释
2020-10-20 10:46:03本文主要介绍了jquery封装插件时匿名函数形参和实参的写法解释。具有很好的参考价值,下面跟着小编一起来看下吧 -
在python中list作函数形参,防止被实参修改的实现方法
2020-09-16 18:04:43主要介绍了在python中list作函数形参,防止被实参修改的实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 -
python函数形参用法实例分析
2021-01-20 04:47:58本文实例讲述了python函数形参用法。分享给大家供大家参考。具体如下: 函数形参: 函数取得的参数是你提供给函数的值,这样函数就可以利用这些值 做 一些事情。这些参数就像变量一样,只不过它们的值是在我们调用... -
函数形参
2018-08-27 21:28:51函数形参 函数形参的定义方式: 位置形参 星号元组形参 命名关键字形参 双星字典形参 位置形参: 语法: def 函数名(形参名1,形参名2,...): 语句块 自己理解:按照位置顺序依次一对一接收的形参 ...函数形参
函数形参的定义方式:
位置形参 星号元组形参 命名关键字形参 双星字典形参
- 位置形参:
- 语法:
def 函数名(形参名1,形参名2,...): 语句块
自己理解:按照位置顺序依次一对一接收的形参
* 星号元组形参
* 语法:def 函数名(*元组形参名): 语句块
* 作用:收集多余的位置传参 * 说明:元组形参名一般命名为 'args' * 自己理解:位置形参传递完后,将多余的位置形参打包形成元组传递给星号元组形参,元组形参名这个变量绑定的就是打包后的元组
示意:
def mysum(a, b, *args): pass mysum(1, 2, 3, 4, 5, 6) # 按位置把实参 1,2 传递给a和b ,剩下的3,4,5,6打包成一个元组(3,4,5,6)传递给*args 也就是 元组变量args 绑定了元组(3,4,5,6),就可以直接在函数调用中使用了。 mysum(1,2) # 位置实参正好够用,没有多余位置实参,则args=空元组,采用len(args)判断 mysun(*[1,2]) # 在函数调用时采用星号,相当于将可迭代对象拆解成一个个元组,中间用逗号隔开而已,此处即是将列表拆开成1,2 然后按位置传递给a,b 即可
- 命名关键字形参:
- 语法:
def 函数名(*, 命名关键字形参): 语句块
或
def 函数名(*args, 命名关键字形参): 语句块
* 作用:强制所有的参数都必须使用关键字传参或 字典关键字传参 * 注: * 分隔符, * 后边的形参必须使用关键字传参 * *args 后边的形参必须使用关键字传参
* 双星字典形参:
* 语法:def 函数名(**字典形参名): 语句块
* 作用:收集多余的关键字传参 * 说明:字典形参名一般命名为 kwargs * 自己理解:函数调用处:** 将字典拆解成关键字实参,可以进行参数传递 * 自己理解: 函数定义处:** 将接收的多余的的关键字打包形成字典
示例:
def fun2(a, b, *args, c, d): pass # *args 后边的形参c,d都必须是关键字形参 fun2(1, 2, 10, 11, 12, d=3, c=4) fun2(1, 2, **{'c': 3, 'd': 4}) # **拆解字典进行关键字传参
** 函数参数说明:
位置形参,缺省参数,星号元组形参,双星号字典形参等可以混合使用函数参数自左至右的顺序为: 1. 位置形参 2. 星号元组形参 3. 命名关键字形参 4. 双星号字典形参
示例:
def fn(a,b,*args, c, **kwargs): pass fn(100, 200, 3, 4, 5, d='D', e='E',c='C') # 100--> a 200-->b (3,4,5)-->agrs # 'C'-->c {'d':'D', 'e':'E'}-->kwargs
- 缺省参数: 给定参数默认值 内部给定默认实参 函数定义时一次性给定
- 位置形参:
-
深入理解指针作为函数形参
2021-11-27 22:05:22接下来,通过一个简单的例子,来演示一下指针作为函数形参的两个容易混淆的问题。 1)可以改变指针指向的内容: void test(int* s) {//指针作为形参 //s = new int(2);//p指向2这块内存空间 *s = 20;//指针指向的...楼主刚从java转到c++,被这个指针搞得头疼,今天晚上碰到这个问题,想了好久,翻书也翻了很久,终于弄明白这其中的奥秘。
首先我们得明白c++中的函数参数传递一个重要规则X(姑且命名X,方便下面叙述)是:
每次调用一个函数,都会重新建立一个形参(类似于临时变量),传入的实参作为初始化值拷贝给形参,一旦实参的值拷贝给形参后,形参和实参其实是两个不同的对象了(c++Prime原话,啃书!!!),就互不干涉了。这句话真的太重要!!!
接下来,通过一个简单的例子,来演示一下指针作为函数形参的两个容易混淆的问题。
1)可以改变指针指向的内容:
void test(int* s) {//指针作为形参 //s = new int(2);//p指向2这块内存空间 *s = 20;//指针指向的内容修改 } int main() { int a = 1000; int* p = &a; cout << "调用前p的地址" << p << endl;//调用前p的地址004FFEC0 cout << "调用前p指向的值" << *p << endl;//调用前p指向的值1000 test(p); cout << "调用后p的地址" << p << endl;//调用后p的地址004FFEC0 cout << "调用后p指向的值" << *p << endl;//调用后p指向的值20 }
如上面代码所示,main函数中的指针p原本是指向a的内存,且存的数是1000,输出为:
“调用前p的地址004FFEC0”
“调用前p指向的值1000”
根据X规则,test()函数在调用时,形参s生成临时变量int* s,实参p用于s的初始化,所以s等于p,也可以理解s和p指向同一块内存,故通过*s对指针指向的内容进行修改:*s= 20,也就是等同于*p=20!所以调用后输出:
“调用前p的地址004FFEC0”
“调用前p指向的值20”
即地址没变,但是值修改了。
由这个例子其实可以看出来,地址没改变,改变了指针指向的内容
2) 不可以改变指针的地址:
void test(int* s) {//指针作为形参 s = new int(2);//p指向2这块内存空间 cout << "调用后s的地址" << s << endl;//调用后s的地址01034FC8 //*s = 20;//指针指向的内容修改 } int main() { int a = 1000; int* p = &a; cout << "调用前p的地址" << p << endl;//调用前p的地址010FF7BC cout << "调用前p指向的值" << *p << endl;//调用前p指向的值1000 test(p); cout << "调用后p的地址" << p << endl;//调用后p的地址010FF7BC cout << "调用后p指向的值" << *p << endl;//调用后p指向的值1000 }
这个例子中我让test函数对指针的指向进行改变。main中的p仍然指向a,在调用后,根据输出语句的地址发现:指向的还是a,地址未发生改变。但是s的地址和p的地址不一样了,因为“一旦实参的值拷贝给形参后,形参和实参其实是两个不同的对象了,就互不干涉了。”注意!这个s和p不是一个东西了。
3)针对1)和2)的思考
为什么指针作为形参可以改变指针指向的内容,却不可以改变指针的指向?我觉得一定得从函数的参数传递本质着手,函数参数传递的规则是实参是形参的初始化,一旦实参的值拷贝给形参后,形参和实参其实是两个不同的对象了。这个一定好好理解一下!基于这个规则:
当一个函数将指针作为形参时,我们给这个形参传入一个实参(指针(非引用类型)),这个实参的值究竟是什么?其实是指针的地址值,这个地址值传给形参后,后续形参怎么折腾,跟这个实参无关的。如:1)中只是*s = 20,这个s其实就是p,因为s没有对指针指向进行修改(可以理解成s和p指向同一个内存,那么s修改了指针指向的内存保存的值,p指向的值当然也得变)。2)中 s = new int(2);就是把s指向了另一个内存,虽然test函数中s的地址变了;但是跟p没有半毛钱关系,所以main中输出的两个p的地址还是一样的。归根结底还是因为“一旦实参的值拷贝给形参后,形参和实参其实是两个不同的对象了,就互不干涉了”。 这句话理解了, 就啥都明白了。
形象一点的说就是:
我把我家的钥匙(实参)拷贝了一份给你(形参),你可以用拷贝的钥匙开我家的门,拿我家的东西,完全没问题,但是你非要去开锁店把我家的钥匙改造成另一个样子,即使可能你可以用这个改造的钥匙去开别人家的门(改变指向),但是你根本不会影响我自己手上这把钥匙继续开我家的门(不改变实参的指向)。
第一次写帖子,只是想分享今天学到的心得。可能总结的不好,不喜勿喷。如果有错的地方,希望大佬们给与指正!感谢!
-
函数指针变量作为函数形参
2020-09-07 12:17:53那么,在定义函数的时候,函数的形参变量可以接收实参变量传递过来的数据。所以,函数指针变量是一种变量类型,也可以作为函数的形参变量。程序测试例子如下: 程序运行结果如下: 可以看到,函数func1的...学习了函数指针变量之后,我们可以把一个函数名设置给函数指针变量,再由函数指针变量来调用该函数名。那么,在定义函数的时候,函数的形参变量可以接收实参变量传递过来的数据。所以,函数指针变量是一种变量类型,也可以作为函数的形参变量。程序测试例子如下:
程序运行结果如下:
可以看到,函数func1的定义如下:
void func1(void (*pfunc)(int))
其中形参的定义是
void (*pfunc)(int)
此时,这个形参变量就是一个函数指针变量。那么,在调用func1函数的时候,必须给形参变量赋值一个函数地址。而且根据形参变量的定义,该函数指针的返回值类型是void,形参列表是接收一个int类型的变量。这个格式与func函数的定义格式一致,所以,可以把func函数设置给func1函数的形参变量。那么,调用func1函数的形式如下:
func1(func);
此时,把func函数名作为实参变量,传递给func1函数的形参pfunc函数指针变量,相当于:
pfunc = func;
所以,func1函数的形参函数指针变量pfunc就得到func函数名的值,指向func函数在内存块在首地址。那么,就可以通过pfunc函数指针变量调用它所指向的func函数。
-
函数形参的理解
2020-11-01 18:50:05一个典型函数定义包括四个部分:返回类型,函数的名字,形参列表和函数体。格式如下 int max(int a,int b) {函数体} 函数的作用 在我看来,函数的一般作用是对一定的输入产生一定的输出,当然可以没有输入;至于... -
void指针作为函数形参的用法
2022-03-27 10:50:43如果函数的参数可以是任意类型指针,那么应该使用 void 指针作为函数的形参,这样函数就可以接受任意数据类型的指针作为参数。 拿memcpy举例: void *mymemcpy (void *dst, const void *src, size_t size) { assert... -
对象与函数——类对象作为函数形参
2022-04-30 09:26:36编写一个 output 函数,以 Int 的常引用作为形参,其功能是输出形参的成员变量的值。输出为一行。 相关知识 类对象作为形参,本质上与基本类型作为形参并无区别。但是考虑到普通类型作为形参,使用的是值传递,也... -
javascript 获取函数形参个数
2020-10-25 14:51:19本节主要介绍了javascript获取函数形参个数的具体实现,需要的朋友可以参考下 -
js函数形参形参接收object变量.docx
2021-11-30 09:27:15js函数形参形参接收object变量.docx -
C语言--函数形参与实参详解
2019-04-29 17:18:05关于指针 32位编译器下指针字节数恒为4字节 64位编译器下指针字节数恒为8字节 ...栈区空间:在函数{}内部定义的变量称为局部变量,系统将局部变量内存分配在栈区,函数调用完毕后此块内存便被销毁。这里所谓的销... -
JS-函数形参默认值
2019-09-18 21:56:09在ES6之前可以通过逻辑运算符来给形参指定默认值 格式: 条件A || 条件B 如果条件A成立, 那么就返回条件A 如果条件A不成立, 无论条件B是否成立, 都会返回条件B function getSum(a, b) { a = a || '1'; b = b || '2'... -
C++三种函数形参形式
2020-08-04 19:16:38C++三种函数形参 C++三种函数形参简介为什么使用指针或引用作为形参使用引用和指针有什么区别使用常量引用 简介 普通形参 :普通形参只是把实参的值拷贝给形参,对形参的改变不会影响到实参。 指针形参 :... -
C++中数组作为函数形参的几种形式
2022-02-14 15:15:57C++中数组作为形参的几种形式 -
【引用参数】 引用作函数形参交换两个整数 (PTA)
2022-03-02 12:27:24【引用参数】 引用作函数形参交换两个整数 (PTA),设计一个void类型的函数Swap,该函数有两个引用类型的参数,函数功能为实现两个整数交换的操作。 -
函数形参和实参
2021-05-13 19:40:56形参(形式参数)在函数定义中出现的参数可以看做是一个占位符,它没有数据,只能等到函数被调用时接收传递进来的数据,所以称为形式参数,简称形参。实参(实际参数)函数被调用时给出的参数包含了实实在在的数据,... -
彻底弄懂函数形参与变量、函数的重名问题
2020-08-27 12:53:031.函数与变量重名 console.log(foo); function foo(){} var foo = "变量"; 输出为: function foo(){} 代码实际是: function foo(){} var foo; console.log(foo); foo = "变量"; 为什么会这样呢... -
关于函数形参前加&和*的思考
2021-08-19 14:17:26加*表示指针,调用函数时实参需要加&符号,表示地址传递; 两者在函数内对传入参数的修改都会作用在实参上,通过地址传递; *表示指针,指针可以指向其他指针,但&声明的变量一旦指向某一个地址,不能再改变... -
数组作为函数形参
2018-05-23 18:20:14请看下面的程序: #include void func1(int arr[]) ...调用函数将实参数组传递给被调用函数形参,形参接收是实参的地址。不论哪种方式,被调用函数里对形参数组的操作都会影响调用函数里的实参数组。 -
变量、指针、引用作函数形参的比较
2019-03-15 12:10:44函数形参是C++函数学习中一大重点,经常让初学者头疼,这里我们通过讲解两个实参值互换的例子讲解实参与形参间的关系,并比较普通变量、指针以及引用作形参时的区别,了解地址、名称以及值间的联系,体会指针、引用... -
C语言学习之一有关函数形参问题(两数交换)
2020-03-11 10:30:55C语言学习之一有关函数形参问题(两数交换)一、形参与实参二、结语 一、形参与实参 什么是形参?什么是实参?参考定义如下: 1、形参即形式参数,在函数定义中,在整个函数体内都可以使用,离开该函数则不能使用。 ... -
js的函数形参和实参详解
2020-03-29 12:15:10函数参数分为实参和形参。 形参就是在定义函数时,传递给函数的参数,被称为形参。 实参就是当函数被调用时,传给函数的参数,称为实参。 【例1】以下示例中,参数a和b就是形参,而调用函数中的2,3就是实参。 ... -
函数形参为指向指针的指针
2019-10-27 01:05:14一、函数的形参为指向指针的指针。当链表头指针为空时,需要使用指向指针的指针。 1、形参与实参间通过地址传递 (1)、当头指针为空时,向该链表中添加新的节点,此时需要使用到指针的指针。InsertNode01 函数... -
必须知道的C语言知识细节:函数形参和实参的区别
2020-07-28 15:34:48C语言中函数形参和实参是十分重要的概念,初学者很容易混淆。 形参:顾名思义,形式参数,仅仅是声明了参数的类型和参数名称,未实际分配内存和赋值。 实参:实际参数,是指函数调用时,实际赋值和分配内存空间。 ... -
指针作为函数形参
2018-08-10 20:49:39q作为形参进入fun函数时,不是q本身进入参数,而是克隆了一个指针变量,这个指针变量的值和q相等。 所以,在程序1中,只是克隆的指针变量的指向发生了改变,而q的指向并没有发生改变。 为了验证这一结论,看... -
函数形参中值传递与地址传递
2020-03-23 21:47:13函数形参中值传递与地址传递