函数(二)
1.1函数参数
<1>. 缺省参数
定义:`
调用函数时,缺省参数的值如果没有传入,则取默认值`
def printinfo(name, age=35):
# 打印任何传入的字符串
print("name: %s" % name)
print("age %d" % age)
# 调用printinfo函数
printinfo(name="miki")
# 在函数执行过程中 age去默认值35
printinfo(age=9 ,name="miki")
<2>. 不定长参数
定义:
有时可能需要一个函数能处理比当初声明时更多的参数, 这些参数叫做不定长参数,声明时不会命名。
def functionname([formal_args,] *args, **kwargs):
"""函数_文档字符串"""
function_suite
return [expression]
<3>. 缺省参数在*args后面
def sum_nums_3(a, *args, b=22, c=33, **kwargs):
print(a)
print(b)
print(c)
print(args)
print(kwargs)
sum_nums_3(100, 200, 300, 400, 500, 600, 700, b=1, c=2, mm=800, nn=900)
1.2 拆包、交换变量的值
<1>拆包
使用不同变量对容器类型中的每一个数据进行保存,这种操作称为拆包
容器类型: 字符串,range, 列表,元组,字典,集合
#利用拆包获取字符串中的每一个数据
my_str = "abc"
my_list = [2,3]
my_dict = {"name":"张飞","age":20}
#这里对字符串拆包,对每一个数据进行保存
v1,v2,v3 = my_str
#对字典进行拆包,注意点:默认是对key进行拆包
data1,data2 = my_dict.values()
#对range进行拆包
value1,value2 = range(1,5,2)# =>[1, 3]
#对函数的返回值进行拆包,获取每一个数据
v1,v2,v3 = return_value()
#对列表
data1,data2 =my_list
1.3 引用(一)
引用就是使用变量保存了数据在内存中的一个地址
num = 1 # 提示:变量本质上存储的是数据在内存中的地址
# 提示:id函数获取的是一个10进制的内存地址
num_id =id(num)
print("num:",num,"内存地址为",num_id)
1.3 可变、不可变类型
所谓可变类型与不可变类型是指:数据能够直接进行修改,如果能直接修改那么就是可变,否则是不可变
1.可变类型(修改数据,内存地址不会发生变化)有: 列表、字典、集合
2.不可变类型(修改数据,内存地址必定发生变化)有: 数字、字符串、元组
1.4 引用(二)
引用当做实参
def test1(b): # 变量b一定是一个局部变量,就看它指向的是谁,可变还是不可变
b += b
# b = b+b
print(b)
# a = [11, 22]
a = 100
test1(a)
print(a)
#分别使用可变类型和不可变类型,测试 += 和 =+ 的行为,
#根据引用变化的方式可以分析出不同结果的底层原理
总结: Python中函数参数是传递引用,也就是数据的内存地址
对于不可变类型,修改形参,不影响实参
对于可变类型来说,修改形参,会影响实参
1.5函数使用的注意事项
1. 自定义函数
函数类型:
无参数、无返回值
def 函数名():
语句
无参数、有返回值
def 函数名():
语句
return 需要返回的数值
#函数中,可以有多个return语句,
#但是只要执行到一个return语句,那么就意味着这个函数的调用完成
有参数、无返回值
def 函数名(形参列表):
语句
#在调用函数时,如果需要把一些数据一起传递过去,被调用函数就需要用参数来接收
有参数、有返回值
def 函数名(形参列表):
语句
return 需要返回的数值
2.调用函数
函数名([实参列表])
调用时,实参的个数和先后顺序应该和定义函数中要求的一致
如果调用的函数有返回值,那么就可以用一个变量来进行保存这个值
3.作用域
在一个函数中定义的变量,只能在本函数中用(局部变量) a=100