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

第31天,我终于被递归打败了,禁止套娃太应该了!

今天主要学的内容是多值参数和递归两部分内容,多值参数还好,虽然有一点绕,但琢磨下也就过去了。

但是,递归是真的难,完全是对脑回路的考验。

绕老绕去的,太折腾人了。

以前有人说禁止套娃我还不太明白原因,现在看来,估计都是被递归毒打过的可怜人吧。

多值参数

253集,定义及作用

开发时,有时定义的函数处理的参数 个数 是不确定的,这个时候,就可以使用 多值参数。

Python 有 两种 多值参数:参数名前增加 一个 * ,可以接收元组;参数名前增加 两个 * ,可以接收 字典。

一般给多值参数命名时,习惯使用以下两个名字:*args(argumengts),存放 元组 参数,前面有一个 * ;**kwargs(keyword) 存放 字典 参数,前面有两个 * 。

使用多值参数的时候,调用的时候,依然用逗号一个个分割每个参数。

提示:多值参数 的应用会经常出现在网络上一些大牛开发的框架中,知道多值参数,有利于我们能够读懂大牛的代码。

254集,数字累加案例演练

演练需求:定义一个函数 sum_members ,可以接收的 任意多个整数。功能要求:将传递的 所有数字累加 并且返回累加的结果。

多值参数可以让函数传递参数时更加简单。

255集,元组和字典的拆包

在调用带有多值参数的函数时,如果希望:将一个 元组变量,直接传递给 args;将一个 字典变量,直接传递给 kwargs 时,就可以使用拆包,简化参数的传递。

比如下面这个例子,就把两个变量都按照元组输出了。

问题是,我演练了一下,如果直接把形参的星号去掉,直接就可以正常输出了,所以没必要拆包啊,这不是多此一举了嘛。

拆包的方式是:在 元组变量前,增加 一个* ;在字典变量前,增加 两个**。

拆包语法,可以简化元组变量和字典变量的传递。

递归

256集,递归的特点及基本代码演练

函数调用自身的 编程技巧 称为递归。

既然函数内部可以调用其他函数,当然在函数内部也可以调用自己。

代码特点:函数内部的 代码 是相同的,只是针对 参数 不同,处理的结果不同;

当参数满足一个条件时,函数不再执行,这点非常重要,通常被称为递归的出口,否则 会出现死循环!

257集,递归演练代码的执行流程图

将上一集的程序进行更详细的讲解。

虽然在代码中,我们只调用了1次函数,但函数在执行时,调用了3次。

递归的出口非常重要,只有到达了出口,函数才会一层一层返回。

感觉递归这东东,有点盗梦空间的意思啊。

258集,递归实现数字累加

需求:定义一个函数 sum_numbers;能够接收一个 num 的整数参数,计算 1+2+......+num 的结果。

写递归程序时候,第一步就要考虑出口问题。

这个程序有点没看懂,比如:

他第一句说根据需求倒过来考虑出口是啥意思?

把数字1当成出口的概念是倒序计算吗?

为什么要设定出口是 num ==1?

为啥 return 是 1?

设定temp 的逻辑是怎么来的?

他这个假设 sum_numbers 能够正确处理累计,这个假设意义何在?

259集,数字累加的执行流程图

用配图再次演练上一集案例,这次得带着疑问好好听课了。

验证了我上一集的猜测,确实是数字是从大到小开始进行调用,然后再从小到大开始进行相加。

所以关键点是2个:

第一个:把数字1作为出口,因为1是最后一次函数调用的结果。

第二个:大胆的假设,实现加法。

这个思维实际上就是逆向思维。

不得不说,想出这些算法思路的人,真是天才!

提示:递归是一个 编程技巧,初次接触递归会感觉有些吃力。在处理 不确定的循环条件时,格外的游泳,例如:遍历整个文件目录的结构。

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

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券