本文适合阅读对象:已学完Python基础课程,并能熟练使用Python基本用法编程。如果还有一些其他语言的基础最好不过了,如果没有Python基础或者正在学习中,请点击以下链接:
Python基础教程
一、“Python之禅"的彩蛋
虽然任何一本介绍Python的图书基本都会提到Tim Peters的“Python之禅”,但这段话无论提多少遍都不为过。它激励着让无数人趋之若鹜,努力成为更优秀的Programmer,希望大家也能从中受益。
“Python之禅”作为彩蛋藏在Python语言当中,只需进入任何一个Python解释器会话并运行这行语句就能看到:
import this
Python代码结果如下:
Beautiful is better than ugly.
# 优美胜于丑陋(Python以编写优美代码为目标)
Explicit is better than implicit.
# 明了胜于晦涩(优美的代码应当是明了的,命名规范,风格相似)
Simple is better than complex.
# 简洁胜于复杂(优美的代码应当是简洁的,不要有复杂的内部实现)
Complex is better than complicated.
# 复杂胜于凌乱(如果复杂不可避免,那代码间也不能有难懂的关系,要保持接口简洁)
Flat is better than nested.
# 扁平胜于嵌套(优美的代码应当是扁平的,不能有太多的嵌套)
Sparse is better than dense.
# 间隔胜于紧凑(优美的代码有适当的间隔,不要奢望一行代码解决问题)
Readability counts.
# 可读性很重要(优美的代码是可读的)
Special cases aren't special enough to break the rules.Although practicality beats purity.
# 即便假借特例的实用性之名,也不可违背这些规则(这些规则至高无上)
Errors should never pass silently.Unless explicitly silenced.
#不要包容所有错误,除非你确定需要这样做(精准地捕获异常,不写except:pass风格的代码)
In the face of ambiguity, refuse the temptation to guess.
# 当存在多种可能,不要尝试去猜测
There should be one-- and preferably only one --obvious way to do it.
# 而是尽量找一种,最好是唯一一种明显的解决方案(如果不确定,就用穷举法) Although that way may not be obvious at first unless you're Dutch.
# 虽然这并不容易,因为你不是 Python 之父(这里的Dutch是指Guido)
Now is better than never.Although never is often better than right now.
# 做也许好过不做,但不假思索就动手还不如不做(动手之前要细思量)
If the implementation is hard to explain, it's a bad idea.If the implementation is easy to explain, it may be a good idea.# 如果你无法向人描述你的方案,那肯定不是一个好方案;反之亦然(方案测评标准)
Namespaces are one honking great idea -- let's do more of those!
# 命名空间是一种绝妙的理念,我们应当多加利用(倡导与号召)
从设计的角度来说,python语言追求的是一种独特的简洁和高可读性;从哲学的角度来讲,python采用了一种所谓的极简主义的设计理念。通过这些如诗一般的文字表达了python编程之美,这就是python之禅。个人感觉python之禅更像修炼武功的心法口诀,需要学习者或开发者们用心去体会其中的奥妙之处,正所谓只可意会不可言传或许用在此处怎么也不为过。
二、使用enumerate()升级循环
如果循环的结果需要用到项的索引,该怎么办呢?可以使用Python内置的enumerate()函数,这是Python很神奇的特性,可以让循环持有并返回当前运行的索引,大家一起来看看:
items=['a','b','c']
for i, item in enumerate(items):
print(f'{i}:{item}')
Python代码结果如下:
三、理解for-in
如何编写出Python-ful的代码?对于之前学过C语言或Java语言,开始学习Python后,写出来的代码可能是这样的,充满C或Java的风格,举个栗子:
items=['a','b','c']
i = 0
while i < len(items):
print(items[i])
i+=1
Python代码结果如下:
这段代码没毛病,执行正常,就是非常没有Python特色,而是C或Java充满的韵味~为什么这么说呢,主要有两点:
代码中手动跟踪了索引:i,先初始化为零,然后在每次循环迭代时仔细递增索引。
为了确定迭代次数,使用len()获取items容器的大小。
如何写出具有Python特色的代码呢?微微老师专门起了个名字,叫做Python-ful的代码。下面来重构第一个代码示例,Python其实无需手动更新索引,可以自动进行,在Python中可以用for循环很好地做到这一点,做法是利用内置的range()自动生成索引:
items=['a','b','c']
for i in range(len(items)):
print(items[i])
Python代码结果如下:
大家看出来了吗,已经比之前好一点,代码也精简了,但仍然不是很有Python特色,感觉依然有点像一个Java风格的迭代代码。为什么这么说呢?因为Python容器的遍历方式非常之简洁,在Python中,for循环实际上for-each循环,可以直接在容器或序列中迭代元素,无需索引查找,直接这样写就可以了:
完美实现!是不是有些被震撼到的感觉?!Python坚持极简主义理念,这个解决方案很有Python特色,非常整洁,看上去就像在阅读编程教科书中的伪代码一样。
注意:循环中不再跟踪容器的大小,也不必使用运行时索引来访问元素。现在容器本身负责分发将要处理的元素,如果容器是有序的,那么所得到的元素序列也是有序的;如果容器是无序的,那么将以随机顺序返回其元素,但循环仍然会遍历所有元素。
如果使用字典时需要同时循环迭代获取字典的键和值,该怎么办呢?for循环同样没有问题,只需同时写两个索引标志即可,一个代表键,一个代表值。
emails={'a':'s@sina.com',
'b':'h@163.com',
'c':'m@qq.com'}
for i, j in emails.items():
print(f'{i}:{j}')
Python代码结果如下:
发表评论 取消回复