目录
(1)位置参数,关键字参数,默认参数,可变参数(*args, **kwargs)
一、函数的引出
程序中重复的内容太多了
'''
程序中重复的内容太多了
在程序开始的时候,打印哈哈,呵呵,嘻嘻
在程序的中间,打印三句哈哈,呵呵,嘻嘻
在程序结束的时候,打印哈哈,呵呵,嘻嘻
'''
# print('哈哈', '呵呵', '嘻嘻')
# print('哈哈', '呵呵', '嘻嘻')
# print('哈哈', '呵呵', '嘻嘻')
# 100行
#
# print('哈哈', '呵呵', '嘻嘻')
# print('哈哈', '呵呵', '嘻嘻')
# print('哈哈', '呵呵', '嘻嘻')
# 200行
#
# print('哈哈', '呵呵', '嘻嘻')
# print('哈哈', '呵呵', '嘻嘻')
# print('哈哈', '呵呵', '嘻嘻')
def laugh():
print('哈哈', '嘻嘻', '呵呵')
print('哈哈', '嘻嘻', '呵呵')
print('哈哈', '嘻嘻', '呵呵')
laugh()
# 100行
laugh()
# 200行
laugh()
二、函数的定义与调用
1.定义
(1).格式
def 函数名称():
....函数体....
(2).注意:
1)函数的名称要遵循标识符命名规则,多个单词使用下划线命名法
2)函数体靠缩进来表示
3): () 都是英文来表示的
4)函数只有在调用的时候才执行,只创建不调用是不会执行的
2.调用:
(1)格式:
函数名()
(2)注意事项:
1)先创建后调用
2)一般情况下,不要将调用函数放到函数体里面
特殊情况下,在递归的时候,函数自己可以调用自己
# 一.创建一个say_hello函数:
def say_hello():
print('hello world')
print('hello python')
print('hello 云计算')
# 调用函数
say_hello()
print('程序结束了....')
三、函数的注释
1.在函数的第一行使用多行注释对函数的功能进行解释说明
2.调用函数的时候,通过用快捷键 ctrl+Q 可以看出函数的解释说明,而了解函数的功能
'''
函数的注释:
1.在函数体的第一行使用多行注释对函数的功能进行解释说明
2.调用函数的时候,通过快捷键 ctrl+Q 可以查看函数的解释说明。而了解此函数的功能
'''
def say_hello():
'''
这是一个打招呼的方法
你好世界 你好 python 你好 云计算
'''
print('hello world')
print('hello python')
print('hello 云计算')
say_hello()
四、函数的参数
1.格式
def 变量名称(参数1,参数2,参数3.........):
....函数体....
# 需求:定义一个求和函数
# 这个函数只能求出10+20的值,扩展性不高,
def sum_num():
num1 = 10
num2 = 20
num3 = num1 + num2
print(num3)
sum_num()
'''函数的参数:
格式
def 函数名称(参数1,参数2,参数3.......):
....函数体....
说明:
1,在小括号里写的变量名就是函数的参数,多个参数之间使用逗号","隔开
2.函数定义几个参数,调用的时候,就必须传递对应的参数的个数
定义函数的参数是形参 形式的参数
调用函数是的参数是实参 实际的参数
'''
def sum_num(aa, bb):
print(aa, '----->', bb)
num1 = aa
num2 = bb
num3 = num1 + num2
print(num3)
sum_num(1, 2)
2.参数的数据类型
(1)可变,不可变数据类型
可变数据类型 | lsit dict set............ |
不可变数据类型 | str tuple int float............ |
(2)注意:
- 如果传递的是不可变数据类型,会重新开辟一块新的内存空间,函数体中不能修改传递的值的大小
- 1)
-
a = 10000 print(id(a)) # 31178544 print(a) # 10000 def func(b): print(id(b)) # 31178544 print(b) # 10000 func(a)
- 2)
-
a = 10000 print(id(a)) print(a) def func(b): print(id(b)) print(b) b = 200 print(id(b)) print(b) func(a) print(id(a)) print(a) # 34586416 # 10000 # 34586416 # 10000 # 1623426288 # 200 # 34586416 # 10000
- 如果传递的是可变数据类型,用的是它的方法,不会开辟新的内存空间,可直接修改函数体中传递的内容
- 1)
outter_list = [1, 2, 3]
print('----->', outter_list) # -----> [1, 2, 3]
def func(inner_list):
print('inner_list', inner_list) # inner_list [1, 2, 3]
func(outter_list)
- 2)
outter_list = [1, 2, 3] print(outter_list) # [1, 2, 3] print(id(outter_list)) # 41952840 def func(inner_list): print(inner_list) # [1,2,3] print(id(inner_list)) # 41952840 inner_list.append(4) print(inner_list) # [1,2,3,4] print(id(inner_list)) # 41952840 func(outter_list) print(outter_list) # [1,2,3,4] print(id(outter_list)) # 41952840
- 如果传递的是可变数据类型,重新给它赋值,会开辟新的内存空间
-
outter_list = [1, 2, 3] print(outter_list) # [1,2,3] print(id(outter_list)) # 31663688 def func(inner_list): print(inner_list) # [1,2,3] print(id(inner_list)) # 31663688 inner_list = [3, 4, 5, 6] print(inner_list) # [3,4,5,6] print(id(inner_list)) # 31664008 func(outter_list) print(outter_list) # [3,4,5,6] print(id(outter_list)) # 31664008
3.参数的类型
(1)位置参数,关键字参数,默认参数,可变参数(*args, **kwargs)
位置参数 | 实参与形参一一对应,按位置传递参数 第一个实参给第一个形参传值,第二个实参给第二个形参传值
| |
关键字参数 | 我们在传参的时候,以形参等于实参的形式忽略形参定义的顺序进行传参的传参方式 形参是什么,实参就是什么 关键字只能是形参中声明过得才能使用 | |
默认参数 | 在定义函数的形参的过程中,可以给形参赋一个初始值(默认值),这种参数叫做默认参数 当调用函数的时候,如果不给默认参数赋值,函数就会使用默认值,如果给默认参数赋值, 函数就会使用重赋的值 | |
可变参数 | (1)如果函数中参数过多,我们定义起来就比较麻烦,调用起来也非常麻烦, 因此Python给我们提供了可变参数类型,能处理比当初声明时更多的参数, 会将传入的参数可以接收多个位置参数 (2)格式: * 变量名 (3)注意事项: 多个位置参数组织成一个元组类型 一般情况下,使用的变量类型名称叫做args(arguments) 用来接收多个位置参数 | *args
* 具有打散元组的功能 |
可变参数 | (1)关键字参数组织成一个字典类型的数据 (2)** 可以打散字典 用来接收多个关键字参数 | **kwargs
** 具有打散字典的功能 |
- 位置参数
def func(num1, num2):
print(num1) # 1
print(num2) # 2
print(num1 + num2) # 3
func(1, 2)
- 关键字参数
def func(num1, num2):
print(num1) # 10 10
print(num2) # 20 30
print(num1 + num2) # 30 40
# func(num1=10, num2=20)
func(num2=30, num1=10)
- 默认参数
def save_userinfo(name, age, gender='男'):
print('姓名:{},年龄:{},性别:{}'.format(name, age, gender))
save_userinfo('wb', 20) # 姓名:wb,年龄:20,性别:男
save_userinfo('hua', 20, gender='女') # 姓名:hua,年龄:20,性别:女
- 可变参数(* args)
# * 变量名 用来接收多个位置参数
def func(*aa):
print(aa) # (1, 2, 3, 4, 5)
print(aa[0], aa[1]) # 1 2
func(1, 2, 3, 4, 5)
# * 有打散元组的功能
tup = (1, 2, 3)
def func(a, b, c):
print(a, b, c) # 1 2 3
func(*tup)
# * args
def func(*args):
print(args) # (1,2,3,4)
print(args[0]) # 1
print(args[1]) # 2
func(1, 2, 3, 4)
- 可变参数(** kwargs)
def func(**kwargs):
print(kwargs) # {'name': 'zs', 'age': 20}
print(kwargs['name']) # zs
print(kwargs['age']) # 20
func(name='zs', age=20)
#
def func(name, age):
print(name, age) # ww 14
dic = {'name': 'ww', 'age': 14}
func(**dic)
(2)位置参数与关键字参数混用
必须位置参数在前,关键字参数在后
def func(num1, num2):
print(num1) # 10
print(num2) # 10
print(num1 + num2) # 20
# func(num1=10, num2=20)
# func(num2=30, num1=10)
func(10, num2=10)
# func(num1=10, 20) 位置参数在关键字参数之后会报错
(3)参数顺序
位置参数>* args >默认参数> ** kwargs
位置参数 接收多个位置参数 默认参数 接收多个关键字参数
五、函数的返回值
1.格式
def 函数名(参数1,参数2,参数3..........):
....函数体.....
reutrn .......
def sum_num(aa, bb):
num3 = aa + bb
return num3
ret = sum_num(1, 3)
print(ret) # 4
2.注意
(1)在函数体的最后一行使用一个关键字return要返回的值
(2)定义一个变量来接收函数的返回值
(3)如果没有在函数体中定义返回值,就返回一个None
def func():
print('func...')
ret = func()
print(ret) # None
(4)return有两个作用:
- 结束函数:一般return后面不会写其他代码
- 返回
3.函数返回多个值
(1)格式
def 函数名(参数1,参数2,参数3......):
.....函数体.....
return 值1,值2.......
(2)注意事项
- 多个值之间用逗号隔开
- 多个值被组织成一个元组返回
-
def func(): a = 10 b = 20 return a, b ret = func() print(ret) # (10, 20)
- 用多个变量接收返回的值
-
# 用多个变量来接收元组的值 tup = (1, 2, 3) a, b, c = (1, 2, 3) print(a, b, c) # 1 2 3 # a, b, c, d = (1, 2, 3) # print(a, b, c, d)#会报错 变两个数多于元组内元素的个数 # 用多个变量来接收函数的多个返回值 def func(): a = 10 b = 20 return a, b num1, num2 = func() print(num1, num2) # 10 20
六、函数的嵌套
def outter():
print('aaa')
def inner():
print('bbb')
inner()
outter()
# aaa
# bbb
def func1():
print('func1...')
def func2():
func1()
print('func2...')
def func3():
func2()
print('func3...')
func3()
# func1...
# func2...
# func3...