来看几段代码,测测你是 Python 菜鸟还是老鸟

简介: 所谓 pythonic,我觉得包含两方面:一是代码的风格符合 Python 的特点,能合理使用 Python 的“语法糖”;二是代码简洁优美,稳定性高,可读性好,便于维护和修改。所谓“Python 之禅”并不仅限于 Python,很多理念是编程普适的。

零基础python入门教程:python666.cn

大家好,欢迎来到 Crossin的编程教室 !


Python 里有个小彩蛋:


在 Python Shell 里输入 import this



这段话被称作“Python 之禅”(The Zen of Python),它列举了一些 Python 所推崇的理念,比如:


优美胜于丑陋

明确胜于隐晦

简单胜于复杂

可读性很重要

不要忽略错误

面对不确定时,拒绝猜测

现在做好过不做,但盲目动手不如不做

如果你的实现很难说清楚,那是个坏想法;反之亦然


当你学完基础,可以写点代码的时候,可能经常感觉自己的实现很别扭。有经验的程序员会一眼看出你的代码出自一个初学者之手。这就是我们经常说的,代码不够 pythonic


所谓 pythonic,我觉得包含两方面:一是代码的风格符合 Python 的特点,能合理使用 Python 的“语法糖”;二是代码简洁优美,稳定性高,可读性好,便于维护和修改。所谓“Python 之禅”并不仅限于 Python,很多理念是编程普适的。


比如来实现对一个列表中元素的遍历访问,我见过很多次有人这么写:


for i in range(len(lst)):
    print(lst[i])


这样的同学很可能是之前有过 C/C++ 或 Java 的经验。这么写功能上没问题,但不够简洁,不够 pythonic。更好的实现方式:


for i in lst:
    print(i)


这种不影响功能,但能简化程序、提高可读性的语法,我们称之为“语法糖”(Syntactic sugar)。Python 中类似的例子还有不少,来举几个:


1、交换两个变量的值,普通写法:


temp = a
a = b
b = temp


pythonic 写法:


a, b = b, a


2、类似的解包(unpacking)用法还可以实现多个返回值的函数。普通写法:


def func(a, b):
    result = [b, a]
    return result
r = func(a, b)
x = r[0]
y = r[1]


pythonic 写法:


def func(a, b):
    return b, a
x, y = func(a, b)


3、读写文件,普通写法:


f = open('filename.txt')
text = f.read()
print(text)
f.close()


pythonic 写法:


with open('filename.txt') as f:
    for line in f:
        print(line)


with 的好处是即使出错,也会帮你关闭文件。


4、拼接字符串,普通写法:


letters = ['h', 'e', 'l', 'l', 'o']
s = ''
for l in letters:
    s += l
print(s)


pythonic 写法:


print(''.join(letters))


5、关于前面遍历列表的例子,如果你想带上索引,可以这么写:


for i, elem in enumerate(lst):
    print(i, elem)


遍历字典项:


for key, value in dct.items():
    print(key, value)


6、取出列表中大于 0 的元素,生成新列表。普通写法:


new_lst = []
for i in lst:
    if i > 0:
        new_lst.append(i)


pythonic 写法:


new_lst = [i for i in lst if i > 0]


这个被称为“列表解析式”(List comprehension,中文翻译说法有很多),可以说是非常 pythonic 的一个用法了。


更进一步,如果数据量很大,而你对新列表仅仅是遍历操作,并不需要一个列表对象,可以采用生成器


new_lst = (i for i in lst if i > 0)
for i in new_lst:
    print(i)


这样会更节省资源,提升执行效率。


7、判断一个值是否为True、是否为空列表、是否是None,普通写法:


if x == True:
    pass
if len(y) == 0:
    pass
if z == None:
    pass


pythonic 写法:


if x:
    pass
if not y:
    pass
if z is None:
    pass


8、根据键名获取字典中对应的值,普通写法:


value = dct[key]


这样的问题在于,如果 key 不存在,代码就报错跳出。于是你不得不增加更多的判断。


pythonic 写法:


value = dct.get(key, 0)


改用 get 方法,不存在时会得到 None,或者指定的默认值(这里是 0)。


篇幅所限,以上仅仅是一些比较具有代表性的例子。但凡事要有度,过分追求 pythonic 的写法也可能导致代码的可读性下降。比如有人喜欢把很多功能写在一个语句中,这反倒不 pythonic 了。所以,我们需要有一些设计的原则,但又不必拘泥于具体的形式,否则就钻入牛角尖了。


那么对于学习者来说,如何才能写出更 pythonic 的代码呢?说到底还是个经验积累的过程,菜鸟不可能看本书、上个课就一夜变成老鸟,但只要坚持得够久就可以。我这边给几个建议:


  1. 多看。看官方库、优秀项目,学习别人的代码。以及看一些优质的教程和经验分享,比如 Crossin的编程教室
  2. 多搜。当你实现一个小功能后,去网上搜一下,别人是怎么写的,对比下是不是比你自己的更好。举个例子:如何从列表中删除重复元素。你自己可以通过循环实现,但只要搜一下,就会知道 list(set(x)) 这种用法。
  3. 多写。自己还没写几行代码,就先别纠结什么效率什么风格了。最终还是要写上足够量的代码,才会有“悟道”的那一刻。


另外,对于代码本身,Python 有一套书写规范,叫做 PEP8。里面约定了很多细节,比如哪里该空格、注释怎么写、什么地方该换行、如何命名等等。网上搜一下就能找到,还有中文版,务必找时间看一看。


最后,留2个小作业:


  1. 判断一个列表 A 是否为另一个列表 B 的“子集”,也就是列表 A 中的元素是否都在列表 B 中。
  2. 计算 1 加到 100 的和


试试看能不能写出你认为 pythonic 的代码,欢迎在留言中分享。


感谢转发点赞的各位~


_往期文章推荐_


给未来的程序猿

相关文章
|
16天前
|
开发框架 数据建模 中间件
Python中的装饰器:简化代码,增强功能
在Python的世界里,装饰器是那些静悄悄的幕后英雄。它们不张扬,却能默默地为函数或类增添强大的功能。本文将带你了解装饰器的魅力所在,从基础概念到实际应用,我们一步步揭开装饰器的神秘面纱。准备好了吗?让我们开始这段简洁而富有启发性的旅程吧!
25 6
|
9天前
|
数据可视化 Python
以下是一些常用的图表类型及其Python代码示例,使用Matplotlib和Seaborn库。
通过这些思维导图和分析说明表,您可以更直观地理解和选择适合的数据可视化图表类型,帮助更有效地展示和分析数据。
48 8
|
17天前
|
API Python
【Azure Developer】分享一段Python代码调用Graph API创建用户的示例
分享一段Python代码调用Graph API创建用户的示例
41 11
|
18天前
|
测试技术 Python
探索Python中的装饰器:简化代码,增强功能
在Python的世界中,装饰器是那些能够为我们的代码增添魔力的小精灵。它们不仅让代码看起来更加优雅,还能在不改变原有函数定义的情况下,增加额外的功能。本文将通过生动的例子和易于理解的语言,带你领略装饰器的奥秘,从基础概念到实际应用,一起开启Python装饰器的奇妙旅程。
32 11
|
14天前
|
Python
探索Python中的装饰器:简化代码,增强功能
在Python的世界里,装饰器就像是给函数穿上了一件神奇的外套,让它们拥有了超能力。本文将通过浅显易懂的语言和生动的比喻,带你了解装饰器的基本概念、使用方法以及它们如何让你的代码变得更加简洁高效。让我们一起揭开装饰器的神秘面纱,看看它是如何在不改变函数核心逻辑的情况下,为函数增添新功能的吧!
|
15天前
|
程序员 测试技术 数据安全/隐私保护
深入理解Python装饰器:提升代码重用与可读性
本文旨在为中高级Python开发者提供一份关于装饰器的深度解析。通过探讨装饰器的基本原理、类型以及在实际项目中的应用案例,帮助读者更好地理解并运用这一强大的语言特性。不同于常规摘要,本文将以一个实际的软件开发场景引入,逐步揭示装饰器如何优化代码结构,提高开发效率和代码质量。
41 6
|
19天前
|
Python
Python编程入门:从零开始的代码旅程
本文是一篇针对Python编程初学者的入门指南,将介绍Python的基本语法、数据类型、控制结构以及函数等概念。文章旨在帮助读者快速掌握Python编程的基础知识,并能够编写简单的Python程序。通过本文的学习,读者将能够理解Python代码的基本结构和逻辑,为进一步深入学习打下坚实的基础。
|
15天前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!
|
14天前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
2天前
|
Unix Linux 程序员
[oeasy]python053_学编程为什么从hello_world_开始
视频介绍了“Hello World”程序的由来及其在编程中的重要性。从贝尔实验室诞生的Unix系统和C语言说起,讲述了“Hello World”作为经典示例的起源和流传过程。文章还探讨了C语言对其他编程语言的影响,以及它在系统编程中的地位。最后总结了“Hello World”、print、小括号和双引号等编程概念的来源。
97 80