Python函数
在计算机中称之为函数,在现实生活中称之为功能。
函数是能够实现特定功能的计算机代码,它是一种特定的代码组结构
一、函数的作用
1.提高代码的重复利用率,避免重复开发相同代码
2.提高程序的开发效率
3.便于程序维护
二、函数名的命名规则
1.推荐使用英文,禁止使用中文
2.可以使用数字,但不能以数字开头
3.不可以使用特殊字符,除了下划线_
4.函数名严格区分大小写
5.函数名必须要有意义
6.不能和系统保留关键字冲突
三、函数的声明方式
格式:
def 函数名():
pass
示例:
#定义函数
def xxoo():
pass #此处编写功能代码
xxoo() #调用
'''
函数的特征:函数定义之后,不会自动执行,只会在调用的时候执行。不调用,不执行。
'''
四、函数的返回值
根据执行函数完毕是否可以得到一个结果,我们可以将函数分为两种类型。
执行过程函数:
函数执行完毕之后,接收不到任何返回结果的函数。
返回值函数:
函数执行完毕之后,会产生一个结果,可以被接收和使用的函数。
格式:
def 函数名(参数):
return 返回值 #有return的函数,就是有返回值的函数
函数名(参数)
'''注意:
1.具有return语句的函数,我们称之为具有返回值的函数
2.return可以为当前函数执行完毕的函数返回一个结果,这个返回值可以用变量接收
3.return执行之后,函数将会终止,所以return之后的语句是不会被执行的
4.一个函数可以使用多个return语句,但是只有一个会被执行,一般都是放入分支结构中
5.一个函数如果需要返回多个数据,使用复合数据类型(list,tuple,set,dict)来操作即可
6.函数内部通过判断和循环语句可以实现很复杂的逻辑。即使return 后没有信息,也会返回一个None
'''
返回一个值的函数
def xxoo():
x = 10
if x > 1:
return x
else:
return -x
print(xxoo())
返回多个值的函数
def xxoo():
x = 10
y = 20
return x,y
print(xxoo())
赋值给变量
def xxoo():
x = 10
y = 20
return x,y
func = xxoo()
print(func)
'''
结果: (10, 20)
在返回多个值的时候,实质上函数是把返回值作为一个元组返回的。本质上是只有一个返回值的。
'''
五、函数的参数
Python 中函数的参数可细分为必需参数、默认参数、关键字参数和可变参数(不定长参数)四种情况。
1.必需参数
必需参数是指为了确保函数正确执行,需要明确赋值的参数,所有参数都遵循按位置一一对应的原则。
格式:
def 函数名(参数1,参数2...):
pass
示例:
#定义带有参数的函数
def funName(name):
print('接收到的参数:',name)
funName('joker_wang') #调用
'''注释:
形参:形式上的参数,声明函数时,括号()中的参数,是形参。
实参:实际上的参数,调用函数时,括号()中的参数,是实参。
实参将值传递给形参的本质过程,本质上就是简单的变量赋值。
'''
2.默认参数
默认参数是指为函数的参数取一个默认值,当调用函数时可以不传入具有默认值的参数,当执行函数时使用该默认值参与运算
格式:
def 函数名(参数1 = 值1,参数2 = 值2...):
pass
示例:
def stu(name, age=30 ):
print(name, age)
stu('joker')
注意:如果形参有默认值,调用时可以不传参,系统会直接使用参数的默认值。
调用时给有默认值的参数传参,实参会覆盖形参的默认值。本质上就是变量的重新赋值
def stu(name, age=30 ):
print(name, age)
stu('joker', 28)
#结果 joker 28
'''
注意:
默认参数必须在最右端,必需参数需要在最左边, 这样才能被解释器正确识别,否则会报错。
File "D:/xampp/htdocs/self-use/python/test.py", line 2
def stu(age=30, name):
^
SyntaxError: non-default argument follows default argument
'''
3.关键字参数
关键字参数则是指在传参时指明形参的名称,并为其赋以实参的值,为了防止参数按照位置传递出现的错误。
格式:
def 函数名(形参1 = 实参1,形参2 = 实参2...):
示例:
#定义带有默认值参数的函数
def funName(name = 'jack',age = 18,sex = 'man'):
print('name:',name)
print('age:',age)
print('sex:',sex)
funName(8,'二狗','Superman') #参数较多时赋值顺序颠倒,将会影响程序执行结果
funName(age = 8,name = '二狗',sex = 'Superman') #关键字参数赋值完美解决上面的问题
4.可变参数(不定长参数)
有的函数在定义时无法指明所有的参数,或是在调用时传入的参数个数比定义时的多,这就需要用到不定长参数。
不定长参数主要有两种传入方式,一种是在参数名称前加星号*,以元组类型导入,用来存放所有未命名的变量参数
格式:
def 函数名(*参数名):
pass
示例:
def counts( *sum ):
t = 0
for i in sum:
t = t + 1
return t
print(counts(1,2,3,4,5,6,7,4,3,2,21,1))
示例:
def counts( *sum ):
t = 0
for i in sum:
t = t + 1
return t
num = [3,5,7,9]
#需要在传递参数的时候,在参数前面再添加一个*号就可以了
counts(*num)
另一种是在参数名称前加两个星号**,以字典类型导入,用来存放所有命名的变量参数
格式:
def 函数名(**参数名):
pass
示例:
def demo(name, age=12, **arg):
print(name, age, arg)
demo('joker',30,sex='男',classid='bihuo01')
'''
结果
joker 30 {'sex': '男', 'classid': 'bihuo01'}
'''
def funName(**car):
for v in car: #遍历
print(v,'value : ',car[v])
funName(a = '卡车',b = '火车',c = '公交车') #调用
#可变参数和关键字参数都可以 允许传入0或者任意个含参数名的参数,这些关键字参数在函数内部自动组装成为一个字典:
#传递0个参数
def demo(name, age, **arg):
print(name, age, arg)
demo('joker',30)
'''
结果
joker 30 {}
'''
命名关键字参数
Python的命名关键字参数对传入的关键字参数做了进一步的限制。
格式:
#在关键字参数前增加一个”*”。
def personinfo(name, age, *, gender, city): #只能传递gender和city参数
print(name, age, gender, city)
personinfo('john', 22, gender = 'male', city = 'Beijing')
各种参数之间组合
一次函数调用可以传递以上所述任何一种参数或者多种参数的组合,当然也可以没有任何参数。
正如默认参数必须在最右端一样,使用多种参数时也对顺序有严格要求,也是为了解释器可以正确识别到每一个参数。
顺序:必需参数、默认参数、可变参数、命名关键字参数和关键字参数。
六、递归函数
在函数内部,可以调用其他函数。如果一个函数在内部调用自身,这个就是递归函数
示例:
#定义一个递归函数
def tubie(num):
#1.输出num
print(num)
#2.判断条件,不改变num
if num >=1:
tubie(num-1)
else:
print('================')
#3.输出num
print(num)
#调用递归函数
tubie(3)
示例:
# 1~10之和
def digui(n):
if n==1:
return 1
return n + digui(n-1)
print(digui(10))
def digui(n):
if n > 0:
return n + digui(n-1)
else:
return 0
print(digui(10))
七、作用域
1.函数作用域
在函数内部声明的函数就是内部函数。
格式:
def 函数名():
局部变量...
def 内部函数名():
Python功能代码...
示例:
def funName():
name = 'dragon'
#定义一个内部函数
def inner():
print('我是内部函数')
'''
1.内部函数的本质就是局部变量(函数就是一个变量)
2.内部函数在函数外部不可以直接调用
3.内部函数在函数内部调用(当然,必须要定义内部函数之后才能调用)
'''
nonlocal使用
nonlocal关键字的意义,不是局部变量,当然他也不是全局变量,通常用于内部函数中使用外部函数的局部变量。
#声明一个外部函数
def outer():
#声明一个变量(肯定不是全局变量)
x = 5
#声明一个内部函数
def inner():
nonlocal x #声明x不是局部变量
x += 9
print(x)
#调用函数
inner()
#调用outer
outer()
'''
如果内部函数使用的是外部函数的局部变量,那么应该使用nonlocal声明
(内部函数的外层,外部函数的局部变量)
'''
2.变量作用域
变量的作用域就是指变量的有效范围。
变量按照作用范围分为两类,分别是 全局变量 和 局部变量。
全局变量:在函数外部声明的变量就是全局变量
有效范围:
全局变量在函数外部可以正常使用
全局变量在函数内部也可以正常使用
局部变量:在函数内部声明的变量就是局部变量
有效范围:
局部变量在函数内部可以正常使用
局部变量在函数外部不可以访问
global关键字
global的作用就是把局部变量提升为全局变量
格式:
def 函数名():
global 变量名
函数功能代码...
示例:
def funName():
global name #如果不使用global关键字,外部是无法访问变量name的。
name = 'dragon'
funName() #调用
print(name) #尝试访问内部函数
'''
global只有在函数内部对变量进行全局声明,该变量才是一个完整的全局变量(在函数外部可以对该变量进行任意操作)。
'''