1。混淆操作本节对比一些Python混淆操作。1.1有放回的随机抽样和无放回的随机抽样importrandomrandom.choices(seq,k=1)#listoflengthk,withreplacementsamplingrandom.sample(seq,k)#listoflengthk,nonePutbacksampling1.2Lambda函数参数func=lambday:x+y#函数运行时绑定x的值func=lambday,x=x:x+y#函数定义时绑定x的值1.3copy和deepcopyimportcopyy=copy.copy(x)#只复制最顶层y=copy.deepcopy(x)#复制所有嵌套的部分复制和变量别名结合使用时,很容易混淆:a=[1,2,[3,4]]#Alias.b_alias=aassertb_alias==aandb_aliasisa#Shallowcopy.b_shallow_copy=a[:]assertb_shallow_copy==aandb_shallow_copyisnotaandb_shallow_copy[2]isa[2]#深拷贝.importcopyb_deep_copy=copy.deepcopy(a)assertb_deep_copy==aandb_deep_copyisnotaandb_deep_copy[2]isnota[2]别名的修改会影响原变量,(浅)拷贝中的元素是原列表中元素的别名,深拷贝是递归拷贝的,深拷贝的修改不影响原变量。1.4==andisx==y#两个引用对象是否有相同的值xisy#两个引用是否指向同一个对象1.5判断类型type(a)==int#面向对象设计忽略多态特性isinstance(a,int)#考虑面向对象设计中的多态特性1.6字符串搜索str.find(sub,start=None,end=None);str.rfind(...)#如果没有找到,返回-1str.index(sub,start=None,end=None);str.rindex(...)#如果没有找到,会抛出ValueError异常如果你想从0开始到索引也可以用~。print(a[-1],a[-2],a[-3])print(a[~0],a[~1],a[~2])2.C/C++用户指南很多Python用户是从以前的C/C++迁移过来的。这两种语言在语法和代码风格上都有一些差异。本节简要介绍它们。2.1大数和小数C/C++的习惯是定义一个非常大的数,Python中有inf和-inf:a=float('inf')b=float('-inf')2.2Boolean的C/C++的习惯是用0和非零值来表示True和False,而Python建议直接用True和False来表示布尔值。a=Trueb=False2.3判断为nullC/C++有用if(a)和if(!a)判断空指针的习惯。Python对None的判断是:ifxisNone:pass如果使用ifnotx,其他对象(如长度为0的字符串、列表、元组、字典等)将被视为False。2.4交换值C/C++的习惯是定义一个临时变量来交换值。使用Python的Tuple操作,可以一步搞定。a,b=b,a2.5比较C/C++的习惯是使用两个条件。使用Python可以一步完成。if0out',shell=True).decode('utf-8')2.12Don'trepeatthewheel,don'trepeatMakingwheels,Python叫做batteriesincluded,意思是Python提供了很多常见问题的解决方案。
