半大孩边玩边学编程之—自定义函数(1)

因为你我每个人每天都产生许多垃圾,以至于城市里每天都有成百上千吨的“垃圾”急需运送、分类、销毁、再造。其实在现代化的垃圾分类做得较好的城市,许多废旧垃圾是循环再利用的。比如大家都能想到的:玻璃瓶是可以熔化做成新的瓶子,废旧纸张可以重新做成再生纸,塑料当然也可以重新压制成其他生活必须品。

垃圾回收再利用

所以在日常生活中做好垃圾的分类是很重要的哟。其实在编程的世界里,“回收和再利用”或说“重复利用”同样是非常重要的。以至于在很大程度上,如果做不到这一点,程序设计根本毫无意义:想象下你昨天刚写的一个程序,今天想用它做一些别的事,可是你得需要再次重新从键盘上敲进去......哦!我反正会崩溃的。

事实上当然不会这样的。在Python中实现“重用代码”的方式有很多种。但其中有一种或两种方式其实我们已经使用过了,你可能想到了:函数(或方法)和模块。我们用乌龟画图的时候总是用range()函数,你什么时候需要一串连续的数字只要用它就行了,事实上range()这个函数和许多其他函数如我们经常用的如print()函数等称为“内置函数”——就是你在安装Python的时候就已经安装到电脑上了,直接用就可以;模块呢?同样在乌龟画图的时候,代码的第一句就是“import turtle”,引入的turtle就是一个模块:模块就像别人已经写好的并打包好的工具箱——里面的各种“工具”(就是函数啊等等)想用的话拿出来用就好了。你也看到了,使用模块最终的目的还是使用模块里面的“函数”,所以函数(英文function或方法)是代码重复利用的方式之一——函数你只需写一次,然后你就能在程序里一次又一次的重复使用了。

函数就像一个“机器”(感谢learnICT)

什么是函数呢?它就像一个机器(你可以把它想象成一个爆米花机器),你从一个入口输入一些参数(比如玉米粒),经过机器的加工处理后就从另一个出口输出结果(爆米花)。那如何做一个自己的函数呢?看下面的图就可以了。

自定义函数的方法

所以自定义函数很容易识别:一看到有个“def”就知道这是个函数;紧跟着def后面的就是“函数的名字”;括号里面的就是函数的"参数";冒号后面缩进的就是函数的“代码块”了。那我们自己做一个简单的函数吧。

程序代码·1

def myfunc(myname):

print ( 'hello %s' % myname)

函数的名字叫做myfunc,括号里面的myname是函数的“参数”:所谓“参数”就是仅·在·函·数·代·码·块·内·使·用·的·变·量。函数写完了该怎么使用它呢?使用函数我们称为“函数调(diao)用”——在提示符下用:函数名字(参数值)就行了。

程序代码·2

>>> def myfunc(myname): #函数定义

print ( 'hello %s' % myname)

>>> myfunc('38哥') #函数调用

hello38哥

细心观察上面的代码,在脑子里想象下:函数myfunc它的“入口”在哪儿呢?——对了,入口输入的就是参数myname,调用函数的时候用“38哥”代替;函数myfunc它的“出口”在哪儿呢?——就是用print()函数打印出名字(你应该注意到了,我们自定义的这个myfunc函数里还有个函数,就是“print”这个“内置函数”!)。

当然,你还可以先定义一个变量,然后将变量传入函数里,效果是一样的:

程序代码·3

>>> a = '39哥' #定义变量

>>> myfunc( a ) #函数调用

hello39哥

其实,比较“正统”的函数是应该有个“return”关键字的,return(英文“返回”)返回一个值,这个返回的值其实就是完全意义上的函数这个“机器”的输出,比如下面的例子:

程序代码·4

#函数定义

>>> def savings( jiawufei, songnaifei, huaxiao):

returnjiawufei+songnaifei-huaxiao

>>>print(savings(10,20,5)) #函数调用

25

你看到了这个函数savings有3个参数,函数的加工过程(或功能)就是将前2个参数相加再减去第3个参数,然后返回(return)给调用者。你当然可以将函数调用的结果赋给一个变量,然后再打印或留着以后用,像下面这样:

程序代码·5

#函数调用并赋值给变量a

>>> a = savings(10,20,5)

#打印这个变量

>>> print(a)

25

有一个是需要注意的:当我们在函数体(就是定义函数的代码块)内定义的变量只能在函数内可以用,在函数外面就不能使用了,比如我们定义了如下的函数:

程序代码·6

>>> x = 2

>>> def test():

a = 10

b = 20

return a * b * x

>>> print(test()) #打印函数结果

400

>>> print(x)

2

>>> print(a)

Traceback (most recent call last):

File "", line 1, in

NameError: name ’a’ is not defined

我们的函数test的函数体里面定义了a、b两个变量,函数返回a和b和x相乘之积。当我们用printh函数调用test()函数时可以输出正常结果;但当我想直接打印print(a)的值的时候,程序报错说“a没有定义”。这个问题涉及到变量的“作用范围”。

函数就像一个小岛(感谢Jason R.Briggs)

函数就像个在大海中间的一个孤单的“小岛”,它和外部世界无法联系。偶尔会有飞机飞过小岛并扔下一些纸张(就是函数的参数一样),小岛的居民捡起来这些纸张,写上字,然后塞进瓶子里再扔进大海里(函数的return返回值)。小岛居民无论做什么谁来捡起纸张,谁来写上字都和将来捡起瓶子读字条内容的人没有任何关系!

a和b是在函数test内定义的,你从函数的外面打印a当然会出错,而变量x本来就是定义在函数的外面的,变量x当然能够print打印出来,而且也能够在函数test内使用!明白了吧?函·数·里·面·定·义·的·变·量·只·能·在·函·数·里·使·用,函·数·外·面·定·义·的·变·量·既·能·在·函·数·里·使·用·也·能·在·函·数·外·使·用。

喜欢这篇文章的人也喜欢 · · · · · ·

▶ 《半大孩边玩边编程(python版)之(六)》-乌龟拉线

▶ 《半大孩边玩边编程(python版)之(七)-乌龟又作画

▶ 《半大孩边玩边编程(python版)之(十一)-while循环

▶ 《半大孩边玩边编程(python版)之(十二)-用while循环让乌龟画画

转载请留言|获得授权方可转载

本平台所使用的图片归相关权利人所有,因客观原因造成不当使用请随时与本平台联系,以协商授权事宜

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180328G1L3TS00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券