函数之创建&参数&变量作用范围&导入模块

一、函数的创建

包括定义函数和调用函数

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()获取当前季度的销售额,并实现自动预测销售额

项目代码:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值