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

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


往期回顾

  • 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点赞,好让我知道你懂了~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,999评论 4 368
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,102评论 1 302
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,709评论 0 250
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,439评论 0 217
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,846评论 3 294
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,881评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,062评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,783评论 0 205
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,517评论 1 248
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,762评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,241评论 1 264
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,568评论 3 260
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,236评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,145评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,941评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,965评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,802评论 2 275

推荐阅读更多精彩内容

  • 我一直觉得写代码也可以写出艺术,在不懂画的人的眼里,《向日葵》不过是小孩子的涂鸦,在懂代码的人眼里,那看似混乱的字...
    AidenRao阅读 4,071评论 9 59
  • 某次二面时,面试官问起Js排序问题,吾绞尽脑汁回答了几种,深感算法有很大的问题,所以总计一下! 排序算法说明 (1...
    流浪的先知阅读 1,171评论 0 4
  • (2013年4月28日)关关雎鸠jujiu,在河之洲。窈窕淑女,君子好逑。参差荇xing菜,左右流之。窈窕淑女,寤...
    逸而全真阅读 774评论 2 8
  • 周六早晨,带着喜欢听故事的兴奋劲,去简单心理主办的“故事客栈——无水之鱼”歇了歇脚,给自己的人生点个暂停,去他人的...
    豆璟阅读 555评论 0 3
  • 1 对面坐着两年未见的闺蜜––莫晓玉。 高大英俊,温柔白净,比欧阳要顾家,前提是单身,你周围有这样的人可要记得帮我...
    素一航阅读 383评论 0 2