• python之函数、参数、作用域、递归


    函数的定义

    函数也就是带名字的代码块。使用关键字def来定义,指出函数名及参数,以冒号结尾。

    def fibs(num):
    
    result =[0,1]
    
    for i in range(num-2):
    
    result.append(result[-2] + result[-1])
    
    return result
    
    print(fibs(10))

    参数

    此处fibs(num)其中的num就是一个形式参数(形参),而后面fibs(10)的10就是实际参数(实参)。简单的说,位于函数名后面的变量通常为形参,而调用函数时提供的值称为实参。位置实参(也就是实参的位置)顺序得注意,不同顺序结果不同。当然可以在调用函数的时候,指定位置实参的内容。比如上面的函数,最后指定print(fibs(num=10)),同样可以输出结果,更准确。

    形参也可以设置默认值,

    def pople(name, age , sex='man'):

    print(name + ' ' + age)

    pople('a', '21')

    如上,将形参参数sex设置为默认值的时候,当调用函数pople时,就不会输出sex的信息。也可以设置默认的形参参数,通过条件判断语句来输出参数形式。

    使用名称指定的参数称为关键字参数。

    函数返回的值成为返回值,使用return语句将值返回到调用函数的代码行,返回值让你能够将程序的大部分繁重工作移到函数中去完成,而简化程序。上面的第一个例子就是返回一个最终的result的结果。

    参数的收集与分配

    1.参数的收集

    参数前面的星号将提供的所有的值都放在一个元组中,也就是收集。

    带星号的参数也可以放在其他位置,但是得使用名称来指定后续参数:

    要收集关键字参数,要使用两个星号,但是得到的结果是一个字典,而不是元组:

    2.参数的分配

    通过函数的调用使用运算符*来实现:

    使用运算符**可以将字典中的值分配给关键字参数:

    下面是一个参数的练习:

    函数文档编写

    在这之中可以通过注释(以#开头)来编写,也还可以通过在def语句后面添加字符串来实现,这个放在函数开头的字符串称为文档字符串,将作为函数的一部分存储起来。

    通过__doc__来访问文档字符串(双下划线),也可以使用内置函数help来查看:

    变量的作用域

    简单的理解变量就是指向值的名称,在函数内使用的变量称为局部变量(与之相对的是全局变量)

    读取全局变量可以使用函数globals来访问,关联全局变量可以使用global来指定:

    递归

    函数调用自身称为递归,使用递归的都可以使用循环来实现。一般情况下,使用循环的效率可能更高,但是很多情况下,使用递归的可读性更高。

    以三个实例来说明,阶乘和幂,二分法。

    阶乘

    1的阶乘为1

    大于1的数字n的阶乘为n-1的阶乘再乘以n

    def fac(n):
        if n == 1:
            return 1
         else:
       return n * fac(n - 1)

    函数power为幂运算,任何数字x的0次幂都为1,即power(x,0)都为1

    n大于0时,power(x,n)为power(x,n-1)与x的乘积,也就是x自乘n-1次。

    def power(x, n):
        if n == 0:
            return 1
        else:
        return x * power(x, n - 1)

    二分法

    比一般循环效率高

    如果上限和下限相同,说明它们都指向的数字所在位置

    否则,找出中间的位置,再确定数字的左右的半部分,然后继续在数字所在那部分查找。

    以下为使用二分法找出数字所在的下标:

    def search(sequence, number, low=0, up=None):
        if up is None: up = len(sequence) - 1
            if low == up:
            assert number == sequence[up]
            return up
        else:
       middle = (low + up) // 2
    
      if number > sequence[middle]:
          return search(sequence, number, middle + 1, up)
       else:
          return search(sequence, number, low, middle)
  • 相关阅读:
    CocoaPods
    Git
    LLVM
    浅入浅出数据结构(11)——简要介绍算法时间复杂度
    浅入浅出数据结构(10)——树的简介
    浅入浅出数据结构(8)——栈、后缀表达式与四则运算计算器
    浅入浅出数据结构(7)——特殊的表:队列与栈
    浅入浅出数据结构(6)——游标数组及其实现
    浅入浅出数据结构(5)——链表的操作
    浅入浅出数据结构(4)——线性表与链表
  • 原文地址:https://www.cnblogs.com/whych/p/9630389.html
Copyright © 2020-2023  润新知