函数与生成器
一、函数
1.1、函数的关键字
def 定义函数
return 返回值
pass 占位
exit(1) 直接退出并返回1
1.2、高阶函数
高阶函数都是可以通过代码逻辑实现,但是自己写的函数的复杂程度或者算法不一定有人家内置的好
①、map高阶函数:
def f(x):
return x*xprint(map(f, [1, 2, 3, 4]))
print(list((map(f, [1, 2, 3, 4]))))
for i in map(f, [1, 2, 3, 4]):
print(i)
仿照map:
def testMap(fun, iter):
l = list()
for i in iter:
l.append(fun(i))
return lprint(testMap(f, [1, 2, 3, 4]))
②、filter()函数用于过滤序列,和map()类似,filter()也接收一个函数和一个序列。和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素,例子:
filter(lamdba x: x%2 ==1, [1, 2, 3, 4, 5])
③、reduce把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算,其效果就是:
def add(x, y):
return x+yreduce(add, [1, 2, 3, 4, 5])
# 1, 2 = 3
# 3, 3 = 6
# 6, 4 = 10
# 10, 5 = 15
④、sorted排序
参数:sorted(iterable, key, reverse)
iterable 一个可迭代的对象、 key 对什么进行排序、 reverse bool类型,如果为true为反序, 默认为false、 返回值是一个list
print(sorted([1, 4, 342, 3, 45, 76, 435, 34], reverse=True))
对字典的key或者val进行排序:
m = dict(a=1, c=10, b=20, d=15)
print(m)
print(sorted(m.items()))
print(sorted(m.items(), key=lambda x: x[0]))
print(dict(sorted(m.items(), key=lambda x: x[1])))
# print(sorted(m.items(), key = lambda d:d[1], reverse = True))
1.3、列表生成式(执行效率高且经常用):
[exp for val in collection if condition]
a2 = [x for x in range(1, 10) if x%2==0]
print(a2)
例子(九宫格):
def jgg():
number = list()
for i in range(1, 10):
number.append(i)
for A in [x for x in range(1, 10)]:
for B in [x for x in range(1, 10) if x != A]:
for C in [x for x in range(1, 10) if x != A and x != B]:
for D in [x for x in range(1, 10) if x != A and x != B and x!= C]:
print("A = {0} B = {1} C = {2} D = {3}".format(A, B, C, D))
1.4、生成器:
方法一:
(exp for val in collection if condition)
a1 = (x for x in range(1, 10) if x%2==0)
print(a1)
for i in a1:
print(i)
print(next(a1)) #python3 是直接调用next方法,python2中是使用a1.next()
方法二:
def test():
a = 1
for i in range(1, 10):
yield i
# return i
a += 1
# return i
# yield 可以理解成return,但是比return多一些角色
# yiele 每次都返回,但是下一次取值时,从上一次yield的下一行开始
m = test()
print(m)
1.5、示例(把1.xtx的内容按照uid排序):
import codecs
with codecs.open("1.txt", "r") as l:
result = sorted(l.readlines(), key=lambda item: int(item.split(":")[2]))
for i in result:
print(i)
1.6、函数的设计规范
耦合性:
①、通过参数接收输入,以及通过return产生输出以保证函数的独立性;
②、尽量减少使用全局变量进行函数间的通信;
③、不要在函数中修改可变类型的参数;
④、避免直接改变定义在另外一个模块中的变量;
聚合性:
①、每个函数都应该有一个单一的、统一的目标;
②、每个函数的功能都应该相对简单;