Linux下Python学习笔记 3:函数

一、什么是函数

函数简单来理解就是数字按一定规律重复出现的规则,我们知道圆的面积计算公式为:S = πr²,当我们知道半径r的值时,就可以根据公式计算出面积。在编程中函数被进一步封装成了方法,接收外部传入的参数来带入规则,继而返回相应的结果。那方法的封装其实是一种抽象的结果。

抽象是数学中非常常见的概念。举个例子:

计算数列的和,比如:1 + 2 + 3 + ... + 100,写起来十分不方便,于是数学家发明了求和符号∑,可以把1 + 2 + 3 + ... + 100记作:

100
∑n
n=1

这种抽象记法非常强大,因为我们看到∑就可以理解成求和,而不是还原成低级的加法运算。

而且,这种抽象记法是可扩展的,比如:

100
∑(n²+1)
n=1

还原成加法运算就变成了:

(1 x 1 + 1) + (2 x 2 + 1) + (3 x 3 + 1) + ... + (100 x 100 + 1)

可见,借助抽象,我们才能不关心底层的具体计算过程,而直接在更高的层次上思考问题。

写计算机程序也是一样,函数就是最基本的一种代码抽象的方式。

Python不但能非常灵活地定义函数,而且本身内置了很多有用的函数,可以直接调用。

 

二、调用函数

Python内置了很多有用的函数,我们可以直接调用。要调用一个函数,需要知道函数名称参数,比如求绝对值的函数 abs,它接收一个参数。

可以直接从Python的官方网站查看文档:http://docs.python.org/2/library/functions.html#abs

也可以在交互式命令行通过 help(abs) 查看abs函数的帮助信息。

调用 abs 函数:

调用函数的时候,如果传入的参数数量不对,会报TypeError的错误,并且Python会明确地告诉你:abs()有且仅有1个参数,但给出了两个:

如果传入的参数数量是对的,但参数类型不能被函数所接受,也会报TypeError的错误,并且给出错误信息:str是错误的参数类型:

而比较函数 cmp(x, y) 就需要两个参数,如果 x<y,返回 -1,如果 x==y,返回 0,如果 x>y,返回 1

Python内置的常用函数还包括数据类型转换函数,比如   int()函数可以把其他数据类型转换为整数:

str()函数把其他类型转换成 str:

sum()函数可以累加:

当然还有更多通用的函数,具体使用时可以查阅文档。

三、编写函数

在Python中,定义一个函数要使用 def 语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用 return语句返回。

我们以自定义一个求绝对值的 my_abs 函数为例:

请注意,函数体内部的语句在执行时,一旦执行到return时,函数就执行完毕,并将结果返回。因此,函数内部通过条件判断和循环可以实现非常复杂的逻辑。

如果没有return语句,函数执行完毕后也会返回结果,只是结果为 None。

return None可以简写为return。

四、返回多值

函数可以返回多个值吗?答案是肯定的。

比如在游戏中经常需要从一个点移动到另一个点,给出坐标、位移和角度,就可以计算出新的坐标:

# math包提供了sin()cos()函数,我们先用import引用它:

但其实这只是一种假象,Python函数返回的仍然是单一值,我们使用一个变量去接收它:

会发现返回的是一个tuple,但是,在语法上,返回一个tuple可以省略括号,而多个变量可以同时接收一个tuple,按位置赋给对应的值,所以,Python的函数返回多值其实就是返回一个tuple,但写起来更方便。

写一个函数,返回一元二次方程:ax² + bx + c = 0的两个解:

求根后 x = (-b±√(b²-4ac)) / 2a

五、递归函数

在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。

举个例子,我们来计算阶乘 n! = 1 * 2 * 3 * ... * n,用函数 fact(n)表示,可以看出:

fact(n) = n! = 1 * 2 * 3 * ... * (n-1) * n = (n-1)! * n = fact(n-1) * n

所以,fact(n)可以表示为 n * fact(n-1),只有n=1时需要特殊处理。

于是,fact(n)用递归的方式写出来就是:

如果我们计算fact(5),可以根据函数定义看到计算过程如下:

===> fact(5)
===> 5 * fact(4)
===> 5 * (4 * fact(3))
===> 5 * (4 * (3 * fact(2)))
===> 5 * (4 * (3 * (2 * fact(1))))
===> 5 * (4 * (3 * (2 * 1)))
===> 5 * (4 * (3 * 2))
===> 5 * (4 * 6)
===> 5 * 24
===> 120

递归函数的优点是定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。

使用递归函数需要注意防止栈溢出。在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。可以试试计算 fact(10000)。

六、定义默认参数

定义函数的时候,还可以有默认参数。

例如Python自带的 int() 函数,其实就有两个参数,我们既可以传一个参数,又可以传两个参数:

int()函数的第二个参数是转换进制,如果不传,默认是十进制 (base=10),如果传了,就用传入的参数。

可见,函数的默认参数的作用是简化调用,你只需要把必须的参数传进去。但是在需要的时候,又可以传入额外的参数来覆盖默认参数值。

我们来定义一个计算 x 的N次方的函数:

可以看到默认值为2,调用的时候只传入x则相当于x²。

同其他语言一样,默认参数只能定义在非必需参数的后面。

七、定义可变参数

如果想让一个函数能接受任意个参数,我们就可以定义一个可变参数:

可变参数的名字前面有个 * 号,我们可以传入0个、1个或多个参数给可变参数:

可变参数也不是很神秘,Python解释器会把传入的一组参数组装成一个tuple传递给可变参数,因此,在函数内部,直接把变量 args看成一个 tuple 就好了。

定义可变参数的目的也是为了简化调用。假设我们要计算任意个数的平均值,就可以定义一个可变参数:

时间: 2024-10-12 17:40:33

Linux下Python学习笔记 3:函数的相关文章

Linux下Python学习笔记 2:条件判断、循环

一.条件判断 if 语句 比如,输入用户年龄,根据年龄打印不同的内容,在Python程序中,可以用if语句实现: 注意: Python代码的缩进规则.具有相同缩进的代码被视为代码块,上面的3行 print 语句就构成一个代码块(但不包括第4行的print).如果 if 语句判断为 True,就会执行这个代码块. 缩进请严格按照Python的习惯写法:4个空格,不要使用Tab,更不要混合Tab和空格,否则很容易造成因为缩进引起的语法错误. 在ubuntu下的vim中需要设置tab默认为4个空格,可

Linux下Python学习笔记 1:数据类型

一.开发环境 开发Python的环境选择很多,windows.Linux.MacOs都可以,除了Windows需要在Python官网上下载安装包,并配置环境变量.在Linux和MacOs上都是自带Python的,关于Python的版本大多都是2.7.* 本文选择了Ubuntu环境来学习Python,主要原因是为了顺便熟悉Linux的环境与命令,开发工具选择的是Vim,当然更多其他的选择有Eclipse.Sublime.pycharm等等,根据个人喜好选择即可, 另:文章部分内容来自Imooc和5

python学习笔记之函数总结--高阶函数以及装饰器

python学习笔记之函数总结--高阶函数以及装饰器 Python特点: 1.不是纯函数式编程(允许变量存在): 2.支持高阶函数(可以传入函数作为变量): 3.支持闭包(可以返回函数): 4.有限度的支持匿名函数: 高阶函数: 1.变量可以指向函数: 2.函数的参数可以接收变量: 3.一个函数可以接收另一个函数作为参数: 下面我将示例一些函数的写法以及使用,并说明python中函数的特性: 1.基本的高阶函数示例: #!/usr/bin/env python def func():      

Python学习笔记003_函数

>>> # 函数>>> def myFirstFunction(params1,params2...): print("这是我的第一个函数!") print("Python你好吗?") >>> #调用函数>>> >>> myFirstFunction()这是我的第一个函数!Python你好吗? >>>  # 函数的返回值  return #函数文档, 就是函数

Python学习笔记6-python函数补充、装饰器、模块

本文主要学习内容有 函数知识的补充 装饰器(无参.有参.非固定参数.有返回值) 函数知识的补充 稍后待续...

Python学习笔记:函数

Python函数 先来看下面代码: def welcome_info(): "显示欢迎信息" print("Hello World!") return 0 如上代码,就定义了一个函数. 调用后的结果为: welcome_info() #调用函数 Hello World! #调用结果 这里,我们引用一下Python官方文档对Python函数的定义: The keyword def introduces a function definition. It must be

Linux下git学习笔记(一)

我是跟着廖雪峰大神的博客学习git的,他讲的非常容易懂 (http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000),然后自己跟着学的时候并不是很顺利,向github提交代码的时候老是报错,不过最后google很久之后给解决了. 先回顾下今天学的吧 一:在Linux上安装Git sudo apt-get install git 因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:

python学习笔记之——函数模块

1.函数参数说明: def login(name,info,passwd = '123456') 函数参数可以有默认值,调用函数时: 1.如果只传二个参数,则有默认值的一定要放到最后: def login(name,passwd = '123456',info='welcome to you') 2.如果传二个参数,一定要指明形参: login(user) login(user,passwd) login(user,info='欢迎') login(user,info='欢迎',passwd='

python 学习笔记day07-python函数高级应用

函数高级应用 变量作用域 全局变量 标识符的作用域是定义为其声明在程序里的可应用范围,也就是变量的可见性 在一个模块中最高级别的变量有全局作用域 全局变量的一个特征是除非被删除掉,否则它们的存活到脚本运行结束,且对于所有的函数,他们的值都是可以被访问的 局部变量 局部变量只是暂时地存在,仅仅只依赖于定义他们的函数现阶段是否处于活动 当一个函数调用出现时,某局部变量就进入声明他们的作用域,在那一刻,一个新的局部变量名为那个对象创建了 一旦函数完成,框架被释放,变量将会离开作用域 如果局部与全局有相