Day18_函数定义_形参_实参_可变参数
一. 上节课复习
- write补充
- f.write('111\n')
f.write('111\n') - f.writelines(['111\n','222\n']) #writelines 用法相当于write多行
- writelines() 方法用于向文件中写入一序列的字符串。
这一序列字符串可以是由迭代对象产生的,如一个字符串列表。
换行需要制定换行符 \n
- writelines() 方法用于向文件中写入一序列的字符串。
- f.write('111\n')
- truncate
- truncate() 方法用于从文件的首行首字符开始截断,截断文件为 size 个字符,无 size 表示从当前位置截断;截断之后 V 后面的所有字符被删除,其中 Widnows 系统下的换行代表2个字符大小
二. 定义函数
-
函数的定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可
- 特性:
减少重复代码
使程序变的可扩展
使程序变得易维护 - 注:函数的定义相当于变量的赋值,函数名相当于变量名,函数的代码相当于变量值;且定义阶段只检测函数的语法是否正确,但调用阶段则不同
- 特性:
-
函数分类
- 内置函数
- 自定义函数
def 函数名(arg1,arg2,arg3): '描述信息' 函数体 return 1
-
函数的定义和调用
- 定义无参函数:调用时为函数调用的语句形式
foo()
- 定义有参函数:定义时有参,调用时必须传参,且一般有返回值;调用时为函数调用的表达式形式
res=bar(1,2)
- 定义空函数
- 定义无参函数:调用时为函数调用的语句形式
-
函数的返回值
- 未在函数中指定return,那这个函数的返回值为None
- 如果return返回值为多个,会以元组的形式返回
- 总结:
- 可以返回任意类型
- return 1 ----> 1
- return 1,2,3 -----> (1,2,3)
- 没有return -----> None
- 函数执行到return就会结束掉
-
变量的解压
- '_'、'*_'
-
函数的参数
-
形参:在函数定义阶段,括号内定义的参数,本质就是变量名
-
实参:在函数调用阶段,括号内定义的参数,必须要有一个明确的值,可被当成变量值
- 注意:实参的值要为不可变类型
- 在函数中不要去修改全局的变量
```python
def foo(x,y) #形参
print(x)
print(y)
foo(1,2) #实参
```
-
在实参的角度的三种传值方式
- 按位置传值:
def foo(x,y): print(x) print(y) foo(1,2)
- 按照关键字传值
def foo(x,y): print(x) print(y) foo(x=1,y=2)
- 混用
- 按位置传值必须在按关键字传值的前面
- 对于一个形参,只能赋值一次,不能重复赋值
def foo(x,y): print(x) print(y) foo(1,y=2)
-
从形参的角度分析
- 位置参数,必须传值的参数
def foo(x,y): print(x) print(y) foo(1,2)
- 默认参数
- 默认参数必须放到位置参数的后面
def foo(x,y=1): print(x) print(y) foo(2)
- 默认参数在函数定义阶段,他的值就已经确定了
sex ='male' def register(sex=x): #register-----[sex = 'male'] print(sex) sex = None register() #输出为male
- 在函数中不要去修改全局的变量(不推荐下述方式)
x=[] def register(name,name_list=x): name_list.append(name) register('ASB') register('YSB') register('WSB') print(x) #['ASB','YSB','WSB']
三. 可变参数
-
*args
def foo(x,*args): #args = (2,3,4,5,6,'a','b') print(x) print(args) foo(1,2,3,4,5,6,'a','b') #输出为1;(2,3,4,5,6,'a','b')
1.1 *args 与位置参数和默认参数混用:*args要放到位置参数的后面
def foo(x,*args,y=2) print(x) print(args) print(y) foo(1,2,3,4,5,y=1000) #>>1;(2,3,4,5);1000
1.2. 从形参的角度
def foo(*args): #args=(1,2,3) print(args) foo(1,2,3)
1.3. 从实参的角度
def bar (x,y,z) print(x) print(y) print(z) bar(*(1,2,3)) #bar(1,2,3)
-
**kwargs
def foo(x,**kwargs): print(x) print(kwargs) foo(1,y=2,a=3,b=4) #<<1;{'b':4,'y':2,'a':3}
- 注意:**kwargs (按关键字传值),按位置传之后剩下的会给**,处理结果为{}字典的形式
- args (按位置传值),按关键字传值剩下的会给*,处理结果为()元组的形式
2.1. 混用
def foo(x,*args,**kwargs): print(x) print(args) print(kwargs) foo(1,y=1,z=2) #>>1,(),{'y':1,'z':2}
2.2. 从形参的角度
def foo(**kwargs): #{'x': 1, 'y': 2, 'z': 3} print(kwargs) foo(x=1,y=2,z=3)
2.3.从实参的角度
def foo(x,y,z=3): print(x) print(y) print(z) foo(**{'x':1,'y':2,'z':3}) #foo(x=1,y=2,z=3)
-
嵌套
def auth(name,password,sex='male'): print(name) print(password) print(sex) def foo(*args,**kwargs): #args =('egon','123') kwargs= {} print('from foo') auth(*args,**kwargs) #auth(*('egon','123'),**{})---------auth('egon','123') foo('egon','123') >>