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.
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号