当前位置: 首页 > 科技观察

你应该知道的九个优秀的Python概念

时间:2023-03-13 06:37:20 科技观察

Python是一种通用的编程语言,因其可读性、面向对象的特性和强大的社区支持而广受欢迎。除了用于Web应用程序之外,Python还用于数据科学、人工智能、科学计算等各个领域。因此,如果您一直在考虑进入编程领域并寻找一种通用语言,Python可能为你。在本文中,我将分享一些高级Python概念,它们将帮助您在脚踏实地的同时取得成功。阅读本文无需成为经验丰富的Python程序员;它只会帮助您更好地理解语言并使您成为更好的开发人员。推导式推导式分为三种:列表推导式、字典推导式和集合推导式。如果要从现有的可迭代对象创建新的列表、字典或集合,请使用理解。下面的代码片段演示了这些用法#Createalistforcomprehensionnumbers=[1,2,3,-3,-2,-1]#Createanewlistmylistcontainingthesenumbers=[x*xforxinnumbers][1,4,9,9,4,1]#为这些数字的幂创建一个新字典mydict={x:pow(10,x)forxinnumbers}#output{1:10,2:100,3:1000,-3:0.001,-2:0.01,-1:0.1}#创建一组这些数字的绝对值myset={abs(x)forxinnumbers}#输出{1,2,3}这些推导具有相似的语法。以下是对不同形式的简要概述。值得注意的是,可以设置条件以确保保留所需元素列表推导:[exprforxiniterable]字典推导:{key_expr:value_exprforxiniterable}设置推导:{exprforxiniterable}可选条件:[exprforxiniterableifcondition]{key_expr:value_exprforxiniterableifcondition}{exprforxiniterableifcondition}异常处理异常是在程序执行过程中发生并导致程序中断的条件。它可能由于各种原因而发生。假设您正在构建一个除法程序并且分母包含0,从而导致ZeroDivisionError。导入不存在的库或访问不在列表索引中的元素是另外两个实例。Python带有大约30个内置异常。try和except块用于处理python中的异常。当我们需要同时处理多个异常时,我们可以使用多个except块。try块是要执行的指令。except块包含尝试失败时执行的代码。还有else和finally块。else块仅在try块成功执行时执行。不管前一个块的结果如何,finally块将始终执行。处理单个异常尝试:a=int(input("Enternumerator:")b=int(input("Enterdenominator:")c=a/bprint(c)exceptZeroDivisionErrorase:print(e,"please提供非零分母")处理多个异常importsystry:f=open('myfile.txt')s=f.readline()i=int(s.strip())exceptOSErroraserr:print("操作系统错误:{0}".format(err))除了ValueError:print("Couldnotconvertdatatoaninteger.")except:print("Unexpectederror:",sys.exc_info()[0])raisefinally:print("OperationSuccessfullyDone!!")(ExampleTakenFromOfficialPythonDocs)集合库Counter以一个可迭代对象作为输入并返回一个字典,其中键是可迭代对象的元素,值是它们各自出现的次数发生在原来的iterable中。从集合中导入计数器数据=[1,1,1,1,2,3,4,3,3,5,6,7,7]count=Counter(data)print(count)##Counter({1:4,3:3,7:2,2:1,4:1,5:1,6:1})nametuple生成可以使用名称访问元素内容的元组子类,命名元组赋予每个位置一个含义,提供可读性和自我记录。fromcollectionsimportnamedtupleDirection=namedtuple('Direction','N,S,E,W')dt=Direction(4,74,0,0)print(dt)#Direction(N=4,S=74,E=0,W=0)OrderedDict这是一个能记住键插入顺序的字典结构。最新版本的python中的词典已经包含此功能。fromcollectionsimportOrderedDictdict=OrderedDict()dictt['a']=5dictt['d']=2dictt['c']=1dictt['b']=3print(dictt)#OrderedDict([('a',5),('d',2),('c',1),('b',3)])defaultDict这是一个字典结构,当访问结构中不存在的键时会返回默认值,而不是抛出错误。fromcollectionsimportdefaultdictdictt=defaultdict(int)dictt['a']=2print(dictt['a'])##返回值print(dictt['b'])##返回默认值#2#0dequedouble侧队列可以从另一侧快速添加和推送对象。deque是一个双向链表,针对链表的连续数据结构的插入和删除进行了优化。它提供了可以在两端进行操作的序列,也就是说你可以在序列的两端进行增删操作。fromcollectionsimportdequed=deque('abc')d.append('d')print(d)#deque(['a','b','c','d'])#appendleft添加元素leftendd.appendleft('e')print(d)#deque(['e','a','b','c','d'])#clear清除所有元素d.clear()print(d)#deque([])还有一些常用的方法如pop、copy、count、extend、index、insert、popleft、remove、reverse、maxlen迭代工具Python的itertools模块提供了各种适用于迭代器的函数。product(iterable,iterable)两个可迭代对象的笛卡尔积。排列(可迭代)所有可能的排列,无需重复元素。combinations(iterable,n)可迭代对象中n个元素的所有可能组合,无需替换。combinations_with_replacement(iterable,n)可迭代的n个元素的所有可能组合和替换。accumulate(iterable)返回可迭代元素的累加和。groupby(iterable,key=FUNC)从可迭代对象中返回一个带有连续键和组的迭代器。装饰器装饰器是Python中修改函数和类行为的一种方式。它们允许您通过添加方法或更改参数来更改功能,或者通过添加属性来更改类。例如,如果你想在每次调用函数“my_function”时都记录下来,你可以这样写代码:__name__}with",args,kwargs)returnoriginal_func(*args,**kwargs)returnwrapper@logging_funcdefadd(a,b):returna+bresult=add(5,6)print(result)让我们来解释装饰器的例子上面-首先,我们有一个名为add的函数,它的工作是获取两个变量并返回它们的总和。现在,经过一段时间的研究,我们意识到我们需要将功能记录到同一个函数中。现在我们有两个选择,第一个是在同一个add函数中添加函数调用记录代码,或者我们可以使用装饰器来添加功能而无需显式更改函数。要使用装饰器,我们首先定义一个装饰器函数。函数original_func作为输入。然后,我们有另一个功能。它是一个带有*args,**kwargs函数参数的包装函数。有了这些,现在都定义为参数,我们可以在函数内部传递任意数量的参数。在包装函数的主体中,我们有日志函数的逻辑。当我们调用带有一些参数add(5,6)的函数add时,输出将是:生成器生成器是一个返回可迭代值序列的函数。与一次返回所有元素并消耗整个列表长度的内存的列表不同,生成器一个一个地生成项目。它包含至少一个yield语句。yield是python中的关键字,用于从函数返回值而不破坏其当前状态或对局部变量的引用。带有yield关键字的函数称为生成器。比如最经典的面试题斐波那契数列deffibon(limit):a,b=0,1whilea>30num.__mul__(6)>>30通常,这些方法用于重载预定义的运算符。例如,数字运算符+、-、*、/必须在数字对象周围使用,但+也可用于连接两个字符串。因此,我们可以争辩说+运算符在执行字符串连接时会消耗大量内存。5+6>>11"python"+"programming">>'pythonprogramming'hashability在学习Python字典时,我们了解到键必须是可哈希的。哈希是什么意思?Hashable基本上意味着Python对象可以被散列,散列的行为。下图描述了散列的工作流程。哈希是使用哈希函数(也称为散列器)(在图中称为散列)将Python对象(在图中称为键)转换为数字哈希值的过程。使用内置的hash()方法获取Python对象的哈希值是判断它是否存在的简单方法。如果对象不可哈希,Python将引发TypeError异常。#获取字符串对象的哈希值hash("Thisisme")5361907397716593195#获取元组对象的哈希值hash((1,2))-3550055125485641917#获取列表对象的哈希值hash([1,2,3])Traceback(recentcalllast):File“”,line1,inTypeError:unhashabletype:'list'#获取字典对象的哈希值hash({“a”:1,“b”:2})Traceback(最近调用last):File“”,line1,inTypeError:unhashabletype:'dict'特别是散列需要时间并且比构建列表和元组慢。那么,为什么我们首先要费心用散列来创建字典呢?在类似的问题上,您可能听说过设置项也必须是可哈希的。字典和集合都需要在后台创建哈希表。以下代码片段演示了特定对象的可散列性如何影响它们作为字典键的适用性。哈希最显着的好处是它们在检索字典元素时提供即时查找时间(即O(1)时间复杂度)。检查特定项目是否在集合中需要相同的时间。换句话说,使用哈希作为物化机制减少了在幕后使用哈希表的开销,同时提高了一些常见操作的效率,例如项目检索、项目插入和项目验证。importrandomimporttimeit#创建一个函数来检查查找时间defdict_look_up_time(n):numbers=list(range(n))random.shuffle(numbers)d0={x:str(x)forxinnumbers}random_int=random.randint(0,n—1)t0=timeit.timeit(lambda:d0[random_int],number=10000)returnt0fornin(10,100,1000,10000,100000):elapse_time=dict_look_up_time(n)print(f”***N={n:<8}:{elapse_time:.5f}”)***N=10:0.00114***N=100:0.00256***N=1000:0.00291***N=10000:0.00207***N=100000:0.00286上面的代码生成一些随机整数来确定项目获取的平均查找时间,以模拟真实情况。正如您所看到的,即使字典中有100,000个条目,查找时间也几乎相同,这证明了使用哈希表作为字典存储机制的好处。本文转载自微信公众号“书阁会编程”,可通过以下二维码关注。转载本文请联系书哥汇编程公众号。