跟老齐学Python之重回函数


Posted in Python onOctober 10, 2014

函数的基本结构

Python中的函数基本结构:

def 函数名([参数列表]):

    语句

 几点说明:
 •函数名的命名规则要符合python中的命名要求。一般用小写字母和单下划线、数字等组合
 •def是函数的开始,这个简写来自英文单词define,显然,就是要定义一个什么东西
 •函数名后面是圆括号,括号里面,可以有参数列表,也可以没有参数
 •千万不要忘记了括号后面的冒号
 •语句,相对于def缩进,按照python习惯,缩进四个空格

看简单例子,深入理解上面的要点:

>>> def name():         #定义一个无参数的函数,只是通过这个函数打印

...     print "qiwsir"  #缩进4个空格

... 

>>> name()              #调用函数,打印结果

qiwsir
>>> def add(x,y):       #定义一个非常简单的函数

...     return x+y      #缩进4个空格

... 

>>> add(2,3)            #通过函数,计算2+3

5

 注意上面的add(x,y)函数,在这个函数中,没有特别规定参数x,y的类型。其实,这句话本身就是错的,还记得在前面已经多次提到,在python中,变量无类型,只有对象才有类型,这句话应该说成:x,y并没有严格规定其所引用的对象类型。

为什么?列位不要忘记了,这里的所谓参数,跟前面说的变量,本质上是一回事。python中不需要提前声明变量,有的语言就需要声明。只有当用到该变量的时候,才建立变量与对象的对应关系,否则,关系不建立。而对象才有不同的类型。那么,在add(x,y)函数中,x,y在引用对象之前,是完全自由的,也就是它们可以引用任何对象,只要后面的运算许可,如果后面的运算不许可,则会报错。

>>> add("qiw","sir")    #这里,x="qiw",y="sir",让函数计算x+y,也就是"qiw"+"sir"

'qiwsir'
>>> add("qiwsir",4)

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

  File "<stdin>", line 2, in add

TypeError: cannot concatenate 'str' and 'int' objects  #仔细阅读报错信息,就明白错误之处了

 从实验结果中发现:x+y的意义完全取决于对象的类型。在python中,将这种依赖关系,称之为多态。这是python和其它的静态语言的重要区别。在python中,代码不关心特定的数据类型。

对于python中的多态问题,以后还会遇到,这里仅仅以此例子显示一番。请看官要留心注意的:python中为对象编写接口,而不是为数据类型。

此外,也可以将函数通过赋值语句,与某个变量建立引用关系:

>>> result = add(3,4)

>>> result

7

 在这里,其实解释了函数的一个秘密。add(x,y)在被运行之前,计算机内是不存在的,直到代码运行到这里的时候,在计算机中,就建立起来了一个对象,这就如同前面所学习过的字符串、列表等类型的对象一样,运行add(x,y)之后,也建立了一个add(x,y)的对象,这个对象与变量result可以建立引用关系,并且add(x,y)将运算结果返回。于是,通过result就可以查看运算结果。

如果看官上面一段,感觉有点吃力或者晕乎,也不要紧,那就再读一边。是在搞不明白,就不要搞了。随着学习的深入,它会被明白的。

调用函数

扯了不少函数怎么编写,到底编写函数有什么用?在程序中怎么调用呢?

为什么要写函数?从理论上说,不用函数,也能够编程,我们在前面已经写了一个猜数字的程序,在那么就没有写函数,当然,用python的函数不算了。现在之所以使用函数,主要是:
 1.降低编程的难度,通常将一个复杂的大问题分解成一系列更简单的小问题,然后将小问题继续划分成更小的问题,当问题细化为足够简单时,就可以分而治之。为了实现这种分而治之的设想,就要通过编写函数,将各个小问题逐个击破,再集合起来,解决大的问题。(看官请注意,分而治之的思想是编程的一个重要思想,所谓“分治”方法也。)
 2.代码重(chong,二声音)用。在编程的过程中,比较忌讳同样一段代码不断的重复,所以,可以定义一个函数,在程序的多个位置使用,也可以用于多个程序。当然,后面我们还会讲到“模块”(此前也涉及到了,就是import导入的那个东西),还可以把函数放到一个模块中供其他程序员使用。也可以使用其他程序员定义的函数(比如import ...,前面已经用到了,就是应用了别人——创造python的人——写好的函数)。这就避免了重复劳动,提供了工作效率。
 
这样看来,函数还是很必要的了。废话少说,那就看函数怎么调用吧。以add(x,y)为例,前面已经演示了基本调用方式,此外,还可以这样:

>>> def add(x,y):       #为了能够更明了显示参数赋值特点,重写此函数

...     print "x=",x    #分别打印参数赋值结果

...     print "y=",y

...     return x+y

... 

>>> add(10,3)           #x=10,y=3

x= 10

y= 3

13

>>> add(x=10,y=3)       #同上

x= 10

y= 3

13

>>> add(y=10,x=3)       #x=3,y=10

x= 3

y= 10

13

>>> add(3,10)           #x=3,y=10

x= 3

y= 10

13

 在定义函数的时候,参数可以想前面那样,等待被赋值,也可以定义的时候就赋给一个默认值。例如:

>>> def times(x,y=2):       #y的默认值为2

...     print "x=",x

...     print "y=",y

...     return x*y

... 

>>> times(3)                #x=3,y=2

x= 3

y= 2

6
>>> times(x=3)              #同上

x= 3

y= 2

6
>>> times(3,4)              #x=3,y=4,y的值不再是2

x= 3

y= 4

12
>>> times("qiwsir")         #再次体现了多态特点

x= qiwsir

y= 2

'qiwsirqiwsir'

 给列位看官提一个思考题,请在闲暇之余用python完成:写两个数的加、减、乘、除的函数,然后用这些函数,完成简单的计算。

注意事项

下面的若干条,是常见编写代码的注意事项:
 1.别忘了冒号。一定要记住符合语句首行末尾输入“:”(if,while,for等的第一行)
 2.从第一行开始。要确定顶层(无嵌套)程序代码从第一行开始。
 3.空白行在交互模式提示符下很重要。模块文件中符合语句内的空白行常被忽视。但是,当你在交互模式提示符下输入代码时,空白行则是会结束语句。
 4.缩进要一致。避免在块缩进中混合制表符和空格。
 5.使用简洁的for循环,而不是while or range.相比,for循环更易写,运行起来也更快
 6.要注意赋值语句中的可变对象。
 7.不要期待在原处修改的函数会返回结果,比如list.append()
 8.一定要之用括号调用函数
 9.不要在导入和重载中使用扩展名或路径。

Python 相关文章推荐
浅析Python中return和finally共同挖的坑
Aug 18 Python
用Python实现随机森林算法的示例
Aug 24 Python
python+opencv实现阈值分割
Dec 26 Python
python读取几个G的csv文件方法
Jan 07 Python
用python实现刷点击率的示例代码
Feb 21 Python
python ddt数据驱动最简实例代码
Feb 22 Python
python ChainMap 合并字典的实现步骤
Jun 11 Python
Python3远程监控程序的实现方法
Jul 15 Python
解决python-docx打包之后找不到default.docx的问题
Feb 13 Python
python 如何利用argparse解析命令行参数
Sep 11 Python
Python Serial串口基本操作(收发数据)
Nov 06 Python
通过Python pyecharts输出保存图片代码实例
Nov 25 Python
跟老齐学Python之Python文档
Oct 10 #Python
跟老齐学Python之大话题小函数(2)
Oct 10 #Python
跟老齐学Python之大话题小函数(1)
Oct 10 #Python
Python警察与小偷的实现之一客户端与服务端通信实例
Oct 09 #Python
python中二维阵列的变换实例
Oct 09 #Python
python实现每次处理一个字符的三种方法
Oct 09 #Python
Python正则表达式匹配ip地址实例
Oct 09 #Python
You might like
PHP函数常用用法小结
2010/02/08 PHP
PDO版本问题 Invalid parameter number: no parameters were bound
2013/01/06 PHP
php输出金字塔的2种实现方法
2014/12/16 PHP
PHP怎样用正则抓取页面中的网址
2016/08/09 PHP
jQuery 位置插件
2008/12/25 Javascript
基于jquery的一行代码轻松实现拖动效果
2010/12/28 Javascript
javascript中用星号表示预录入内容的实现代码
2011/01/08 Javascript
js定义对象或数组直接量时各浏览器对多余逗号的处理(json)
2011/03/05 Javascript
js三种排序算法分享
2012/08/16 Javascript
angularjs客户端实现压缩图片文件并上传实例
2015/07/06 Javascript
关于在vue-cli中使用微信自动登录和分享的实例
2017/06/22 Javascript
使用jQuery实现动态添加小广告
2017/07/11 jQuery
vue监听对象及对象属性问题
2018/08/20 Javascript
用element的upload组件实现多图片上传和压缩的示例代码
2019/02/12 Javascript
layui实现数据表格点击搜索功能
2020/03/26 Javascript
封装微信小程序http拦截器过程解析
2019/08/13 Javascript
详解vue beforeEach 死循环问题解决方法
2020/02/25 Javascript
Selenium执行Javascript脚本参数及返回值过程详解
2020/04/01 Javascript
详解javascript脚本何时会被执行
2021/02/05 Javascript
[01:14:10]2014 DOTA2国际邀请赛中国区预选赛 SPD-GAMING VS Orenda
2014/05/22 DOTA
[58:32]EG vs Liquid 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
收集的几个Python小技巧分享
2014/11/22 Python
Python使用Pycrypto库进行RSA加密的方法详解
2016/06/06 Python
Python实现字符串逆序输出功能示例
2017/06/24 Python
Python文件操作中进行字符串替换的方法(保存到新文件/当前文件)
2019/06/28 Python
PyTorch和Keras计算模型参数的例子
2020/01/02 Python
Pytorch 扩展Tensor维度、压缩Tensor维度的方法
2020/09/09 Python
用css3实现当鼠标移进去时当前亮其他变灰效果
2014/04/08 HTML / CSS
使用phonegap检测网络状态的方法
2017/03/30 HTML / CSS
Zavvi美国:英国娱乐之家
2017/03/19 全球购物
信息技术专业个人自我评价
2013/12/11 职场文书
计划生育宣传标语
2014/06/21 职场文书
2015年七一建党节活动方案
2015/05/05 职场文书
2015年迎新晚会策划书
2015/07/16 职场文书
2016年“5.12”护士节致辞
2015/07/31 职场文书
MySQL 使用自定义变量进行查询优化
2021/05/14 MySQL