前言
什么是函数?在中学时代或者数学领域中你也许会得到这样的回答:函数的定义是给定一个数集A,假设其中的元素为x,对A中的元素x施加对应法则f,记作f(x),得到另一数集B,假设B中的元素为y,则y与x之间的等量关系可以用y=f(x)表示,函数概念含有三个要素:定义域A、值域B和对应法则f。其中核心是对应法则f,它是函数关系的本质特征。但是在我么计算机领域中函数有了另一种理解,它是神圣的。它是指一段可以直接被另一段程序或代码引用的程序或代码。也叫做子程序、(OOP中)方法。一个较大的程序一般应分为若干个程序块,每一个模块用来实现一个特定的功能。所有的高级语言中都有子程序这个概念,用子程序实现模块的功能。今天呢咱就带领大家了解一下计算机语言中的函数是一种什么情况。
一、为什么计算机中要有函数?
有时一段代码可能要使用很多次,每次只是变量的大小进行了细微的改变,如果不封装成函数
可能每次使用的时候都需要重复的写一次。写成函数可以实现一段代码重复使用
对于计算机编程,我们期望程序的模块化设计,而函数正是将代码进行模块化的典型。通过将能够实现某种功能的一段代码装进函数,使用的时候再调用相应的函数。
函数的使用可以使代码更加严密更加有条理。
将一个项目切分成很多小的模块,然后可以多人协作。提高开发效率
函数的递归可以简单实现许多算法 如:汉诺塔
二、Python的函数分类
1.内置函数
直白的说就是你下载完Python IDEL后不需要进行导入包能够直接使用的函数
例如print()、abs()、len()等等
代码如下:
print("Hello") abs(-1) len("Hello World")
2.标准库函数
标准库的会伴随着Python的安装而安装,不过使用里面的包时需要先导入
使用的规则如下:
代码如下:
import math print(math.pi)
3.第三方库函数
第三方库最典型的特点就是需要自己单独进行下载或者安装
安装之后进行导入使用
代码如下:
import pandas as pd data = pd.read_csv( 'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv') print(data.head())
4.用户自定义函数
自己定义的函数函数名自己起参数自己设置,函数的功能自己定制
这也是我们今天要重要强调的内容,先看看一个成型的函数。
代码如下:
def print99(): for teg in range(1,10): temp=1 while temp<=teg: print(str(temp)+'*'+str(teg)+'='+str(teg*temp),end=' ') temp+=1 print() if __name__=="__main__": print99()
三、Python中函数的组成部分及特点
1.声明一个函数
一个函数的组成大致是这样的【函数声明】
''' def是对函数进行声明,f为函数名 Python语句块是要求格式化的,所以函数体(这里pass做的占位符)在 函数声明下要进行缩进,并且参数列表括号后面要跟上:(冒号) ''' def f(参数列表): pass
2.函数特点的剖析
Python中的函数特点:
函数使用比较简单与其他语言一样函数名后加括号调用(不过调用函数之前一定要先进行函数声明)
函数可以有返回值但是不是必须有返回值(无返回值函数执行完毕后结果为None)
函数是一个表达式,可以直接用于计算(加减乘除)
Python中的函数可以作为变量直接赋值。
Python函数返回一个值,但是经过操作支持多返回值(可以返回一个元组,元组内存多个值)
函数从声明到执行:
def是执行语句,Python解释执行def语句会创建一个函数对象,并绑定到函数名变量
调用函数前必须先执行def 语句,也就是函数的声明,创建函数对象
执行的时候使用 函数名(),也就是相应的函数对象实现函数的调用。
使用外部函数的时候先进行包的导入,在导入包的时候会初始化函数对象。
四、函数参数详解
1.按照参数的定义划分
①形式参数
形式参数顾名思义仅仅是一种形式上的参数,主要用于函数的参数类型声明,在Python中体现的不是很明显,但是在C或C++上能够明显的体现出来。在C++中函数声明的参数列表可以只写函数的类型。然后调用函数的时候传入对应类型的参数。形式参数的作用域仅仅在该函数范围内。
②实际参数
实际参数顾名思义就是实际的参数,换句话说也就是在调用函数的时候实实在在传进去的参数。此时的参数变量类型要与函数形式参数相对应,要有人为赋予的值。
#此时的i就是形式参数、“Tom”就是实际参数 def pType(i): print(type(i)) pType("Tom")
2.按照参数的使用方法划分
根据参数的定义划分可以划分为形参、实参。根据参数的使用方法划分可以划分为位置参数、可变参数、可选参数、命名参数。
①位置参数
位置参数的意思就是根据形式参数的位置,传入相应的实际参数。函数的参数列表是有限个 并且参数没有默认值,调用函数的时候必须在对应位置传入对应参数。 def pType(i): print(type(i))
②可变参数
前面提到了位置参数,是有限个并且必须在指定位置传入指定参数。 可变参数与其相反,它可以传入任意个数个参数,并且类型无需保持一致。 可变参数的传参方方式有两种一种是变量前加单*,一种是变量前加双*。 加单星的称为元组可变参数,加双星的是字典可变参数。(可变参数一般放在参数列表的末尾) 要切记如果元组可变参数与字典可变参数同时出现在函数参数列表中要将元组可变参数放在前面
[1]元组可变参数
元组可变参数指的是传进来的参数会以元组的形式进行储存。 def pr1(a,b,*c): print(a) print(b) print(c)
[2]字典可变参数
字典可变参数是传进来的参数会以字典的形式进行储存,最典型的特征就是传参时必须以命名参数形式传参 命名参数接下来会讲,使用这种方式的原因得益于字典可变参数是字典形式,要有键值对。 def pr2(a,b,** c): print(a) print(b) print(c)
[3]字典元组可变参数
字典可选参数放在参数列表最后,因为元组可选参数根据位置进行选参,如果将其放在字典可选参数后面会 导致命名参数后面的参数无法传入,程序抛出异常。而将命名参数放在最后正好弥补这种缺陷。
def pr3(a,b,*c,**d): print(a) print(b) print(c) pr3(1,2,3,age=4,p=2,q=3,w=4,e=3,r=24)
③可选参数
可选参数就是调用函数的时候可以传入该参数,也可以不传入该参数,如果不传人参数的话就使用 该参数在定义函数的时候的默认值。【如果参数列表有可变参数,传参的时候会先给可选参数再给可变参数】 def pr1(a,b=10): print(a) print(b)
④命名参数
命名参数使用的时候要将参数名体现出来,也就是说,传参的时候可以跟参数位置无关,但是需要使用参数名传参 一般的情况下命名参数有可无,在有字典可变参数或者经过我们处理的时候,相关的参数必须显式传递。
命名参数的大致形式
def pr1(a,b): print(a) print(b) #这两种调用方式一样。 pr1(10,11) pr1(b=11,a=10)
强制命名参数
def pr1(*,a,b): print(a) print(b) #这两种调用方式一样。 # pr1(10,11) 这种方式报错 pr1(b=11,a=10)
五、递归函数
1.定义
在计算机语言中,如果一个函数调用了自身那么这个函数被称为递归函数。
# 汉诺塔 def h(n,a,b,c): if n==1: print(a,"--->",c) else: h(n-1,a,c,b) h(1,a,b,c) h(n-1,b,a,c) h(4,"A","B","C")
2.递归函数需要满足的条件
- 递归必须有终止条件
- 必须保证随着递归次数增加相关变量向终止条件收敛
- 必须清楚递归不能次数太多,递归次数超限将影响计算机内存。
六、函数式编程
函数式编程是种编程方式,函数式编程语言最重要的是函数可以接受函数当作输入(参数)和输出(返回值)。和指令式编程相比,函数式编程强调函数的计算比指令的执行重要。和过程化编程相比,函数式编程里函数的计算可随时调用。
1.函数对象
作为Python中的函数,是以对象的形式存在的。对象可以用于参数传递,作为返回值
作为变量进行赋值等等。
2.高阶函数
如果一个函数的参数或者返回值中包含另外一个函数,那么该函数被称为高阶函数。
3.Lambda表达式和匿名函数
在Python中有许多内置函数均为高阶函数,例如map、filter。使用他们的时候往往
需要传递一个函数进去,作为处理变量的标准。这种被作为参数的函数被称为回调函数。
一般不会很大,只需要满足一些小功能。所以我们喜欢传递匿名函数进去。
而Lambda表达式的作用就是创建小型的匿名函数,规则如下:
lambda 参数列表:函数体
以下程序运行结果为
其中map与filter前的*意思是解包。显示出列表信息。
print(*map(lambda x,y:x+y,range(5),range(5))) print(*filter(lambda x:x%2==0,range(10)))
4.函数装饰器的简单使用
函数装饰器就是套在函数外层的一个躯壳,用于初始化内部函数执行的环境。
装饰器返回一个修改之后的函数对象,装饰器是一种设计模式。一个函数可以有多个装饰器。
装饰器的具体语法如下:
import time #装饰器函数 def timeit(func): def wrapper(*s): start=time.perf_counter() func(*s) end=time.perf_counter() print('运行时间:',end-start) return wrapper #函数使用装饰器 @timeit def mysum(n): sum=0 for i in range(n):sum+=i print(sum) #调用函数 mysum(10)
总结
Python是一门即支持面向对象又支持面向过程的语言,并且Python中一切皆对象,函数式编程使其编程起来十分灵活。熟练地掌握函数可以使我们代码更为规范。到此函数篇也就结束了,函数装饰器大家可以深入地学习一下。本篇大家就重点掌握参数运用以及Lambda表达式。