python计算写作业时间_理解了这三点,才敢说自己会写Python代码_Python作业辅导员 – 天元浪子-CSDN博客...

本文通过讲述一个Python程序员在工作中遇到的问题,揭示了写出简洁优美代码的三个关键:合理使用中间变量、适度使用列表推导式、善用内置函数。作者分享了二维列表转置的不同实现方式,展示了如何提高代码效率和可读性。
摘要由CSDN通过智能技术生成

原文作者:天元浪子

原文标题:理解了这三点,才敢说自己会写Python代码

发布时间:2021-02-04 16:59:19

某同学应聘Python岗位被录用。上班第一天,Leader吩咐他写一个获取次日日期信息的函数。该同学信心满满地写下了这样一段代码, 然后就没有然后了。

import time

def get_next_date():

time.sleep(24*60*60)

return time.strftime('%Y-%m-%d')

当然,这只是一个段子,相信没有Python程序员真的会写出这样的代码。不过,很多时候,我们写出来的代码尽管功能满足需求,效率也还说得过去,但可读性较差,且难以维护,和人们通常所说的简洁优美相去甚远。

那么,怎样才能写出传说中的简洁优美的Python代码呢?前几天,我在Python学习群里征集一个Python小题目的答案,借以了解程序员的编程习惯,分析影响程序员写出Pythonic代码的主要原因,最终总结出三条秘诀。题目如下:二维列表转置。

严格讲,Python的列表并没有维度的概念。这里说的二维列表是指类似下面这样的列表。

[ [1, 2, 3],

[4, 5, 6],

[7, 8, 9] ]

请实现二维列表的转置(行列互换,首行变首列,尾行变尾列,如下所示)。

[ [1, 4, 7],

[2, 5, 8],

[3, 6, 9] ]

这个活动得到了同学们的热情支持,甚至有同学们使用Java语言提交了自己的答案。对于这些同学,除了表示感谢,我无法回报更多,只能在能力所及的范围内,为每人提供30分钟的一对一服务,比如,代写作业、答疑等。

这是我收到的众多答案中的一个,并且很有代表性。

>>> a = [[1,2,3], [4,5,6], [7,8,9]]

>>> a_copy = []

>>> a_temp = []

>>> a_size = len(a)

>>> a_item_size = len(a[0])

>>> for i in range(a_item_size):

for j in range(a_size):

a_temp.append(a[j][i])

a_copy.append(a_temp)

a_temp = []

>>> a_copy

[[1, 4, 7], [2, 5, 8], [3, 6, 9]]

阅读这段代码的时候,最感吃力的是我需要记住a_copy、a_temp 、a_size、a_item_size等中间变量,否则读不懂后面的代码。在适当的位置合理地使用中间变量或临时变量,会提高效率,增强代码地可读性,但是,不加限制地使用,则会降低代码的可读性,同时也会带来更多的风险。

对上面的代码稍加修改,并封装成函数,感觉顺眼了很多。

>>> def transpose(arr):

result, arr_len = list(), len(arr)

for j in range(len(arr[0])):

result.append(list())

for i in range(arr_len):

result[-1].append(arr[i][j])

return result

>>> transpose([[1,2,3], [4,5,6], [7,8,9]])

[[1, 4, 7], [2, 5, 8], [3, 6, 9]]

在我收到的答案中,大约有70%和修改后的这段代码类似。不过,这段代码看起来还是有点啰嗦,不够简洁。如果使用列表推导式,则可以在一行之内完成转置。

>>> def transpose(arr):

return [[arr[i][j] for i in range(len(arr))] for j in range(len(arr[0]))]

>>> transpose([[1,2,3], [4,5,6], [7,8,9]])

[[1, 4, 7], [2, 5, 8], [3, 6, 9]]

使用列表推导式,可以让代码更加紧凑,但会降低可读性,因此应限制使用。在所有收集到的答案中,有几位同学使用了列表推导式,还有两位同学使用了NumPy的数组转置。遗憾的是,没有一位同学写出下面这个我认为的最佳答案。

>>> def transpose(arr):

return list(zip(*arr))

>>> transpose([[1,2,3], [4,5,6], [7,8,9]])

[(1, 4, 7), (2, 5, 8), (3, 6, 9)]

这个答案,用到了内置函数zip()和一颗星(*)解包魔法,代码简洁高效。想要写出这样经典的答案,有一个前提条件就是对Python的内置函数能够信手拈来。Python内置了七十多个常用函数,配合不同的参数,可以实现非常精妙的功能。比如,从包含重复元素的列表中找出重复次数最多的元素,可以用一行代码高效实现。

>>> arr = [7,3,5,3,6,7,3,5,6,3,5]

>>> max(set(arr), key=lambda x:arr.count(x))

3

最后,总结一下写出简洁优美的Python代码的三条秘诀:

秘诀第1条:合理使用中间变量或临时变量

秘诀第2条:适度使用列表推导式等语法特性

秘诀第3条:尽量使用Python的内置函数

Post Views:

9

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值