函数是一种功能上的抽象,比如当我们写一段程序,这个程序多次用到了发送邮件的功能(比如说:每天三点固定发送邮件,每当服务器负载较重发送邮件提醒……),那么我们就可以将发送邮件这个功能抽象出来,单独对其定义一个函数进行实现。这样在需要引用发送邮件功能的时候,我们就不需要重复复制代码,直接调用函数就可以了。另外的过程易读性强,方便修改也是函数的两大优点。

函数的分类:

函数大体上可以分为两类--内置函数和自定义函数

内置函数:

简单的介绍一下几个函数的功能:

abs():取绝对值  divmod():除整取余  input():输入  max():返回其中的最大值  id():返回该对象的标识符

然后介绍一些可能会用到的函数:

 

#对所有可迭代的对象进行判断,若有一个为空,则返回False
>>> all('123')
True
>>> all([1,2,3])
True
#当有一个元素为空时
>>> all(['',2])
False
#但是,输入一个空的列表则不会返回False
>>> all([])
True
all()所有为真则为真,else:为假
#当有一个为非空,则返回True
>>> any('123')
True
>>> any([0, 1])
True
>>> any([0, ''])
False
any() 有一个为真则为真,所有为假则为假
#
for i,j in enumerate([1,2,3]):
    print(i,j)
0 1
1 2
2 3
#字典也可以进行枚举,只是顺序可变
for i,j in enumerate({'a':2,'b':3}):
    print(i,j)
0 b
1 a
enumerate()遍历序列中的元素以及它们的下标
>>> eval('2+3')
5
#将字符串2+3转换为整数计算表达式,并返回计算结果
>>> eval('sdfdfsd')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1, in <module>
NameError: name 'sdfdfsd' is not defined
eval()将字符串str当成有效Python表达式来求值,并返回计算结果
>>> round(2.3)
2
round()四舍五入
>>> sum([1,2,3])
6
>>> max(1,2,3)
3
>>> min(1,2,3)
1
sum() max() min() 求和,取最大值,取最小值
#chr() 将ascii码中的数字(0--255)转换为对应的字符
>>> chr(65)
'A'
#ord()将字符转换为对应的ascii码
>>> ord('t')
116
chr() ord() ascii码与字符的相互转换
>>> pow(2,2)
4
pow() 幂
open('test','r+',encoding='utf-8')
open(‘路径’,'模式',encoding=……可选) 打开文件
x = [1, 2, 3]
y = [4, 5, 6]
z = [7, 8, 9]
u = zip(x, y, z)
print u
#结果是:
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
#当两个序列元素个数不一致时,zip会产生元素个数最小的那个序列的元素个数的值
x = [1, 2, 3]
y = [4, 5, 6,7]
u=zip(x,y)
print(u)
#结果是:
[(1,4),(2,5),(3,6)]
zip()接受任意多个(包括0个和1个)序列作为参数,返回一个tuple列表
>>> sorted([1,4,2,5,3])
[1, 2, 3, 4, 5]
sorted()排序
''' hasattr(p_object, name): 
    hasattr(object, name) -> bool
    Return whether the object has an attribute with the given name. '''
#若该对象中存在该方法就返回True
#其中  name必须为字符串
>>> li=[123,456]
>>> hasattr(li,'pop')
True

>>> li=['123','456']
>>> hasattr(li,'123')
False
hasattr()检测某个对象是否存在某个方法
getattr(object, name, default=None): 
    getattr(object, name[, default]) -> value
    
    Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y.
    When a default argument is given, it is returned when the attribute doesn't exist; without it, an exception is raised in that case.

>>> class student(object):
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def say(self):
        print('I am a student')
>>> getattr(student,'say')         #如果该对象中存在该方法,就打印该方法的地址
<function student.say at 0x03DCE468>
>>> a=student('linghuchong',23)
>>> getattr(a,'age')
23
getattr()检测并取得该对象中的属性
setattr(object, name, value)

This is the counterpart of getattr(). The arguments are an object, a string and an arbitrary value. The string may name an existing attribute or a new attribute. The function assigns the value to the attribute,
provided the object allows it. For example, setattr(x,'foobar', 123) is equivalent to x.foobar = 123.

#将该对象的某个属性赋值为value
#如果该对象不存在这个属性,则新建该属性
>>> class student(object):
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def say(self):
        print('I am a student')
>>> a=student('linghuchong',23)
>>> setattr(a,'name','renwoxing')
>>> print(a.name)
renwoxing
>>> setattr(a,'dfas','lalal')
>>> a.dfas
'lalal'
setattr()修改某个对象的属性值

 

自定义函数:

#def是关键字  用来定义函数
def obj():
   pass          #什么也不做
obj()

上例就是一个最简单的自定义函数的格式,它是一个空函数。

函数的返回值:

当我们运行完一个函数,这个函数有许多可能的结果,比如说报错缺少文件,报错缺少库,运行成功,报错密码不对……我们想知道具体的结果,这时就可以用到返回值,比如1表示运行成功,404表示not found……

return可以返回值,还表示函数的终止!

 

def obj():
    n1=2
    if n1==3:
        return 0
    else:
        return 1
ret=obj()
print(ret)

1 #结果

当然也可以返回多个值:

def obj():
    n1=2
    if n1==3:
        return 0,1
    else:
        return 1,2
ret=obj()
print(ret)
(1,2)    #结果

由此可见,返回多个值时返回的是一个tuple。

参数:

在上面的例子中函数都是无参数的,实际应用中,很多函数都是有参数的,并且参数可以有多个,甚至允许有动态参数。

多个参数

 

def show(a,b,c=2):
    print(a,b,c)
show(1,3)
1,3,2    #结果
show(b=3,a=2)
1,3,2    #结果

 

在上面的例子中不仅有多个参数,还有默认参数

默认参数:

默认参数代表如果没有赋值,就按照默认值返回,若赋值,在按照所赋予的值返回。

并且必选参数在前,默认参数在后,否则Python的解释器会报错。

默认参数存在一个问题,我无耻的参(fu)考(zhi)了廖雪峰大神的python教程:

 

先定义一个函数,传入一个list,添加一个END再返回:

def add_end(L=[]):
    L.append('END')
    return L

当你正常调用时,结果似乎不错:

>>> add_end([1, 2, 3])
[1, 2, 3, 'END']
>>> add_end(['x', 'y', 'z'])
['x', 'y', 'z', 'END']

 

当你使用默认参数调用时,一开始结果也是对的:

 

>>> add_end()
['END']

 

但是,再次调用add_end()时,结果就不对了:

 

>>> add_end()
['END', 'END']
>>> add_end()
['END', 'END', 'END']

很多初学者很疑惑,默认参数是[],但是函数似乎每次都“记住了”上次添加了'END'后的list。

原因解释如下:

Python函数在定义的时候,默认参数L的值就被计算出来了,即[],因为默认参数L也是一个变量,它指向对象[],每次调用该函数,如果改变了L的内容,则下次调用时,默认参数的内容就变了,不再是函数定义时的[]了。

所以,定义默认参数要牢记一点:默认参数必须指向不变对象!

要修改上面的例子,我们可以用None这个不变对象来实现:

 

def add_end(L=None):
    if L is None:
        L = []
    L.append('END')
    return L

 

现在,无论调用多少次,都不会有问题:

 

>>> add_end()
['END']
>>> add_end()
['END']

 

 

为什么要设计strNone这样的不变对象呢?因为不变对象一旦创建,对象内部的数据就不能修改,这样就减少了由于修改数据导致的错误。此外,由于对象不变,多任务环境下同时读取对象不需要加锁,同时读一点问题都没有。

我们在编写程序时,如果可以设计一个不变对象,那就尽量设计成不变对象

 

另外在赋值时,可以通过指定参数而不用按照顺序进行赋值。

动态参数:

所谓动态参数,就是传入的参数是动态的,即数目不确定。实际上就是将输入的所有参数存储为一个元组或者字典。

如果要定义一个tuple的动态参数,只需要在定义参数时在参数前添加一个*。

def show(*a):
    print(a)
show(1,2,3)
(1,2,3)   #结果

上例就是将所有参数转换为一个tuple。

如果要定义一个dict的动态参数,只需要在定义参数时在参数前添加两个*。

 

def show(**a):
    print(a)
show(n1=1,n2=2)
{'n2': 2, 'n1': 1}       #结果

 

posted on 2016-04-28 20:20  MnCu  阅读(599)  评论(2编辑  收藏  举报