#1.list列表的坑: def append_list(x,lis=list()): lis.append(x) return lis l1=append_list(1) l2=append_list('a') l3=append_list('23',[]) l4=append_list(23) print(l3) print(l4) #输出结果: # [1] # ['a', '23', 23] #分析:l2,l4 在进行调用的时候因为没有指定lis的参数,没有创建新的list列表,会默认使用lis=[]的基础上进行append 操作,所以l4=[1, 'a', 23]; # 而l3传入了lis参数,相当于创建了一个新的列表 # ****************************** print("*"*20+" 2 "+"*"*20) #2Python闭包的延迟绑定的坑 def multi_test(): return [lambda x : i * x for i in range(8)] print([multi(2) for multi in multi_test()]) #输出结果为: # [14, 14, 14, 14, 14, 14, 14, 14] #分析:猜想输出的结果应该是[0,2,4,6,8,10,12,14],而结果是由于python闭包的延迟邦定造成, # 在调用multi_test的函数时,参数的值在返回for循环完成后的值7, 所以最终的值被赋予了7 # ****************************** print("*"*20+" 2.1 "+"*"*20) #2.1解决case2 的问题 def multi_bibao(): return [ lambda x, i=i: i*x for i in range(8)] print([mu(2) for mu in multi_bibao()] ) #输出结果为: # [0, 2, 4, 6, 8, 10, 12, 14] # ****************************** print("*"*20+" 2.2 "+"*"*20) #2.2使用生成器 yield 解决case2 def multi_yield(): for i in range(8): yield lambda x :i*x print([mu(2) for mu in multi_yield()] ) #输出结果为: # [0, 2, 4, 6, 8, 10, 12, 14] # ****************************** print("*"*20+" 2.3 "+"*"*20) #2.3使用偏函数 解决case2 from functools import partial from operator import mul def mul_(): return [partial (mul,l) for l in range (8)] print([mu(2) for mu in mul_()] ) #输出结果为: # [0, 2, 4, 6, 8, 10, 12, 14] #分析:functools.partial(func, *args, **keywords),起到冻结函数的作用 # 函数装饰器,返回一个新的partial对象。 # 调用partial对象和调用被修饰的函数func相同,只不过调用partial对象时传入的参数个数通常要少于调用func时传入的参数个数。 # 当一个函数func可以接收很多参数,而某一次使用只需要更改其中的一部分参数,其他的参数都保持不变时,partial对象就可以将这些不变的对象冻结起来, # 这样调用partial对象时传入未冻结的参数,partial对象调用func时连同已经被冻结的参数一同传给func函数,从而可以简化调用过程。 ######### #介绍operator函数:operator是使用c语言写的所以在执行算法的时候比python效率高一些, ''' __all__ = ['abs', 'add', 'and_', 'attrgetter', 'concat', 'contains', 'countOf', 'delitem', 'eq', 'floordiv', 'ge', 'getitem', 'gt', 'iadd', 'iand', 'iconcat', 'ifloordiv', 'ilshift', 'imatmul', 'imod', 'imul', 'index', 'indexOf', 'inv', 'invert', 'ior', 'ipow', 'irshift', 'is_', 'is_not', 'isub', 'itemgetter', 'itruediv', 'ixor', 'le', 'length_hint', 'lshift', 'lt', 'matmul', 'methodcaller', 'mod', 'mul', 'ne', 'neg', 'not_', 'or_', 'pos', 'pow', 'rshift', 'setitem', 'sub', 'truediv', 'truth', 'xor'] ''' ''' lt <小于 le <=小于等于 eq == ne != ge >= not_ not 否定 control +B 查看源码即可,一共464行代码,很简单的 ''' from operator import * #1比较函数< <= == != >= > print(lt(3,4)) # True print(le(2, 4)) # True print(eq(2,2)) # True print(ne(2,3)) # True print(ge(4,3)) # True print(gt(8,5)) # True #2逻辑函数 非 真 是 不是 print(not_(3)) # False print(truth(3)) # True print(is_not(3,5)) #True print(is_(1,1)) #True print(is_not(1,2)) # True #3数学函数: 绝对值 加法 & 取整// index inv取反 lshift左位移 mod取模(余数) mul乘法 neg返回(-obj) (or |) pos返回(+obj) #pow 次方 rshift 右位移 sub减法 truediv除法 xor按位异或 print(abs(-3)) #3 print(add(3,4)) #7 print(and_(2,3)) # 2 print(floordiv(7,3)) #2 print(index(3)) # 3 print(inv(4)) #-5 print(lshift(2,3)) #16 print(mod(7,2)) #1 print(mul(3,4)) #12 # print(matmul(2.3,2.9)) print(neg(2)) #-2 print(or_(2,3)) #3 print(pos(-2)) #-2 print(pow(2,5)) #32 print(rshift(2,1)) #1 print(sub(5,2)) #3 print(truediv(12,3)) #4.0 print(xor(2,4)) print("+"*20) #序列;concat判断是否可迭代 可迭代相加 ;contains(a,b) 判断b 是否在a中 ; countOf(a,b) 检查b在a中出现的次数 #delitem([1,2],1) 指定下标删除列表元素 ;getitem([1,2],1)取下标为1的元素 ;indexOf(a,2); seitem(a,index,newitem) 修改函数; #length_hint(可迭代对象,index) 如果是可迭代,返回对应下标的value;否则返回下标的数值; print(concat('hello ','word')) # hello word print(contains("qwe",'w')) # True print(countOf('qwerqq','q')) #3 a=[1,2,3,4,5] delitem(a,2) print(a) # [1, 2, 4, 5] print(getitem(a,2)) # 4 print(indexOf(a,2)) # 1 setitem(a,1,7) print(a) #[1, 7, 4, 5] print(length_hint(a,2)) #4 print(length_hint('',0)) #0
python基础
最新推荐文章于 2022-10-11 21:19:11 发布