Python入门篇之函数


Posted in Python onOctober 20, 2014

Pythond 的函数是由一个新的语句编写,即def,def是可执行的语句--函数并不存在,直到Python运行了def后才存在。

函数是通过赋值传递的,参数通过赋值传递给函数

def语句将创建一个函数对象并将其赋值给一个变量名,def语句的一般格式如下:

def function_name(arg1,arg2[,...]):

    statement

[return value] 

返回值不是必须的,如果没有return语句,则Python默认返回值None。

函数名的命名规则:

函数名必须以下划线或字母开头,可以包含任意字母、数字或下划线的组合。不能使用任何的标点符号;

函数名是区分大小写的。

函数名不能是保留字。

Python使用名称空间的概念存储对象,这个名称空间就是对象作用的区域, 不同对象存在于不同的作用域。下面是不同对象的作用域规则:

每个模块都有自已的全局作用域。

函数定义的对象属局部作用域,只在函数内有效,不会影响全局作用域中的对象。

赋值对象属局部作用域,除非使用global关键字进行声明。

LGB规则是Python查找名字的规则,下面是LGB规则:

1.大多数名字引用在三个作用域中查找:先局部(Local),次之全局(Global),再次之内置(Build-in)。

>>> a=2

>>> b=2

>>> def test(b):

...     test=a*b

...     return test

>>>print test(10)

20

b在局部作用域中找到,a在全局作用域中找到。

2.如想在局部作用域中改变全局作用域的对象,必须使用global关键字。

#没用global时的情况

>>> name="Jims"

>>> def set():

...     name="ringkee"

...

>>> set()

>>> print name

Jims
#使用global后的情况

>>> name="Jims"

>>> def set1():

...     global name

...     name="ringkee"

...

>>> set1()

>>> print name

ringkee

3.'global'声明把赋值的名字映射到一个包含它的模块的作用域中。

函数的参数是函数与外部沟通的桥梁,它可接收外部传递过来的值。参数传递的规则如下:

4.在一个函数中对参数名赋值不影响调用者。

>>> a=1

>>> def test(a):

...     a=a+1

...     print a

...

>>> test(a)

2

>>> a

1             # a值不变

5.在一个函数中改变一个可变的对象参数会影响调用者。

>>> a=1

>>> b=[1,2]

>>> def test(a,b):

...     a=5

...     b[0]=4

...     print a,b

...

>>> test(a,b)

5 [4, 2]

>>> a

1

>>> b

[4, 2]    # b值已被更改

参数是对象指针,无需定义传递的对象类型。如:

>>> def test(a,b):

...     return a+b

...

>>> test(1,2)   #数值型

3

>>> test("a","b")   #字符型

'ab'

>>> test([12],[11])   #列表

[12, 11]

函数中的参数接收传递的值,参数可分默认参数,如:

def function(ARG=VALUE)
元组(Tuples)参数:

def function(*ARG)
字典(dictionary)参数:

def function(**ARG)
一些函数规则:

默认值必须在非默认参数之后;

在单个函数定义中,只能使用一个tuple参数(*ARG)和一个字典参数(**ARG)。

tuple参数必须在连接参数和默认参数之后。

字典参数必须在最后定义。

1.常用函数
1.abs(x)

abs()返回一个数字的绝对值。如果给出复数,返回值就是该复数的模。

>>>print abs(-100)

100

>>>print abs(1+2j)

2.2360679775

2.callable(object)

callable()函数用于测试对象是否可调用,如果可以则返回1(真);否则返回0(假)。可调用对象包括函数、方法、代码对象、类和已经定义了“调用”方法的类实例。

>>> a="123"

>>> print callable(a)

0

>>> print callable(chr)

1

3.cmp(x,y)

cmp()函数比较x和y两个对象,并根据比较结果返回一个整数,如果x<y,则返回-1;如果x>y,则返回1,如果x==y则返回0。

>>>a=1

>>>b=2

>>>c=2

>>> print cmp(a,b)

-1

>>> print cmp(b,a)

1

>>> print cmp(b,c)

0

4.divmod(x,y)

divmod(x,y)函数完成除法运算,返回商和余数。

>>> divmod(10,3)

(3, 1)

>>> divmod(9,3)

(3, 0)

5.isinstance(object,class-or-type-or-tuple) -> bool

测试对象类型

>>> a='isinstance test'

>>> b=1234

>>> isinstance(a,str)

True

>>> isinstance(a,int)

False

>>> isinstance(b,str)

False

>>> isinstance(b,int)

True

下面的程序展示了isinstance函数的使用:

def displayNumType(num):

    print num, 'is',

    if isinstance(num, (int, long, float, complex)):

        print 'a number of type:', type(num).__name__

    else:

        print 'not a number at all!!!'

displayNumType(-69)

displayNumType(9999999999999999999999999L)

displayNumType(565.8)

displayNumType(-344.3+34.4j)

displayNumType('xxx')

代码运行结果如下:

-69 is a number of type: int

9999999999999999999999999 is a number of type: long

565.8 is a number of type: float

(-344.3+34.4j) is a number of type: complex

xxx is not a number at all!!!

6.len(object) -> integer

len()函数返回字符串和序列的长度。

>>> len("aa")

2

>>> len([1,2])

2

7.pow(x,y[,z])

pow()函数返回以x为底,y为指数的幂。如果给出z值,该函数就计算x的y次幂值被z取模的值。

>>> print pow(2,4)

16

>>> print pow(2,4,2)

0

>>> print pow(2.4,3)

13.824

8.range([lower,]stop[,step])

range()函数可按参数生成连续的有序整数列表。

>>> range(10)

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

>>> range(1,10)

[1, 2, 3, 4, 5, 6, 7, 8, 9]

>>> range(1,10,2)

[1, 3, 5, 7, 9]

9.round(x[,n])

round()函数返回浮点数x的四舍五入值,如给出n值,则代表舍入到小数点后的位数。

>>> round(3.333)

3.0

>>> round(3)

3.0

>>> round(5.9)

6.0

10.type(obj)

type()函数可返回对象的数据类型。

>>> type(a)

<type 'list'>

>>> type(copy)

<type 'module'>

>>> type(1)

<type 'int'>

11.xrange([lower,]stop[,step])

xrange()函数与range()类似,但xrnage()并不创建列表,而是返回一个xrange对象,它的行为与列表相似,但是只在需要时才计算列表值,当列表很大时,这个特性能为我们节省内存。

>>> a=xrange(10)

>>> print a[0]

0

>>> print a[1]

1

>>> print a[2]

2

2.内置类型转换函数
1.chr(i)

chr()函数返回ASCII码对应的字符串。

>>> print chr(65)

A

>>> print chr(66)

B

>>> print chr(65)+chr(66)

AB

2.complex(real[,imaginary])

complex()函数可把字符串或数字转换为复数。

>>> complex("2+1j")

(2+1j)

>>> complex("2")

(2+0j)

>>> complex(2,1)

(2+1j)

>>> complex(2L,1)

(2+1j)

3.float(x)

float()函数把一个数字或字符串转换成浮点数。

>>> float("12")

12.0

>>> float(12L)

12.0

>>> float(12.2)

12.199999999999999

4.hex(x)

hex()函数可把整数转换成十六进制数。

>>> hex(16)

'0x10'

>>> hex(123)

'0x7b'

5.long(x[,base])

long()函数把数字和字符串转换成长整数,base为可选的基数。

>>> long("123")

123L

>>> long(11)

11L

6.list(x)

list()函数可将序列对象转换成列表。如:

>>> list("hello world")

['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']

>>> list((1,2,3,4))

[1, 2, 3, 4]

7.int(x[,base])

int()函数把数字和字符串转换成一个整数,base为可选的基数。

>>> int(3.3)

3

>>> int(3L)

3

>>> int("13")

13

>>> int("14",15)

19

8.min(x[,y,z...])

min()函数返回给定参数的最小值,参数可以为序列。

>>> min(1,2,3,4)

1

>>> min((1,2,3),(2,3,4))

(1, 2, 3)

9.max(x[,y,z...])

max()函数返回给定参数的最大值,参数可以为序列。

>>> max(1,2,3,4)

4

>>> max((1,2,3),(2,3,4))

(2, 3, 4)

10.oct(x)

oct()函数可把给出的整数转换成八进制数。

>>> oct(8)

'010'

>>> oct(123)

'0173'

11.ord(x)

ord()函数返回一个字符串参数的ASCII码或Unicode值。

>>> ord("a")

97

>>> ord(u"a")

97

12.str(obj)

str()函数把对象转换成可打印字符串。

>>> str("4")

'4'

>>> str(4)

'4'

>>> str(3+2j)

'(3+2j)'

13.tuple(x)

tuple()函数把序列对象转换成tuple。

>>> tuple("hello world")

('h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd')

>>> tuple([1,2,3,4])

(1, 2, 3, 4)

3.序列处理函数
1.常用函数中的len()、max()和min()同样可用于序列。

2.filter(function,list)

调用filter()时,它会把一个函数应用于序列中的每个项,并返回该函数返回真值时的所有项,从而过滤掉返回假值的所有项。

>>> def nobad(s):

...     return s.find("bad") == -1

... 

>>> s = ["bad","good","bade","we"]

>>> filter(nobad,s)

['good', 'we']

这个例子通过把nobad()函数应用于s序列中所有项,过滤掉所有包含“bad”的项。

3.map(function,list[,list])

map()函数把一个函数应用于序列中所有项,并返回一个列表。

>>> import string

>>> s=["python","zope","linux"]

>>> map(string.capitalize,s)

['Python', 'Zope', 'Linux']

map()还可同时应用于多个列表。如:

>>> import operator

>>> s=[1,2,3]; t=[3,2,1]

>>> map(operator.mul,s,t)   # s[i]*t[j]

[3, 4, 3]

如果传递一个None值,而不是一个函数,则map()会把每个序列中的相应元素合并起来,并返回该元组。如:

>>> a=[1,2];b=[3,4];c=[5,6]

>>> map(None,a,b,c)

[(1, 3, 5), (2, 4, 6)]

4.reduce(function,seq[,init])

reduce()函数获得序列中前两个项,并把它传递给提供的函数,获得结果后再取序列中的下一项,连同结果再传递给函数,以此类推,直到处理完所有项为止。

>>> import operator

>>> reduce(operator.mul,[2,3,4,5])  # ((2*3)*4)*5

120

>>> reduce(operator.mul,[2,3,4,5],1) # (((1*2)*3)*4)*5

120

>>> reduce(operator.mul,[2,3,4,5],2)  # (((2*2)*3)*4)*5

240

5.zip(seq[,seq,...])

zip()函数可把两个或多个序列中的相应项合并在一起,并以元组的格式返回它们,在处理完最短序列中的所有项后就停止。

>>> zip([1,2,3],[4,5],[7,8,9])

[(1, 4, 7), (2, 5, 8)]

如果参数是一个序列,则zip()会以一元组的格式返回每个项,如:

>>> zip((1,2,3,4,5))

[(1,), (2,), (3,), (4,), (5,)]

>>> zip([1,2,3,4,5])

[(1,), (2,), (3,), (4,), (5,)]

4.其他
def语句是实时执行的,当它运行的时候,它创建并将一个新的函数对象赋值给一个变量名,Python所有的语句都是实时执行的,没有像独立的编译时间这样的流程

由于是语句,def可以出现在任一语句可以出现的地方--甚至是嵌套在其他语句中:

if test:

    def fun():

        ...

else:

    def func():

        ...

...

func()

可以将函数赋值给一个不同的变量名,并通过新的变量名进行调用:

othername=func()
othername()
创建函数

内建的callable函数可以用来判断函数是否可调用:

>>> import math

>>> x=1

>>> y=math.sqrt

>>> callable(x)

False

>>> callable(y)

True

使用del语句定义函数:

>>> def hello(name):

    return 'Hello, '+name+'!'

>>> print hello('world')

Hello, world!

>>> print hello('Gumby')

Hello, Gumby!

编写一个fibnacci数列函数:

>>> def fibs(num):

    result=[0,1]

    
for i in range(num-2):

       
 result.append(result[-2]+result[-1])

   
 return result

>>> fibs(10)

[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

>>> fibs(15)

[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]

在函数内为参数赋值不会改变外部任何变量的值:

>>> def try_to_change(n):

    n='Mr.Gumby'

>>> name='Mrs.Entity'

>>> try_to_change(name)

>>> name

'Mrs.Entity'

由于字符串(以及元组和数字)是不可改变的,故做参数的时候也就不会改变,但是如果将可变的数据结构如列表用作参数的时候会发生什么:

>>> name='Mrs.Entity'

>>> try_to_change(name)

>>> name

'Mrs.Entity'

>>> def change(n):

    n[0]='Mr.Gumby'

>>> name=['Mrs.Entity','Mrs.Thing']

>>> change(name)

>>> name

['Mr.Gumby', 'Mrs.Thing']

参数发生了改变,这就是和前面例子的重要区别

以下不用函数再做一次:

>>> name=['Mrs.Entity','Mrs.Thing']

>>> n=name  #再来一次,模拟传参行为

>>> n[0]='Mr.Gumby' #改变列表

>>> name

['Mr.Gumby', 'Mrs.Thing']

当2个变量同时引用一个列表的时候,它们的确是同时引用一个列表,想避免这种情况,可以复制一个列表的副本,当在序列中做切片的时候,返回的切片总是一个副本,所以复制了整个列表的切片,将会得到一个副本:

>>> names=['Mrs.Entity','Mrs.Thing']

>>> n=names[:]

>>> n is names

False

>>> n==names

True

此时改变n不会影响到names:

>>> n[0]='Mr.Gumby'

>>> n

['Mr.Gumby', 'Mrs.Thing']

>>> names

['Mrs.Entity', 'Mrs.Thing']

>>> change(names[:])

>>> names

['Mrs.Entity', 'Mrs.Thing']

关键字参数和默认值

参数的顺序可以通过给参数提供参数的名字(但是参数名和值一定要对应):

>>> def hello(greeting, name):

        print '%s,%s!'%(greeting, name)

>>> hello(greeting='hello',name='world!')

hello,world!!

关键字参数最厉害的地方在于可以在参数中给参数提供默认值:

>>> def hello_1(greeting='hello',name='world!'):

    print '%s,%s!'%(greeting,name)

>>> hello_1()

hello,world!!

>>> hello_1('Greetings')

Greetings,world!!

>>> hello_1('Greeting','universe')

Greeting,universe!

若想让greeting使用默认值:

>>> hello_1(name='Gumby')

hello,Gumby!

可以给函数提供任意多的参数,实现起来也不难:

>>> def print_params(*params):

    print params

>>> print_params('Testing')

('Testing',)

>>> print_params(1,2,3)

(1, 2, 3)

混合普通参数:

>>> def print_params_2(title,*params):

    print title

   
 print params

>>> print_params_2('params:',1,2,3)

params:

(1, 2, 3)

>>> print_params_2('Nothing:')

Nothing:

()

 星号的意思就是“收集其余的位置参数”,如果不提供任何供收集的元素,params就是个空元组

但是不能处理关键字参数:

>>> print_params_2('Hmm...',something=42)

Traceback (most recent call last):

  File "<pyshell#112>", line 1, in <module>

    print_params_2('Hmm...',something=42)

TypeError: print_params_2() got an unexpected keyword argument 'something'

试试使用“**”:

>>> def print_params(**params):

    print params

>>> print_params(x=1,y=2,z=3)

{'y': 2, 'x': 1, 'z': 3}

>>> def parames(x,y,z=3,*pospar,**keypar):

   
 print x,y,z

   
 print pospar

   
 print keypar
>>> parames(1,2,3,5,6,7,foo=1,bar=2)

1 2 3

(5, 6, 7)

{'foo': 1, 'bar': 2}

>>> parames(1,2)

1 2 3

()

{}

>>> def print_params_3(**params):

   
 print params
>>> print_params_3(x=1,y=2,z=3)

{'y': 2, 'x': 1, 'z': 3}

>>> #返回的是字典而不是元组

>>> #组合‘#'与'##'

>>> def print_params_4(x,y,z=3,*pospar,**keypar):

   
 print x,y,z

   
 print pospar

   
 print keypar
>>> print_params_4(1,2,3,5,6,7,foo=1,bar=2)

1 2 3

(5, 6, 7)

{'foo': 1, 'bar': 2}

>>> print_params_4(1,2)

1 2 3

()

{}
Python 相关文章推荐
在Django的session中使用User对象的方法
Jul 23 Python
浅析Python 中整型对象存储的位置
May 16 Python
深入理解python中的闭包和装饰器
Jun 12 Python
对Python中DataFrame按照行遍历的方法
Apr 08 Python
PyCharm安装第三方库如Requests的图文教程
May 18 Python
Python中pymysql 模块的使用详解
Aug 12 Python
python3 下载网络图片代码实例
Aug 27 Python
python自动化UI工具发送QQ消息的实例
Aug 27 Python
python生成器用法实例详解
Nov 22 Python
将python依赖包打包成window下可执行文件bat方式
Dec 26 Python
Python预测分词的实现
Jun 18 Python
Golang Web 框架Iris安装部署
Aug 14 Python
Python入门篇之条件、循环
Oct 17 #Python
Python入门篇之字典
Oct 17 #Python
Python入门篇之字符串
Oct 17 #Python
Python入门篇之列表和元组
Oct 17 #Python
Python入门篇之对象类型
Oct 17 #Python
Python入门篇之编程习惯与特点
Oct 17 #Python
python中正则表达式的使用详解
Oct 17 #Python
You might like
默默简单的写了一个模板引擎
2007/01/02 PHP
php入门学习知识点四 PHP正则表达式基本应用
2011/07/14 PHP
windows下配置php5.5开发环境及开发扩展
2014/12/25 PHP
9条PHP编程小知识及易犯的小错误
2015/01/22 PHP
PHP使用glob方法遍历文件夹下所有文件的实例
2018/10/17 PHP
PHP whois查询类定义与用法示例
2019/04/03 PHP
thinkphp5 框架结合plupload实现图片批量上传功能示例
2020/04/04 PHP
javascript实现上传图片前的预览(TX的面试题)
2007/08/20 Javascript
EXT中xtype的含义分析
2010/01/07 Javascript
jQuery contains过滤器实现精确匹配使用方法
2013/04/12 Javascript
使用jQuery实现的掷色子游戏动画效果
2014/03/14 Javascript
javascript获取checkbox复选框获取选中的选项
2014/08/12 Javascript
javascript中var的重要性分析
2015/02/11 Javascript
三种AngularJS中获取数据源的方式
2016/02/02 Javascript
AngularJS 中的事件详解
2016/07/28 Javascript
Express与NodeJs创建服务器的两种方法
2017/02/06 NodeJs
vue中v-model动态生成的实例详解
2017/10/27 Javascript
vue toggle做一个点击切换class(实例讲解)
2018/03/13 Javascript
在 Typescript 中使用可被复用的 Vue Mixin功能
2018/04/17 Javascript
js实现点击展开隐藏效果(实例代码)
2018/09/28 Javascript
vue使用v-for实现hover点击效果
2018/09/29 Javascript
利用原生JavaScript实现造日历轮子实例代码
2019/05/08 Javascript
五句话帮你轻松搞定js原型链
2020/12/09 Javascript
python实现上传样本到virustotal并查询扫描信息的方法
2014/10/05 Python
Python实现批量检测HTTP服务的状态
2016/10/27 Python
Python3中的列表,元组,字典,字符串相关知识小结
2017/11/10 Python
Django 拆分model和view的实现方法
2019/08/16 Python
jupyter notebook 增加kernel教程
2020/04/10 Python
ffmpeg+Python实现B站MP4格式音频与视频的合并示例代码
2020/10/21 Python
Oracle快照(snapshot)
2015/03/13 面试题
男方父母证婚词
2014/01/12 职场文书
中学生操行评语大全
2014/04/24 职场文书
小学生环保演讲稿
2014/04/25 职场文书
解除劳动关系协议书范文
2014/09/11 职场文书
正规欠条模板
2015/07/03 职场文书
学校2016年九九重阳节活动总结
2016/04/01 职场文书