00:00
好,接下来我们来继续说一下函数的参数啊,还是我们先来创建一个简单的函数啊,我们直接定义一个啊,那定义函数这个东西我们经常会用到,那这个同学们一定要整的非常的熟悉啊,非常熟悉定义个函数,函数名我叫做一个FN2,这边呢,我就定一个参数啊,一个参数,然后在这我来整一个print呢,来一个A,等于我这来一个A,输出一下A,那在这里这时候我是不是就可以去调这个FN2了,诶F2了,比如说我这传一个123,那现在等于A的值是不是就是123呀?哎,123我这一保存,我这一执行A的值就变成了一个123,那如果我换一种写法啊,我这么写,我在这里边我来写什么呢?我来写一个B等于123,比说我现在定一个变量B,然后我这写一个B,那问你这两个,刚才这两个东西,我写一个FN2123跟写一个FN2B1不一样,哎,实际上是等价的,因为B的值是不是就是123呀,哎,所以你这传一个B,那那就是它啊,就是它,所以我这一执行是不是也是123呀,哎,效果是一样的,甚至你还可以怎。
01:00
怎么写呢?我这来一个A等于123,然后我这传一个A,这样行不行啊,哎,这样也是没问题的,哎注意了,行参它跟我们这个函数外部的变量是没有关系的,也就说我们这个行三它只在内部有用,这样写不会导致它覆它它被覆盖,这两个A是独立的,我们讲作用率的时候再去提,但是你现在知道这个两个A是没有任何关系的啊,没有任何关系的,我们这一保存执行一下是不是效果是一样的呀,诶效果是一样的,但是现在啊,我们为了区分一下,我改成C啊,或者改成B啊,我先改成B,但是你要注意这写A也是没有关系的啊,也是没关系的,所以注意我这也可以写变量,也可以直接去写那个什么呀,哎,自卖量都是可以的啊,都是可以的,那这个时候就带来一个问题了,诶,那现在我们这儿传的是一个123对吧,B的值是123,那也就是说我实参在传递的时候,它有没有类型的限制呢?诶十参在传递的时候有没有类型的限制呢?要注意了,我们来说一下我们这个函数在调用时。
02:00
啊,函数在调上时,我们的解析器啊,我们的Python解析器它不会检查我们这个实参的什么呀,哎,类型啊,不会检查实三类型也就是什么呢?我们13可以传递任意类型的,哎对象啊可以传递任意类型对象,那现在我的B是一个123,我换一个B等于处行不行啊,一直行是不是也没问题啊,我再换一个B等于hello改成一个字符串,我这一直行是不是也没问题啊,哎,也是没问题的,我这再画一个来一个B等于什么呢?哎,B等于一个这个捺哎,那我们这一直行是不是也没问题啊?哎,也没问题是至是也可以什么呢?我直接来B等于一个中号一,逗号二,逗号三,这是一个什么呀?是不是一个列表啊,我们这一直行是不是也没有问题呀,哎,这些都是可以去进行,比如说我们在这儿传一个列表也是可以的啊,所以这里边我就不再去具体说了,总之参数什么都能传啊,什么都不能传,诶假如说我这么来啊,我这么来。
03:00
看到了我直接来一个B等于FN,或者我直接干嘛呀,诶直接把它住了,我传一什么呢?我传一个FN2,然后我这传一个FN,我这么传行不行,这么传行不行,这FN是谁?FN是不是我们在上边定义的一个函数啊,那现在我这直接写了FN,注意我可没加括号,我可没有去调用这个函数,在这里我实际上是把FN作为了一个实参,是不是传递函数啊,那现在也就是说函数现在是不是变成了一个参数啊,那现在我问你A的值是谁,A的值是谁?哎,注意A的值就是谁呀,FN啊,A的值就是FN,那这个就是我们说一个实参啊,注意实参可以是任意类型的值,数字也行,不尔值也行,字符串也行啊,列表也行,想传什么你就能传什么,能理解吧,哎,所以注意啊,什么都能做为参数啊,什么都能传做为参数,所以这一块你不要以。
04:00
因为它是一个好处,其实它会存在一些问题,什么问题呢?比如说我这来一个啊第哎,我们定义一个FN3,这里边我定义两个参数,一个是A,一个是B,我们这个函数非常简单,就是print一下A加B啊,就是打印一下A加B,那这个时候我们注意了,我直接调一下FN3,我来个123逗号,一个456,那这样它是不是就给我算123加456啊,哎,这样当然是没有问题的,可以计算的,但是看着了,如果我是这么写的了,我不小心把这个东西写成了字符量了,那现在A是123 B是不是就是456了,哎,B就是456,那这个时候是不是就意味着他在将这个整数和字符链进行相加呀,哎,经行相加,这个时候你执行干嘛了,是不是就报错了,哎,不支持这个整形,还有字由串进行加法运算就给你报错了,所以你要注意了,它不会去检查参数的类型,那这样就会导致我们这接收的。
05:00
实际的实际13它有可能是不是各种类型啊,哎,所以我们一般情况下,如果是为了我们程序运行的严谨的话,我们在调的时候一定要注意传的参数的类型啊,一定要注意参数类型,你要注意它需要的是number的时候,你就不要传字符串,那这时候就会报错,而我们在定义函数时候,也尽量要在函数里来干嘛,来检查一下参数的类型,检查一下它是不是字符串,是不是number,是不是我们希望的类型,如果是我们希望的,我们才做进行运算,如果不是我们就不去做运算啊,当然我们还后边会说到这个异常的一个异常的一个检查啊,异常检查我们可以通过别的方式去处理这个异常,但是现在来讲我们尽量要干嘛,诶,第一个定义函数的时候,尽量把这东西给它想周全了,要干嘛呀,检查一下类型,第二一个调用函数的时候,明确一下你需要传的到底是什么类型的实参啊,什么类型的食参,好这是这块,然后我们接着往下说啊,接着往下说,那这个就是我们。
06:00
一个参数,参数其实相对来说比较的简单啊,比较简单,那这里我要演示一个问题啊,演示一个问题在这儿呢,我来定义一个FN4 FN4还是就一个参数,一个这个AA,我们这来一个print的一个A等于这来一个这个A啊,你会发现我这也定义AB,这也定义一个A,上边是不是还有ABC啊ABC但是注意啊,它们有没有关系啊,哎,没有关系,每一个函数当中的参数都是独立的啊,行参这个A就在这里边有效,在外边大它以外的地方是没有效的啊,无效的。好接着往下看啊,现在我这定义了一个A等于A,然后在这呢,我定义一个变量,我这来一个这个C吧,诶,C等于一个十,那现在我调一下FN4,我传一个C,我这一保存,我这一执行,是不是A就等于十了,诶A等于十了,那注意了,我现在做这样一个事啊,我现在在函数的外部打印一个C,我在函数外部。
07:00
打一个C,我们这一保存走一个C的值是不是也是12,哎,我这样啊,换一个我直接来一个这个C,等于我这来一个C,这一保存A的值是十,C的值也是十啊,那这时候注意我们现在是把这个十作为参数传到函数里了,哎,传到函数里了,在函数中注意了,我来给A进行重新赋值,A等于20,现在A等于20,毫无疑问这里A是不是变成20了,哎,这里的A变成20了,那现在我要问你的是C会不会变,C会不会变?哎,注意不用猜也知道,肯定不会变,为什么?因为我们在这里边A是不是相当于是一个变量啊,我在这里是不是在等于给这个变量进行重新赋值啊?哎,我给变量重新赋值,我们说了给变量重新赋值,会不会影响到其他变量,哎,不会影响到,所以这个时候C是不会变的啊,C是不会变的,我这一执行C变不变,诶A变成了20,但是C有没有变,诶C是不会改。
08:00
变的,所以注意我们这来写一下,在我们这个函数中,哎,函数中对我们行参进行重新赋值啊,重新赋值不会影响什么呀,诶影响其他的这个变量,这个这句话我们等于又重复了一遍,只要是给变量进行重新赋值,都不会影响别人,你爱怎么付怎么付,你就是改你自己对别人不会产生影响啊,不会产生影响,但是这里边注意了啊,我们来看一下,我把这注掉。老师注意掉啊,现在我换了C等于一个一逗号二逗号三,C现在是个列表对吧?C是个列表,我还是保存一下,我这一执行A等于123 B是不是也等C等于123呀,好,那现在在这儿啊,我来干嘛呢?现在A是一个什么呢?哎,A是一个列表。A是一个列表,列表我们来干嘛呢?我们来尝试修改我这个列表中的一个元素,非常简单,我直接来一个A中号零等于一个30啊,A中号零等于30,那注意了,现在我是在改变量还是在改对象,很明显我通过索引是不是改对象里边元素啊,所以这个是在改对象,而我们现在的C和A它们是不是同一个对象,哎,是同一个对象,所以这个时候我们来看一直行走一个。
09:26
是不是A和C都变了,哎,A和C都变了,所以这里边注意如果什么呢?如果我们的行参指向的是一个对象啊,是一个对象,当我们什么呢?哎,当我们通过这个行参去修改对象时啊,去修改对象时它会什么呢?它会影响到所有指向该对象的一个变量啊,会影响到所有指向该项的变量,所以这块你要注意,我们当去传C的时候,实际上是把C对应那个值或者是对应那个对象传到什么呀?传到函数里,所以当C等于十的时候,A就是什么呀,十当C等于123这个对象的时候,A就是谁,A就是123这个对象,这个时候我把C传进去,A和C它们指向的是什么?是同一个对象啊,A和C指向的是同一对象,所以在这如果你这看一下IDAIDA。
10:27
然后你这再看一下什么呢?看一下IDC,你会发现他们俩的ID是什么,是一样的啊,是一样的,所以这个时候你去改对象的话,由于A和C他们指向的是同一个对象干嘛?诶它会互相影响,你改A也会影响到C,你改C也会影响到A,因为他们指向的是同一个对象,这个跟我们之前讲的那个是一样的啊,你要考虑清楚到底是改变量还是在改对象,如果是改变量,你爱怎么改怎么改,对谁都没影响,只会影响你自己,而反过来你这如果是在改对象了,那对不起,所有的指向该变量的对象都会产生影响啊,所有的都会产生响,所以这你改A也会影响到C,那这个基本上我们所有的语言都是什么呀,都是这样一个特点啊,都是这样一个特点,诶那同学说,老师,我现在我不希望去,我希望A和C他们是独立的,也就是说我把C。
11:27
确实作为参数传进去了,但是我现在什么呢?我不希望当我去改A的时候影响到C,对吧,这个这个很常见,这个需求很常见,那怎么办?那怎么办?那如果你希望达成这么一个目的,那就意味着我们不能把这个对象直接传进去,而应该是什么,而应该是传一个这个对象的副本啊,我应该传递一个对象的副本,那我怎么来获取到对象的副本呀?哎,我们之前是不是说过一个函数叫做什么,一个方法叫做什么呀?叫做copy,所以在这儿我直接来一个C,点一个copy,那这样我传的就不是C了,而是C的一个副本啊,C对应这个列列表的一个副本,这个时候你再看我这一执行,你来看A变了,C变不变,没变,并且他们的ID1不一样,不一样,为什么不一样?因为这个时候A拿到就不是C了,而是C的一个什么呀,副本还记得copy吧,我们叫做一个浅复制,在这里我们实际上就是对C做了一个浅复制,然后传的是谁,然后传的是。
12:27
复制那个对象,而不是C本身啊,而不是C本身,这样可以或者也可以这么办呢,也可以这么传,直接传一个C中号,一个这个冒号,C中号一个冒号,这个是不是切片,诶切片没指定起始值,也没有指定结束值,那就是什么呀,就是从头到尾切,那这个时候切到也是一个列表的副本,这个时候你一看是不是也是互相独立的,诶也没有产生影响,所以当你去传的是一个可变对象的时候,而你又不希望在函数内部的操作会影响到外部的可变对象,你这个时候就可以选择传递一个什么呢?传递一个对象的副本,用这个像这列表就用点copy或者用什么呀中号来传就OK了,那就OK了。好,那关于参数我们就说这么多,简单总结一下参数,一定注意参数可以是任意的类型啊,可以是任意类型,什么都行,数字也好,租这也好,布尔值也好,什么那也好,以后我们学的各种各样的。
13:27
B项也好,甚至可以传什么,甚至可以传函数啊,甚至可以传函数,像刚才我们是不是就传了一个FN这函数,哎,我们这可以再演示一下啊,我们把刚才那个这个东西不太好理解,我们这里边需要再演示一下,呃,刚才我们是在这儿传的FN2这我们是不是传了一个FN作为函数,我们这一执行A的值就是什么,就是一个函数,并且实际上你不仅可以接收A这个函数,你可以干嘛呀,你这还可以去A括号干嘛去调用这个函数,123这一保存一执行是不是A等于一,B等于二,C等于三呀,哎,你甚至可以去调用这函数啊,所以注意参数十三可以是任意的对象,什么对象都行啊,什么对象都行,像函数这种情况还比较复杂一点,这个函数这种情况往后我们会专门来讲它,这种函数我们也称它为叫什么呢?叫回调函数啊,叫回调函数现在我们先不提它,你现在要知道就是一件事儿,13可以是任意的数据类型,你看这句话我说。
14:27
很多遍了,很多遍了,一定要记住,什么都行,什么对象都可以作为食材来传递,好,我们来听一下。
我来说两句