Chinaunix首页 | 论坛 | 博客
  • 博客访问: 235699
  • 博文数量: 57
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 557
  • 用 户 组: 普通用户
  • 注册时间: 2015-10-01 18:05
文章分类

全部博文(57)

文章存档

2017年(57)

我的朋友

分类: Python/Ruby

2017-11-01 22:49:27

函数最重要的目的是方便我们重复使用相同的一段程序。

将一些操作隶属于一个函数,以后你想实现相同的操作的时候,只用调用函数名就可以,而不需要重复敲所有的语句。
1.函数的定义
在Python中,函数声明和函数定义是视为一体的。在Python中,函数定义的基本形式如下:

def function(params):
    block
 return expression/value
实例如下:

点击(此处)折叠或打开

  1. # -*- coding:utf-8 -*-
  2. # Author :Alvin.Xie
  3. # @Time :2017/11/1 22:01
  4. # @File :fun.py


  5. # 定义函数
  6. def printme(astr):
  7.     print astr
  8.     return
2.函数的调用

定义一个函数只给了函数一个名称,指定了函数里包含的参数,和代码块结构。

这个函数的基本结构完成以后,你可以通过另一个函数调用执行,也可以直接从Python提示符执行。

如下实例调用了printme()函数:


点击(此处)折叠或打开

  1. # -*- coding:utf-8 -*-
  2. # Author :Alvin.Xie
  3. # @Time :2017/11/1 22:01
  4. # @File :fun.py


  5. # 定义函数
  6. def printme(astr):
  7.     print astr
  8.     return


  9. # 调用函数
  10. printme("第一次调用用户自定义函数!")
  11. printme("再次调用同一函数")
运行结果如下:
第一次调用用户自定义函数!
再次调用同一函数
说明:
(1)在Python中采用def关键字进行函数的定义,不用指定返回值的类型。
(2)函数参数params可以是零个、一个或者多个,同样的,函数参数也不用指定参数类型,因为在Python中变量都是弱类型的,Python会自动根据值来维护其类型。 
(3)return语句是可选的,它可以在函数体内任何地方出现,表示函数调用执行到此结束;如果没有return语句,会自动返回NONE,如果有return语句,但是return后面没有接表达式或者值的话也是返回NONE。
一般我们把没有return语句的函数叫做过程

点击(此处)折叠或打开

  1. # -*- coding:utf-8 -*-
  2. # Author :Alvin.Xie
  3. # @Time :2017/11/1 22:01
  4. # @File :fun.py

  5. def sayHello():
  6.     print 'hello'


  7. def square_sum(a,b):
  8.     c = a**2 + b **2
  9.     return c


  10. print sayHello()
  11. print square_sum(3, 4)
运行结果如下
hello
None
25
第一个函数sayHello没有return,所以返回None .第二个函数square_sum有return语句,返回函数的执行结果。

3.函数的传参
参数分形参和实参,定义函数时,函数名后括号里就是形参,调用函数时,函数名后面括号里就是实参
实例如下:

点击(此处)折叠或打开

  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. # Author :Alvin.Xie
  4. # @Time :2017/11/1 22:01
  5. # @File :fun.py

  6. def modify1(m, k):
  7.     m = 2
  8.     k = [4,5,6]
  9.     return


  10. def modify2(m, k):
  11.     m =2
  12.     k[0] = 0
  13.     return


  14. n = 100
  15. L =[1, 2, 3]

  16. modify1(n, L)
  17. print n
  18. print L

  19. modify2(n, L)
  20. print n
  21. print L
运行结果:
100
[1, 2, 3]
100
[0, 2, 3]
分析如下:
从结果可以看出,执行modify1( )之后,n和L都没有发生任何改变;
执行modify2( )后,n还是没有改变,L发生了改变。因为在Python中参数传递采用的是值传递方式,在执行函数modify1时,
先获取n和L的id( )值,然后为形参m和K分配空间,让m和K分别指向对象100和对象[1,2,3]。m=2这句让m重新指向对象2,而K=[4,5,6]这句让K重新指向对象[4,5,6]。
这种改变并不会影响到实参n和L,所以在执行modify1之后,n和L没有发生任何改变;在执行函数modify2时,
同理,让m和K分别指向对象2和对象[1,2,3],然而K[0]=0让K[0]重新指向了对象0(注意这里K和L指向的是同一段内存),所以对K指向的内存数据进行的任何改变也会影响到L,
因此在执行modify2后,L发生了改变。

当实参是元组合字典传参方式如下

点击(此处)折叠或打开

  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. # Author :Alvin.Xie
  4. # @Time :2017/11/1 22:01
  5. # @File :fun.py

  6. def printinfo(*a, **aa):
  7.     print a
  8.     print info

  9. atuple = (1,2,3)
  10. info = {'name': 'tom', 'age': 28}
  11. printinfo(*atuple, **info)
运行结果:
(1, 2, 3)
{'age': 28, 'name': 'tom'}








阅读(1218) | 评论(0) | 转发(0) |
0

上一篇:python 练习1

下一篇:python高阶函数

给主人留下些什么吧!~~