七. python进阶(内置函数和高阶函数)
一. 内置函数
查看链接
# zip li1=["张三","李四","王五"] li2=["22","33","55"] li4=["15kg","85kg","99kg"] bb=zip(li1,li2,li4) # print("__iter__" in bb) print(bb) for i in bb: print(i) # eval() ss="[22,33,'zhansg']" ret=eval(ss) print(ret) st="8+9" print(eval(st)) stre="for i in range(66): print(i)" c=compile(stre,"","exec") print(c)
https://www.cnblogs.com/nickchen121/p/10796073.html
https://www.processon.com/view/link/5b4ee15be4b0edb750de96ac#map
https://www.runoob.com/python/python-built-in-functions.html
二. 内置高阶函数
高阶函数 函数接收的参是一个函数名 返回值包含函数
把函数当作一个参数传给另一个函数
def a(n): print(n) def b(name): print('my name is 哈哈哈') a(b('111111111111111111111111111111111')) # my name is 哈哈哈 # None
def a(n): print(n) #<function b at 0x000002EAA7B43E18> def b(): print('my name is 哈哈哈') a(b)
1. sum() 方法对系列进行求和计算。
# sum() 方法对系列进行求和计算。 # # 语法 # 以下是 sum() 方法的语法: # # sum(iterable[, start]) # 参数 # iterable -- 可迭代对象,如:列表、元组、集合。 # start -- 指定相加的参数,如果没有设置这个值,默认为0。""" print(sum([0,1,2])) # 3 print(sum((2, 3, 4), 1) ) # 10 元组计算总和后再加 1 print( sum([0,1,2,3,4], 2) ) # 12 列表计算总和后再加 2
2. callback()判断是否能调用 来检查函数能否调用
print(callable(print)) # True a=111 print(callable(a)) # false def aa():pass print(callable(aa)) # True
import time def callback(): print("这是一个callback函数") def test_callback(call): print("这是在test_callback中哦") #模拟延时效果 time.sleep(1) print("开始调用callback函数") time.sleep(1) #开始回调 call() print("调用完成") # 这是在test_callback中哦 # 开始调用callback函数 # 这是一个callback函数 # 调用完成 test_callback(callback) print(callable(test_callback))# True print(callable(callback)) # True
3. 查看帮助信息help()
# 查看帮助信息help() print(help(dict)) print(help(list)) print(help(tuple)) print(help(set)) print(help(str)) # 哈希 print(hash("aaaaaaaaaaaaaaaaaaa"))
4. all(x)如果all(x)参数x对象的所有元素不为0、''、False或者x为空对象,则返回True,否则返回False
# 函数用于判断给定的可迭代参数 iterable 中的所有元素是否都为 TRUE,如果是返回 True,否则返回 False。 # 元素除了是 0、空、None、False 外都算 True。 # all() print(all(['a','',123])) # False print(all(['aaa',123])) # True print(all(['','',123])) # False
5.any(x)判断x对象是否为空对象,如果都为空、0、false,则返回false,如果不都为空、0、false,则返回true
# 如果都为空、0、false,则返回false,如果不都为空、0、false,则返回true。 # any() 函数用于判断给定的可迭代参数 iterable 是否全部为 False,则返回 False,如果有一个为 True,则返回 True。 # 元素除了是 0、空、FALSE 外都算 TRUE。 # 列表list,元素都不为空或0 print(any(())) # 空列表 False print(any([])) #空元组 False any((0, '', False)) # 元组tuple,元素全为0,'',false print(any(('a', 'b', 'c', 'd'))) # 元组tuple,元素都不为空或0 any(('a', 'b', 'c', 'd')) # 元组tuple,元素都不为空或0 True print(any([1,'',99])) True
6. zip()
函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。
a = [1,2,3] b = [4,5,6] c = [4,5,6,7,8] d=('*','**',[1,2],'6666') f={'k1':1,'k2':3} print(zip(a,b,c)) for i in zip(a,b,c,d,f): print(i) # (1, 4, 4, '*', 'k1') # (2, 5, 5, '**', 'k2') print(list(zip(('a','n','c'),(1,2,3)))) # [('a', 1), ('n', 2), ('c', 3)] print(list(zip(('a','n','c'),(1,2,3,4)))) # [('a', 1), ('n', 2), ('c', 3)] p={'name':'张三','age':18,'爱好':'上网','地址':'南充'} print(list(zip(p.keys(),p.values()))) # [('name', '张三'), ('age', 18), ('爱好', '上网'), ('地址', '南充')]
# 求出列字典最大值 aa={"age1":11,"age2":16,"age3":20,"age4":28,"age5":90} # 这样比较不知到对应哪个key和value的值 不合理 print(max(aa.values())) # 90 print(max(aa)) # age5 print('*********************1111111****************') # 借用zip()函数来比较字典里面的大小 这样逻辑清晰 就是key和value都知道 cc={"age1":11,"age2":16,"age3":20,"age4":28,"age5":90} q=max(zip(cc.values(),cc.keys())) print(q) # (90, 'age5') print('********************2222222*****************') E={"age1":11,"age2":16,"age3":20,"age4":28,"age5":90} for item in zip(E.values(),E.keys()): print(item) # (11, 'age1') # (16, 'age2') # (20, 'age3') # (28, 'age4') # (90, 'age5') # 总结 早出最大的年龄和对应的人名 vv=[ {"name":"张三","age":15}, {"name":"哈哈","age":22}, {"name":"往往","age":33}, {"name":"李四","age":60}, ] B=max(vv,key=lambda dic:dic['age']) print(B) # {'name': '李四', 'age': 60}
7.filter() 函数
原型 : filter (fn,lsd)
参数1 为函数
参数2 为序列
功能: 过滤
白话文 : 把传入的函数依次作用与序列每个元素,
根据返回的是True还是False 决定是否保留改元素
listl=[1,2,3,4,5,6,7,8,9] # 筛选条件 def func (num): # 偶数保留 if num%2==0: return True # 奇数剔除 return False L=filter(func,listl) print(list(L)) #[2, 4, 6, 8]
data=[["姓名","年龄","爱好"],["tom",25,"无"],["tom",2555500000,"金钱"]] def func2(v): v=str(v) if v=="无": return False return True for line in data: m=filter(func2,line) print(list(m)) # ['姓名', '年龄', '爱好'] # ['tom', 25] # ['tom', 2555500000, '金钱']
v = [4,5,6,7] def dd(x): return x%2==1 re=filter(dd,v) print(re) for i in re: print(i) #5 7 print("***********************************************8") # 和上面filter同等 ret=[i for i in [1,2,3,4,5,6] if i%2==1] print(ret) # [1, 3, 5] def is_odd(n): return n % 2 == 1 newlist = filter(is_odd, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) for i in newlist: print(i) print("***********************************************8") # 过滤列表中所有字符串 def st(n): if type(n)==str: return True aa=filter(st,[1,"hello","我是",2,77,"good"]) print(aa) for i in aa: print(i) # hello # 我是 # good print("***********************************************8") # 过滤列表中所有空 def em(n): return n and str(n).strip() jj=filter(em,[1,"hello","我是",None,77,"",[],66]) for i in jj: print(i) j=str([]) print(type(j)) jf=str(None) print(type(jf)) # 1 # hello # 我是 # 77 # 66 # <class 'str'> # <class 'str'> print("***********************************************8") import math def gg(n): if math.sqrt(n)%2==0: return n l=filter(gg,[12,64,25,36,88,77]) for i in l: print(i) # 64 # 36
8. map()函数
map函数的原型是map(function, iterable, …),它的返回结果是一个列表。
参数function传的是一个函数名,可以是python内置的,也可以是自定义的。
参数iterable传的是一个可以迭代的对象,例如列表,元组,字符串这样的。
map 返回的是一个迭代器类型
原型: map(fn,lsd)
参数1 是函数
参数2 是序列
功能: 将传入的函数依次作用在序列的每一个元素,
并把结果作为新的Iterator返回
# map() 会根据提供的函数对指定序列做映射。 # 第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。 ret=map(abs,[1,-3,-4,-5,6]) for i in ret: print(i) print("***************************************") def square(x) : # 计算平方数 return x**2 aa=map(square, [1,2,3,4,5]) for i in aa: print(i)
list2=[2,4,6,8,10] res=map(lambda x:x-1,list2) print(res) # <map object at 0x000001AE389F9BE0> for i in res: print(i) # 1 # 3 # 5 # 7 # 9 def add (x): return x-1 list3=[2,4,6,8,10] print(list(map(add,list3))) # [1, 3, 5, 7, 9] msg="abcdef" print(list(map(lambda x:x.upper(),msg))) # ['A', 'B', 'C', 'D', 'E', 'F']
9.reduce ()函数
# 求一序列的和 list2=[1,2,3,4,5] # 1+2 # 1+2+3 # 1+2+3+4 # 1+2+3+4+5 def aa(x,y): return x+y r=reduce(aa,list2) print("r=",r) #15
from functools import reduce reduce(fn ,lsd) 参数1为函数 参数2为列表 功能 一个函数作用在序列上,这个函数必须接受两个参数, reduce 把结果继续和序列的下一个元素累计计算 例如: reduce(f,[a,b,c,d]) 相当于 f(f(f(a,b),c),d)
num=[2,4,6,8,10] res=0 for i in num: res+=i print(res) # 30 print("**********************************************") # 利用函数 def aa (arr): ser=0 for i in arr: ser+=i return ser b=aa(num) print(b) # 30 print("**********************************************") from functools import reduce # 利用 reduce def aa(x,y): return x+y r=reduce(aa,num) print("r=",r) #30 print("**********************************************") # 利用匿名函数 num=[2,4,6,8,10] def cc (func,arr): res=arr.pop(0) # print(res) 2 for i in arr: res=func(res,i) return res b=cc(lambda x,y:x*y,num) print(b) # 3840 print("**********************************************") # 利用reduce函数 num2=[1,2,3,4,5,6] AA=reduce(lambda x,y:x+y,num2) print(AA) # 21
10. sorted() 和 sort()
# sorted() 函数对所有可迭代的对象进行排序操作。 生成了个新列表 f=[5,7,-6,3,4,1,2] print(sorted(f)) print(f) # sort() 在原有的基础上排序 l=[1,-2,33,-4,-9] l.sort(key=abs) print(l) # 按照列表长度排序 h=[' ',[1,2],'hellossaaa','66'] new=sorted(h,key=len) print(new) # [[1, 2], '66', ' ', 'hellossaaa']
# ord() 函数是 chr() 函数(对于8位的ASCII字符串) # 或 unichr() 函数(对于Unicode对象)的配对函数 print(ord('A')) # 65 #求 平方 print(pow(3,3)) #27 # 四舍五入 print(round(3.5)) # 把字符串变成字典 print(set('hello')) # {'o', 'l', 'h', 'e'} # 排序 l=[5,8,9,4] print(sorted(l)) # [4, 5, 8, 9] """# 列表字典排序 vv=[ {"name":"张三","age":15}, {"name":"哈哈","age":90}, {"name":"往往","age":222}, {"name":"李四","age":60} ], print(sorted(vv,key=lambda dic: dic ['age'])) # [{'name': '张三', 'age': 15}, {'name': '李四', 'age': 60}, {'name': '哈哈', 'age': 90}, {'name': '往往', 'age': 222}] """ # 字典排序 name={ "张三":52, "小孩":23, "校长":280, "吕老师":999, "A":8888, } print(sorted(name)) # ['A', '吕老师', '小孩', '张三', '校长'] 按照values字母大小排序 print(sorted(name,key=lambda key:name[key])) # ['小孩', '张三', '校长', '吕老师', 'A'] # 按照keys价钱从小到大排序 print(sorted(zip(name.values(),name.keys()))) #keys和values 排序 # [(23, '小孩'), (52, '张三'), (280, '校长'), (999, '吕老师'), (8888, 'A')] print(str('1')) # 1 aa=str({'a':1}) print(eval(aa)) # {'a': 1} # 求和、 a=[1,5,9,5,10] print(sum(a)) # 30 print(sum(range(4))) # 6 # 查看类型 print(type(1)) # <class 'int'> """ 65 27 4 {'h', 'e', 'o', 'l'} [4, 5, 8, 9] ['A', '吕老师', '小孩', '张三', '校长'] ['小孩', '张三', '校长', '吕老师', 'A'] [(23, '小孩'), (52, '张三'), (280, '校长'), (999, '吕老师'), (8888, 'A')] 1 {'a': 1} 30 6 <class 'int'> """
11. enumerate()
# enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。 # Python 2.3. 以上版本可用,2.6 添加 start 参数。 seasons = ['Spring', 'Summer', 'Fall', 'Winter'] p=list(enumerate(seasons)) print(p) # [(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')] print("********************************************") i = 0 seq = ['one', 'two', 'three'] for element in seq: print(element,i) i += 1 # one 0 # two 1 # three 2
12.divmod() 函数把除数和余数运算结果结合起来
divmod() 函数把除数和余数运算结果结合起来, # 返回一个包含商和余数的元组(a // b, a % b)。 print(divmod(10,2)) #(4, 0) print(divmod(11,2)) #(5, 1) print(divmod(20,2)) #(10, 0) print(divmod(11,3)) #(3, 2)
13.进制转换
# 进制转换 print(bin(10)) # 10进制到2进制 # 0b1010 print(hex(12)) # 10进制到16进制 # 0xc print(oct(11)) # 10进制到8进制 0o13
14.isinstance() 函数来判断一个对象是否是一个已知的类型
# isinstance() 函数来判断一个对象是否是一个已知的类型,类似 type()。 print(isinstance(1,int)) # True print(isinstance('abcdef',str)) # True print(isinstance([],list)) # True print(isinstance({},dict)) # True
15.functools模块用于高阶函数
import functools # functools模块用于高阶函数:作用与或者返回其它函数的函数。 # 一般来说,对于该模块,任何可调用对象都可以视为一个函数。 # 偏函数 def int2(str,base=2): return int(str,base) print(int2("11111")) # 把一个参数固定住 形成一个新的函数 int3=functools.partial(int,base=2) print(int3("111")) # 进制的换算 # 31 # 7