您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 能源与动力工程 > python的学习和理解-编程技巧1
把python里面的东西全部当成是对象看待!!!1、文件名(模块名),不要包含横杠(横线)(-),而应该采用下划线(_)。因为importx-y是会报语法错误的。2、lambda无名函数(特别的,lambda可以包裹任何东东,类似装饰器、适配器)add=lambdax,y:x+yprint(add(1,2))lambdax:lambday:print(‘test’)3、根据序列构建str或bytes串的join方法(返回str或bytes)fruits=['apple','banana']result=''.join(fruits)4、函数中定义函数deffun1():deffun1_1():print(‘text’)returnfun1_15、函数、方法、类的装饰器用法:因为“函数”、“方法”、“类”在python看来都是对象,所以,装饰器都可以将它们用作普通参数,进而进一步处理。6、使用%来连接、格式字符串(现在普遍使用str.format函数:用{}和:来代替%)s=“thisisasample%s%s”%(“hello”,“qjj”)s=“thisisasample{}{}”.format(“hello”,“qjj”)7、x,y=y,x8、str.format_map(dict)或str.format(**dict)9、yield生成器10、生成器表达式(小括号):(x+1forxin[1,2,3])11、[x*2forxinrange(10)ifx%2==0]or(x*2forxinrange(10)ifx%2==0)12、x=1if21else213、for…else…14、try…except…else…(try语句中没有异常发生时,才执行else语句)15、无论是在try还是在except中,遇到return时,只要设定了finally语句,就会中断当前的return语句,跳转到finally中执行,如果finally中遇到return语句,就直接返回,不再跳转回try/excpet中被中断的return语句16、在except和try中遇到return时,会锁定return的值,然后跳转到finally中,如果finally中没有return语句,则finally执行完毕之后仍返回原return点,将之前锁定的值返回(即finally中的动作不影响返回值),如果finally中有return语句,则执行finally中的return语句。17、在一个循环中,最终要跳出某轮循环之前,会先转到finally执行,执行完毕之后才开始下一轮循环18、任何元素都是对象,都可以传递,特别的,把函数(方法)作为参数传递。19、函数的默认参数(特别注意可变默认参数,例如列表)20、xxx()==xxx.__call__()21、with语句的用法:withopen('filename','r',encoding=’utf-8’)asf:forlineinf:printline22、map、filter、zip、functools.reduce23、序列操作:itertools.chain、itertools.count、itertools.repeat、itertools.cycle、itertools.groupby、itertools.islice24、对于and语句,如果and左边的是true,and右边的值将被返回作为and的结果;对于or语句,如果or左边的是false,or将右边的值将被返回作为or的结果。25、动态加载模块1,使用系统函数__import_()1.stringmodule=__import__('string')2,使用imp模块1.importimp2.stringmodule=imp.load_module('string',*imp.find_module('string'))3,使用exec1.import_string=importstringasstringmodule2.execimport_string26、dirUp,dirDown,dirLeft,dirRight=range(4)27、list[x:y:z]——x,y表示起止索引位置(位置索引从0开始),z表示间隔28、if0x10:比较if0xandx10:29、ifxindict:比较ifxindict.keys():30、带参数的iter方法:defseek_next_line(f):forciniter(lambda:f.read(1),'\n'):#借用lambda来包裹pass31、两个list构建一个dict:names=['jianpx','yue']ages=[23,40]m=dict(zip(names,ages))32、简化语法:ifaandbandc:returnTrueelse:returnFalse可以简化成:returnall([a,b,c])33、heapq模块(堆),用于获取前n个最小、最大元素:heapq.nlargest(n,data)heapq.nsmallest(n,data)这个heapq堆,内部是一个简洁二叉树,确保父节点总是比子节点小(仅此)。在heapq.push或heapq.pop的过程中,会动态调整data的元素顺序,以确保父节点总是比子节点小。34、将字符串字面值动态转换为list或dict:1)evala='{a:1,b:2}'a=eval(a)2)jsonimportjsona='{a:1,b:2}'a=json.loads(a)35、动态创建类(对象):Class=type(name,(baseClass,),dict(__slots__=(),__new__=new))从中看出,动态创建一个类(对象)需要的参数包括:类名该类(对象)的基类(列表)该类(对象)的定义(字典)36、判断真假布尔值,以下全部表示False:1.None2.Flase3.数值为0的情况,如:0、0.0、0j4.所有空序列,如:''、()、[]5.所有空mapping,如:{}6.instancesofuser-definedclasses,iftheclassdefinesa__bool__()or__len__()method,whenthatmethodreturnstheintegerzeroorboolvalueFalse.37、isinstance、issubclass(特殊)机制:常规上,python会通过类对象的__mro__属性来寻找和判断。但是,如果isinstance函数的第二个参数类是抽象类(abc.ABCMeta)(必须是抽象类吗?对!否则__subclasshook__方法不会被调用),并且提供了__subclasshook__这么一个类方法的话,会根据该方法返回值来判断(其实,__subclasshook__又是被__subclasscheck__调用。__subclasscheck__才是整个判断的逻辑核心)。——ThismethodshouldreturnTrue,FalseorNotImplemented.IfitreturnsTrue,thesubclassisconsideredasubclassofthisABC.IfitreturnsFalse,thesubclassisnotconsideredasubclassofthisABC,evenifitwouldnormallybeone.IfitreturnsNotImplemented,thesubclasscheckiscontinuedwiththeusualmechanism.还有另外一种方式:abc.ABCMata的register方法(影响isinstance、issubclass的返回值)。上述机制的作用,就是不用(继承)实现“子类”的方式,也可以认为是“子类”。在java中,这种判断的目的就是为了接口方法一致。38、用生成器(函数中的yield)来实现协程(停留在yield的生成器):协程可以理解为是一个含无限循环代码的生成器。执行到yield语句时,返回yield语句后面的值后该生成器暂停(保留状态);直到外部调用生成器的send方法后(send方法可以有参数,作为yield的返回值,传递值给生成器),生成器继续从原有状态往下执行。协程与普通函数有什么关系呢?协程可以保持执行状态。39、python中的迭代器有以下几种方式:首先明确的是,python的for….和in…语句,内部都是调用和使用迭代器协议(调用__iter__、__next__两个方法)1)“序列协议”方式——实现__getitem__方法2)双参数调用内置iter函数——首参数必须是一个callable,第二个参数是停止(迭代)标记值。iter也可以单单数调用,此时其逻辑与双参数调用完全不同。3)迭代器协议(迭代器对象要实现__iter__、__next__两个方法,不依赖内置iter函数)内置的iter函数,参数是一个和两个,是完全不同的处理逻辑:一个参数:参数要么必须实现__iter__、__next__两个方法,因为iter会调用参数的__iter__方法并返回(期望是一个迭代器对象,支持__next__方法);参数要么必须实现__getitem__方法(这种情况下,iter函数返回python内部实现的一个迭代器,其__next__方法不停调用其第一个参数的__getitem__方法来进行迭代返回)。两个参数:其返回值是也一个迭代器对象,但这个迭代器对象我猜测是python自动内部实现的,其__next__方法不停调用其第一个参数的__callable__方法来进行迭代返回。40、生成器表达式中的for可以嵌套,且作用域比较特别:d={'a':1,'b':2,'c':3}a=(itemforitem,countind.items()for_inrange(count)for_inrange(count))foriina:print(i)结果是:a输出1次(1*1);b输出4次(2*2);c输出9次(3*3)。看到了吗?直觉以为是for从后执行到前;但是,上例中,后面的for却可以引用前面的for中的变量:count。所以,for的执行顺序到底是怎样的呢?41、python不支持类的方法重载(同名、同返回值和类型、不同参数),原因比较直观:python是根据kv来动态查找对象进而操作该对象的,而k的查找仅仅包括k名称,不含参数信息。所以,如果有重载的情况,后者会替换掉前者,只保留一个k。但python依然支持类似重载的特性,机制就是不定长的位置参数(*args)和关键字参数(**keyargs)。42、python并发技术包括多线程(threading)、多进程(multiprocessing)。subprocess模块与multiprocessing模块有区别,前者启动一个操作系统下的普通进程;后者启动另外一个python(解释器)进程。在python代码上,并发一般分为3个级别:1)低层并发——调用cpu指令提供的“原子操作”指令,该级别一般普通程序员不会用到。一般是低层api开发人员才会用到。python语言本身无法提供和支持这么低层次的开发。估计类似c/c++语言加上特定编译器选项编译出来的二进制代码才提供这么低层的实现。2)中级并发——python语言支持。采用某种锁(lock)机制(例如threading.Semaphore、threading.Lock、multiprocessing.Lock等)来确保并发情况下的访问冲突。3)高级并发——python语言支持。在中级并发的基础上,再封装一层,封装中级层的锁机制,以便更加容易使用并发机制。例如concurrent.futures模块、queue.Queue模块、multiprocessing.JoinableQ
本文标题:python的学习和理解-编程技巧1
链接地址:https://www.777doc.com/doc-2853921 .html