首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

第十讲——函数(二)

第十讲——函数(二)

上一讲我们讲解了无参数无返回值和有参数有返回值的函数的定义以及使用,还有两种:有参数无返回值和有参数有返回值的函数,今天给大家讲解一下。(本次文章建议大家仔细阅读!)

有参数无返回值:

在此之前,我们先来了解一下什么是参数。

PS:为了简洁易懂,一下的函数代表了Python中的函数以及方法两种东西。

参数,也叫参变量,是一个变量,分为两种:形参(形式参数)和实参(实际参数),在英语里,参数这个词语的单词叫做argument。

形参:当我们定义一个函数时,同时声明调用这个函数时需要给这个函数多少个变量,分别是什么类型,在这个函数中这些变量叫什么,那么这个变量就叫做形参,形参本身不占用内存空间,当调用函数并且传递了参数时才会占用内存空间,当函数执行完毕,这个内存空间即被释放,里面的内容被销毁。

实参:即,我们调用函数时给这个函数传递的这个参数就叫做实参,实参是实际存在的一个变量,这个变量是可以读取到值并且可以传递到函数中的。

下面写个例子给大家作为参考:

上面的例子中,我定义了一个函数,叫做 foo ,他有一个参数,叫做args(这个args只是一个名字,可以随意更改),在函数体内部,我使用 print 函数打印出了这个值(这里使用的名字要和我们上面定义形参的名字一样)。

在函数体下面,我们定义了一个变量,叫 num,里面存的内容是整型 100,foo(num) 的意思就是,调用这个函数,在括号内写入这个变量(也可以直接写值,这样直接就把值给过去了),我们就把这个值传递进去了,要注意的是,这边传入什么类型的变量,那边接收就是什么类型的变量。

当然,我们也可以写多个形参,如下面的例子

上面的例子中,我们使用了两个形参,去接收两个参数,执行的功能是原样打印。

当函数去接收参数时,是按照传递实参的顺序去接收的,即,你的形参写在了第几个,就由第几个对应的形参接收。

但是,我们写了多少个形参,就必须传递多少个实参!这个如果不符合就会错误,即不能少,也不能多!

在Python中,允许指定形参传值,这也就是说,我们只要能记住有哪些形参,我们不必按照顺序来传递,但是必须指定参数的名字,如下面的例子:

就像上面这个例子一样,指定了哪个参数去接收哪一个变量之后,就可以任意的改变顺序,但是,建议无论怎么传递实参,都按照形参的顺序去写!

作为以上的总结,我们写一个实际的应用,比如,解方程 y = a^x(a的x次方,在这篇文章中不表示异或),传递两个参数,分别是 a 和 x,打印得到的 y 的值:

如果上面的都了解了,我们继续看下面:

有参数有返回值函数:

就像最开始我们说的,函数的目的是完成一个指定的功能,所以我们有时候就想知道这个函数结束时什么状态,或者我们需要拿到函数执行的结果去继续执行下面的步骤,这时候,就需要我们去使用这种有参数有返回值的函数了!

在上一讲中,我们讲解了怎么使用返回值,刚刚讲解了怎么使用我们的参数,那么我就直接写一个例子,假设有这么一个系统,拿到了用户的用户名和密码去登陆,大致流程图如下:(手工绘图,请谅解不太美丽)

在这个程序中,我们将验证密码这个功能封装成为一个函数,接收两个参数:用户名和密码,做出判断后,返回True或者False,在主程序中打印成功或者失败,代码如下:

我们首先定义了一个函数叫做CheckUserPasswd,在主程序中调用时,传入了这个函数需要的两个参数,使用result 变量接收我们的用户名和密码是否正确,最后打印输出,结束程序。

还没完呢!

Python中传递参数有一个特点,即传递地址!

也就是说,Python中传递参数后,形参和实参指向了同一个地址,函数结束后并不是销毁内存而是销毁这个指针,那么,有一个大胆的想法:

猜一下输出的结果,是10?还是20?

是的,没错,结果是20:

可是刚刚不是说,是地址传参吗?怎么没有修改地址中的内容呢?

在刚开始教大家定义变量时讲过,Python中的赋值,是划分了一块内存,里面存了一个内容,然后用这个名字指向它,重新赋值时,即让这个名字重新指向了另一块内存,所以最后我们不能修改原地址内存中的东西,给大家证明一下:

上面的图片是我们的代码,下面的图片是结果,从这个结果我们可以看到,函数中赋值之后,这个num变量的地址变化了,所以才造成了这个结果,大家明白了吗?

最后一点了!

那么怎么才能利用这个传递地址的特性呢?

赋值会造成id更改,之前我们讲过,如果使用其他的诸如append的命令,是直接在原内存上更改的,这里适用吗?来试试看!

代码如上图:大家先来猜一猜再看结果!

不要想下看答案哦!

不要翻了!

想一想再向下翻嘛!

确定不再想一想了!

确定一下自己的答案!

好吧,那就给你看答案了!

故意的很多换行!

觉得不错的话,转发点赞是对我最大的鼓励

^_~

谢谢观看

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181212G1JUBD00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券