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

2个月前 (11-17 23:53)阅读2回复0
路人甲
路人甲
  • 管理员
  • 注册排名2
  • 经验值97190
  • 级别管理员
  • 主题19438
  • 回复0
楼主

零根底python入门教程:python666.cn

各人好,欢送来到 Crossin的编程教室 !

Python 里有个小彩蛋:

在 Python Shell 里输入 import this

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

漂亮胜于丑恶

明白胜于隐晦

简单胜于复杂

可读性很重要

不要忽略错误

面临不确按时, 回绝揣测

如今做好过不做,但自觉脱手不如不做

若是你的实现很难说清晰,那是个坏设法;反之亦然

漂亮胜于丑恶

明白胜于隐晦

展开全文

简单胜于复杂

可读性很重要

不要忽略错误

面临不确按时, 回绝揣测

如今做好过不做,但自觉脱手不如不做

若是你的实现很难说清晰,那是个坏设法;反之亦然

当你学完根底,能够写点代码的时候,可能经常觉得本身的实现很别扭。有经历的法式员会一眼看出你的代码出自一个初学者之手。那就是我们经常说的,代码不敷 pythonic。

所谓 pythonic,我觉得包罗两方面:一是代码的气概 契合 Python 的特点,能合理利用 Python 的“语法糖”;二是代码 简洁漂亮,不变性高,可读性好,便于敬服和修改。所谓“Python 之禅”其实不仅限于 Python,良多理念是编程普适的。

好比来实现对一个列表中元素的遍历拜候,我见过良多次有人那么写:

fori inrange(len(lst)):

print(lst[i])

如许的同窗很可能是之前有过 C/C++ 或 Java 的经历。那么写功用上没问题,但不敷简洁,不敷 pythonic。更好的实现体例:

fori inlst:

print(i)

那种不影响功用,但能简化法式、进步可读性的语法,我们称之为“ 语法糖”( Syntactic sugar)。Python 中类似的例子还有很多,来举几个:

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

temp = a

a = b

b = temp

pythonic 写法:

a, b = b, a

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

deffunc(a, b):

result = [b, a]

returnresult

r = func(a, b)

x = r[ 0]

y = r[ 1]

pythonic 写法:

deffunc(a, b):

returnb, a

x, y = func(a, b)

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

f = open( 'filename.txt')

text = f.read

print(text)

f.close

pythonic 写法:

withopen( 'filename.txt') asf:

forline inf:

print(line)

with 的益处是即便出错,也会帮你封闭文件。

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

letters = ['h', 'e', 'l', 'l', 'o']

s = ''

for l in letters:

s += l

print(s)

pythonic 写法:

print(''.join(letters))

5、关于前面遍历列表的例子,若是你想带上索引,能够那么写:

fori, elem inenumerate(lst):

print(i, elem)

遍历字典项:

forkey, value indct.items:

print(key, value)

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

new_lst = []

fori inlst:

ifi 0:

new_lst.append(i)

pythonic 写法:

new_lst = [i fori inlst ifi 0]

那个被称为“ 列表解析式”( List comprehension,中文翻译说法有良多),能够说长短常 pythonic 的一个用法了。

更进一步,若是数据量很大,而你对新列表仅仅是遍历操做,其实不需要一个列表对象,能够接纳 生成器:

new_lst = (i fori inlst ifi 0)

fori innew_lst:

print(i)

如许会更节省资本,提拔施行效率。

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

ifx == True:

pass

iflen(y) == 0:

pass

ifz == None:

pass

pythonic 写法:

ifx:

pass

ifnoty:

pass

ifz isNone:

pass

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

value = dct[key]

如许的问题在于,若是 key 不存在,代码就报错跳出。于是你不能不增加更多的判断。

pythonic 写法:

value = dct.get(key, 0)

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

篇幅所限,以上仅仅是一些比力具有代表性的例子。凡是事要有度,过火逃求 pythonic 的写法也可能招致代码的可读性下降。好比有人喜好把良多功用写在一个语句中,那反倒不 pythonic 了。所以,我们需要有一些设想的原则,但又没必要拘泥于详细的形式,不然就钻入牛角尖了。

那么关于进修者来说,若何才气写出更 pythonic 的代码呢?说到底仍是个经历积累的过程,菜鸟不成能看本书、上个课就一夜酿成老鸟,但只要对峙得够久就能够。我那边给几个定见:

别的,关于代码自己, Python 有一套书写标准,叫做 PEP8。里面约定了良多细节,好比哪里该空格、正文怎么写、什么处所该换行、若何定名等等。网上搜一下就能找到,还有中文版,务必找时间看一看。

最初,留2个小功课:

碰运气能不克不及写出你认为 pythonic 的代码,欢送在留言平分享。

感激转发和点赞的列位~

给将来的法式猿

如需领会 付费精品课程及 教学 答疑办事

请在 Crossin的编程教室内回复: 666

0
回帖

来看几段代码,测测你是 Python 菜鸟还是老鸟 期待您的回复!

取消
载入表情清单……
载入颜色清单……
插入网络图片

取消确定

图片上传中
编辑器信息
提示信息