美文网首页python初学者@IT·互联网程序员
跟我读python3文档:016_带你手撕程序,展现一个函数如何

跟我读python3文档:016_带你手撕程序,展现一个函数如何

作者: 咖喱py | 来源:发表于2017-08-30 23:52 被阅读458次

    贯穿始终的理念:别废话,就是干!


    往期回顾

    • break
    • continue
    • len( )函数
    • range( )函数的返回值,以及三个参数
    • 帮助函数
    • type( )
    • a, b = b, a

    想看手撕程序的,请跳过4.6小节,直接往下翻。

    4.6. Defining Functions

    上期我们尝试生成了10以内的斐波那契数列( the Fibonacci series),那么如何生成任意边界的斐波那契数列呢?

    这就要用到函数这个概念了。
    相当于我们写一个小程序,他的功能就是生成我们指定边界的斐波那契数列,比如我在这个小程序中输入10,他就会生成:1, 1, 2, 3, 5, 8。

    那么这个小程序有哪些基本要素呢?
    我们直接用代码说话:

    >>> def fib(n):   
    ...     a, b = 0, 1
    ...     while a < n:
    ...         print(a, end=' ')
    ...         a, b = b, a+b
    ...     print()
    ...
    

    小程序fib( )就写好了,也就是说,我们写好了一个名为:fib( )的函数。
    我们运行fib( ) 函数看看:

    >>> fib(2000)
    0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597
    

    结构分析:

    1. def 关键字
      define的缩写,就是定义的意思。

    2. 函数名字
      名字一般以英文或者下划线开头。内部可以掺杂数字。
      比如galipy1、galipy2、gali_py、_gali2py、galipy_
      不过,一般以下划线开头的名字在程序中都有特殊作用,所以你就乖乖用英文取名字吧。

    3. 冒号

    4. 括号里的形式参数。
      什么是形式参数呢?其实就是一个用来存储你输入的值的变量,这个变量可以有多个,看你自己需要几个,自行设定。

    5. 缩进

    6. 有时我们还会遇到return语句,等遇到时在解释。

    试着自己参考着以上要点,模仿着写几个函数,然后执行看看能不能成功得到想要的结果。比如把我们之前介绍的冒泡排序法完善下~


    到目前为你,如果你是跟着我的教程一步一步走来的话,那么恭喜你,你的一只脚终于迈进了编程的大门。
    理论上,掌握了上边的5个要点,再加上之前学的语句,你就可以开始用最原始的方法写程序了。虽然大型程序还费点劲,但是解决点小问题还是绰绰有余的。
    不过,你的编程之路才刚刚开始。
    你现在只不过是初入江湖,离走出新手村还有很远的道路。
    建议先停下脚步,回忆回忆我们之前讲的东西。

    试着自己写出:斐波那契数列、冒泡排序法。
    如果你能完成上面两个函数,并且成功运行,那么说明你的阶段学习是合格的,可以开始之后的学习。
    如果你发现自己依旧不能写出来,那就停下来,回顾回顾以前讲解的知识,看看自己到底是哪里不明白。


    作者:咖喱py

    手撕函数

    下面,我以冒泡排序为例,给大家讲解下写程序的基本思路:

    一、自然是先google下,看看什么是冒泡排序。

    得到如下结果:

    冒泡排序算法的流程如下:
    比较相邻的元素。 如果第一个比第二个大,就交换他们两个。
    对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。 在这一点,最后的元素应该会是最大的数。
    针对所有的元素重复以上的步骤,除了最后一个。
    持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

    上面这些就是思路。
    下面的就是实现过程

    二、按照提示构建程序。

    我们依旧以[5, 432, 23, 73, 98, 23, 765, 11, 90, 69, 4]这个列表为例。

    a = [5, 432, 23, 73, 98, 23, 765, 11, 90, 69, 4]
    

    得到列表a

    下面就是程序的主体框架思路了。

    1. 我们来看第一句:

    比较相邻的元素。 如果第一个比第二个大,就交换他们两个。

    看到这句你能写出什么?
    什么是相邻元素?列表的一号位和二号位,二号位和三号位,以此类推。
    相邻不就是差一个的意思吗!
    所以,用程序表示就是:a[ i ]与a[ i + 1 ]

    然后我们继续看关键词:比较、相邻、如果、交换。
    那我们就用程序表达出来呗:

    if a[i] > a[i + 1]:
        a[i], a[i + 1] = a[I + 1], a[i]
    

    我们让 j = i + 1,方便书写。

    if a[i] > a[j]:
        a[i], a[j] = a[j], a[i]
    

    这不就是:如果、相邻、比较、交换吗?


    我们在看下一句:

    1. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。 在这一点,最后的元素应该会是最大的数。

    说白了不就是先比较第一个与第二个,再比较第二个与第三个,再比较第三个与第四个,以此类推。
    这不就是挨个遍历吗?
    遍历用啥?for语句啊
    所以程序语言如何写?
    我们要从第一个遍历到最后一个,从1,到结尾,这是一个范围,所以会用range函数,和表示长度的len函数。
    所以,代码如下:

    for i in range(len(a)):
    

    这不就是从列表第一个值0号位开始,到结尾位吗?
    但是,我们在比较到倒数第二位时,就是比较最后两位的大小,所以也就不用在用最后一位比较其他的了,所以,我们的范围应该缩小一位。
    变成len(a) - 1
    也就是:

    for i in range(len(a) - 1):
    

    我们继续往下读:

    1. 针对所有的元素重复以上的步骤,除了最后一个。
      这不就是循环往复吗,所以自然是用while循环了。并且设置好判断条件就行了。
      于是就有:
    while len(a):
    

    但是人家强调除了最后一个,所以,应该少循环一次

    while len(a) - 1: 
    

    为了方便书写,我们这样写

    b = len(a) - 1
    while b :
    

    在设置下判断条件的改变方式

    b = len(a) - 1
    while b :
        b = b - 1
    

    1. 最后,把他们组合一下:
    a = [5, 432, 23, 73, 98, 23, 765, 11, 90, 69, 4]
    b = len(a) - 1
    while b :
        for i in range(len(a)-1):
    
            j = i + 1
    
            if a[i]>a[j]:
                a[i], a[j] = a[j], a[i]
    
        b -= 1                                   #这是b = b - 1 的简写形式。
    
    1. 最后,用print函数把结果打印出来就可以了。
    a = [5, 432, 23, 73, 98, 23, 765, 11, 90, 69, 4]
    b = len(a) - 1
    while b :
        for i in range(len(a)-1):
    
            j = i + 1
    
            if a[i]>a[j]:
                a[i], a[j] = a[j], a[i]
    
        b -= 1
    print(a)
    

    三、封装为函数,方便调用。

    有了主体框架了,我们在把它封装下,做成一个可以排序任意长度列表的函数就可以了。
    用我们新学的知识:自定义函数。
    取个函数名字,就叫:bubble吧~

    def bubble(a):
        b = len(a) - 1
        while b :
            for i in range(len(a)-1):
                j = i + 1
                if a[i]>a[j]:
                    a[i], a[j] = a[j], a[i]
            b -= 1
        print(a)
    

    大功告成~
    试试你的bubble( )函数~

    bubble函数.png

    希望上面的展示能让初学编程的你理解程序是如何写出来的~
    如果学到了,记得在简书给咖喱py点赞,好让我知道你懂了~

    相关文章

      网友评论

      • 爱猫猫的老狗:老师,我是这样想的,能不能不用每次都全部遍历比较,因为每次遍历都会产生一个最大值放在后面,这个值就不用再参加下次的比较了,也就是说遍历的次数可以逐次减一,提高程序效率。
        def bubble(a):
        b = len(a) - 1
        while b :
        for i in range(b):#把例子中的len(a)-1修改成b
        j = i + 1
        if a[i]>a[j]:
        a[i], a[j] = a[j], a[i]
        b -= 1
        print(a)
        爱猫猫的老狗:@咖喱py 666
        咖喱py:感受下~https://www.bilibili.com/video/av13977395/
      • 爱猫猫的老狗:while b 等同于while b>0对吧?
        咖喱py:把它理解为【判断条件】是对的,但不完全正确。注意while语句块中,b的变化条件。b在自减,所以b最终会小于等于零 。
      • 爱猫猫的老狗:while b 是什么意思?求解释。
        爱猫猫的老狗:@咖喱py 非常感谢
        咖喱py:@爱猫猫的老狗 http://www.jianshu.com/p/3af5774259f1
        cuiqbo:@爱猫猫的老狗 如果b为真 然后while
      • leader4:学到了!!!这是我看过的讲编程思路讲的最明白的教程了!大神不愧是大神!膜拜!

      本文标题:跟我读python3文档:016_带你手撕程序,展现一个函数如何

      本文链接:https://www.haomeiwen.com/subject/uujxjxtx.html