3.函数
函数的本质就是功能的封装,和对代码的抽象
1.函数的作用
1.避免开发重复性的代码
2.便于程序的理解与维护
3.对底层代码的抽象
2.函数的格式
def 函数名(参数):
函数功能代码…
函数功能代码…
return (若没有返回值NULL)
Python函数并不需要声明类型,调用的方法:函数名(参数,参数…)
声明函数时的参数->形参,使用函数时的参数->实参
返回值:
3.内置函数
我们例举了一些内置函数,更多的内置函数我们可以在官方文档中查看,也可以自己找一些教程
# 内置函数
print(abs(-20))
# 查看帮助文档
help(abs)
list1 = [2,4,-6,-7,9,-10]
print(max(list1))
print(max(2,4,-6,-7,9,-10))
# 数据类型转换
print(type(int('123')))
print(type(str(123)))
print(type(float("123")))
4.自定义函数
自定义函数的导入实例:
例如:
# 从其他位置导入函数
from MyTest import my_abs
print(my_abs(-999))
# help查看函数说明文档
help(my_abs)
MyTest.py
# 自定义 abs函数
def my_abs(x):
'''
自定义abs函数
:param : 一个自然数
:return: 这个自然数的绝对值
'''
if x>=0:
return x
else:
return -x
自定义的函数不但可以外置,还可以自己去书写函数的说明,上述调用的输出情况如下:
999
Help on function my_abs in module MyTest:
my_abs(x)
自定义abs函数
:param : 一个自然数
:return: 这个自然数的绝对值
我们还可以通过这种方式找到这个函数的说明文档
my_abs.__doc__
为了方便让别人得到更友好的使用体验,我们可以把报错设置的更加人性化
# 自定义 abs函数
def my_abs(x):
'''
自定义abs函数
:param : 一个自然数
:return: 这个自然数的绝对值
'''
if not isinstance(x,int,float):
raise TypeError('只能输入int或float类型参数')
if x>=0:
return x
else:
return -x
这个isinstance()函数,是判断函数类型的函数,如果x是int或者float则返回真。注意not
5.多个返回值的函数
在python当中,多个返回值的函数也是很常见的
def getNames():
return 'lsw','qq1'
那么我们如何去接受这种多返回值的函数呢,1.可以用多个变量去接收,2.可以用一个变量去接收
name1,name2 = getNames()
print(name1,name2)
t = getNames()
print(t)
print(type(t))
可以发现,如果用多个变量去接收,那就可以直接得到值,如果用一个变量接收多个返回值的函数,那么得到的就是一个元组
>>>lsw qq1
>>>('lsw', 'qq1')
>>><class 'tuple'>
6.默认参数
假设我们有一个已经使用了很久的函数power()
我们期待给他一个拓展的功能,可以实现计算x的n次方
如何拓展使得在不影响旧函数使用的情况下新添这个功能呢
def power(x):
return x*x
def power(x,n=2):
s = x
while n>1:
s = s*x
n = n-1
return s
print(power(2,3))
print(power(4))
7.多个参数的函数
def getSum(numbers):
sum = 0
for i in numbers:
sum+=i
return sum
print(getSum([1,2,3,4,5]))
这种情况下我们给出的参数得是列表形式的,如何使参数的给出可以更加随意呢
def getSum(*numbers):
sum = 0
for i in numbers:
sum+=i
return sum
print(getSum(2,4,6,8))
nums = [2,3,4]
# 通过列表传入
print(getSum(*nums))
8.函数的关键字
有已知的参数,还有提供可以拓展的参数
def student(name,sex,**kw):
print('name:',name,'sex:',sex,'others:',kw)
student('lsw','male',age=24,region='china')
# 通过字典传入
dicts = {'age':24,'region':'china'}
student('lsw','male',**dicts)
# 在之后的可选关键字中,只接收指定关键字
def student(name,sex,*,city):
pass
综上,对于关键字接收,已经有了这么几种方法
def f1(a,b,c=0,*args,**kw):
'''
a,b为必选参数,c为默认值参数,args为任意个参数,而kw为键值对型的参数
'''
pass
def f2(a,b,c=0,*,d,**kw):
'''
像这种*,d即多个非键值对型参数中,除了给出的必选参数和默认值参数,只接收d属性这个参数,但kw对应的是键值对型参数,对于给出的键值对型参数还是可以接收
'''
pass
9.全局变量
在python中,也是区分全局变量和局部变量的,在函数中可以使用或者修改全局变量,但前提是需要声明一下这个变量是全局的,(global),以使解释器知道,这是一个全局变量而非local variable局部变量
而局部变量,只能在声明它的代码块中访问或者修改,例如下面的age 就是定义在函数fun()中的局部变量,若在函数外访问,会提是这个变量是未定义的。
# 全局变量与局部变量
name = 'zhangsan' # 全局变量
def fun():
# global name
print('函数内部输出全局变量:',name)
name = 'lisi'
print('name=',name)
age = 30 # 局部变量
print('age=',age)
fun()
print('函数外name:',name)