函数2
-
缺省参数
回忆内置函数print()的用法
- 可以在定义的时候采用赋值的方式,给予默认值,给定默认值的参数要放在后面
- 此时如果缺少参数就采用默认参数,如果有输入,就采用输入值
- 关于实参的写法,可以全部使用位置参数,此时必须要按照形参顺序;也可以全部是用关键字的方法,此时次序没有限制.如果采用位置和关键字的混合,那么关键字参数一定要放在后面,而且前面的位置参数要对应形参
def say_hello(name,age,city): print('大家好,我是{},我今年{},我来自{}'.format(name,age,city)) say_hello('wanger',24)#此时会报错,因为缺少了一个必要的参数city def say_hello(name,age,city='yancheng'): print('大家好,我是{},我今年{},我来自{}'.format(name,age,city)) say_hello('wanger',24)
-
多个参数
- 想到用列表,元组,集合
- 如何得到用户输入的多个数据
- 使用while循环
- 让用户按照指定格式输入数据,然后再转
def many_sum(iter): x=0 for i in iter: x+=i return x #使用while循环 nums=[] while True: num=input('请输入你要的数字,输入exit结束:') if num=='exit': break else: nums.append(int(num)) print(nums) #让用户按照指定格式输入数据 nums=input('请输入你要的列表,数字用逗号隔开:') nums=nums.split(',')#导出一个列表 print(nums) # #用while循环,将字符串转成数字 # new_nums=[] # i=0 # while i<len(nums): # new_nums.append(int(nums[i])) # i+=1 # print(new_nums) #这么写会出问题,不会将里面的元素转化成数字 for num in nums: num=int(num) print(nums) print(nums)
-
可变参数
-
可变的位置参数
- *args一定要写在位置参数后面
- 按顺序对应,多余的会打包成一个元组存入args
-
可变的关键字参数
- 关键字参数一定要在位置参数后面
- 按照关键字对应,多余的会打包成一个字典存入kwargs
#使用*args可以使用多个位置参数 def many_print(a,b,*args): #这样写就至少得输入两个参数 print("a={},b={}".format(a,b)) #按顺序对应,多余的会打包成一个元组存入args print('args={}'.format(args)) many_print(1,2,3,4,5,6) print('-----------') #使用**kwargs可以使用多个关键字参数 def p(a,b,*args,x=0,y=1,**kwargs): # 注意顺序 print("a={},b={}".format(a, b)) # 按顺序对应,多余的会打包成一个元组存入args print('args={}'.format(args)) print('x={},y={}'.format(x,y)) print('kwargs={}'.format(kwargs)) #按照关键字对应,多余的打包成一个字典存入kwargs p(2,3,5,6,x=1,y=2,z=3,h=6) #result a=1,b=2 args=(3, 4, 5, 6) ----------- a=2,b=3 args=(5, 6) x=1,y=2 kwargs={'z': 3, 'h': 6}
-
-
可变数据类型和不可变数据类型的传参
def test(a): print('修改前a的地址%X'%id(a)) a=100 print('修改后a的地址%X' % id(a)) def demo(nums): print('修改前nums的地址%X'%id(nums)) nums[0]=10 print('修改后nums的地址%X' % id(nums)) x=1 #不可变数据类型 print('调用前x的地址%X'%id(x)) #调用前后a的地址发生了变化,但是x的地址没有发生变化 test(x) print(x) print('调用后x的地址%X'%id(x)) y=[1,2,3,4,5,6] #可变数据类型 print('调用前y的地址%X'%id(y)) #调用前后,nums和y的地址都没发生变化 demo(y) print(y) print('调用后y的地址%X'%id(y)) #result 调用前x的地址7FEE1D17110 修改前a的地址7FEE1D17110 修改后a的地址7FEE1D17D70 1 调用后x的地址7FEE1D17110 调用前y的地址3F5208 修改前nums的地址3F5208 修改后nums的地址3F5208 [10, 2, 3, 4, 5, 6] 调用后y的地址3F5208
-
函数的注意事项
-
Python中不允许函数重名,如果函数重名,那么后一个会覆盖前一个
-
定义变量要避开函数名,否则会把已有的函数覆盖(包括内置函数)
#函数的注意事项 #不能重名 def test(a,b): print("a={},b={}".format(a,b)) def test(m): print('hello','good','m={}'.format(m)) #test(1,2) #此时下面的函数已经覆盖了上面的函数,这样调用就会报错 test=3 #test(2) #此时变量test已经覆盖了test函数,调用就会出错 input=12 #input(12) #此时变量input已经覆盖了input函数,调用就会报错
-