Python从入门到实战(一)——Python基础
Python从入门到实战(二)——程序流程控制
Python从入门到实战(三)——组合数据类型
Python从入门到实战(四)——函数
Python从入门到实战(五)——模块和包
Python从入门到实战(六)——文件
Python从入门到实战(七)——面向对象
Python从入门到实战(八)——异常
Python从入门到实战(九)——多线程
Python从入门到实战(十)——爬虫
一个栗子
递归求阶乘
def factorial(n):
if n == 1: # 递归结束条件
return 1
else:
return n * factorial(n-1) # 向下递归
factorial(10) # 求10的阶乘
匿名函数不需要显示地定义函数名,使用 [lambda + 参数 + 表达式],即。
lambda [arg1 [,arg2, ... argN]] : expression
也就是说,lambda用来表示匿名函数,可以传入多个参数,但只能有一个表达式。
func = lambda x,y:x+y
可以看到,上面把匿名函数对象赋给一个变量,只要直接调用该对象就可以使用匿名函数。
再举个栗子
将下面的add和sub用匿名函数替代
替代后
优势
高阶函数的参数中有函数
语法
map(function, iterable, ...)
map() 会根据提供的函数对指定序列做映射。
第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的迭代器。
使用该函数要先从functools
模块导入
from functools import reduce
reduce()函数会对参数序列中元素进行累计。函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给 reduce 中的函数 function (有两个参数) 先对集合的第1、2个元素进行操作,得到的结果再与第三个数据用 function函数进行操作,…,一直到最后一个参数被用完,将结果返回。
语法
reduce(function, iterable[, initializer])
filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的迭代器。
语法
filter(function, iterable)
接受两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判断,然后返回 True
或 False
,最后将返回 True
的元素放到新列表中。
sorted() 函数对所有可迭代的对象进行排序操作。
语法
sorted(iterable, key=None, reverse=False)
zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象,这样做的好处是节约了不少的内存。
我们可以使用 list()
转换来输出列表。
如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 *
号操作符,可以将元组解压为列表。
语法
zip([iterable, ...])
any() 函数用于判断给定的可迭代参数 iterable 是否全部为 False
,如果是,则返回False
,如果有一个为 True
,则返回 True
元素除了0、空、FALSE外都算
True
函数等价于
def any(iterable):
for element in iterable:
if element:
return True
return False
all() 函数用于判断给定的可迭代参数 iterable 中的所有元素是否都为 True
,如果是返回 True
,否则返回 False
。
元素除了是 0、空、None、False 外都算 True
。
函数等价于
def all(iterable):
for element in iterable:
if not element:
return False
return True
上面讲了闭包函数,内部函数使用了外部函数的局部变量,在装饰器这里,内部函数使用了外部函数传入的函数。
这样就可以为函数增加一些新的功能,而不用在原本的函数上进行修改。
示例
# 装饰器方案
def pre(func):
def wapper_func():
print("Tom said:")
func()
return wapper_func
@pre # 语法糖
def func1():
print('hello, python')
@pre
def func2():
print('goodbye, python')
# func1 = otherfunc(func1)
func1()
# func2 = otherfunc(func2)
func2()
这里还有一个语法糖的概念,就是在要装饰的函数前,加上@装饰函数
就可以完成下面等价的功能,对函数进行装饰。
func1 = otherfunc(func1)
装饰在实际开发中有什么用
下面用函数执行时间统计举个栗子
# 函数执行时间统计
import time as t
def get_time(func):
def new_func():
st = t.time()
func()
ed = t.time()
print("函数执行了%ds"%(ed-st))
return new_func
@get_time
def func1():
t.sleep(3) # 睡眠3s
func1()
如何对有不同参数个数的函数进行装饰
可以使用可变参数,和可变关键字参数
# 装饰器方案
def pre(func):
def wapper_func(*args, **kwargs):
print("Tom said:")
func(*args, **kwargs)
return wapper_func
@pre # 语法糖
def func1(name1,name2):
print("hello, %s.I'm %s"%(name1,name2))
@pre
def func2(name):
print('goodbye, %s'%name)
# func1 = otherfunc(func1)
func1('Lily','Tom')
# func2 = otherfunc(func2)
func2('Lily')
如何使装饰器的参数可变
在外面再套一个装饰器
# 装饰器方案
def dc(name):
def pre(func):
def wapper_func(*args, **kwargs):
print("%s said:"%name)
func(*args, **kwargs)
return wapper_func
return pre
@dc('Tom') # 语法糖
def func1(name1,name2):
print("hello, %s.I'm %s"%(name1,name2))
@dc('Kity')
def func2(name):
print('goodbye, %s'%name)
# pre = dc(name)
# func1 = pre(func1)
func1('Lily','Tom')
# pre = dc(name)
# func2 = pre(func2)
func2('Lily')