python函数

titledatetagscategories
python函数
2019-09-03 16:39:19 -0700
python基础
python

函数的返回值

  • 利用元组返回多个值
def test():
    num = 1
    str = "hello"
    return (num, str)
    
temp = test()         #则temp是一个元组类型,对于不同的内容要使用对应索引调用,容易出错
temp1, temp2 = test() #或使用多个变量接收返回值,方便管理
  • 同理,可利用元组交换数据
a, b = (b, a)
a, b = b, a     # =右边是省略括号的元组

形参与实参

在函数内部对变量使用赋值语句,会在函数内部修改局部变量的引用,不会影响到外部变量的引用
def test(num, my_list):
    print("函数内部:")
    #赋值
    num = 10
    my_list = [4, 5, 6]
    print(num)
    print(my_list)
    
g_num = 5
g_list = [1, 2, 3]
test(g_num, g_list)
print("执行完成后")
print(g_num)
print(g_list)
  • 执行结果
函数内部:
10
[4, 5, 6]
执行完成后
5
[1, 2, 3]

实参未改变,其原因是变量与数据是分开存储的,g_num 指向数据5 的地址,当将g_num传入test函数是,实则是传入了数据5 的地址,而当使用赋值语句时,局部变量num指向新的数据10 ,但g_num仍然指向5

如果传入的是可变类型,在函数内部使用方法修改了数据内容,会同时修改外部数据
def test1(my_list):
	print("函数内部:")
	my_list.append(9)
	print(my_list)

g_list = [1, 2, 3]
test1(g_list)
print("程序结束:%s" % g_list)
  • 输出结果
函数内部:
[1, 2, 3, 9]
程序结束:[1, 2, 3, 9]

可见外部参数也被修改,其原因是使用数据的自身方法不会创建新的数据,而是在原有数据上的修改,外部变量和局部变量同时指向该地址,因而在函数内部使用方法修改后会影响外部参数

+=对于不可便类型是先相加后赋值,对于可变类型实质上是调用extend()方法
def test2(num, my_list):
	num += 10
	print("不可变类型函数内部+=结果%d" % num)
	my_list += [8]
	print("可变类型函数内部+=结果%s" % my_list)


g_number = 5
g_l1 = [1, 2, 3]
test2(g_num,g_l1)
print("不可变类型外部结果%d" % g_number)
print("可变类型外部结果%s" % g_l1)
  • 运行结果
不可变类型函数内部+=结果15
可变类型函数内部+=结果[1, 2, 3, 8]
不可变类型外部结果5
可变类型外部结果[1, 2, 3, 8]

可见前者外部未改变,后者外部改变


给函数添加缺省值

  • 在函数定义时可在参数后面加= 并添加缺省值
def test3(name, gender=True):   #True是gender的缺省值
	"""
	输入姓名和性别
	:param name: 姓名
	:param gender: 性别 True男生 False女生
	:return: null
	"""
	gender_text = "男生"
	if not gender:
		gender_text = "女生"
	print(name+"是"+gender_text)

test3("小明")           #gender未输入,则使用缺省值
test3("小美", False)    #指定gender
  • 输出结果
小明是男生
小美是女生
  • 注意:带有缺省值的参数必须放在参数列表的末尾

  • 当有多个缺省参数而需要指定特定的某个参数值时,需要同时输入参数名

def test4(name, gender=True, grade="大一"):
    #代码块
    ...

#如果指定gender
test4("小美", False)

#如果指定grade
test4("小明", grade="大二")

多值参数

  • 有时一个函数传入的参数个数是不确定的,这个时候就可以使用多值参数
  • python中有两种多值参数
    • 参数名前加一个 *可以接收元组
    • 参数名前加两个 * 可以接收字典
  • 一般给多值参数命名时,习惯使用以下名字
    • *args -- 存放元组 arguments(变量)
    • **kwargs --存放字典 kw是keyword
def demo1(num, *args, **kwargs):
	print(num)
	print(args)
	print(kwargs)

demo1(1, 2, 3, 4, 5, name="小明", age=18)   #这种写法无须拆包

键不需要加分号,并用=连接

  • 输出结果
1
(2, 3, 4, 5)
{'name': '小明', 'age': 18}

元组和字典的拆包

  • 在调用有多致参数的函数时,如果希望
    • 将元组直接传给args
    • 将字典直接传给kwargs
  • 就可以使用拆包
    • 在元组变量前加一个*
    • 在字典变量前加两个 *
def demo2(*args, **kwargs):
	print(args)
	print(kwargs)

g_nums = (1, 2, 3)
g_dict = {"姓名":"小明", "age":18}
demo2(g_nums, g_dict)
demo2(g_nums, **g_dict)
  • 运行结果
((1, 2, 3), {'姓名': '小明', 'age': 18})
{}
((1, 2, 3),)
{'姓名': '小明', 'age': 18}

可见前者字典也被传给了args,与期望不符,而后者加了** 实现预期

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值