函数基础部分

平时开发中写程序就是开发一个一个的功能。

为什么要用函数?

不用函数的问题是:

1.程序冗长

2.程序的扩展性差

3.程序的可读性差

什么是函数?

在程序中,函数就是具备某一功能的工具。

事先将工具准备好即函数的定义。

遇到应用场景拿来就用即函数的调用。

函数的使用必须遵循先定义,后调用的原则。

函数是对程序逻辑进行结构化或过程化的一种编程方法。能将整块代码巧妙地隔离成易于管理的小块,把重复代码放到函数中而不是进行大量的拷贝——这样既能节省空间,也有助于保持一致性,因为你只需改变单个的拷贝而无须去寻找再修改大量复制代码的拷贝。Python中函数的基础部分与你熟悉的其他的语言没有什么不同。

怎么用函数?

定义函数:

def 函数名(参数1.参数2,….):

参数就是变量名,变量名用来外部给他传值,传进来值在函数体内可以给他调用

函数体代码

三引号里写函数功能的描述信息,文档注释

代码块

return 返回值

  定义:def关键字开头,空格之后接函数名和圆括号,最后还要加一个冒号。

       def是固定的,不能变。

       函数名:函数名是包含字母,数字,下划线的任意组合,但是不能以数字开头。虽然函数名可以随便取名,但是一般尽量定义成     可以表示函数功能的。

函数的定义阶段:

函数的使用必须遵循先定义,后调用的原则。没有事先定义函数,而直接引用函数名,就相当于在引用一个不存在的变量名。

函数定义阶段不执行函数体代码,只检测语法

申请内存空间,把函数体代码放进去,把函数体内存地址赋值给函数名。

定义函数时的参数就是函数体接收外部传值得一种媒介,其实就是一个变量名。

函数定义的三种形式:无参函数,有参函数,空函数。

无参函数:在函数定义阶段括号内没有参数称之为无参函数。

特点:定义时无参,意味着调用时也无需传入参数

有参函数:在函数定义阶段括号内有参数称之为有参函数。

特点:定义时有残,意味着调用时也必须传参

如果函数体代码逻辑需要依赖外部传入值,必须定义成有参函数。

空函数:函数体写个pass

调用函数:函数名后面加括号,括号里面可以传参数。

函数名()

调用函数分三种形式:

1.直接函数名加括号

2.表达式形式

3.把函数的调用当做参数传给一个函数

函数的调用阶段:

执行函数体代码,直到碰到return结束。或者一直运行完毕所有代码。

函数即变量。

定义一个变量,对应一个值

定义一个函数,对应一个值,函数名对应的是函数体的内存地址。

函数的返回值:

什么是返回值?

函数会向调用者返回一个值,而实际编程中大部分偏函数更接近过程,不显示地返回任何东西。把过程看待成函数的语言通常对于“什么都不返回”的函数设定了特殊的类型或者值的名字。这些函数在c中默认为“void”的返回类型,意思是没有返回值。如果保存了返回值,该值为None。

为什么要有返回值?

如果需要在程序中拿到函数的处理结果做进一步的处理,则需要函数必须要有返回值。

怎么用返回值?

函数的返回值用return去定义

格式为:

return 值

注意:

1.return是一个函数结束的标志,函数内可以有多个return,但只要执行一次,整个函数就会结束运行。

2.return的返回值无类型限制,即可以是任意数据类型。

3.return的返回值无个数限制,即可以用逗号分隔开多个任意类型的值。

1.return的作用:结束一个函数的执行

2.首先返回值可以是任意的数据类型。

3.函数可以有返回值:如果有返回值,必须要用变量接收才有效果

   也可以没有返回值:

  没有返回值的时候分三种情况:

    1.当不写return的时候,函数的返回值为None

    2.当只写一个return的时候,函数的返回值为None

    3.return None的时候,函数的返回值为None(几乎不用)

4.return返回一个值(一个变量)返回的值是该值本身。

5.return返回多个值(多个变量):多个值之间用逗号隔开,以元组的形式返回。

                接收:可以用一个变量接收,也可以用多个变量接收,返回几个就用几个变量去接收

函数的参数

什么是参数?在定义函数的时候括号内可以指定参数,这个参数本质相当于变量名。

为什么要定义参数?函数体代码需要函数函数的调用者传入值才能运行的时候,就需要为函数准备好参数。

如何用参数?

首先分为形参和实参

形参:在函数定义阶段括号内定义的参数,称之为形式参数,简称形参,本质就是变量名。

实参:在函数调用阶段括号内传入的值,称之为实际参数,简称实参,本质就是变量的值。

详细的分类:

1.位置参数:按照从左到右的顺序依次定义的参数

位置形参:在函数定义阶段,按照从左到右的顺序依次定义的形参,称之为位置形参。

特点:

但凡是按照位置定义的形参,都必须被传值,多一个不行,少一个也不行。

位置实参:在函数调用阶段,按照从左到右的顺序依次传入的实参,称之为位置实参。

特点:

按位置为对应的形参依次传值

2.关键字实参:在调用函数时,按照key=value的形式为指定的参数传值,称之为关键字实参。

特点:

可以打破位置的限制,但仍能为指定的形参赋值

注意:

1,可以混用位置实参和关键字实参,但位置实参必须放在关键字实参的前面!

2,可以混用,但不能对一个形参重复赋值。

3.默认参数(默认形参):在函数定义阶段,就已经为形参赋值。

特点:在定义阶段就已经被赋值,意味着在调用阶段可以不用为其赋值。

注意:

1,位置形参必须放到默认形参前面。

2,默认参数的值只在定义阶段赋值一次,即默认参数的值在函数定义阶段就已经固定死了。

3.默认参数的值通常应该定义为不可变类型。

#默认参数定义为可变类型的问题

# def register(name,hobby,hobbies=[]):

#     hobbies.append(hobby)

#     print('%s的爱好'%name,end=':')

#     print(hobbies)

#

# register('zrg','play')

# register('lqz','hello')

#修改

def register(name,hobby,hobbies=None):

    if hobbies is None:

        hobbies=[]

    hobbies.append(hobby)

    print('%s的爱好'%name,end=':')

    print(hobbies)

register('zrg','play')

register('lqz','hello')

总结:

实参的应用:取决于个人习惯。

形参的应用:

1,位置形参:大多数情况下的调用值都不一样,就应该将该参数定义成位置形参。

2,默认形参:大多数情况下的调用值都一样,就应该将参数定义成默认形参。

4.可变长参数:指的是在调用函数时,传入的参数个数可以不固定

而调用函数时,传值的方式无非两种,一种是位置实参,一种是关键字实参。

所以对应着,形参也必须有两种解决方案来分别接收溢出的位置实参(*args)和关键字实参(**kwargs)。

形参中的*会将溢出的位置实参全部接收,然后存储元组的形式,然后将元组赋值给*后的变量名。

实参中参数也可以带*,*会将该参数的值循环取出,打散成位置实参。(以后但凡碰到实参中带*的,他就是位置实参,应该立马打散成位置实参去看。)

形参中的**会将溢出的关键字实参全部接收,然后存储字典的形式,然后将字典赋值给**后的变量名。

实参中参数也可以带**,**会将该参数的值循环取出,打散成关键字实参。(以后但凡碰到实参中带**的,他就是关键字实参,应该立马打散成关键字实参去看。)

*args和**kwargs的应用

了解命名关键字形参

命名关键字形参:在函数定义阶段,*后面的参数都是命名关键字参数。

特点:在传值时,必须按key=value的形式传,并且key必须命名为关键字参数指定的参数。

原文地址:https://www.cnblogs.com/zhangrenguo/p/10358428.html