四,程序流程控制之函数

函数

为什么需要函数?

思考以下代码:

 if cpu使用率 >80%:
        连接邮箱
        发送邮件
        关闭邮箱
    if 内存使用率 >80%:
        连接邮箱
        发送邮件
        关闭邮箱
    if 硬盘使用率 >80%:
        连接邮箱
        发送邮件
        关闭邮箱

可以看见,每个条件判断内的代码块都是一样的内容,如果现在需要修改其中一条,则每个相同的代码块都要修改,如果重复的代码块有更多,那会非常不方便,容易出问题,所以定义了函数,去代表这些重复的内容,每次我们需要用到这个代码块的时候只需要去调用就可以了

1,函数的概念

函数是一段具有特定功能的代码块,可以重复使用,以函数名来表示,通过函数名来完成调用。

函数也可以看作是一段子程序,需要的的时候调用,不用在每个需要执行的地方去重复编写代码。每次使用函数时可以传入不同的参数,以对不同的数据进行处理;函数执行后,可以反馈相应的处理结果。

函数是一种抽象功能。

2,Python中的函数定义

Python中函数用def关键字来定义,语法格式如下

def 函数名(参数列表):

  函数体代码块

  return(返回值列表)

调用的时候直接用   函数名(实际参数)   来实现

def func():

  print('123')

func()

结果为123

3,函数的调用过程

程序调用函数一共要经过4个步骤:

1,程序在函数调用处暂停执行

2,在调用函数时将实参赋值给形参

3,执行函数体代码块

4,执行完毕后给出返回值,回到调用前暂停处继续执行

4,函数的参数

定义函数时()里的参数叫形参(形式参数),它只是一个变量名,供函数体调用。

调用函数时,()里的参数叫做实参(实际参数),它是实际的数据,会传递给形参,供函数体执行。

4.1形参

定义函数时,形参根据功能不同,可以定义几种类型。

4.1.1必须参数

在定义函数时,如果要求必须传入的参数,就叫做必须参数。

直接定义在函数名()中的参数就是必须参数。

def ad(x,y):

  print(x+y)

ad(1)

结果会报错,指出少传了一个y的实参

4.1.2默认参数

在定义函数时,某些形参一开始会有默认值,可以不用接收实参,这个时候就可以定义默认参数。

在函数名()中,以  变量名=默认值  的形式定义的形参就是默认参数。

注意:默认参数必须放在必须参数后面。若传了实际参数给默认形参,则会覆盖默认值。

4.1.3不定参数

在定义函数时,有时会不确定会传多少个参数,这个时候就可以定义不定参数。

不定参数根据传递的实参不同分为两种:

位置不定参

在函数名的()中,在形参前加星号*,则可以定义位置不定参,通常会将它定义为*args

它用来接收调用函数时,以位置传递过来的超过形参数量的剩下的实参。

注意:不定参必须定义在默认参数后面

def func(a,*args):

  print(args)

func(1,2,3,4)

结果为(2,3,4)

位置不定参会接收除了第一个之外剩下的所有实参,并以元组的形式返回

关键字不定参

在函数名的()中,在形参前加双星号**,则可以定义关键字不定参,通常会将它定义为**kwargs

它用来接收函数调用时,以关键字参数传递过来的超过形参数量的剩下的实参。

注意:不定参必须定义在默认参数后面

def func(a,**kwargs):

  print(kwargs)

func(a=1,b=2,c=3,d=4)

结果为{'b':2,'c':3,'d':4}

关键字不定参会接收除了第一个以外剩下的所有实参,并以字典的形式返回

4.2实参

调用函数时,传递实参有两种方式

4.2.1位置参数

传递参数时,默认会按照形参的位置一一对应,这种实参传递方式也叫位置参数。

def power(x,y):

  print(x**y)

power(2,3)  结果为8

power(3,2)  结果为9

实参按照形参的位置一一对应传入,所以结果会有区别

4.2.2关键字参数

调用函数时,参数按照  形参名=实参  的形式传递的参数叫做关键字参数。

这是不用考虑参数的位置。

注意:关键字参数要放在位置参数后面

使用关键参数调用上面的函数

power(x=3,y=2)  9  

power(y=2,x=3)  9

power(3,y=2)  9

power(y=2,3)  报错

4.2.3*,**在传递实参时的用法

*解包

在传递实参时,可以通过*对迭代对象进行解包。

def func(a,b,*args):

  print(a,b,args)

l = [1,2,3,4,5,6]

func(*l)

结果为1 2 (3,4,5,6),这里func(*l)相当于func(1,2,3,4,5,6)

**解包

在传递实参时,可以通过**对字典进行解包

def func(a,b,**kwargs):

  print(a,b,kwargs)

t = {'a':1,'b':2,'c':3,'d':4}

func(**t)

结果为1 2 {'c':3,'d':4},这里func(**t)相当于func(a=1,b=2,c=3,d=4)

4.3返回值

函数还有一个重要的功能,就是返回结果

Python中函数以关键字 return 来返回结果并退出函数,程序回到调用函数处继续往下执行

return可以将0个,1个,多个函数运算完的结果,返回给函数被调用处的变量

函数可以没有返回值,也就是可以没有return语句,这是函数返回None

return会将多个返回值以元组的形式返回

注意:函数被调用执行函数体时,只要遇到return,就马上停止退出函数,返回到函数被调用处往下执行

5,lambda函数

与三元运算类似,lambda函数用来定义简单的,能够在一行内表达的函数,语法格式如下

lambda arg1,arg2,...:表达式

f = lambda x,y: x + y

res = f(1,2)

print(res)

结果为3

6,变量作用域

Python中一个变量能被访问的范围就叫做作用域,根据作用域的大小,分为全局变量和局部变量

6.1全局变量

Python是解释型语言,解释器在执行一个Python程序时会在计算机内存中申请一块内存来运行这个程序,全局变量在这块内存空间中都可以被访问和修改

直接定义在函数外的变量就是全局变量,在程序运行的全过程有效

6.2局部变量

相对应的,在函数里面定义的变量就是局部变量,它只在函数里有效,一旦函数执行完毕,它就不存在了

6.3global关键字

有时我们需要在函数内部修改全局变量

使用global关键字可以在函数内部修改全局变量

a = 1

def func():

  global a  #声明a为全局变量

  a += 1

func()

print(a)

结果为2

7,python的内置函数

Python解释器一共提供了70多个内置函数。

import builtins

print(dir(builtins))

结果小写的都是内置函数

常用内置函数

abs()  返回数字的绝对值。参数可以是整数或浮点数。如果参数为复数,则返回其大小。如果x定义__abs__(),则 abs(x)返回x.__abs__()

all(可迭代)  没理解  

bin()  将整数转换为以“0b”为前缀的二进制字符串。结果是有效的Python表达式

chr()  接收一个字符的unicode整数,返回这个字符

dir(对象)  尝试返回该对象的有效属性列表。

divmod(a,b)  使用两个(非复数)数字作为参数,并在使用整数除法时返回一对包含其商和余数的数字。

enumerate(可迭代对象,start = 0)  返回一个枚举对象。iterable必须是序列, 迭代器或其他支持迭代的对象。__next__()enumerate()返回的迭代器的方法 返回一个元组,该元组包含一个计数(从start开始,默认为0),以及通过对iterable进行迭代而获得的值。

简单说就是循环这个可迭代对象,给每一个元素前加序号

help(对象)  调用内置的帮助系统。

hex()  将整数转换为以“ 0x”为前缀的小写十六进制字符串。

id(对象)  返回该对象内存中的地址

input()  用户输入,以字符串形式返回

isinstance(object,classinfo)  接收一个对象和一个类,如果对象是这个类的对象或者这个类的子类(直接,间接)的对象则返回True,否则返回False。

issubclass(class,classinfo)  如果classclassinfo的子类(直接,间接)则返回True,否则返回False。

iter()  返回一个迭代器对象,如果对象不支持迭代则抛出异常。

len()  返回对象的长度(项目数)。参数可以是序列(例如字符串,字节,元组,列表或range)或集合(例如字典,集合)。

map()  返回一个迭代器,该迭代器将函数应用于iterable的每个项目,并产生结果。

max()  返回可迭代的最大项目或两个或多个参数中的最大一个。

如果提供了一个位置参数,则它应该是可迭代的。返回迭代器中最大的项。如果提供了两个或多个位置参数,则返回最大的位置参数。

min()  返回可迭代的最小项或两个或多个参数中的最小项。

如果提供了一个位置参数,则它应该是可迭代的。返回iterable中的最小项。如果提供了两个或多个位置参数,则返回最小的位置参数。

oct()  将整数转换为以“ 0o”为前缀的八进制字符串。结果是有效的Python表达式。

ord()  返回一个字符的unicode码的十进制整数。

pow(x,y)  返回x的y次幂。

reversed()  返回一个反向迭代器

round()  返回数字舍入到小数点后的n位精度。如果ndigits省略或为None,则返回与其输入最接近的整数。

sorted(iterable**,key = Nonereverse = False* )

iterable中的项目返回一个新的排序列表。

有两个可选参数,必须将其指定为关键字参数。

key指定一个自变量的函数,该函数用于从iterable中的每个元素中提取一个比较键(例如key=str.lower)。默认值为None(直接比较元素)。

reverse是一个布尔值。如果设置为True,则对列表元素进行从大到小的排序。

sum(迭代)  求和

zip()  制作一个迭代器,聚合每个可迭代对象中的元素。

原文地址:https://www.cnblogs.com/wuxiaofan/p/13047521.html