目录
一、函数参数和返回值的作用
二、函数返回值(进阶)
三、函数参数(进阶)
四、传递任意数量的实参*星号*args—建立空元组
五、传递任意数量的键值对实参—两个星号**—建立空字典**kwargs
函数:封装功能独立的代码,在需要时通过函数名被调用
参数:外界希望在函数内部处理的数据
返回值:函数完成工作后,给调用者的一个结果
函数根据有无参数和返回值,可以相互结合,共有4种组合形式
1.无参数,无返回值
2.无参数,有返回值
3.有参数,无返回值
4.有参数,有返回值
定义函数时,是否接收参数,或是否返回结果,根据实际的功能需求决定
1.如果函数内部处理的数据不确定,就可以将外界的数据以参数传递到函数内部
2.如果希望一个函数执行完成后,向外界汇报执行结果, 就可以增加函数的返回值
返回多个结果
在函数中使用return关键字可以返回结果
那么如何让函数执行后返回多个结果?
def test():
print('第一名同学是...')
name1 = 'zhangsan'
print('第二名同学是...')
name2 = 'lisi'
### 元组可以包含多个数据,使用元组让函数一次返回多个值
### 如果函数返回的类型是元组,小括号可以省略
### return (name1,name2)
return name1,name2 ## 函数返回一个元组,包含name1和name2的值
name = test() ## name接收函数返回值 name数据类型是元组
print(name)
函数返回类型是元组,同时希望单独的处理元组中的元素,使用多个变量,一次接收函数的返回结果。
比如,我想单独显示同学1或同学2,那怎么编写呢?我们添加以下代码
gl_name1,gl_name2 = test() ## 使用多个变量一次接收函数的返回结果
print(gl_name1) ## 注意:多变量接收结果时,变量的个数应该
print(gl_name2) ## 和元组中元素的个数保持一致
试题- -交换数字:
a = 6
b = 100
# python 专有方法;等号右边是一个元组,将小括号省略
a, b = b, a
函数内部参数赋值不影响外部实参
def test(num, num_list):
print('函数内部代码')
num = 100 ## 函数内参数
num_list = [1, 2, 3] ## 函数内参数
print(num)
print(num_list)
print('函数执行完成')
gl_num = 99
gl_list = [4, 5, 6]
test(gl_num, gl_list)
print(gl_num)
print(gl_list)
#####################
函数内部代码
100
[1, 2, 3]
函数执行完成
99 ## 不影响外部参数num
[4, 5, 6] ## 不影响外部参数num_list
修改内部参数会影响外部实参
若传递的参数是可变类型,在函数内部,使用方法修改数据的内容,同样会影响到外部的数据
def test(num_list):
print('函数内部')
num_list.append(9) ## 使用.append()方法会改变外部参数数据
print(num_list)
print('函数完成')
gl_list = [1,2,3]
test(gl_list)
print(gl_list)
######################
函数内部
[1,2,3,9]
执行完成
[1,2,3,9]
面试题- - +=
def test(num, num_list):
print('函数内部')
num += num
num_list += num_list ## 列表变量调用"+="
# num_list.extend(num_list) ## 本质上是在执行列表变量的extend方法
print(num)
print(num_list)
print('函数完成')
gl_num = 9
gl_list = [1,2,3]
test(gl_num, gl_list)
print(gl_num)
print(gl_list)
########################
函数内部
18
[1, 2, 3, 1, 2, 3]
函数完成
9 ## 整型,字符的'+='不会影响外部实参
[1, 2, 3, 1, 2, 3] ## 函数内部列表的'+='影响了外部列表实参,等同于使用方法extend()
指定缺省参数
定义函数时,给某个参数指定一个默认值,具有默认值得参数就叫缺省参数(也叫默认参数)
调用函数时,如果没有传入缺省参数的值,则在函数内部使用该缺省参数的默认值
将常见值设置为参数缺省值,达到简化函数的调用,如:
def print_info(name, sex = True): ## 缺省参数sex
sex_text = '男生'
if not sex: ## 指定sex值为False时,执行该行命令
sex_text = '女生'
print('%s 是 %s' % (name, sex_text))
print_info('小明')
print_info('小嫣', False)
##########################
小明是男生
小嫣是女生
缺省函数注意事项
1 .缺省参数定义位置: 必须在形参列末尾
def print_info(name, title, sex=True): ## sex缺省参数必须在参数列末尾
2 .调用多个缺省参数的函数:调用时,必须指定参数名
def print_info(name, title='doc', sex=True):
sex_text = '男生'
if not sex:
sex_text = '女生'
print('%s%s是%s' % (title, name, sex_text))
print_info('小明', title='dri', sex=True) ## 正确写法
print_info('小嫣', False) ## 错误写法
###############################
dir小明是男生
False小嫣是一个男生 ## 因调用时,第二个参数Flase没指定传给谁,就默认传给了title
只有*
星号的形参,如果事先不知道要传递多少参数给函数,则可以使用带星号*
的形参,星号意味着让python创建一个名为names的空元组(如下代码),常用*args表示,结果以元组的形式输出
def personal_message(*names):
print(names)
personal_message('lusy')
personal_message('lusy','wudl','Daly')
同时有*
星号和位置实参。同时存在位置实参,关键字实参和星号形参是比较常见的,也很实用,这个时候,通常建议将*
号参数放在最后,则默认先匹配位置实参和关键字实参最后剩下的都收集到星号的形参中
def personal_message(gender,*names):
print('gender: ',gender)
print('names: ',names)
personal_message('male','wudl','Daly','Abdule')
def personal_message(gender,age,*names):
print('gender: ',gender)
print('names: ',names)
print(age)
personal_message('male','18','wudl','Daly','Abdule')
注意:以下是错误写法
def personal_message(gender,age,*names):
print('gender: ',gender)
print('names: ',names)
print(age)
personal_message(gender='male',age='18','wudl','Daly','Abdule')
使用两个星号**让python建立一个名为user_info(如下代码)的空字典,通常我们使用**kwargs
def build_profile(first,last,**user_info):
#创建空字典,有用户的所有信息
profile = {}
profile['first_name'] = first
profile['last_name'] = last
for key,value in user_info.items():
profile[key] = value
return(profile)
user_profile = build_profile('deliang','wu',
age='22',
location='Beijing')
print(user_profile)
>>>
{'age': '22', 'location': 'Beijing',
'last_name': 'wu', 'first_name': 'deliang'}
我们输入的键值对age=‘22’,location='Beijing’会传递到由两个星号建立的空字典user_info中。