函数
概念:
在一个完整的项目中,某些功能可能会反复地使用,这时我们会将这些功能封装为函数,然后当我们使用的时候直接调用函数就行。
本质:
对功能的封装就是函数。
优点:
1.简化代码结构,增加了代码的重复使用的程度
2.修改、维护、调试方便
一、创建和调用函数
用法:
'''
def(关键字) 函数名():
函数体
return 返回表达式
函数名() #调用
'''
#函数名可以大小写字母、下划线开头,不能数字开头
def func():
a=1
b=2
print('这是返回值%d'%(a+b))
func()
###############################
这是返回值3
二、函数的参数
概念:函数的参数就是放在括号里的东西,可以个性化
def func(grade): #括号里的参数近似相当于变量
print('我的成绩为:'+grade)
func('100')
################################
我的成绩为:100
三、函数的返回值
概念:如果我们需要函数返回数据的执行结果,而不是我们给定的结果,那就使用函数中的关键字:return+制定的返回值
def func(a,b):
return a+b
print(func(1,2))
################################
3
注意:当函数内部使用的是return的时候,必须调用print(),不然会没有输出结果
四、函数的参数
意义:如果函数没有了参数,那么函数将变得非常单一和死板,相对应地也将执行单一的功能
1.形参和实参
概念:参数从调用的角度来讲,分为形式参数(形参)和实际参数(实参)。
形参:函数创建和定义过程中小括号里面的参数
实参:函数在调用的时候传递进来的参数或者值
str1 = '满分'
def func(grade): #小括号里面的grade就是形参
return grade
print(func(str1)) #调用时候的参数就是实参
#####################################
满分
2.关键字参数
概念:普通的参数叫位置参数,在调用的时候,我们可能会粗心传递错参数顺序导致结果和我们预期的不一致,比如:
def func(fruit,color):
print(fruit,'这个水果是',color,'色')
func('红','apple')
####################################
红 这个水果是 apple 色
使用关键字参数:
def func(fruit,color):
print(fruit,'这个水果是',color,'色')
func(color='红',fruit='apple')
##############################
apple 这个水果是 红 色
3.默认参数
概念:默认参数实在设定形参的时候给形参赋的值(区别于关键字参数)
def func(fruit='Apple',color='是红色'):
print(fruit,color)
func()
################################
Apple 是红色
func(fruit='Pear',color='是黄色')#在传递参数过程中,替换了默认的值
#####################################
Pear 是黄色
4.位置可变参数(可变参数)
概念:在不知道特定情况下用到多少参数的时候在参数前面加(*)星号
def func(*test):
print('test有%d个参数'%len(test))
print('最后一个参数是',test[-1])
print(type(test))
print(test)
func(1,2,2,4,5,5,3)
#################################
test有7个参数
最后一个参数是 3
<class 'tuple'>
(1, 2, 2, 4, 5, 5, 3)
5.关键字可变参数()
概念:该形式参数可以接受任意多个传入的键-值对参数(关键字实参),而且接受的参数将会以字典的方式组织
def func(**kwd):
print(kwd) #kwd以字典的方式组织传入的关键字实参
func(fruit='apple',price=10)
######################################
{'fruit': 'apple', 'price': 10}
注意:当位置可变参数 (args)和关键字可变参数(**kwd)一起使用时,必须先声明位置可变参数(args),最后声明关键字可变参数(**kwd)
五、函数的范围
1.函数的过程
理解:在python中,只有函数没有过程
def func():
print(123)
print(func())
###############################
123
None
#没有return默认返回一个None
2.返回值
理解:python可以利用序列打包多种类型的一次性返回值
def func():
return 1,2,3,4
print(func())
###############################
(1, 2, 3, 4)
3.变量的作用域
理解:变量的作用域也就是类似于变量可见性
def func(gra,num):
count_grade=gra*num
return count_grade
final_grade=func(80,5)
print(final_grade)
print(count_grade)
###################################
400
NameError: name 'count_grade' is not defined
注意:错误的原因因为‘count_grade’没有被定义过,因为它是func函数内部定义的,只有在函数内部才有效,函数外调用就失效了,这种变量称为局部变量。
和局部变量相对应的就是全局变量,全局变量的作用域大于局部变量
example1:
def func(gra,num):
count_grade=gra*num
print(grade)
return count_grade
grade=80
final_grade=func(80,5)
print(final_grade)
###########################
80
400
example2:
def func(gra,num):
count_grade=gra*num
grade=100
print('in_grade:',grade)
return count_grade
grade=80
final_grade=func(80,5)
print('out_grade:',grade)
print(final_grade)
#############################
in_grade: 100
out_grade: 80
400
注意:在这里函数内部的grade是python自己创建的新的局部变量,和外部的grade没有关联
4.global关键字
概念:如上述例子可见python对于全局变量的保护,这种保护有时候会影响代码的维护,所以就有了global关键字解决
def func(gra,num):
count_grade=gra*num
global grade
grade = 100
print('in_grade:',grade)
return count_grade
grade=80
final_grade=func(80,5)
print('out_grade:',grade)
print(final_grade)
##################################
in_grade: 100
out_grade: 100
400
六、内嵌函数和闭包
1.内嵌函数
概念:允许在函数内部创建另一个函数
def func1():
print('func1')
def func2():
return 'func2'
return func2()
print(func1())
############################
func1
func2
注意:func2是func1的内部函数,所以它的作用域也在func1函数体内,在外部调用会报错
2.闭包
概念:一个内部函数里,对外部的作用域(非全局作用域)的变量进行引用,那么内部函数就被认为是闭包,闭包是函数重要的组成结构
def func1(x):
def func2(y):
return x*y
return func2 #这里不用括号
#调用格式1
a=func1(10)
print(a(5))
#调用格式2
print(func1(10)(5))
#########################
50
50
注意:它和内嵌是一个意思,不能直接调用func2,会报错