• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell
您的位置:首页 > 脚本语言 >python > Python中的一些陷阱与技巧小结

Python中的一些陷阱与技巧小结

作者:goldensun 字体:[增加 减小] 来源:互联网

goldensun 通过本文主要向大家介绍了python 技巧,象棋技巧陷阱,逆战陷阱解锁卡技巧,逆战陷阱卡开启技巧,大航海时代ol陷阱技巧等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

Python是一种被广泛使用的强大语言,让我们深入这种语言,并且学习一些控制语句的技巧,标准库的窍门和一些常见的陷阱。

Python(和它的各种库)非常庞大。它被用于系统自动化、web应用、大数据、数据分析及安全软件。这篇文件旨在展示一些知之甚少的技巧,这些技巧将带领你走上一条开发速度更快、调试更容易并且充满趣味的道路。

学习Python和学习所有其他语言一样,真正有用的资源不是各个语言繁琐的超大官方文档,而是使用常用语法、库和Python社区共享知识的能力。
探索标准数据类型
谦逊的enumerate

遍历在Python中非常简单,使用“for foo in bar:”就可以。
 

drinks = ["coffee", "tea", "milk", "water"]
for drink in drinks:
  print("thirsty for", drink)
#thirsty for coffee
#thirsty for tea
#thirsty for milk
#thirsty for water
</div>

但是同时使用元素的序号和元素本身也是常见的需求。我们经常看到一些程序员使用len()和range()来通过下标迭代列表,但是有一种更简单的方式。
 

drinks = ["coffee", "tea", "milk", "water"]
for index, drink in enumerate(drinks):
  print("Item {} is {}".format(index, drink))
#Item 0 is coffee
#Item 1 is tea
#Item 2 is milk
#Item 3 is water
</div>

enumerate 函数可以同时遍历元素及其序号。
Set类型

许多概念都可以归结到对集合(set)的操作。例如:确认一个列表没有重复的元素;查看两个列表共同的元素等等。Python提供了set数据类型以使类似这样的操作更快捷更具可读性。
 

# deduplicate a list *fast*
print(set(["ham", "eggs", "bacon", "ham"]))
# {'bacon', 'eggs', 'ham'}
 
# compare lists to find differences/similarities
# {} without "key":"value" pairs makes a set
menu = {"pancakes", "ham", "eggs", "bacon"}
new_menu = {"coffee", "ham", "eggs", "bacon", "bagels"}
 
new_items = new_menu.difference(menu)
print("Try our new", ", ".join(new_items))
# Try our new bagels, coffee
 
discontinued_items = menu.difference(new_menu)
print("Sorry, we no longer have", ", ".join(discontinued_items))
# Sorry, we no longer have pancakes
 
old_items = new_menu.intersection(menu)
print("Or get the same old", ", ".join(old_items))
# Or get the same old eggs, bacon, ham
 
full_menu = new_menu.union(menu)
print("At one time or another, we've served:", ", ".join(full_menu))
# At one time or another, we've served: coffee, ham, pancakes, bagels, bacon, eggs
</div>

intersection 函数比较列表中所有元素,返回两个集合的交集。在我们的例子中,早餐的主食为bacon、eggs和ham。
collections.namedtuple

如果你不想给一个类添加方法,但又想使用foo.prop的调用方式,那么你需要的就是namedtuple。你提前定义好类属性,然后就可以实例化一个轻量级的类,这样的方式会比完整的对象占用更少的内存。
 

LightObject = namedtuple('LightObject', ['shortname', 'otherprop'])
m = LightObject()
m.shortname = 'athing'
> Traceback (most recent call last):
> AttributeError: can't set attribute
</div>

用这种方式你无法设置namedtuple的属性,正如你不能修改元组(tuple)中元素的值。你需要在实例化namedtuple的时候设置属性的值。
 

LightObject = namedtuple('LightObject', ['shortname', 'otherprop'])
n = LightObject(shortname='something', otherprop='something else')
n.shortname 
# something
collections.defaultdict
</div>

在写Python应用使用字典时,很多时候有些关键字一开始并不存在,例如下面的例子。
 

login_times = {}
for t in logins:
  if login_times.get(t.username, None):
    login_times[t.username].append(t.datetime)
  else:
    login_times[t.username] = [t.datetime]
</div>

使用defaultdict 我们可以跳过检查关键字是否存在的逻辑,对某个未定义key的任意访问,都会返回一个空列表(或者其他数据类型)。
 

login_times = collections.defaultdict(list)
for t in logins:
  login_times[t.username].append(t.datetime)
</div>

你甚至可以使用自定义的类,这样调用的时候实例化一个类。
 

from datetime import datetime
class Event(object):
  def __init__(self, t=None):
  if t is None:
    self.time = datetime.now()
  else:
    self.time = t
 
events = collections.defaultdict(Event)
 
for e in user_events:
  print(events[e.name].time)
</div>

如果既想具有defaultdict的特性,同时还想用访问属性的方式来处理嵌套的key,那么可以了解一下 addict。
 

normal_dict = {
  'a': {
    'b': {
      'c': {
        'd': {
          'e': 'really really nested dict'
        }
      }
    }
  }
}
 
from addict import Dict
addicted = Dict()
addicted.a.b.c.d.e = 'really really nested'
print(addicted)
# {'a': {'b': {'c': {'d': {'e': 'really really nested'}}}}}
</div>

这段小程序比标准的dict要容易写的多。那么为什么不用defaultdict呢? 它看起来也够简单了。
 

from collections import defaultdict
default = defaultdict(dict)
default['a']['b']['c']['d']['e'] = 'really really nested dict' 
# fails
</div>

这段代码看起来没什么问题,但是它最终抛出了KeyError异常。这是因为default[‘a']是dict,不是defaultdict.让我们构造一个value是defaulted dictionaries类型的defaultdict,这样也只能解决两级嵌套。

如果你只是需要一个默认计数器,你可以使用collection.Counter,这个类提供了许多方便的函数,例如 most_common.
控制流

当学习Python中的控制结构时,通常要认真学习 for, while,if-elif-else, 和 try-except。只要正确使用,这几个控制结构能够处理绝大多数的情况。也是基于这个原因,几乎你所遇到的所有语言都提供类似的控制结构语句。在基本的控制结构以外,Python也额外提供一些不常用的控制结构,这些结构会使你的代码更具可读性和可维护性。
Great Exceptations

Exceptions作为一种控制结构,在处理数据库、sockets、文件或者任何可能失败的资源时非常常用。使用标准的 try 、except 结构写数据库操作时通常是类型这样的方式。
 

try:
  
# get API data
  data = db.find(id='foo') 
# may raise exception
  
# manipulate the data
  db.add(data)
  
# save it again
  db.commit() 
# may raise exception
except Exception:
  
# log the failure
  db.rollback()
 
db.close()
</div>

你能发现这里的问题吗?这里有两种可能的异常会触发相同的except模块。这意味着查找数据失败(或者为查询数据建立连接失败)会引发回退操作。这绝对不是我们想要的,因为在这个时间点上事务并没有开始。同样回退也不应该是数据库连接失败的正确响应,因此让我们将不同的情况分开处理。

首先,我们将处理查询数据。

try:
  
# get API data
  data = db.find(id='foo') 
# may raise exception
except Exception:
  
# log the failure and bail out
  log.warn("Could not retrieve FOO")
  return
 
# manipulate the data
db.add(data)

</div>

现在数据检索拥有自己的try-except,这样当我们没有取得数据时,我们可以采取任何处理方式。没有数据我们的代码不大可能再做有用的事,因此我们将仅仅退出函数。除了退出你也可以构造一个默认对象,重新进行检索或者结束整个程序。

现在让我们将commit的代码也单独包起来,这样它也能更优雅的进行错误处理。
 

try:
  db.commit() 
# may raise exception
except Exception:
  log.warn("Failure committing transaction, rolling back")
  db.rollback()
else:
  log.info("Saved the new FOO")
finally:
  db.close()
</div>

实际上,我们已经增加了两端代码。首先,让我们看

您可能想查找下面的文章:

  • Python中的一些陷阱与技巧小结
  • Python常用小技巧总结
  • 收藏整理的一些Python常用方法和技巧
  • 总结Python编程中三条常用的技巧
  • Python中AND、OR的一个使用小技巧
  • Python splitlines使用技巧

相关文章

  • Python教程之全局变量用法
  • Python FTP操作类代码分享
  • Python中的命令行参数解析工具之docopt详解
  • 详解Python的collections模块中的deque双端队列结构
  • 用python实现的可以拷贝或剪切一个文件列表中的所有文件
  • python之yield表达式学习
  • Python学习笔记整理3之输入输出、python eval函数
  • 深入理解Python中字典的键的使用
  • 总结网络IO模型与select模型的Python实例讲解
  • 使用PyV8在Python爬虫中执行js代码

文章分类

  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell

最近更新的内容

    • python 解析html之BeautifulSoup
    • Python中下划线的使用方法
    • 使用Python脚本在Linux下实现部分Bash Shell的教程
    • python通过get,post方式发送http请求和接收http响应的方法
    • python实现自动重启本程序的方法
    • Windows中使用wxPython和py2exe开发Python的GUI程序的实例教程
    • python django事务transaction源码分析详解
    • 使用tensorboard可视化loss和acc的实例
    • python 中文乱码问题深入分析
    • Python提取Linux内核源代码的目录结构实现方法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有