python的内置函数比较强大,比如help(),type(),id(),raw_input()等等,这个需要多去查看文档。
一.python函数的调用:
python函数的调用也是需要注意传入参数的个数、参数的类型、参数的顺序;
函数名其实就是指向一个函数对象的引用,完全可以把函数名赋给一个变量,相当于给这个函数起了一个“别名”:
>>>a = abs # 变量a指向abs函数
>>>a(-1) # 通过a调用abs函数
二.python函数的创建
上图是函数创建时的基本框架,注意如果没有return,函数会自动返回None,函数的主体首先最好进行参数的检查,
数据类型检查可以用内置函数isinstance实现:
defmy_abs(x):
ifnotisinstance(x, (int,float)):
raiseTypeError('badoperand type')
if x >= 0:
returnx
else:
return–x
python中函数可以返回多个值,返回值作为一个元组,pass可以在函数主体中作为一个占位符,如果函数的主体功能暂时没想好,可以使用pass.
三.函数的参数
python中函数的参数包括:位置参数position、默认参数key=value、非关键字可变长参数*args、关键字变量参数**kw
1.位置参数:调用时的数量必须和声明时的一样,也是必备参数。
位置参数的调用除了和函数声明的一样之外,也可以按照关键字传入:
注意以下几个位置参数的问题:
2.默认参数:函数在定义的时候就给函数传值了。
但是调用时也可以改变默认参数的值:
默认参数必须执行不变的对象!!!
3.可变参数:python将所有位置相关的参数收集到了一个新的元组中,并将这个元组赋值给变量args
这是我在练习时的一个问题,所以python的缩进问题非常重要,python语言对你养成良好的编程习惯有重要帮助。
4.可变关键字参数:“**"是其重要的标志,你可以这样想,你可以调用的时候传入你想传入的参数名称加参数的值。
在Python中定义函数,可以用位置参数、默认参数、可变参数和可变关键字参数,这4种参数都可以一起使用,或者只用其中某些,但是请注意,参数定义的顺序必须是:位置参数、默认参数、可变参数和可变关键字参数。
四.lambda表达式:除了def语句之外,Python还提供了一种生存函数对象的表达式形式,即lambda又被称为匿名函数(也就是 其没有函数名),用这种方式定义函数比较简洁、方便。lambda起到了一种函数速写的作用,允许在使用的代码内嵌入一个函 数的定义。
五.内置函数:主要是三个函数:map、filter、reduce
1.map:接收两个参数,一个是函数(特别是匿名函数),一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果 作为新的list返回,批处理一组数据,例如:
2.reduce:这个函数必须接收两个参数,reduce把结果继续和序列的下一个函数作用在一个序列上,元素做累积计算
例如序列求积:
def multi(x,y):
returnx *y
li = [1, 3, 4, 6, 9]
print reduce(multi, li) #参数是一个函数和一个序列
通俗讲就是序列中的下一个元素的运算要在前面元素运算的基础进行。
3.filter()函数用于过滤序列,也是同样的两个参数。
只保留奇数:
上面的三个内置函数的使用,我感觉关键还是在参数函数的设计。
六.偏函数:把一个函数的某些参数给固定住(即默认参数),返回一个新的函数,调用这个新函数会更简单。
使用前需要 import functools
假设要转换大量的二进制字符串,每次都传入int(x,base=2)非常麻烦,可以利用functools.partial来创建一个偏函数:
>>>import functools
>>> int2= functools.partial(int,base=2)
>>> int2('00001111')
15
有点设计默认参数函数的感觉。
七. 生成器:可以对照列表来理解,列表元素可以按照某种算法推算出来,但有时会有冗余的数据产生,我们可以在循环的过程中不断推算出后续的元素而不必创建完整的list,节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器。
1.创建生成器的方法:
(1)把一个列表生成式的[]改成(),就创建了一个generator:
>>> g= (x * x for x in range(10))
>>> g
<generatorobject <genexpr>at 0x0000000002EA93F0>
创建L和g的区别仅在于最外层的[]和(),L是一个list,而g是一个generator。
可以使用next()或者for循环来遍历generator:>>> g.next()
(2)要把fib函数变成generator,只需要把printb改为yield b就可以了:
def fib(max):
n,a, b= 0, 0, 1
while n< max:
yield b
a, b = b, a + b
n= n + 1
如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator:
class MyClass(object):
:
@staticmethod
defstaticFoo():
:
装饰器的语法以@开头,接着是装饰器函数的名字和可选的参数
装饰器实际就是函数,来处理被装饰的函数
有参和无参装饰:
@deco1(deco_arg)
@deco2
def func():
pass
等价于 func= deco1(deco_arg)(deco2(func))
贴上一张程序图便于理解:
qi
生器成器
lam