Python3学习笔记之函数基础
1. 为什么要使用函数
函数可以方便阅读代码。
函数可以减少重复代码。
函数可以减少管理操作,减少修改操作。
2. 函数分类
内置函数:len() sum() max() min()
自定义函数:用户自己设定的函数
3. 函数定义语法
def 函数名称(参数1,参数2,参数3) : 也可以不加参数
'''注释说明'''
函数体 也就是要执行的代码
return 返回值
例子:
def name(): x=1 print (x) name() 结果:1
4. 函数的使用规则
先定义,后调用。
如果不定义,就调用,会有报错。相当于调用一个不存在的变量。
函数在定义阶段只检查语法,而不执行代码,所以不会报逻辑错误。只会报语法错误。
5. 定义函数的三种方式
无参数(如果函数无参数,那么调用函数的时候,也不用加参数)
例子:
def foo(): print('from foo') bar() def bar(): print('from bar')
有参数(如果有参数,那么调用函数的时候必须要加参数,当函数体代码需要传入的值)
def auth(username,password):
空函数用来设计代码结构
def a(): pass 使用了pass关键字
6. 如何调用函数
在函数的后面加() ,表示调用函数。
先找到函数名,然后根据函数名执行里面的代码。
7. 函数返回值
1. 无返回值 无return 返回None
例子:
def name(): print ('I love you !') print(name())
可以看到返回的值为none.
2. 返回一个值
def name(): print ('I love you !') return 520 print(name())
因为我要求return 520,所以打印调用函数的返回值为520
3. 返回多个值
def name(): print ('I love you !') return 520,1314 print(name())
可以看到返回的值放到了一个元组中,(520, 1314)
4. 注意:函数体中遇到return,函数执行代码就结束,并把return后面的值返回。函数体内可以有多个return,但是只执行一次。
return后面的值,可以是任意类型。返回是该值本身的数据类型。
return后面的值,如果是多个,用逗号分割开,并拼接成一个元组。
5. 什么时候该有返回值?
调用函数,经过一系列的操作,最后要拿到一个明确的结果,则必须要有返回值。
通常有参函数需要有返回值。
6. 什么时候不需要有返回值?
调用函数,仅仅只是执行函数体代码,最后不需要得到什么结果,则无需返回值。
通常无参函数不需要返回值。
8. 调用函数的三种方式
1. 常用的就是:函数名()
2. 把函数的返回值赋值给一个变量
3. 把函数的返回值放到一个数学表达式中。
def name(): return 5 a=name()*3 print(a) 结果:15
9. 函数的参数
1. 形参与实参
形参:定义函数的时候,出现在函数括号里面的参数就是形参,形参就是变量名
实参:调用函数的时候,出现在函数括号里面的参数就是实参,实参就是变量值
在调用阶段,实参才会绑定到形参,调用结束,绑定结束。
2. 参数的类型:
1. 位置参数
位置形参:必选参数,多一个不行少一个不行,写几个形参,就必须有几个实参
位置实参:从左往右,一个一个传值给形参
def xinxi(name,age): print(name) print(age) xinxi('yangjianbo',30) 输出结果: yangjianbo 30 位置实参换一下位置 def xinxi(name,age): print(name) print(age) xinxi(30,'yangjianbo') 输出结果: 30 yangjianbo
所以,位置参数就是从左到右传值,如果实参的位置颠倒,它依然还是从左到右传值。所以就需要下面的关键字参数,来配合位置参数使用。
2. 关键字参数
1. 指名形参的名称,采用key=value的方式。
def xinxi(name,age): print(name) print(age) xinxi(age=30,name='yangjianbo') 输出结果: yangjianbo 30
2. 那么位置实参跟关键字实参能不能混合使用呢?
1. 第一种情况:
def xinxi(name,age,sex): print(name) print(age) print(sex) xinxi('yangjianbo',age=18,sex='male') 输出结果: yangjianbo 18 male
可以混合使用,第一个参数使用位置实参,后面两个使用关键字实参。
2. 第二种情况:
def xinxi(name,age,sex): print(name) print(age) print(sex) xinxi(name='yangjianbo',18,sex='male') 输出结果: SyntaxError: positional argument follows keyword argument
第一个参数是关键字实参,第二个是位置实参,第三个是关键字实参,结果报错了,错误显示:位置参数在关键字参数的后面了。
也就是说:位置参数必须在关键字参数的前面,才有效果。
3. 第三种情况:
def xinxi(name,age,sex): print(name) print(age) print(sex) xinxi('yangjianbo',18,sex='male',name='houzhen') 输出结果: TypeError: xinxi() got multiple values for argument 'name'
我给name这个变量赋值两次,结果报错,错误显示:name变量得到了多个值,所以当位置实参和关键字实参混合使用的时候,要注意不能传多个值给一个变量。
3. 默认参数
1. 在定义阶段,已经为形参赋值。
def xinxi(name,age=20,sex): print(name) print(age) print(sex) xinxi(name='yangjianbo',18,sex='male') 输出结果: SyntaxError: non-default argument follows default argument
报错了:非默认参数不能放在默认参数后面,意思就是说:如果定义阶段,默认参数一定要放在最后面,位置形参一定在默认参数的前面。
2. 默认参数的值不可变类型。
def xinxi(name,age,sex='male'): print(name) print(age) print(sex) xinxi('yangjianbo',18) 输出结果: yangjianbo 18 male
使用默认参数:实参可以不用输入。
4. 可变长参数:
1. *args
def foo(x, y, *args): print(x, y) print(args) foo(1, 2, 3, 4, 5) def foo(x, y, *args): print(x, y) print(args) foo(1, 2, *[3, 4, 5]) def foo(x, y, z): print(x, y, z) foo(*[1, 2, 3])
args的结果为元组。
2. **kwargs
def foo(x,y,**kwargs): print(x,y) print(kwargs) foo(1,y=2,a=1,b=2,c=3) def foo(x,y,**kwargs): print(x,y) print(kwargs) foo(1,y=2,**{'a':1,'b':2,'c':3}) def foo(x,y,z): print(x,y,z) foo(**{'z':1,'x':2,'y':3})
kwargs的结果为字典
5. 命名关键字参数:
形参中,在*后面的参数就是命名关键字参数。
那么在传实参的时候,必须按照key=value的方式传值。
def foo(x, y, *args, a=1, b, **kwargs): print(x, y) print(args) print(a) print(b) print(kwargs) foo(1, 2, 3, 4, 5,b=2, c=4, d=5)
10. 练习题
1. 判断用户输入的对象长度是否大于5
def duixiang(str): if len(str)>5: print("长度大于5") else: print("长度小于5") duixiang((1,2,3,4)) 输出结果: 长度小于5
2.