019--python内置函数
一、内置高阶函数
map函数:接收两个数据 函数和序列,map()将函数调用'映射'到序列身上,并返回一个含有所有返回值的一个列表
num1 = [1,2,3,4,5] num2 = [5,4,3,2,1] def add_one(x): #加 return x+1 def reduce_one(x): #减 return x-1 def pow(x): #平方 return x**2 def map_test(func,array): res = [] for i in array: res.append(func(i)) return res res1 = map_test(pow,num1) print(res1) res2 = map_test(lambda x:x+1,num1) print(res2) #内置函数map res3 = map(reduce_one,num2) print(list(res3))
reduce函数:接收两个数据 函数和序列,reduce
把一个函数作用在一个序列[x1, x2, x3, ...]
上,这个函数必须接收两个参数,reduce
把结果继续和序列的下一个元素做相应计算
num1 = [1,2,3,4,100,200] def reduce_test(func,array,init=None): if init==None: res=array.pop(0) else: res=init for i in array: res=func(res,i) return res print(reduce_test(lambda x,y:x*y,num1,10)) #内置reduce函数 from functools import reduce print(reduce(lambda x,y:x+y,num1))
filter函数:接收两个数据 函数和序列,filter()
把传入的函数依次作用于每个元素,然后根据返回值是True
还是False
决定保留还是丢弃该元素
num1 = [1,5,20,30,100,200] def filter_test(func,array): res = [] for i in array: res.append(func(i)) return res res1 = filter_test(lambda x:x>99,num1) print(res1) #内置filter函数 res2 = filter(lambda n:n>99,num1) print(list(res2))
二、其它内置函数
eval()把字符串中的数据结构提取出来 a = "{'a':23,'b':43,'book':'english'}" print(eval(a)) hash()可以hash的数据类型是不可变数据类型 a = 'alex' b = hash(a) print(b) zip 函数(组成一一对应的元组)(如果外面不加一个lis那没得到的就是一个zip对象) print(list(zip(('a','b','c'),(1,2,3)))) print(list(zip(('a','b','c'),(1,2,3,4)))) print(list(zip(('a','b','c','d'),(1,2,3)))) p = {'name':'alex','age':23,'gender':'male'} print(list(zip(p.keys(),p.values()))) 输出结果为: [('a', 1), ('b', 2), ('c', 3)] [('a', 1), ('b', 2), ('c', 3)] [('a', 1), ('b', 2), ('c', 3)] [('name', 'alex'), ('age', 23), ('gender', 'male')] max 和 min 函数 l = [ (5,'e'), (2,'b'), (3,'c'), (6,'d') ] print(list(max(l))) max 函数的两点说明: 1.max处理的是可以迭代的对象,相当于for循环取出每个元素进行比较,不同数据类型之间不可以比较 2.每个元素之间的比较是从每个元素的第一个位置依次比较,如果此位置可以区分出大小,后面就不需要比较了,直接得出这两个元素的大小 sorted函数的使用(都是按照从小到大的顺序进行排列) name_dict ={ 'yuanhao':80, 'alex':99, 'wupeiqi':700 } print(sorted(name_dict)) print(sorted(name_dict,key = lambda key:name_dict[key])) 1.对数据的进制转化 a = hex(12)#十进制转十六进制 b = bin(12) #十进制转二进制 c = oct(12) #十进制转八进制 print(a) print(b) print(c) 输出结果为: 0xc 0b1100 0o14 2.数字转字母,字母转数字(ASCII表) a = ord('A') b = chr(99) print(a,b) 输出结果:65 c 3.divmod 取余函数(用在做网页的文章分页) c = divmod(10,3) print(c) 输出结果:(3, 1) #3余数为1 4.求次方函数 d = pow(2,3) e = pow(2,3,4) print(d,e) #d:2的3次方;e:2的3次方对4取余 5.reversed函数取翻转 6.round() #四舍五入函数 7.abs() # print(abs(-10)) 输出 10 8.all()函数 判断列表内是否都为真 >>> print(all([1,2,'1',''])) False 9.any()函数 有一真则为真 >>>print(any([0,'',1])) >>>True 10.bytes()函数 name='你好' print(bytes(name,encoding='utf-8')) print(bytes(name,encoding='utf-8').decode('utf-8')) print(bytes(name,encoding='gbk')) print(bytes(name,encoding='gbk').decode('gbk')) print(bytes(name,encoding='ascii'))#ascii不能编码中文 11.isinstance()函数 判断数据类型 print(isinstance(1,int)) print(isinstance('abc',str)) print(isinstance([],list)) print(isinstance({},dict)) print(isinstance({1,2},set))
三、迭代器和生成器
我们已经知道,可以直接作用于for
循环的数据类型有以下几种:
一类是集合数据类型,如list
、tuple
、dict
、set
、str
等;
一类是generator
,包括生成器和带yield
的generator function。
这些可以直接作用于for
循环的对象统称为可迭代对象:Iterable
。
可以使用isinstance()
判断一个对象是否是Iterable
对象:
>>> from collections import Iterable >>> isinstance([], Iterable) True >>> isinstance({}, Iterable) True >>> isinstance('abc', Iterable) True >>> isinstance((x for x in range(10)), Iterable) True >>> isinstance(100, Iterable) False
而生成器不但可以作用于for
循环,还可以被next()
函数不断调用并返回下一个值,直到最后抛出StopIteration
错误表示无法继续返回下一个值了。
可以被next()
函数调用并不断返回下一个值的对象称为迭代器:Iterator
。
可以使用isinstance()
判断一个对象是否是Iterator
对象:
>>> from collections import Iterator >>> isinstance((x for x in range(10)), Iterator) True >>> isinstance([], Iterator) False >>> isinstance({}, Iterator) False >>> isinstance('abc', Iterator) False
生成器都是Iterator
对象,但list
、dict
、str
虽然是Iterable
,却不是Iterator
。
把list
、dict
、str
等Iterable
变成Iterator
可以使用iter()
函数:
>>> isinstance(iter([]), Iterator) True >>> isinstance(iter('abc'), Iterator) True
你可能会问,为什么list
、dict
、str
等数据类型不是Iterator
?
这是因为Python的Iterator
对象表示的是一个数据流,Iterator对象可以被next()
函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration
错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()
函数实现按需计算下一个数据,所以Iterator
的计算是惰性的,只有在需要返回下一个数据时它才会计算。
Iterator
甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。
迭代器小结
凡是可作用于for
循环的对象都是Iterable
类型;
凡是可作用于next()
函数的对象都是Iterator
类型,它们表示一个惰性计算的序列;
集合数据类型如list
、dict
、str
等是Iterable
但不是Iterator
,不过可以通过iter()
函数获得一个Iterator
对象。
Python的for
循环本质上就是通过不断调用next()
函数实现的,例如:
for x in [1, 2, 3, 4, 5]: pass 实际上完全等价于: # 首先获得Iterator对象: it = iter([1, 2, 3, 4, 5]) # 循环: while True: try: # 获得下一个值: x = next(it) except StopIteration: # 遇到StopIteration就退出循环 break
生成器
1.生成器函数:常规函数定义,但是,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行
2.生成器表达式:类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表,把列表解析式的中括号改为小括号
生成器小结:
1.是可迭代对象
2.实现了延迟计算,省内存
3.生成器本质和其他的数据类型一样,都是实现了迭代器协议,只不过生成器附加了一个延迟计算省内存的好处,其余的可迭代对象可没有这点好处.
4.只能遍历一次
生成器表达式: >>> L = [x * x for x in range(10)] >>> L [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] >>> g = (x * x for x in range(10)) >>> g <generator object <genexpr> at 0x1022ef630> 生成器函数:裴波拉契数列 def fib(max): n, a, b = 0, 0, 1 while n < max: yield b a, b = b, a + b n = n + 1 return 'done'
闭包问题示例:
def multipliers(): gs = [] for i in (0, 1, 2, 3): def g(x): return i * x gs.append(g) return gs # 即4个g(x) gs = [g(x),g(x),g(x),g(x),g(x)] print([m(2) for m in multipliers()]) # [m(2) for m in multipliers()] 相当于 [m(2) for m in [g(x),g(x),g(x),g(x),g(x)]] 这里的个g(x)就是 def g(x): # return i * x # m(2) for m in multipliers()即m是multipliers的一个返回值,即g(x)。 m(2)即g(2),2*3 = 6 # 故结果是【6,6,6,6】 #解决方法一: 使用map函数先生成一个序列(i for i in range(4)) 然后传入lambda表达式i * x 进行计算 def multipliers(x): return map(lambda i :i * x ,(i for i in range(4))) print(list(multipliers(2))) # 解决方法二: 在循环的时候就把每次的i值当默认参数传进去 def multipliers(): return [lambda x, i=i : i * x for i in range(4)] print([m(2) for m in multipliers()]) def multiplier(): gs = [] for i in (0, 1, 2, 3): def g(x,i=i): # 在循环的时候就把每次的i值当默认参数传进去 return i * x gs.append(g) return gs # gs = [ return 0*x , return 1*x , return 2*x , return 3*x ] print([m(2) for m in multiplier()]) # [m(2) for m in multiplier()] 相当于 [m(2) for m in [ return 0*x , return 1*x , return 2*x , return 3*x ] ]
菜鸟教程:内置函数详解
资料来源:廖雪峰迭代器说明 林海峰迭代器生成器说明