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.        

          

 

           

         

 

         

    

        

posted @ 2017-09-18 23:40  奋斗史  阅读(239)  评论(0编辑  收藏  举报