- 本教程为python3文档解读
- 本教程面向完全型小白,只要你会在电脑上打字,那你就可以看懂。
- 参考视频观看,味道更加:https://space.bilibili.com/186584185/#!/video
- 建议优先阅读本系列的《编程的本质》这一章节。
贯穿始终的理念:别废话,就是干!
往期回顾:
- 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
结构分析:
-
def 关键字
define的缩写,就是定义的意思。 -
函数名字
名字一般以英文或者下划线开头。内部可以掺杂数字。
比如galipy1、galipy2、gali_py、_gali2py、galipy_
不过,一般以下划线开头的名字在程序中都有特殊作用,所以你就乖乖用英文取名字吧。 -
冒号
-
括号里的形式参数。
什么是形式参数呢?其实就是一个用来存储你输入的值的变量,这个变量可以有多个,看你自己需要几个,自行设定。 -
缩进
-
有时我们还会遇到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
下面就是程序的主体框架思路了。
- 我们来看第一句:
比较相邻的元素。 如果第一个比第二个大,就交换他们两个。
看到这句你能写出什么?
什么是相邻元素?列表的一号位和二号位,二号位和三号位,以此类推。
相邻不就是差一个的意思吗!
所以,用程序表示就是: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]
这不就是:如果、相邻、比较、交换吗?
我们在看下一句:
- 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。 在这一点,最后的元素应该会是最大的数。
说白了不就是先比较第一个与第二个,再比较第二个与第三个,再比较第三个与第四个,以此类推。
这不就是挨个遍历吗?
遍历用啥?for语句啊
所以程序语言如何写?
我们要从第一个遍历到最后一个,从1,到结尾,这是一个范围,所以会用range函数,和表示长度的len函数。
所以,代码如下:
for i in range(len(a)):
这不就是从列表第一个值0号位开始,到结尾位吗?
但是,我们在比较到倒数第二位时,就是比较最后两位的大小,所以也就不用在用最后一位比较其他的了,所以,我们的范围应该缩小一位。
变成len(a) - 1
也就是:
for i in range(len(a) - 1):
我们继续往下读:
- 针对所有的元素重复以上的步骤,除了最后一个。
这不就是循环往复吗,所以自然是用while循环了。并且设置好判断条件就行了。
于是就有:
while len(a):
但是人家强调除了最后一个,所以,应该少循环一次
while len(a) - 1:
为了方便书写,我们这样写
b = len(a) - 1
while b :
在设置下判断条件的改变方式
b = len(a) - 1
while b :
b = b - 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 的简写形式。
- 最后,用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( )函数~
希望上面的展示能让初学编程的你理解程序是如何写出来的~
如果学到了,记得在简书给咖喱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)