一、函数的创建
包括定义函数和调用函数
1.定义新函数
def 函数名(参数):
代码块
return 返回值
def是一个保留字,用于定义一个函数,’:‘不能忽略,基本上需要缩进的时候都要带上’:‘
函数名命名可自定义,但要遵守元素名命名的规则
参数是函数可接收到的数据,函数可接收参数也可不接收参数(参数可有可没有)
return是用于函数执行后的数据返回给调用函数,如果不需要返回数据,就不用return(return可有可没有)
定义函数并不会使用函数,调用函数才会有运行结果,这里运行函数,并没有输出信息

2.调用函数
调用方法就是函数名()

调用函数不能写在定义函数之前

3.函数的复用
定义好函数可以直接使用

4.return返回值
1)带return
a=2,返回2

2)不带return
没有return,函数中变量a的值就不会被返回,调用函数代码默认空值,显示none

下面这个在上文中有过,不带return,能输出值是因为函数内部本身就带print函数
输出来的值是函数内部print执行输出的,和下面不要搞混了

这里显示的依旧是none

3)带return且返回多个值
返回的多个值是一个元组

4)return位于非末尾行且返回多个值
这个代码有两个return,其中一个不在末尾,这里ls长度为2,满足条件,运行到了return b
就直接退出函数了,其实和break是有些相似的

二、函数的参数
1.形参和实参
也就是形式参数(定义函数中的参数)和实际参数(调用函数时填入的参数)
先定义函数,输入一个数值赋值给a,调用函数
def 函数名(形参1,形参2,……):
代码块
return 返回值
函数名(实参1,实参2,……)
注意以下几点:
形参使用变量名来接收实参传递过来的信息
创建函数的时候,要确定函数需要处理的数据有哪些,从而确保形参的个数
函数需要接收多个形参时,形参之间用逗号隔开
调用函数中实参为实际数据,且实参个数与形参个数相同
调用函数时,会按照顺序依次将所有实参的数据复制给形参
这里实参为a,形参为n:

2.默认参数:当调用函数时没写实参2的时候形参2使用默认值
def 函数名(形参1,形参2=数据):
这里的pi就为默认参数,写了参数2,就按写入的计算,没写就用默认值
r是必填参数

3.可变参数:不确定函数中需要接收的参数个数
def 函数名(形参1,*形参2):
可变参数用*,而且必须要位于必填参数的右边保证必填参数先接收数据
可变参数以元组形式接收数据
3赋值给a,1,2,3赋值给可变参数b,输出b是一个元组

4.关键字参数
可变参数以元组的形式存储接收到的数据,关键字参数以字典形式存储接收到的数据
def 函数名(形参1,**形参2):
关键字参数前用**,关键字参数位于必填参数右边,保证必填参数先接收数据
关键字参数以字典形式接收数据
关键字参数接收的数据包括键和值,键值之间用=连接

三、函数的变量作用范围
报错,函数中的变量是不能用于函数外的,这里a,b都是局部变量

e在函数外,这种变量称为全局变量,是可以用于整个代码的

1.函数中使用全局变量存在的问题
1)函数内部创建一个新变量
上文提到过,函数内可以用全局变量,但不是直接用全局变量。这里a为全局变量,能用于函数里,但是在用于函数中时,函数内部会创建一个新的局部变量,严谨来说不是同个变量。

也就是说,全局变量a=3在使用到函数中的时候需要经历函数内部重建一个新的局部变量(表面上是能直接用,但其实是有一个重建局部变量的过程的)
2)等号直接赋值
但如果我们根据上面就在函数间直接定义一个同名变量a,此时想要打印出a的值会发现报错,local variable,意思是函数中变量a没有分配值
是因为系统默认我们在函数里创建了一个局部变量a,所以函数中第一个print就会报错认为a没有被赋值

3)函数中定义全局变量同名变量
对代码进行些改动,在函数中,函数优先使用函数内部的变量,这里输出a的值是3,函数内的变量是不能用于函数外的,这里不会显示为2

2.global声明全局变量
如果需要在函数内和外都使用同一个变量,不会因为在函数内部而被重新赋值
两者就是同个变量,以上的情况两者是两个变量,global声明就能让二者是同一个变量,共用同个内存空间

3.变量为可变数据
是否会改变内存空间,以此能将数据分为可变数据和不可变数据,可变数据指数据变化后不会改变内存空间
id():获取当前变量数据值所在的内存空间编号
这里我们定义了两个变量a,b,然后查看两个变量内存编号
然后,对a重新赋值,对b添加一个内容,查看内存编号
最后同样的输出结果,但是采用的是等号赋值b,查看内存编号
a赋值前后内存编号改变,b使用方法改变内容前后内存编号没变,b为可变数据。
但是b后面用等号赋值时却改变了内存编号,是因为=的原因,只要被=赋值,内存空间是一定会变的。
对于一个可变数据,使用方法修改数据时不会改变内存空间,对数据进行新赋值时会改变其内存空间。

4,函数中的可变数据
当可变数据为全局变量时,在函数中对可变数据进行修改会改变全局变量
这里全局变量a为可变数据,函数对变量a进行反转(方法改变数据),最后函数内输出a和函数外输出一样

ls为空列表,这里调用了两次func函数,也就是说ls经历了两次方法添加数据,输出的a,b是一样的,这里a和b虽然在名字上以为是两个变量,但实际上,a,b共用同一个空间,只不过是同个空间的不同名字。

四、导入其他模块中的函数
1.导入文件模块
import 文件名:是python中的保留字,导入当前文件夹内的文件模块
文件名.函数名(参数)
这里a文件导入进来,操作的时候需要注意这俩代码文件要在同一文件夹下。


导入多个文件时,文件用,隔开
eg:import a,b,c
2.导入文件中的指定函数
from 文件名 import 函数名
函数名(参数)
a文件为导入文件,里面有三个函数,b导入文件a中的fun6


导入文件中多个函数时,文件用,隔开
eg:from a import fun6,fun8
3.导入文件中的全部函数
from 文件名 import *(这里*就表示文件中全部函数)
4.给导入的函数设置别名(文件也可以)
from 文件名 import 函数 as 新的函数名
![]()
from 文件名 as 新文件名
![]()
5.__name__(这是两个下横线)属性
输出文件名,但这个文件名是b却输出的是main,这是因为,当前b为代码运行的主程序,由上文直到,现在我们运行的代码是导入别的文件的函数,两个文件内代码运行,会有一个主进程,这个主进程无论叫什么,用__name__输出的都是main

现在我们在另一个代码中加入输出__name__,就会显示文件名为a,因为它不是主程序,所以就是它文件名


一般我们做一个项目的时候,都会把功能分出去,也就像上述一样,函数和主程序不再同一个文件里,而是由多个人完成。
依旧那上面的例子进行说名,a文件中的函数编写是由李华负责的,主程序代码由韩梅负责,李华编写程序的时候肯定要调试代码然后不断完善代码,于是就会在a文件中使用下图框选内容

这个的存在就是为了李华调试,因为他在写这个代码的时候运行这个代码,这个a文件代码就是主程序,所以__name__==__main__,继续运行下面代码从而检验代码程序的可行性
等这个文件代码完成后要调用时,韩美在b文件运行时,主程序为b文件中代码,自然就不满足__name__==__main__,下面代码不会运行。
五、匿名函数lambda
lambda也是python保留字之一,用于定义一些简单函数,也称匿名函数。
有两种使用情况:
1)lambda作为函数
函数名=lambda 参数:函数内代码
eg:
fun1= lambda x,y:y+x
等效于
def fun1(x,y):
return y+x
2)将lambda作为函数的参数
以sorted()函数为例
(关于sorted()函数,与sort()类似,但sort()时列表的方法,而sorted()是用于各种数据类型的)
sorted(iterable,key=None,reverse=Flase)
有三个参数,
iterable:表示可迭代的数据对象
key:比较函数其值可以为lambda语句
reverse:指明排序顺序,False为从小到大,True反之,不写默认False
sorted(b)字母顺序按照unicode值

当key传入了lambda语句
abs()为取绝对值
3,7,9,4,0,2
abs(x-5) 2,2,4,1,5,3
默认False 1,2,2,3,4,5
输出 4,3,7,2,9,0
输出的还是原来的那些数,进行key语句的是原来那些数,进行排序的是key语句进行完的那些数

六、实例
项目描述:某项目部需要实现工程预测,根据已知第一季度华南华北华东地区的销售额预测明年总体销售额,预测销售额为三个地区第一季度销售额的阶乘之和。例如,华南销售额2万,华北2万,华东3万,预测销售额2!+2!+3!=10万
项目任务:设计一个程序,通过input()获取当前季度的销售额,并实现自动预测销售额
项目代码:

3357

被折叠的 条评论
为什么被折叠?



