5个python中编程的大坑

简介: 5个python中编程的大坑

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

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

1.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)

2.dic(字典)

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

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)

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

3.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

提取首、中、尾三部分:

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

如果你看到下面的任务:

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 defaultdict
 
items_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]=1
    else:
        result[color]+=1
print (result)
# 输出 {'red': 2, 'blue': 3, 'green': 1}

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

colors = ['red', 'blue', 'red', 'green', 'blue', 'blue']
d = defaultdict(int)
for color in colors:
    d[color] += 1
print(d) #学习中遇到问题没人解答?小编创建了一个Python学习交流群:711312441

更简单的方法用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 = 0
    powers = []
    while 2**i < max:
        powers.append[2**i]
        i += 1
    return 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
相关文章
|
14天前
|
安全 数据处理 开发者
Python中的多线程编程:从入门到精通
本文将深入探讨Python中的多线程编程,包括其基本原理、应用场景、实现方法以及常见问题和解决方案。通过本文的学习,读者将对Python多线程编程有一个全面的认识,能够在实际项目中灵活运用。
|
8天前
|
设计模式 开发者 Python
Python编程中的设计模式:工厂方法模式###
本文深入浅出地探讨了Python编程中的一种重要设计模式——工厂方法模式。通过具体案例和代码示例,我们将了解工厂方法模式的定义、应用场景、实现步骤以及其优势与潜在缺点。无论你是Python新手还是有经验的开发者,都能从本文中获得关于如何在实际项目中有效应用工厂方法模式的启发。 ###
|
1天前
|
存储 人工智能 数据挖掘
从零起步,揭秘Python编程如何带你从新手村迈向高手殿堂
【10月更文挑战第32天】Python,诞生于1991年的高级编程语言,以其简洁明了的语法成为众多程序员的入门首选。从基础的变量类型、控制流到列表、字典等数据结构,再到函数定义与调用及面向对象编程,Python提供了丰富的功能和强大的库支持,适用于Web开发、数据分析、人工智能等多个领域。学习Python不仅是掌握一门语言,更是加入一个充满活力的技术社区,开启探索未知世界的旅程。
10 5
|
2天前
|
人工智能 数据挖掘 开发者
探索Python编程:从基础到进阶
【10月更文挑战第32天】本文旨在通过浅显易懂的语言,带领读者从零开始学习Python编程。我们将一起探索Python的基础语法,了解如何编写简单的程序,并逐步深入到更复杂的编程概念。文章将通过实际的代码示例,帮助读者加深理解,并在结尾处提供练习题以巩固所学知识。无论你是编程新手还是希望提升编程技能的开发者,这篇文章都将为你的学习之旅提供宝贵的指导和启发。
|
14天前
|
弹性计算 安全 小程序
编程之美:Python让你领略浪漫星空下的流星雨奇观
这段代码使用 Python 的 `turtle` 库实现了一个流星雨动画。程序通过创建 `Meteor` 类来生成具有随机属性的流星,包括大小、颜色、位置和速度。在无限循环中,流星不断移动并重新绘制,营造出流星雨的效果。环境需求为 Python 3.11.4 和 PyCharm 2023.2.5。
|
6天前
|
数据处理 Python
从零到英雄:Python编程的奇幻旅程###
想象你正站在数字世界的门槛上,手中握着一把名为“Python”的魔法钥匙。别小看这把钥匙,它能开启无限可能的大门,引领你穿梭于现实与虚拟之间,创造属于自己的奇迹。本文将带你踏上一场从零基础到编程英雄的奇妙之旅,通过生动有趣的比喻和实际案例,让你领略Python编程的魅力,激发内心深处对技术的渴望与热爱。 ###
|
10天前
|
数据采集 机器学习/深度学习 人工智能
Python编程入门:从基础到实战
【10月更文挑战第24天】本文将带你进入Python的世界,从最基础的语法开始,逐步深入到实际的项目应用。我们将一起探索Python的强大功能和灵活性,无论你是编程新手还是有经验的开发者,都能在这篇文章中找到有价值的内容。让我们一起开启Python的奇妙之旅吧!
|
11天前
|
设计模式 监控 数据库连接
Python编程中的设计模式之美:提升代码质量与可维护性####
【10月更文挑战第21天】 一段简短而富有启发性的开头,引出文章的核心价值所在。 在编程的世界里,设计模式如同建筑师手中的蓝图,为软件的设计和实现提供了一套经过验证的解决方案。本文将深入浅出地探讨Python编程中几种常见的设计模式,通过实例展示它们如何帮助我们构建更加灵活、可扩展且易于维护的代码。 ####
|
8天前
|
数据库 开发者 Python
“Python异步编程革命:如何从编程新手蜕变为并发大师,掌握未来技术的制胜法宝”
【10月更文挑战第25天】介绍了Python异步编程的基础和高级技巧。文章从同步与异步编程的区别入手,逐步讲解了如何使用`asyncio`库和`async`/`await`关键字进行异步编程。通过对比传统多线程,展示了异步编程在I/O密集型任务中的优势,并提供了最佳实践建议。
12 1
|
11天前
|
存储 人工智能 数据挖掘
Python编程入门:构建你的第一个程序
【10月更文挑战第22天】编程,这个听起来高深莫测的词汇,实际上就像搭积木一样简单有趣。本文将带你走进Python的世界,用最浅显的语言和实例,让你轻松掌握编写第一个Python程序的方法。无论你是编程新手还是希望了解Python的爱好者,这篇文章都将是你的理想起点。让我们一起开始这段奇妙的编程之旅吧!
16 3