对于Python新手来说,写代码很少考虑代码的效率和简洁性,因此容易造成代码冗长、执行慢,这些都是需要改进的地方。本文是想通过几个案列给新手一点启发,怎样写python代码更优雅。

一:不喜欢使用高级数据结构

sets(集合)

很多新手忽视sets(集合)和tuple(元组)的强大之处

例如,取两个列表交集:

def common_elements(list1, list2):    common = []        for item1 in list1:                if item1 in list2:                        common.append( item1 )        return common

这样写会更好:

def common_elements(list1, list2):common = set(list1).intersection(set(list2))return list(common)

dic(字典)

新手枚举(访问和取出)字典的键和对应值,认为对应值必须通过键来访问,往往会这样做:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:579817333
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
my_dict = {'a':1,'b':2}
for key in my_dict:        print(key, my_dict[key])

有一个更优雅的方法可以实现:

my_dict = {'a':1,'b':2}for key, value in my_dict.items():    print(key, value)

对大部分项目来说,这样写会更加有效率。

tuple(元组)

元组一旦创建就无法更改元素,看似没有什么用处,其实元组的作用大着呢!很多函数方法都会返回元组,比如enumerate()和dict.items(),并且可以在函数中使用元组,返回多个值。还能够很方便地从元组中提取信息:

a,b = ('cat','dog')

上面元组中有两个元素,分别被赋给a,b。如果有多个值,同样可以提取:

a,b,c = ('cat','dog','tiger')
print(a,b,c)

提取首、尾两个元素:

first,*_,end = (1,2,3,4,5,6)
print(first,end)
# 输出:1、6

提取首、中、尾三部分:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:579817333
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
first,*middle,end = (1,2,3,4,5,6)
print(first,middle,end)
# 输出:1、[2, 3, 4, 5]、6

元组还可以用来交换变量:

(a,b,c) = (c,a,b)

上面a变成之前的c,b变成之前的a,c变成之前的b

元组也能作为字典的键,所以如果你需要存储数据,可以使用带有元组键的字典,比如说经纬度数据。

二:不喜欢使用上下文管理器

新手可能会习惯这样进行读取文件操作:

if os.path.exists(data_file_path):    data_file = open(data_file_path,'r')
else:    raise OSERROR
print( data_file.read())
data.close()

这样写会有几个明显的问题:

  • 可能出现文件存在,但文件被占用,无法读取的情况
  • 可能出现文件可以被读取,但操作文件对象出现报错的情况
  • 可能出现忘记关闭文件的情况

如果使用with…语句,问题就迎刃而解了:

with open(data_file_path,'r') as data_file:print(data_file.read)

这样可以捕获任何打开文件或处理数据时的异常情况,并且在任务处理完后自动关闭文件。

python初学者可能不太了解上下文管理器的神奇之处,它真的能带来巨大的便利。

三:不喜欢使用标准库

标准库itertools和collections仍然很少被初学者使用

itertools

如果你看到下面的任务:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:579817333
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
list1 = range(1,10)
list2 = range(10,20)
for item1 in list1:for item2 in list1:print(item1*item2)

这是一个嵌套循环操作,为提高代码效率,完全可以用product()函数替代嵌套循环:

from itertools import product
list1 = range(1,10)
list2 = range(10,20)
for item1,item2 in product(list1, list2):print(item1*item2)

这两段代码的结果完全一样,但使用标准库函数明显更加简洁高效。itertools还有很多方便操作迭代对象的函数,比如:

  • count()函数会创建一个无限迭代器
  • cycle()函数会把传入的序列无限重复下去
  • chain()可以把多个迭代对象串联起来
  • group()函数可以把迭代其中相邻的重复元素挑出来,放在一起

  • 有兴趣可以详细看看itertools库的各种神奇函数

collections

新手对python集合模块了解的可能并不多,你可能会遇到这样的情形:

consolidated_list = [('a',1),('b',2),('c',3),('b',4)]
items_by_id = {}
for id_, item in consolidated_list:if id_ not in items_by_id: items_by_id[id_] = []if id_ in items_by_id:items_by_id[id_].append(item)

上面代码构建了一个字典,依次向字典中添加信息,如果某个键已经存在,则以某种方式修改该键的值;如果某个键不存在,则添加对应键值对。

这种算法非常常见,你可以用collects模块的defaultdict()函数来实现同样效果:

from collections import defaultdictitems_by_id = defaultdict(list)
consolidated_list = [('a',1),('b',2),('c',3),('b',4)]for id_, item in consolidated_list:items_by_id[id_].append(item)

在此列中,defaultdict()接受一个list作为参数,当键不存在时,则返回一个空列表作为对应值。

有时候我们会遇到统计词频的案例,比如:

# 统计词频
colors = ['red', 'blue', 'red', 'green', 'blue', 'blue']
result = {}
for color in colors:if result.get(color)==None:result[color]=1else:result[color]+=1
print (result)
# 输出 {'red': 2, 'blue': 3, 'green': 1}

完全可以用defaultdict()函数实现上面的计数功能:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:579817333
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
colors = ['red', 'blue', 'red', 'green', 'blue', 'blue']
d = defaultdict(int)
for color in colors:d[color] += 1
print(d)

更简单的方法用collections模块的Counter()函数:

from collections import Counter
colors = ['red', 'blue', 'red', 'green', 'blue', 'blue']
c = Counter(colors)
print (dict(c))

对于备份文件,新人往往会用system模块:

from  os import system
system("xcopy e:\\sample.csv  e:\\newfile\\")

其实shutil模块更好用:

import shutil
shutil.copyfile('E:\\q.csv', 'e:\\movie\\q.csv')

因为shutil会很详细地报告错误和异常。

四:不喜欢使用异常处理

无论老手新手都应该在写代码的时候进行异常处理操作,这样可以使代码更加健壮。异常处理一般会用try…except语句,具体使用方法可见:

五:不喜欢使用生成器

除非你的list十分复杂,并且频繁调用,否则都建议使用生成器,因为它非常节省内存,举个例子:

def powers_of_two(max=20000):i = 0powers = []while 2**i < max:powers.append[2**i]i += 1return powers

对于使用次数少、占据大量内存、且容易生成的数据,可以用生成器替代列表存储:

from itertools import count, takewhile
def powers_of_two(max=20000):for index in takewhile(lambda i: 2**i < max, count(start=0)):yield 2**index

python新手遇到的5大坑相关推荐

  1. 编程入门python语言是多大孩子学的-不学点编程,将来怎么给孩子辅导作业―Python新手入门教程...

    为了填满AI时代的人才缺口,编程语言教育都从娃娃抓起了!如果你还不懂Python是什么将来怎么给孩子辅导作业呢? Python新手入门教程 近期,浙江省信息技术课程改革方案出台,Python言语现已断 ...

  2. python小项目案例-拯救Python新手的几个项目实战

    原标题:拯救Python新手的几个项目实战 Python 做小游戏 实例一:24点游戏 项目名称:经典趣味24点游戏程序设计(python) 实例二:五子棋游戏 python学习关注我们企鹅qun: ...

  3. python新手自学-新手自学python

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! python介绍与特点(自学python知识整理)python 简介python ...

  4. python新手项目-推荐:一个适合于Python新手的入门练手项目

    原标题:推荐:一个适合于Python新手的入门练手项目 随着人工智能的兴起,国内掀起了一股Python学习热潮,入门级编程语言,大多选择Python,有经验的程序员,也开始学习Python,正所谓是人 ...

  5. python基础看什么书-python新手看什么书比较好?这五本最靠谱

    Python Python开发 Python语言 python新手看什么书比较好?这五本最靠谱 结合我做开发这么多年经验, 总结了以下五本书对学python的人来说很有帮助! 1.<Python ...

  6. python新手入门教程-终于知晓python新手练习教程

    Python是一种解释型.面向对象.动态数据类型的高级程序设计语言.作为今年来越来越流行的语言,我们该如何学习或者转行学习Python呢,这里小迹为大家介绍如何入门学习Python.以下是小编为你整理 ...

  7. 用python怎么赚钱-用python赚钱(python新手怎么兼职)

    回答: 用这个做兼职一般是做爬虫.做其他的内容,好像很少了.如果你真的要做那么,你还是玩爬虫方向去走.用了爬虫,你就会发现需要代理IP,后面有很多要花钱的东西.. 正规渠道的话,在国内不要考虑用Pyt ...

  8. 从小白到精通python要多久-超适合小白的python新手教程

    python介绍 这是我们专门为 小白 量身打造的Python新手教程,具有如下特点: 全视频,手把手,零起点,项目实例,基于船新的Python 版本. Python是一种计算机程序设计语言.你可能已 ...

  9. python语言必背代码-Python新手必须知道的25条知识点

    原标题:Python新手必须知道的25条知识点 1.到底什么是Python?你可以在回答中与其他技术进行对比 下面是一些关键点: Python是一种解释型语言.这就是说,与C语言和C的衍生语言不同,P ...

最新文章

  1. Pycharm那些隐藏的实用小技巧,yyds!
  2. 怎样让webservice在浏览器远程浏览时像在本地浏览一样有参数输入框
  3. 计算机网络中各层的协议图表(TCP/IP)
  4. restful post请求_猿蜕变9——一文搞定SpringMVC的RESTFul套路
  5. php 获取请求,PHP 扩展 - 获取请求信息
  6. php删除oracle数据记录日志文件,Oracle手动切换日志文件和清空日志文件
  7. AD教程系列 | 2-认识其他电子元器件的封装
  8. 太强了!这款轻量级的数据库中间件完美解决了SpringBoot中分库分表问题?
  9. 【BZOJ 2306】 2306: [Ctsc2011]幸福路径 (倍增floyd)
  10. C++ coredump原因总结(转载)
  11. POJ 3537 Crosses and Crosses 博弈论 SG函数 记忆化搜索
  12. 俺压箱底的导航网站推荐
  13. 机器学习-sklearn第十二天——笔记
  14. Vue表单输入绑定(v-model)
  15. 边沿触发 与电平触发
  16. 不只是技术!成为IT经理必备的十大软技能
  17. SD从零开始10 框架协议(Outline Agreement)—合同/计划协议
  18. 公网远程访问内网群晖NAS 7.X版 【内网穿透】
  19. V型测试,W型测试和H型测试
  20. 史上最全的StarUML使用教程

热门文章

  1. SpringCloud(第 057 篇)CentOS7 安装 maven 编译工具
  2. 算法导论——贪心算法:哈夫曼编码(霍夫曼编码)
  3. MongoDB学习系列6: mongodump
  4. 越南估值最高的电商公司之一:Tiki获1亿美元融资!
  5. 【ABAP】SAP判断单据是否被锁定
  6. 【已修正】SAP中各个环境的简介
  7. 【MM配置】评估和账户确定(Valuation Account Determination) - 1
  8. 销售组织与工厂对照表
  9. sap 实战 table
  10. SAP项目MM调研清单