请选择 进入手机版 | 继续访问电脑版

湖南新梦想

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 14|回复: 0

用这10个小技巧加速Python编程(二)

[复制链接]

280

主题

281

帖子

1053

积分

金牌会员

Rank: 6Rank: 6

积分
1053
发表于 2021-1-13 11:02:25 | 显示全部楼层 |阅读模式
本帖最后由 chaomeili 于 2021-1-13 11:03 编辑

5.带文件对象的语句  
我们经常需要从文件读取数据并将数据写入文件。最常见的方法是使用内置open()函数简单地打开文件,该函数会创建一个我们可以操作的文件对象。
  >>> # Create a text file that has the text: Hello World!
  ...
  ... # Open the file and append some new data
  ... text_file0 = open("hello_world.txt", "a")
  ... text_file0.write("Hello Python!")
  ...
  ... # Open the file again for something else
  ... text_file1 = open("hello_world.txt")
  ... print(text_file1.read())
  ...
  Hello World!
 
    在前面的代码片段中,我们从一个文本文件开始,该文件的文本为“ Hello World!”。然后,我们将一些新数据附加到文件中。但是,过了一会儿,我们想再次处理该文件。当我们读取文本文件时,它仍然具有旧数据。换句话说,附加的文本不包括在文本文件中。
  这是因为我们首先没有关闭文件对象。如果不关闭文件,则无法保存更改。确实,我们可以close()在文件对象上显式调用该方法。但是,我们可以使用“ with”语句执行此操作,该语句将自动为我们关闭文件对象,如下所示。完成对文件的操作后,我们可以通过访问文件对象的closed属性来验证文件已关闭。

  >>> with open("hello_world.txt", "a") as file:
  ...     file.write("Hello Python!")
  ...
  ... with open("hello_world.txt") as file:
  ...     print(file.read())
  ...
  ... print("Is file close?", file.closed)
  ...
  Hello World!Hello Python!Hello Python!
  Is file close? True

  用更笼统的术语来说,with语句是在Python中使用上下文管理器的语法。上一个示例涉及文件操作,因为这些文件是共享资源,我们负责释放这些资源。上下文管理器可以帮助我们完成工作。如前所示,文件操作结束后,将使用with语句自动关闭文件。

  6.评估多个条件
  通常,我们需要评估多个条件。有几种可能的方案。对于数值,我们可以对同一变量进行多次比较。在这种情况下,我们可以链接这些比较。
  # Multiple Comparisons
  # The typical way
  if a < 4 and a > 1:
      # do something here# Do this instead
  if 1 < a < 4:
      # do somerthing here

  在其他一些情况下,我们可以进行多个相等比较,并且可以使用以下in关键字进行成员[url=]测试[/url]。
  # The typical way
  if b == "Mon" or b == "Wed" or b == "Fri" or b == "Sun":
      # do something here# Do this instead, you can also specify a tuple ("Mon", "Wed", "Fri", "Sun")
  if b in "Mon Wed Fri Sun".split():
      # do something here

  另一种技术是使用内置的all()和any()函数用于评估多个条件的功能。具体而言,该all()函数将评估何时迭代中的元素全部为True,因此该函数适合于替换一系列AND逻辑比较。另一方面,该any()函数的计算结果为True当迭代中的任何元素为True,因此适合替换一系列OR逻辑运算。相关示例如下所示。
  # The typical ways
  if a < 10 and b > 5 and c == 4:
      # do somethingif a < 10 or b > 5 or c == 4:
      # do something# Do these instead
  if all([a < 10, b > 5, c == 4]):
      # do somethingif any([a < 10, b > 5, c == 4]):
      # do something

  7.在函数声明中使用默认值
  在几乎所有的Python项目中,大多数代码都涉及创建和调用函数。换句话说,我们不断处理函数声明和重构。在许多情况下,我们需要多次调用一个函数。根据不同的参数集,该功能将略有不同。但是,有时一组参数可能比其他一组更常用,在这种情况下,我们在声明函数时应考虑设置默认值。考虑下面的简单示例。
  # The original form:
  def generate_plot(data, image_name):
      """This function creates a scatter plot for the data"""
      # create the plot based on the data
      ...
      if image_name:
          # save the image
          ...# In many cases, we don't need to save the image
  generate_plot(data, None)# The one with a default value
  def generate_plot(data, image_name=None):
      pass# Now, we can omit the second parameter
  generate_plot(data)

  要注意的一件事是,如果在设置默认值时要处理可变数据类型(例如列表,集合),请确保使用None而不是构造函数(例如arg_name = [])。由于Python在定义的位置创建函数对象,因此提供的空白列表将被函数对象“卡住”。换句话说,调用函数对象时不会立即创建它。相反,我们将在内存中处理相同的函数对象,包括其最初创建的默认可变对象,这可能会导致意外行为。

  8.使用计数器进行元素计数
  当我们在列表、元组或字符串中有多个项目时(例如,多个字符),我们经常想计算每项中有多少个元素。为此,可以为此功能编写一些乏味的代码。
  >>> words = ['an', 'boy', 'girl', 'an', 'boy', 'dog', 'cat', 'Dog', 'CAT', 'an','GIRL', 'AN', 'dog', 'cat', 'cat', 'bag', 'BAG', 'BOY', 'boy', 'an']
  ... unique_words = {x.lower() for x in set(words)}
  ... for word in unique_words:
  ...     print(f"* Count of {word}: {words.count(word)}")
  ...
  * Count of cat: 3
  * Count of bag: 1
  * Count of boy: 3
  * Count of dog: 2
  * Count of an: 5
  * Count of girl: 1

  如上所示,我们首先必须创建一个仅包含唯一单词的集合。然后,我们迭代单词集,并使用该count()方法找出每个单词的出现情况。但是,有一种更好的方法可以使用Counter类来完成此计数任务。
  >>> from collections import Counter
  ...
  ... word_counter = Counter(x.lower() for x in words)
  ... print("Word Counts:", word_counter)
  ...
  Word Counts: Counter({'an': 5, 'boy': 4, 'cat': 4, 'dog': 3, 'girl': 2, 'bag': 2})

  该计数器类是在collections模块中可用的。要使用该类,我们只需创建一个generator:,x.lower() for x in words每个项目都将被计数。如我们所见,Counter对象是类似dict的映射对象,每个键对应于单词列表的唯一项,而值是这些项的计数。
  此外,如果我们有兴趣找出单词列表中最频繁出现的项目,我们可以利用Counter对象的most_common()方法。以下代码展示了这种用法。我们只需要指定一个整数(N),即可从列表中找出最频繁的N个项目。附带说明,该对象还将与其他序列数据一起使用,例如字符串和元组。
  >>> # Find out the most common item
  ... print("Most Frequent:", word_counter.most_common(1))
  Most Frequent: [('an', 5)]
  >>> # Find out the most common 2 items
  ... print("Most Frequent:", word_counter.most_common(2))
  Most Frequent: [('an', 5), ('boy', 4)]

(未完待续.......)




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|湖南新梦想 ( 湘ICP备18019834号-2 )

GMT+8, 2021-1-21 16:39 , Processed in 0.041221 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表