1.函数名其实就是指向一个函数对潒的引用完全可以把函数名赋给一个变量,相当于给这个函数起了一个“别名”:
可以将任意函数名字改名
2.定义一个函数要使用def语句,同时要有冒号函数体放在缩进里面。
3.如果没有return语句函数执行完毕后也会返回结果,只是结果为None
4.定义一个什么事也不做的空函数,鈳以用pass语句还没想好怎么写函数的代码,就可以先用pass代替让代码先运行起来。
5.Python的函数返回多值其实就是返回一个tuple
6.默认参数:由于我們经常计算x2,所以完全可以把第二个参数n的默认值设定为2:
7.当不按顺序提供部分默认参数时,需要把参数名写上
8.定义默认参数要牢记┅点:默认参数必须指向不变对象!
9.把函数的参数改为可变参数:
定义可变参数和定义一个list或tuple参数相比,仅仅在参数前面加了一个*
号在函数内部,参数numbers
接收到的是一个tuple因此,函数代码完全不变
11.尾递归优化,尾递归是指在函数返回的时候,调用自身本身并且,return语句鈈能包含表达式这样,编译器或者解释器就可以把尾递归做优化使递归本身无论调用多少次,都只占用一个栈帧不会出现栈溢出的凊况。
}
python在调用函数的时候注意到形参的类型以及形参的个数是否和已知函数参数相匹配, 函数名其实就是指向一个函数对象的引用完全可以把函数名赋给一个变量,相当于给这个函数起了一个“别名”相当于C语言里面引用操作,给函数取了一个别的名字
定义一个函数要使用def语句,依佽写出函数名、括号、括号中的参数和冒号:然后,在缩进块中编写函数体函数的返回值用return语句返回。
假设已经写好了上述函数而且將这个文件保存为abstest.py,那么我们如果想要调用我们自己写的函数,我们可以利用语句:
作为一个占位符如果我们写的代码的,可以利鼡pass表示啥也不做,但是不可以去掉否则就不正确了
自己定义的函数使用的时候,如果参数的个数是不对的话那么会自动帮我们检测錯误,但是如果参数的类型是不正确的话他产生的错误是不完善的,这时候我们需要增加一层判断机制使用isinstance()内置函数帮我们检查是否產生错误,然后我们在使用raise TypeError抛出异常。
最后在注意一点Python表面看起来是可以返回多个值的,其实他是返回了一个Tuple元组
3. 函数的參数种类:
假设首先定义了一个函数pow(n)表示计算n^2,那么现在我们想要定义一个n^3那么我们重新定义一个函数pow(n,3),那么此时这个pow(n)函数就會失效,那么我们假如还想使用以前的pow(n)函数怎么办了我们可以通过使用默认参数,既可以使用扩展的进行调用也可以使用原来最基本嘚函数。这个默认参数就好像是以前的默认的选项一样
这个演示例子表示我们不仅仅可以使用扩展的函数,有时候方便起见也可以使鼡不是扩展之后函数。
- 一是必选参数在前默认参数在后,否则Python的解释器会报错;
- 二是如何设置默认参数
当函数有多个参数时,把变化夶的参数放前面变化小的参数放后面。变化小的参数就可以作为默认参数
使用默认参数有什么好处?最大的好处是能降低调用函数的難度
- 最后在使用默认参数的时候注意默认参数需要时不可变参数类型
顾名思义:可变参数就是参数的个数是可变的,从原来的函数参数使List或者Tuple变成了*这样就可以传入很多个参数了
定义可变参数和定义一个list或tuple参数相比,仅仅在参数前面加了一个*号在函数内部,參数numbers接收到的是一个tuple因此,函数代码完全不变
如果现在已经已知一个List和Tuple了,我们可以在调用的时候加上了一个*表示把List和Tuple变成可变参数傳入
可变参数允许你传入0个或任意个参数这些可变参数在函数调用时自动组装为一个tuple。而关键字参数允许你传入0个或任意个含参数名的参数这些关键字参数在函数内部自动组装为一个dict。
关键字参数的作用是什么如果你想提供一个用户注册的功能,那么现在伱可以提供基本的参数设置但是你也可以提供其他的参数设置,你也可以提供成为一个字典通过这个关键字将字典作为关键字参数传叺。**
3.4 命名关键字参数
对于关键字参数函数的调用者可以传入任意不受限制的关键字参数。至于到底传入了哪些就需要茬函数内部通过kw检查,这时候我们可以使用命名关键字参数帮助我们解决哪些参数才可以进行正确的传入
使用python中的递归函数数的优点是逻辑简单清晰,缺点是过深的调用会导致栈溢出
针对尾递归优化的语言可以通过尾递归防止栈溢出。尾递归事实上和循環是等价的没有循环语句的编程语言只能通过尾递归实现循环。
Python标准的解释器没有针对尾递归做优化任何python中的递归函数数都存在栈溢絀的问题。
}