目录
一、函数的引入
在程序开发时,需要多次使用的某一代码,为了提高效率,将这一代码组成一个模块。
二、函数的定义
1.函数的格式:
def 函数名():
(缩进)...函数体.....
def say_hello():
print('哈哈哈哈')
print('哈哈哈哈')
say_hello()
print('程序结束了')
结果:
哈哈哈哈
哈哈哈哈
程序结束了
2.注意事项:
1).函数的名称要遵循标识符的命名规则,多名称时使用下划线
2).函数体都是靠强制缩进来表示的
3). : ( )都是英文表示的
4).函数只有调用的时候才会执行,只有创建是不会执行的。
三、调用函数格式
格式:------> 函数名()
1).先创建后调用
2).一般情况下调用函数时,不要将函数放到函数体中
3).递归函数时,必须将函数放到函数体中
4).函数可多次调用
四、函数的注释
1).在函数体的第一行使用多行注释对函数功能进行解释说明
2).调用函数的时候,可通过快捷键Ctrl+Q可以查看函数的解释说明,了解函数的功能。
def say_hello():
'''只是一个打招呼的方法
你好世界,你好Python,你好云计算
'''
print('hello world')
print('hello python')
print('hello 云计算')
say_hello()
五、函数的参数
1.格式:
def 函数名(参数1,参数2....):
....函数体.....
2.说明:
1).在小括号里面写的变量名就是函数参数,多个参数之间用逗号“ ' ”隔开。
2)函数定义几个参数,调用函数时就必须传递对应的参数个数。
3)定义的参数叫形参----->形式参数
调用函数时的参数叫实参------>实际参数
def sum_num(aa,bb):
print(aa,'----',bb)
num1=aa
num2=bb
num3=num1+num2
print(num3)
#调用函数
sum_num(1,3)
结果:
1 ---- 3
4
3.参数的分类
位置参数 | 实参和形参一 一对应,按位置传递参数 |
关键字参数 | 以形参等于实参的形式,忽略形参定义的顺序进行传递参数 注意:1.关键字只能是形参过程中声明过的才能使用 2.关键字参数和位置参数同时存在时,位置参数必须在前 面,关键字参数在后面。 |
默认参数 | 在定义函数形参的时,可以给形参附一个初始值(默认值)-->默认参数 当调用函数时,如果不给默认参数赋值,函数就会用默认值 如果默认函数被赋值,函数就会用新的值 注意事项:默认参数一定在形参的后面 |
可变参数 | 格式: *变量名 **变量名
可接受多个位置参数 可接受多个关键字参数 |
可变参数注意事项:
1).多个位置参数被组织成一个元组类型数据
2).一般情况下使用变量名称叫做args------>*args
3).*具有将元组打散的功能
4)**kwargs接受多个关键字参数,变量名称任意,一般使用kwargs
5).**具有将字典打散的功能,也叫拆包
6).关键字参数被组织成一个字典类型的数据
i>位置参数
def sum_num(num1,num2):
print(num1,num2)
sum_num(1,2)
结果:
1 2
ii>关键参数
def sum_num(num1,num2):
print(num1)
print(num2)
print(num1+num2)
sum_num(num1=20,num2=10)
结果:
20
10
30
iii>默认参数
def save_userinfo(name,age,gender='女'):
print('姓名:{},年龄:{},性别:{}'.format(name,age,gender))
save_userinfo('哈哈',20)#不给默认参数赋值,默认使用默认值
save_userinfo('xixi',18,'男')#默认参数赋值,函数就会使用新的值
#结果:
姓名:哈哈,年龄:20,性别:女
姓名:xixi,年龄:18,性别:男
v>可变参数
def func(*args):
print(args)
func(1,2,3,4,5)
结果:
(1, 2, 3, 4, 5) #可以传递任意多个实参,被组织成一个元组
iv>*打散功能
tup=(1,2,3,4)
print(*tup)
lst=[5,6,7,8]
print(*lst)
结果:
1 2 3 4
5 6 7 8
tup=(1,2,3)
def func(a,b,c):
print(a,b,c)
func(*tup)
结果:
1 2 3
vi>**将字典打散
dic={'name':'zs','age':20]
def func(name,age):
print(name,age)
func(**dic)
结果:
zs 20
六、函数参数的类型
可变数据类型:list、dic
| 传递可变数据类型,可直接修改函数体中传递的内容,不需要开辟新的内存空间
|
不可变数据类型:str、int、float | 传递不可变数据类型,函数体中不能修改传递的值得大小,b=200-->重新开一个新的内存空间 |
i>传递可变数据类型
outter_list=[1,2,3]
print('-------',outter_list)
#print(id(outter_list))
def func(inner_list):
print('******',inner_list)
inner_list.append(4)#内容被修改了
#inner_list=[1,2,3,4,5,6,6,7]#开辟新的内存空间
print(inner_list)
#print(id(inner_list))
func(outter_list)
print(outter_list)
结果:
------- [1, 2, 3]
****** [1, 2, 3]
[1, 2, 3, 4]
[1, 2, 3, 4]
ii>传递不可变数据类型
a=10000
print('a变量的ID值:',id(a))#实际传递的是地址,
def func(b):
print(b)
b=200
print(b)
print('修改后的b的ID值:',id(b))
func(a)
#a和b的地址相同,因此值也是相同的
print(a)
结果:
a变量的ID值: 32611088
10000
200
修改后的b的ID值: 506037488
10000
------- [1, 2, 3]
七、函数的返回值
1.格式:
def 函数名(参数1,参数2):
....函数体.......
return 值
2.注意事项:
1).在函数体的最后使用一个关键字return,要返回的值
2).如果函数不写返回值,默认None。
3).return 的两个作用:
1>可以返回值
2>结束函数,一般return后面不写其他代码
i>
def sum_num(aa,bb):
num3=aa+bb
return num3
#调用函数
ret=sum_num(1,3)#定义一个变量ret接收函数返回值
print(ret)#且他们的内存地址相同
结果:
4
ii>返回None
def func(c):
print('hhh')
ret=func()
print(ret)
结果:
hhh
None
iii>return可以直接结束整个方法
def func(c):
print('func....')
a=10
b=c
if a>b:
return
print('aaa')
func(1)
结果:
func.....
八、返回多个值
1.格式:
def 函数名(参数1,参数2...):
....函数体......
return 值1,值2,值3
2.注意事项:
1).多个值要用逗号隔开
2).多个值被组成一个元组返回
def func(c):
a=20
b=10
return a,b
ret=func()
print(ret)
结果:
(20,,10)
因为可以用多个变量接收元组,
因此返回值可以被多个变量接收
def func(c):
a=20
b=10
return a,b
num1,num2=func()
printnum1,num2)
结果:
20 10
九、参数顺序
1.创建函数声明参数时的顺序:
位置参数 、*args、默认参数、**kwargs
def func(a,*args,b=10,**kwargs):
print(a)
print(args)
print(b)
print(kwargs)
func('zw','sd','ert',b=20,c=30,d=88)
结果:
zw
('sd','ert')
20
{'c':20,'d':88}
十、函数的嵌套
函数里面套函数
def outter():
print('aaa')
def intter():
print('bbbb')
intter()
outter()
结果:
aaa
bbbb
函数嵌套调用: