当前位置: 首页 > 后端技术 > Python

花了十多年才弄明白:Python的精髓其实就是方括号、花括号和圆括号!

时间:2023-03-25 22:21:48 Python

与其他编程语言相比,Python的独特之处是什么?很多程序员会说,缩进。确实,缩进是Python语言的标志性特征,但它只是外在的和形式的。从语言特性来看,Python有哪些特点?我试着在知乎上搜索了一下,最有代表性的答案是语法简洁、易学、代码高效、功能强大这四项。细细品味这四项后,我仍然觉得这就是Python语言所表现出的使用效果或用户体验,仍然不是语言特性层面的特性。换句话说,Python有哪些语言特点,使人们普遍认为Python具有语法简洁、易学、代码高效、功能强大等特点?我个人认为这是由于列表(list)、字典(dict)、元组(tuple)和集合(set)的“四钻”所致。虽然整数(int)、浮点数(float)、字符串(str)也很重要,但这三个对象相对于其他编程语言的区别并不像“四大金刚”那么明显。毫不夸张地说,列表、字典、元组、集合代表了Python语言的核心和基础,也是Python的精髓所在。学习使用列表、字典、元组和集合意味着掌握编程语言Python。如果你接受这个观点,那么Python的本质已经从列表、字典、元组、集合等“四大金刚”演变为由方括号、花括号、圆括号组成的“括号家族”。1.方括号方括号是几乎所有编程语言中的第一个符号。这里的第一不是指使用频率,而是指这个符号所表现的编程语言的内涵和创造性。事实上,就符号的使用频率而言,方括号也可能名列前茅——这只是我的直觉,没有统计数据支持。1.1创建列表对于初学者来说,创建列表最常用的方法是使用一对方括号。>>>a=[]>>>a[]>>>b=[3.14,False,'x',None]>>>b[3.14,False,'x',None]方括号广泛用于创建列表,尤其是当理解用于创建列表时。>>>c=[i**2foriinrange(5)]>>>c[0,1,4,9,16]但是我总觉得方括号像口语或者俚语,太随意了。我更喜欢使用严格的list()来创建列表。使用list()创建列表是实例化列表类的标准方法。可以体验一下list类的构造函数如何适配不同类型的参数。>>>a=list()>>>a[]>>>b=list((3.14,False,'x',None))>>>b[3.14,False,'x',None]>>>c=列表({1,2,3})>>>c[1,2,3]>>>d=列表({'x':1,'y':2,'z':3})>>>d['x','y','z']>>>e=列表(范围(5))>>>e[0,1,2,3,4]>>>f=list('*'*iforiinrange(5))>>>f['','*','**','***','****']1.2的索引list括号可以创建列表,但是方括号不等同于列表,因为方括号也用于索引。>>>[3.14,假,'x',无][2]'x'>>>[3.14,假,'x',无][-2]'x'>>>[3.14,假,'x',无][1:][假,'x',无]>>>[3.14,假,'x',无][:-1][3.14,假,'x']>>>[3.14,错误,'x',无][::2][3.14,'x']>>>[3.14,错误,'x',无][::-1][无,'x',错误,3.14]列表的索引很灵活,特别是引入负数索引,用-1表示最后一个元素或者倒序,真是开心。以上操作是一种常用的索引方法。如果你能看懂下面的代码,就说明你的功力已经足够了。>>>a=[3.14,False,'x',None]>>>a[2:2]=[1,2,3]>>>a[3.14,False,1,2,3,'x',None]1.3List方法如果你能对list对象方法使用得心应手,你就是Python高手。>>>a=[3.14,False,'x',None]>>>a.index('x')2>>>a.append([1,2,3])>>>a[3.14,假,'x',无,[1,2,3]]>>>a[-1].insert(1,'ok')>>>a[3.14,假,'x',无,[1,'好的',2,3]]>>>a.remove(False)>>>a[3.14,'x',None,[1,'ok',2,3]]>>>a.pop(1)'x'>>>a[3.14,None,[1,'ok',2,3]]>>>a.pop()[1,'ok',2,3]>>>a[3.14,None]2.大括号大括号代表字典对象,这是大多数初学者所认为的。然而,这是错误的,至少是片面的。在下面的代码中,a和b都是用花括号创建的对象,但是一个是字典,一个是集合。>>>a={}>>>a{}>>>b={'x','y','z'}>>>b{'y','z','x'}>>>type(a)>>>type(b)最初,Python使用花括号来表示字典和集合:花括号是空的,或者是键值对,意思是一本字典;花括号中没有重复的元素,即集合。为了不引起误解,我习惯用dict()生成字典,用set()生成集合。>>>dict(){}>>>dict({'x':1,'y':2,'z':3}){'x':1,'y':2,'z':3}>>>dict((('x',1),('y',2),('z',3))){'x':1,'y':2,'z':3}>>>dict.fromkeys('xyz'){'x':无,'y':无,'z':无}>>>dict.fromkeys('abc',0){'a':0,'b':0,'c':0}>>>set((3,4,5)){3,4,5}>>>set({'x':1,'y':2,'z':3}){'y','z','x'}>>>set([3,3,4,4,5,5]){3,4,5}编码练习其中,虽然套装在某些情况下具有不可替代性,但套装的使用频率却是“四大金刚”中最低的。我们这里不讨论,只说说字典的使用技巧。2.1判断字典中是否存在key在Py2时代,dict对象曾经有has_key()方法来判断是否包含某个key。py3放弃了这种方法,判断一个key是否存在于字典中,只能使用in的方法。>>>a=dict({'x':1,'y':2,'z':3})>>>aTrue中的'x'>>>aFalse中的'v'2.2添加新键或updatekeyvalue很多人喜欢用给字典赋值的方式来给字典增加一个新的键或者更新键值。>>>a=dict()>>>a['name']='xufive'>>>a{'name':'xufive'}我不推荐这种方法,用update()比较有仪式感,而且您可以一次添加或修改多个键。>>>a=dict()>>>a.update({'name':'xufive','gender':'male'})>>>a{'name':'xufive','gender':'Male'}2.3从字典中获取一个key值a['age']是最常见的方式,但是也会遇到key不存在的异常。推荐以下方法。>>>a.get('age',18)182.4获取字典的所有键、所有值、所有键值对。dict类提供了三个方法:keys()、values()和items()来返回字典中的所有键、所有值、所有键值对。需要注意的是,返回的结果不是一个列表,而是一个迭代器。如果需要以列表形式返回结果,请使用list()转换。>>>a=dict()>>>a.update({'name':'xufive','gender':'male'})>>>list(a.keys())['name','性别']>>列表(a.values())['xufive','男性']>>>列表(a.items())[('name','xufive'),('性别','男')]2.5遍历字典很多同学在遍历字典的时候可能会写成遍历字典的keys()。其实不用这么麻烦,直接如下遍历即可。>>>a=dict([('name','xufive'),('gender','male')])>>>forkeyina:print(key,a[key])namexufivegendermale3.圆括号圆括号表示元组对象,应该没有问题吧?确实,听起来还行,但是说到元组的使用,相信每个初学者都至少会掉一次坑。3.1必入的浅坑元组不用列表最显着的特点就是不能更新元素的值。忘记或忽视这一点会导致陷阱。>>>a=(3,4)>>>a[0]=5Traceback(最后一次调用):文件“”,第1行,在a[0]=5TypeError:'tuple'objectdoesnotsupportitemassignment3.2必入坑使用Python多年,写过最严重的bug就是下面这段代码。>>>importthreading>>>defdo_something(name):print('Mynameis%s.'%name)>>>th=threading.Thread(target=do_something,args=('xufive'))>>>线程Thread-1中的th.start()Exception:Traceback(最近调用最后一次):文件“C:\Users\xufive\AppData\Local\Programs\Python\Python37\lib\threading.py”,第926行,在_bootstrap_innerself.run()文件"C:\Users\xufive\AppData\Local\Programs\Python\Python37\lib\threading.py",line870,inrunself._target(*self._args,**self._kwargs)TypeError:do_something()takes1positionalargumentbut6weregiven我明明只提供了1个参数,却提示给了6个参数,为什么?原来在元组初始化的时候,如果只有单参数,单参数后面必须加逗号(,),否则初始化结果只会返回原参数。>>>a=(5)>>>a5>>>type(a)>>>b=('xyz')>>>b'xyz'>>>type(b)>>>a,b=(5,),('xyz',)>>>a,b((5,),('xyz',))>>>type(a),type(b)(,)3.3单星号解包元组在格式化输出字符串时,我最喜欢C风格。当有多个%匹配时,下面的可能是最自然的写法。>>>args=(95,99,100)>>>'%s:语文%d分,数学%d分,英语%d分'%('天元浪子',args[0],args[1],args[2])'Python编程学习圈:语文95分,数学99分,英语100分'是对的,但是不够精彩。满分应该是这样写的。>>>args=(95,99,100)>>>'%s:语文%d分,数学%d分,英语%d分'%('Python编程学习圈',*args)'Python编程学习圈:语文95分,数学99分,英语100分'3.4为什么要用元组?既然元组的元素不能改变,为什么要用元组呢?使用列表而不是元组不是更方便吗?确实在大多数情况下可以用列表代替元组,但是下面的例子证明了列表不能代替元组。>>>s={1,'x',(3,4,5)}>>>s{1,(3,4,5),'x'}>>>s={1,'x',[3,4,5]}追溯(最近调用最后):文件“”,第1行,在s={1,'x',[3,4,5]}TypeError:unhashabletype:'list'我们可以将元组添加到集合中,但不能添加列表,因为列表是不可散列的。这一点不难理解:列表元素是可以动态变化的,所以没有固定的哈希值——这与集合要求元素的唯一性冲突;而元组的元素是禁止更新的,它们的哈希值在整个生命周期内都不会改变,所以可以是一个集合的元素。显然,元组和列表的存储方式是完全不同的。因为不需要考虑更新问题,元组的速度性能比列表要好很多。优先使用元组应该是Python程序员遵循的一个基本原则。以上就是本次分享的全部内容。想了解更多python知识,请前往公众号:Python编程学习圈,发“J”免费领取,每日干货分享