Python的函数简析

1.面向过程的基本定义,以及函数在内存中基本调用情况

2.Python中函数的基本应用(定义,调用,传参)

3.Python中函数参数简析(必需参数,命名(关键字)参数,默认参数,可变* **,匿名参数表达式,全局函数的引用)

4.返回值简析()

5.函数间参数的传递,以及函数的传递

6.修改全局变量的问题

壹   函数是面向过程语言的基础

函数是面向过程语言的基础,当然,Python是一门大名鼎鼎的面向对象的语言,但是函数也是Python很重要的一个组成部分

什么是面向过程?

打个比方,食堂要给1000个员工做饭,面向过程的话就是:给员工A做西红柿炒蛋,给员工A做青椒小炒肉,给员工B做西红柿炒蛋,给员工B做青椒小炒肉,给员工C做西红柿炒蛋,给员工C做青椒小炒肉,给员工D......  以此类推,由上而下,总头至尾按部就班的执行所需要的步骤,就是面向过程的编程。

底层开发经常用的c语言,就是一款很典型的面向过程的编程语言,它是根据目标,去一个个的调用执行所需要的函数,按步骤一步步来的。

所以,函数的存在就是面向过程一个重要的标志;那什么是面向对象呢?后面讲到了Python面向对象编程的思想以后,我会再次拿这个食堂做饭的例子讲一下,就茅塞顿开了~

在Python中,调用一个函数的调用过程,在底层解释中叫做 “ 压栈 ” ,就是把需要调用的函数代码编译的机器语言转入到内存中,新建一个堆进行执行操作;等到函数执行完之后,就将内存中的机器余语言代码清空,拟称为 “ 弹栈 ” 。 

贰   Python中函数的基本应用

在Python中,如果要创建一个函数,需要如下定义:

def 函数名 (参数):
    函数体
    return 返回值
  • 因为函数是一种对缩进换行敏感的语言,所以必须以关键字def开头;
  • 后面接着函数的名称和圆括号()内存放着需要使用的参数列表;
  • 函数的内容必须要以外加缩进起始;
  • return后紧跟需要返回给调用者的数值,专称返回值;

我们先试着写出并调用一个最简单的输出函数:

于是我们所需要的字符串就被输出了出来;这是一个典型的无参函数:因为函数内没有参数的传递等问题;

这就是一个很典型的有参函数,参数传递中数据类型为“str”值

上面两个例子中在结尾分别通过有参数调用和无参调用了两个不同的函数,形式都是:

函数名 (参数)

叁   Python中函数参数简析

在Python中,函数内的参数主要有以下几个类型:

  • 必需参数
  • 命名(关键字)参数
  • 默认参数
  • 可变 *** 类型
  • 匿名参数
  • 全局函数的引用*

必需参数:

简要地说就是必需向函数内传入一个正确的参数,不然函数就会报错

如此报错,所以说,在上面这个例子内的函数来说,par也就是一个必需参数

命名(关键字)参数

这个参数也相对简单,就是在调用函数传参的时候,传入一个有着“参数名”的参数,而且这个参数名必须和函数内部所使用的名字相同,不然就会报错:

这样就报错了,因为关键字使用错误......

默认参数

默认参数,顾名思义,就是一个被预先默认好了的参数,在函数定义时候已经被预先设定好了一个默认值:

这样子及时在调用的时候没有对其进行定义,也不会一想到函数的调用,就会直接使用默认值进行传参;例子里面在调用的时候就没有对其进行传参;当然,如果有了默认参数,还要继续传参的话,便会按照我们所传递的参数值进行传递

优先级: 手动参数 > 默认参数

可变参数(万能参数)

可变参数分为两种:

  • *型参数,传递值数据类型为元组
  • **型参数,传递值得数据类型为字典

先来看 * 型参数:

这就是 * 型参数,在函数开始的时候定义时候需要在参数名前面加一个 * 号,代表元组型可变参数;

在上面这个例子里面,我们前三个必需参数使用完之后,三个以后的所有参数都回进入到元组型可变参数中,通过元组的形式进行存储,传递;我们在函数体内部进行引用的时候,直接使用它的命名名字就可以进行引用;

且这个可变参数一旦传参成功,在函数内便不可修改,具体用法与元组一样

再来看**型参数:

使用方法同*元组型可变参数类似,但是他在第三个以后的所有参数都回进入到字典型可变参数中,通过字典的形式进行存储,传递;所以我们在调用函数时,传递的参数必须是要以键值一一对应的形式进行传参,不然就会报错;

注意:**型参数调用传递的时候  键  字符串不能加“”不然也会报错

匿名函数

在Python中,我们使用 lambda 关键字来创建匿名函数,而不是使用我们所熟知的def;其所谓是匿名函数,是因为它经济只是一个表达式,比正常意义上的def函数简洁很多;而她的主题仅仅是一个表达式,并不是代码块,所能实现的功能和用途也非常局限;lambda函数拥有属于自己的命名空间,且不能访问自己之外的空间里的全局空间内的参数;

匿名函数的使用方法:

变量名称 = lambda 函数体 : 返回值

这就是一个最基础的匿名函数,他没有名字,函数体直接赋值给变量sum,sum直接指向了存储函数体的内存地址,我们直接打印sum瞅瞅:

这就是匿名函数他的底层运行原理

Python中的全局函数

这里我就是简单演示一下Python中全局函数有哪一些:

首先导入模块:import builtins

查看有哪些全局函数:dir(builtins)

啊好像有点小多,我打算在下一个博客中简要分析一下全局函数在Python中的应用

肆   Python函数返回值简析

前面简要的提到了一下Python函数中return语句的基础使用,这里就结合着“递归函数”来详细说一下;

函数返回值,就是通过函数体对传入参数执行之后,在函数结束的时候,返回给调用者(有可能是一个变量,也有可能是另一个函数)的一个具体的数值,就是函数的返回值:

可以看到,函数体进行了一个传入参数的乘法运算,然后把结果在函数体内直接赋值,return返回最后的乘积,就是返回给调用者的数值;

我们再来看这个例子,很显然的表面了一个逻辑:调用者最后拿到的数值与函数体无关,只是与函数最后的返回值有关;

且Python函数运行返回多个值,最后一元组形式存储传递,输出;

递归函数在返回值中的应用

我们需要设计一个可以计算累乘的程序,于是我们如下设计:

我们在返回值中直接调用了自身函数,就形成了一个所谓 “ 递归 ” 的函数应用,简洁的说就是“套娃”,将函数环环相嵌,在灭亡中走向永生,也许这就是编程哲学的最高境界吧

伍   函数间参数的传递,以及函数的传递

首先我们来看这个例子;

很明显,x的值就是230,这是不可磨灭的事实,但是,假如我们这样子给x赋值呢:

我们去掉了他的参数和后面的括号,直接赋值为函数的名字odd?

这个时候,我们相当于做了一件有点牛逼的事情:函数的传递(不是对象不能叫继承)

相当于把odd这个函数的所有内容直接赋值给了x这个变量,这里的x就相当于一个指针堆大概就是这样,类似于Linux里面的软链接

随意我们在这儿可以吧变量x当成一个新的函数来使用(x的代码块将会与odd函数的代码亏啊一同变化):

结果也是230

神奇的Python

陆   函数中引用全局变量的问题

什么是全局变量?

上面左图的i很明显想用的就是全局(外部)变量 i = 99,而右边的调用就是局部(内部)变量 i = 9

全局变量就是在整个程序中任何地方都能使用的变量,但是在函数体中,默认优先使用的是局部变量

要是我们想在函数中使用全局变量,并且修改全局变量的话,我们需要使用到以下关键字:global

首先在global后面加上全局变量的名称(必须先声明,不然会报错),然后才能在下面进行赋值等操作

我们这里能够看到,修改之后,即使在函数外面,变量 i 的值也变为了函数内进行修改后的 1 值

拒绝终点思维,不断成长学习爱是永恒的主题

= =

发布了34 篇原创文章 · 获赞 36 · 访问量 5918

猜你喜欢

转载自blog.csdn.net/Alexz__/article/details/104488102