0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Python独一无二的特色是什么?

数据分析与开发 来源:Python作业辅导员 作者:天元浪子 2021-01-18 18:17 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

究竟是Python的哪些语言特性使得人们普遍认为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**2 for i in range(5)] 》》》 c [0, 1, 4, 9, 16]但我一直觉得,方括号就像口语或俚语,太过随便。我更喜欢使用严谨的list()来创建列表。使用list()创建列表,是list类的实例化的标准方法,可以体会list类的构造函数如何适应不同类型的参数。》》》 a = list() 》》》 a [] 》》》 b = list((3.14, False, ‘x’, None)) 》》》 b [3.14, False, ‘x’, None] 》》》 c = list({1,2,3}) 》》》 c [1, 2, 3] 》》》 d = list({‘x’:1,‘y’:2,‘z’:3}) 》》》 d [‘x’, ‘y’, ‘z’] 》》》 e = list(range(5)) 》》》 e [0, 1, 2, 3, 4] 》》》 f = list(‘*’*i for i in range(5)) 》》》 f [‘’, ‘*’, ‘**’, ‘***’, ‘****’]

1.2 列表的索引

方括号可以创建列表,但方括号并不等同于列表,因为方括号还用来索引。

》》》 [3.14, False, ‘x’, None][2] ‘x’ 》》》 [3.14, False, ‘x’, None][-2] ‘x’ 》》》 [3.14, False, ‘x’, None][1:] [False, ‘x’, None] 》》》 [3.14, False, ‘x’, None][:-1] [3.14, False, ‘x’] 》》》 [3.14, False, ‘x’, None][::2] [3.14, ‘x’] 》》》 [3.14, False, ‘x’, None][::-1] [None, ‘x’, False, 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.3 列表的方法

对于列表对象的方法如果能信手拈来,那就是Python高手了。

》》》 a = [3.14, False, ‘x’, None] 》》》 a.index(‘x’) 2 》》》 a.append([1,2,3]) 》》》 a [3.14, False, ‘x’, None, [1, 2, 3]] 》》》 a[-1].insert(1, ‘ok’) 》》》 a [3.14, False, ‘x’, None, [1, ‘ok’, 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) 《class ‘dict’》 》》》 type(b) 《class ‘set’》原来,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’: None, ‘y’: None, ‘z’: None} 》》》 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 判断一个键是否存在于字典中

Py2时代,dict对象曾经有has_key()的方法,用来判断是否包含某个键。py3舍弃了这个方法,判断一个键是否存在于字典中,只能使用in这样的方法了。

》》》 a = dict({‘x’:1, ‘y’:2, ‘z’:3}) 》》》 ‘x’ in a True 》》》 ‘v’ in a False

2.2 向字典中添加一个新键或更新键值

很多人喜欢用对字典的一个键赋值的方法,实现向字典中添加一个新键或更新键值。

》》》 a = dict() 》》》 a[‘name’] = ‘xufive’ 》》》 a {‘name’: ‘xufive’}我不推荐这样的方式,使用update()才更有仪式感,还可以一次添加或修改多个键。》》》 a = dict() 》》》 a.update({‘name’:‘xufive’, ‘gender’:‘男’}) 》》》 a {‘name’: ‘xufive’, ‘gender’: ‘男’}

2.3 从字典中获取一个键值

a[‘age’]是最常用的方式,但是也还会遇到键不存在的异常。下面的方法值得推荐。

》》》 a.get(‘age’, 18) 18

2.4 获取字典的全部键、全部值、全部键值对

dict类提供了keys()、values()和items()等三个方法分别返回字典的全部键、全部值和全部键值对。需要注意的是,返回结果并非列表,而是迭代器。如果你需要列表形式的返回结果,请使用list()转换。

》》》 a = dict() 》》》 a.update({‘name’:‘xufive’, ‘gender’:‘男’}) 》》》 list(a.keys()) [‘name’, ‘gender’] 》》》 list(a.values()) [‘xufive’, ‘男’] 》》》 list(a.items()) [(‘name’, ‘xufive’), (‘gender’, ‘男’)]

2.5 遍历字典

遍历字典的时候,很多同学或写成遍历字典的keys()。其实,不需要这么麻烦,可以像下面这样直接遍历。

》》》 a = dict([(‘name’, ‘xufive’), (‘gender’, ‘男’)]) 》》》 for key in a: print(key, a[key]) name xufive gender 男

3. 圆括号

圆括号代表元组对象,这么说应该没有问题吧?的确,听起来没有问题,但在元组的使用上,我相信每个初学者都会跌进同一个深坑至少一次。

3.1 必入之浅坑

元组不用于列表的最显著的特点,就是无法更新元素的值。忘记或者忽略这一点,就会入坑。

》》》 a = (3, 4) 》》》 a[0] = 5 Traceback (most recent call last): File “《pyshell#14》”, line 1, in 《module》 a[0] = 5 TypeError: ‘tuple’ object does not support item assignment

3.2 必入之深坑

使用了多年Python之后,我曾经写出的最糟糕的bug,就是下面这一段代码。

》》》 import threading 》》》 def do_something(name): print(‘My name is %s.’%name) 》》》 th = threading.Thread(target=do_something, args=(‘xufive’)) 》》》 th.start() Exception in thread Thread-1: Traceback (most recent call last): File “C:UsersxufiveAppDataLocalProgramsPythonPython37lib hreading.py”, line 926, in _bootstrap_inner self.run() File “C:UsersxufiveAppDataLocalProgramsPythonPython37lib hreading.py”, line 870, in run self._target(*self._args, **self._kwargs) TypeError: do_something() takes 1 positional argument but 6 were given我分明只提供了1个参数,却提示说给出了6个参数,为什么呢?原来,元组初始化时,如果只有单个参数,则必须在单个参数之后增加一个逗号(,),否则,初始化结果仅返回原参数。》》》 a = (5) 》》》 a 5 》》》 type(a) 《class ‘int’》 》》》 b = (‘xyz’) 》》》 b ‘xyz’ 》》》 type(b) 《class ‘str’》 》》》 a, b = (5,), (‘xyz’,) 》》》 a, b ((5,), (‘xyz’,)) 》》》 type(a), type(b) (《class ‘tuple’》, 《class ‘tuple’》)

3.3 单星号解包元组

格式化输出字符串时,C语言风格是我的最爱。当有多个%需要匹配时,下面也许是最自然而然的写法。

》》》 args = (95,99,100) 》》》 ‘%s:语文%d分,数学%d分,英语%d分’%(‘天元浪子’, args[0], args[1], args[2]) ‘天元浪子:语文95分,数学99分,英语100分’正确固然正确,但不够精彩。满分写法应该是这样的。》》》 args = (95,99,100) 》》》 ‘%s:语文%d分,数学%d分,英语%d分’%(‘天元浪子’, *args) ‘天元浪子:语文95分,数学99分,英语100分’

3.4 为什么要使用元组?

既然元组的元素不可改变,那为什么还要使用元组呢?使用列表代替元组不是更方便吗?诚然,在多数情况下,可以使用列表代替元组,但下面的例子却可以证明,列表无法代替元组。

》》》 s = {1,‘x’,(3,4,5)} 》》》 s {1, (3, 4, 5), ‘x’} 》》》 s = {1,‘x’,[3,4,5]} Traceback (most recent call last): File “《pyshell#32》”, line 1, in 《module》 s = {1,‘x’,[3,4,5]} TypeError: unhashable type: ‘list’我们可以将元组加到集合中,但列表不行,因为列表是不可哈希(unhashable)的。理解这一点并不困难:列表元素可以被动态改变,所以没有一个固定不变的哈希值——这与集合要求的元素唯一性冲突;而元组的元素被禁止更新,其哈希值在整个生命周期都不会变化,因此可以成为集合的元素。 显然,元组和列表有着完全不同的存储方式。因为不用考虑更新问题,元组的速度性能要远优于列表。优先使用元组,应该成为Python程序员遵循的一条基本原则。

原文标题:用了十几年才想明白:Python 的精髓居然是方括号、花括号和圆括号!

文章出处:【微信公众号:数据分析与开发】欢迎添加关注!文章转载请注明出处。

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编程
    +关注

    关注

    90

    文章

    3709

    浏览量

    96789
  • python
    +关注

    关注

    57

    文章

    4859

    浏览量

    89618

原文标题:用了十几年才想明白:Python 的精髓居然是方括号、花括号和圆括号!

文章出处:【微信号:DBDevs,微信公众号:数据分析与开发】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    刷脸喝咖啡?乐鑫科技ESP32-P4+摄像头方案,改写咖啡机的规则

    独一无二的偏爱,让技术“懂你”!代码已开源!后台私信P4C5全功能共享咖啡机自动获取共享咖啡机软件开源百度网盘链接!启明云端共享咖啡机方案,采用WT99P4C5-
    的头像 发表于 11-12 18:05 376次阅读
    刷脸喝咖啡?乐鑫科技ESP32-P4+摄像头方案,改写咖啡机的规则

    宏齐光1206单色系列LED是电脑主机的“光影魔法师”

    主机提供实用的功能指示,还能为机箱增添独特的视觉效果,让每台电脑都成为独一无二的艺术品。宏齐光(鼎宝宏)代理商南山电子认为宏齐光1206单色系列LED是电脑主机
    的头像 发表于 10-24 15:41 241次阅读
    宏齐光1206单色系列LED是电脑主机的“光影魔法师”

    电力线就是网络线:载波模块如何“悄无声息”实现电能表数据传递?

    载波模块凭借独一无二的“电力线复用”特性,在成本敏感且需广覆盖的物联网场景中难以被替代。
    的头像 发表于 10-11 17:17 1105次阅读
    电力线就是网络线:载波模块如何“悄无声息”实现电能表数据传递?

    termux如何搭建python游戏

    install -y clang git vim htop tree openssh ``` Python环境配置 Termux默认支持Python3,需进步完善开发
    发表于 08-29 07:06

    用树莓派做个指纹识别方案,难不难?

    让我们在树莓派单板计算机上解锁生物识别控制功能吧!生物识别技术利用每个人独有的、不易复制的生理或行为特征进行身份验证。地球上每个人的指纹都是独一无二的,让我们起来探索指纹的奇妙用途吧!本文将介绍
    的头像 发表于 08-09 13:14 651次阅读
    用树莓派做<b class='flag-5'>一</b>个指纹识别方案,难不难?

    经纬恒润全栈自研像素大灯:从安全守护到星空影院,智能定义每次出行

    你是否曾在漆黑雨夜为远光烦恼?是否期待爱车拥有独一无二的个性表达?在传统车灯谢幕之际,经纬恒润凭借深厚技术积累与全栈自研能力,推出了强大的像素大灯解决方案。它以高清、精准、动态的光影科技,让车灯化身
    的头像 发表于 07-02 17:06 957次阅读
    经纬恒润全栈自研像素大灯:从安全守护到星空影院,智能定义每<b class='flag-5'>一</b>次出行

    超高频RFID电子标签如何存储数据

    在科技飞速发展的今天,超高频 RFID(射频识别)电子标签正逐渐走进我们的生活,广泛应用于物流、零售、医疗等众多领域。它就像个小小的 “智能身份证”,能够为物品提供独一无二的标识,并存储丰富的信息。那么,超高频 RFID 电子标签是如何存储数据的呢?这些数据又是否可以重
    的头像 发表于 06-17 16:23 1137次阅读

    戴上DPVR AI Glasses,让骑行拥有第视角“回忆”

    ,亦或深入山野探寻自然脉络,在车轮转动间,既渴望用身体丈量世界,也希望以镜头留存每独一无二的旅程,尤其是山地速降的惊险瞬间、公路骑行的沿途风光等第视角沉浸式记录
    的头像 发表于 06-04 10:54 685次阅读
    戴上DPVR AI Glasses,让骑行拥有第<b class='flag-5'>一</b>视角“回忆”

    全开源!ESP32+3D打印遥控赛车 极速48km/h 成本可控自由改装

    我们可以深入了解 3D 打印、遥控模型设计和电子控制的魅力。它不仅能让我们拥有独一无二的遥控赛车,更是次宝贵的学习和实践经验。
    的头像 发表于 05-22 11:41 2389次阅读
    全开源!ESP32+3D打印遥控赛车 极速48km/h 成本可控自由改装

    HMC6475LC4B宽带MMIC VCO,带有缓冲放大器3.90-7.50GHz技术手册

    + 23V 的模拟调谐电压。HMC6475LC4B VCO 采用 +5V 单电源供电,仅消耗 53 mA 电流,采用符合 RoHS 标准的 SMT 封装。该宽带 VCO 独一无二地结合了超小尺寸、低相位噪声、低功耗和宽调谐范围的特性。
    的头像 发表于 04-29 09:14 684次阅读
    HMC6475LC4B宽带MMIC VCO,带有缓冲放大器3.90-7.50GHz技术手册

    python入门圣经-高清电子书(建议下载)

    此资料内容是本针对所有层次的Python 读者而作的Python 入门电子书。 全书分两部分:第部分介绍用Python 编程所必须了解的
    发表于 04-10 16:53

    零基础入门:如何在树莓派上编写和运行Python程序?

    在这篇文章中,我将为你简要介绍Python程序是什么、Python程序可以用来做什么,以及如何在RaspberryPi上编写和运行个简单的Python程序。什么是
    的头像 发表于 03-25 09:27 1556次阅读
    零基础入门:如何在树莓派上编写和运行<b class='flag-5'>Python</b>程序?

    RFID标签在资产管理中的应用管理

    在资产管理领域,RFID标签的应用为企业带来了精细化管理的新契机。为每件资产贴上独一无二的RFID标签,就如同给资产赋予了个专属的“数字身份”。标签内详细记录着资产的名称、型号、规格等基本信息
    的头像 发表于 03-12 17:50 603次阅读
    RFID标签在资产管理中的应用管理

    使用Python实现xgboost教程

    使用Python实现XGBoost模型通常涉及以下几个步骤:数据准备、模型训练、模型评估和模型预测。以下是个详细的教程,指导你如何在Python中使用XGBoost。 1. 安装XGBoost
    的头像 发表于 01-19 11:21 2244次阅读

    便携式户外空调用锂电池 22.4V16Ah磷酸铁锂电池组 可定制开发

    的户外用电体验独一无二。 有了这款便携式户外空调用锂电池组,无论是深山露营、海边度假还是草原野餐,都能随时随地享受清凉。这个夏天,赶紧备上它,开启你的舒适户外之旅吧!
    的头像 发表于 12-30 16:09 1013次阅读
    便携式户外空调用锂电池 22.4V16Ah磷酸铁锂电池组 可定制开发