函数
建立函数
在Python中,规定了一种定义函数的格式,下面的举例就是一个函数,以这个函数为例来说明定义函数的格式和调用函数的方法。
|
|
定义函数的格式为:
|
|
几点说明:
- 函数名的命名规则要符合Python中的命名要求。一般用小写字母和单下划线、数字等组合,有人习惯用aaBb的样式,但我不推荐
- def是定义函数的关键词,这个简写来自英文单词define
- 函数名后面是圆括号,括号里面,可以有参数列表,也可以没有参数
- 千万不要忘记了括号后面的冒号
- 函数体(语句块),相对于def缩进,按照python习惯,缩进四个空格
函数命名
Python对命名的一般要求:
文件名:全小写,可使用下划线
函数名:小写,可以用下划线风格单词以增加可读性。如:myfunction,my_example_function。注意:混合大小写仅被允许用于这种风格已经占据优势的时候,以便保持向后兼容。有的人,喜欢用这样的命名风格:myFunction,除了第一个单词首字母外,后面的单词首字母大写。这也是可以的,因为在某些语言中就习惯如此。但我不提倡,这是我非常鲜明的观点。
函数的参数:命名方式同变量(本质上就是变量)。如果一个参数名称和Python保留的关键字冲突,通常使用一个后缀下划线会好于使用缩写或奇怪的拼写。
变量:变量名全部小写,由下划线连接各个单词。如color = WHITE,this_is_a_variable = 1。
调用函数
定义函数
|
|
普通调用
|
|
还可以直接把赋值语句写到里面,就明确了参数和对象的关系。当然,这时候顺序就不重要了
|
|
多态调用
|
|
##注意事项
下面的若干条,是常见编写代码的注意事项:
- 别忘了冒号。一定要记住复合语句首行末尾输入“:”(if,while,for等的第一行)
- 从第一行开始。要确定顶层(无嵌套)程序代码从第一行开始。
- 空白行在交互模式提示符下很重要。模块文件中符合语句内的空白行常被忽视。但是,当你在交互模式提示符下输入代码时,空白行则是会结束语句。
- 缩进要一致。避免在块缩进中混合制表符和空格。
- 使用简洁的for循环,而不是while or range.相比,for循环更易写,运行起来也更快
- 要注意赋值语句中的可变对象。
- 不要期待在原处修改的函数会返回结果,比如list.append(),这在可修改的对象中特别注意
- 调用函数是,函数名后面一定要跟随着括号,有时候括号里面就是空空的,有时候里面放参数。
- 不要在导入和重载中使用扩展名或路径。
返回值
所谓返回值,就是函数向调用函数的地方返回的数据。
编写一个斐波那契数列函数:
|
|
返回多个值元组
|
|
对这个函数,我们还可以用这样的方式来接收函数的返回值。
|
|
函数文档
|
|
|
|
参数收集
函数参数的个数也有不确定的时候,怎么解决这个问题呢?Python用这样的方式解决参数个数的不确定性。
元组形式
|
|
字典形式
|
|
一种优雅的方式
|
|
综合
def foo(p1, p2, p3, …)
|
|
def foo(p1=value1, p2=value2, …)
|
|
def foo(*args)
这种方式适合于不确定参数个数的时候,在参数args前面加一个*
|
|
def foo(**args)
这种方式跟上面的区别在于,必须接收类似arg=val形式的。
|
|
特殊函数
lambda
|
|
lambda函数的使用方法:
- lambda后面直接跟变量;
- 变量后面是冒号;
- 冒号后面是表达式,表达式计算结果就是本函数的返回值;
lambda函数不能包含太多的命令,包含的表达式不能超过一个,不要试图向lambda函数中塞入太多的东西,如果需要更复杂的东西,应该定义一个普通的函数。
map
|
|
map()是Python的一个内置函数,它的基本样式是:map(fun,seq)
func是一个函数,seq是一个序列对象。在执行的时候,序列对象中的每个对象,按照从左到右的顺序依次被取出来,塞入到func函数里面,并将func的返回值依次存到一个列表中。
reduce
reduce()是横着逐个元素进行运算
|
|
filter
|
|
练习
求解一元二次方程
|
|
统计考试成绩
|
|
找质数
质数又称素数,指在大于1的自然数中,除了1和此整数自身外,无法被其他自然整数整除的数(也可定义为只有1和本身两个因数的数)
|
|
编写函数的注意事项
- 尽量不要使用全局变量
- 如果参数是可变数据类型,则在函数内不要修改它
- 每个函数的功能和目的要单一,不要一个函数试图做很多事情
- 函数的代码行数尽量少
- 函数的独立性越强越好,不要跟其他的外部东西产生关联