关于Python函数的相关基础知识点

基本函数的搭建:

1)关于创建和调用函数:  

以上便创建好了一个最基础的函数,但是如果不去调用这个函数,这个函数就永远不会执行,Python作为一门简洁的语言,其调用方法比C语言,Java等语言要简单的多

以上便能调用函数的功能输出函数中的内容。


       在Python中函数的调用和运行机制:当函数 myFirstFunction发生调用操作的时候,Python会
自动往上找到 def myFirstFunction()的定义过程,然后依次执行该函数所包含的代码块部令(也就是冒号后面的缩进部分内容)。

2) 函数的参数与返回值:

     1.参数

      像上面的那个函数为无参构建的函数,而在我们日常的学习中经常会用到有参函数的构建,如以下函数

       该函数便是设置了两个参数,在函数中通过print语句进行输出和调用,其中的somebody和something便为函数的形参,而在下面进行函数调用中会向函数中进行传值即为函数的实参,如下面函数中的a,b即为函数的实参。

       在该函数中有一个特殊的知识点就是关键字参数,前面在定义函数的时候,就已经把参数的名字和位置定下来了,Python 中这类固定的参数称为位置参数。对于函数的调用者来说,只需要知道按照顺序传递正确的参数就可以了。
可是有些时候,很容易会搞乱位置参数的顺序,以至于函数无法按照预期实现。对于这类情况,使用关键字参数就很有用了。

       如在上面的函数中第一种调用方法就是直接输入参数,而第二种则是通过关键字参数来实现不同位置却能把参数传值到正确的位置,但是需要主要的是以上两种传值方法是不存在先后顺序的,而在第三种传值方法中,位置参数必须要在关键字参数的前面,否则就会出错

      2.返回值

       有些时候,需要函数返回一些数据来报告执行的结果,比如生活中一件事是否做成功总得有个交代吧。所以,函数需要返回值。其实也用常简单,只需要在函数中使用关键字 return, 后面跟着的就是指定要返回的值。

        在Python中函数的默认返回值为None,但是它也可以根据不同的返回值类型来返回不同的值,而如果返回了多个值,Python的返回值默认是以元组的形式打包的

       当然也可以利用列表将多种类型的值打包到一起再返回。

3)函数文档:

        给函数写文档是为了让别人可以更好地理解你的的设计逻辑,在实际开发中,个人的工作量和能力确实相当有限,因此中、大型的程序永远都是团队来完成的。大家的代码要相互衔接,就需要先阅读别人提供的文档,因此适当的文档说明非常重要。而函数文档的作用是描述该函数的功能以及一些注意事项:

        但是开头的字符串并不会被打印,起作用和注释类似,但又不完全相同,文档注释不能被输出出来,但是函数文档则可以利用特殊手段输出出来

        在上述函数中便通过特殊属性__doc__来获取

4)收集参数:

        若实参个数不确定,在定义函数的时候,形参就可以使用收集参数来“搞定”。而
语法也很简单,仅需要在参数前面加上星号(*)即可:

        其原理就是把收集参数的参数们转为元组打包在一起。

        函数的定义中,收集参数前面的星号(*)起到的作用称为“打包”操作,通俗的理解就是将多个参数打包成一个元组的形式进行存储。而其中的星号(*)在形参中的作用是“打包”,而在实参中的作用则相反,起到“解包”的作用。

5)变量的作用域

        在Python中,变量的作用域(scope)是指变量可以访问和使用的区域。作用域规定了变量的可见范围和生存周期。

Python中有以下几种变量作用域:

  1. 全局作用域(Global scope):全局作用域是在整个程序中都可访问的作用域。在函数外部定义的变量属于全局作用域,在程序的任何地方都可以使用。

  2. 局部作用域(Local scope):局部作用域是在函数内部定义的作用域,只能在函数内部访问。在函数中定义的变量属于局部作用域,在函数外部是无法访问的。

  3. 嵌套作用域(Enclosing scope):嵌套作用域是在嵌套函数中的作用域,内层函数可以访问外层函数定义的变量

        作用域的查找顺序是“就近原则”,即先在当前作用域查找变量,如果找不到,再逐级向上查找直到全局作用域。

        在函数内部,可以使用global关键字将局部变量声明为全局变量,以便在函数外部也能访问和修改该变量。类似地,可以使用nonlocal关键字将内层函数中的变量声明为来自外层函数的变量。

        注意的是,在不同作用域中使用相同名称的变量会引起命名冲突和覆盖,因此在编写代码时应避免重复使用变量名。

6)   装饰器

        在Python中,装饰器(Decorator)是一种特殊的语法,用于修改或增强函数(或类)的功能。装饰器本质上是一个函数,它接受被装饰的函数作为参数,并返回一个新的函数(通常是一个包装函数),用于替代原始函数的功能。

        装饰器的主要作用是在不修改被装饰函数源代码的情况下,为其添加额外的功能或行为,例如日志记录、性能分析、权限验证等。通过装饰器,可以方便地对多个函数应用相同的功能扩展,提高代码的重用性和可维护性。

        下面是一个简单的装饰器示例:

 

        其中Python利用“@语法糖”来解决注释中ik = log(cake)代码繁多的问题,所以Python中使用语法糖来使程序更加简洁,有更高的可读性。

7)函数式编程

        1. lambda 表达式: lambda 是一种匿名函数的定义方式,它可以快速定义简单的函数而不需要使用 def 关键字。lambda 表达式的语法为:lambda arguments: expressionarguments 是函数的参数,expression 是函数的返回值表达式。

   2.filter() 函数: filter() 函数用于过滤可迭代对象中的元素,并返回一个符合条件的新可迭代对象。它接受两个参数:一个函数和一个可迭代对象。函数用于判断元素是否符合条件,符合条件的元素将被保留下来。

        3. map() 函数: map() 函数用于对可迭代对象中的每个元素都执行同一个操作(即函数),并返回一个包含所有操作结果的新可迭代对象

8) 递归

        递归(Recursion)是一种算法或函数调用自身的过程。在递归中,函数通过不断调用自身来解决问题,直到达到了某个终止条件才停止递归,而递归在解决一些算法问题的时候显得十分快捷与方便,例如生活中的汉诺塔的解法,裴波那契数列等问题都是可以通过递归来快速解决的。

        递归通常包含两个要素:

  1. 基线条件(Base Case):基线条件是指递归终止的条件。当满足基线条件时,递归将停止调用自身,并返回结果。

  2. 递归条件(Recursive Case):递归条件是指在没有满足基线条件时,递归函数会调用自身来推进问题的求解。

        适合使用递归的问题通常具有以下性质:

  • 可以被分解为相同子问题的重复性质。
  • 子问题与原始问题的解具有相同的结构。
  • 存在可以使问题规模减小的规律。

        递归的实现过程可以简化问题的表达和解决思路,但需要注意以下几点:

  1. 确保递归能够收敛到基线条件,否则可能导致无限递归,消耗过多的内存和时间。
  2. 递归的效率较低,因为每次递归都需要保存当前状态并调用新的递归函数。
  3. 可以使用尾递归(Tail Recursion)、记忆化递归(Memoization)等技巧来优化递归算法的性能

如在解决汉诺塔问题时:        

        我们对于游戏的玩法,可以简单分解为三个步骤:
                (1)将前63个盘子从X移动到Y上,确保大盘在小盘下。
                (2)将最底下的第64个盘子从x移动到Z上。
                (3)将Y上的63个盘子移动到Z上。
                这样看上去问题就简单一点了,但是步骤(1) 和步骤(3) 应该如何执行才是让人头疼的问题。
                但是仔细思考一下,在游戏中,我们发现由于每次只能移动一个圆盘,所以在移动的过程中显然要借助另外一根针才可以实施。也就是说,步骤(1) 需要借助乙将1~63个盘子移到Y上,步骤(3)需要借助X将Y针上的63个盘子移到乙针上。
          所以把新的思路聚集为以下两个问题:
                问题一,将X上的63个盘子借助乙移到Y上。
                问题二,将Y上的63个盘子借助X移到乙上。
        然后我们发现,解决这两个问题的方法与刚才第一个问题的思路是一样的,都可以拆解成三个步骤来实现。
         问题一(将X上的63个盘子借助乙移到Y上)拆解为:
                (1) 将前62个盘子从X移动到Z上,确保大盘在小盘下。
                (2) 将最底下的第63 个盘子移动到Y上。
                (3)将Z上的62个盘子移动到Y上。
        问题二(将Y上的63个盘子借助X移到乙上)拆解为:
                (1) 将前 62个盘子从Y移动到X上,确保大盘在小盘下。
                (2) 将最底下的第63个盘子移动到乙上。
                (3)将X上的62个盘子移动到Y上。
 

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值