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

湖南新梦想

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

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

[复制链接]

280

主题

281

帖子

1053

积分

金牌会员

Rank: 6Rank: 6

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

 编码很有趣,而Python编码更有趣,因为有很多不同的方法可以实现相同的功能。但是,大多数时候都有一些首选的实现方法,有些人将其称为Pythonic。这些Pythonic的共同特征是实现的代码简洁明了。
  用Python或任何编码语言进行编程不是像火箭一样的科学,而主要是关于技巧。如果有意尝试使用Pythonic编码,那么这些[url=]技术[/url]将很快成为我们工具包的一部分,并且我们会发现在项目中使用它们变得越来越自然。因此,让我们探索其中的一些简单技巧。
  1.负索引
  人们喜欢使用序列,因为当我们知道元素的顺序,我们就可以按顺序操作这些元素。在Python中,字符串、元组和列表是最常见的序列数据类型。我们可以使用索引访问单个项目。与其他主流编程语言一样,Python支持基于0的索引,在该索引中,我们在一对方括号内使用零访问第一个元素。此外,我们还可以使用切片对象来检索序列的特定元素,如下面的代码示例所示。
  >>> # Positive Indexing
  ... numbers = [1, 2, 3, 4, 5, 6, 7, 8]
  ... print("First Number:", numbers[0])
  ... print("First Four Numbers:", numbers[:4])
  ... print("Odd Numbers:", numbers[::2])
  ...
  First Number: 1
  First Four Numbers: [1, 2, 3, 4]
  Odd Numbers: [1, 3, 5, 7]

  但是,Python通过支持负索引而进一步走了一步。具体来说,我们可以使用-1来引用序列中的最后一个元素,并向后计数。例如,最后一个元素的索引为-2,依此类推。重要的是,负索引也可以与切片对象中的正索引一起使用。

  >>> # Negative Indexing
  ... data_shape = (100, 50, 4)
  ... names = ["John", "Aaron", "Mike", "Danny"]
  ... hello = "Hello World!"
  ...
  ... print(data_shape[-1])
  ... print(names[-3:-1])
  ... print(hello[1:-1:2])
  ...
  4
  ['Aaron', 'Mike']
  el ol

  2.检查容器是否为空
  容器是指可以存储其他数据的那些容器数据类型。一些经常使用的内置容器是元组,列表,字典和集合。在处理这些容器时,我们经常需要在执行其他操作之前检查它们是否包含任何元素。确实,我们可以检查这些容器的长度,该长度与已存储项目的数量相对应。当长度为零时,容器为空。下面显示了一个简单的示例。

  if len(some_list) > 0:
      # do something here when the list is not empty
  else:
      # do something else when the list is empty

  但是,这不是最好的Pythonic方式。相反,我们可以简单地检查容器本身,它将在容器True包含元素时进行评估。尽管以下代码向您展示了主要的容器数据类型,但这种用法也可以应用于字符串(即,任何非空字符串都是True)。

  >>> def check_container_empty(container):
  ...     if container:
  ...         print(f"{container} has elements.")
  ...     else:
  ...         print(f"{container} doesn't have elements.")
  ...
  ... check_container_empty([1, 2, 3])
  ... check_container_empty(set())
  ... check_container_empty({"zero": 0, "one": 1})
  ... check_container_empty(tuple())
  ...
  [1, 2, 3] has elements.
  set() doesn't have elements.
  {'zero': 0, 'one': 1} has elements.
  () doesn't have elements.

  3.使用Split()创建字符串列表
  我们经常使用字符串作为特定对象的标识符。例如,我们可以使用字符串作为字典中的键。在数据科学项目中,字符串通常是数据的列名。选择多个列时,不可避免地需要创建一个字符串列表。确实,我们可以使用列表中的文字创建字符串。但是,我们必须编写成对的引号将每个字符串括起来,这对于“懒惰”的人来说有点繁琐。因此,我更喜欢利用字符串的split()方法来创建字符串列表,如下面的代码片段所示。

  >>> # List of strings
  ... # The typical way
  ... columns = ['name', 'age', 'gender', 'address', 'account_type']
  ... print("* Literals:", columns)
  ...
  ... # Do this instead
  ... columns = 'name age gender address account_type'.split()
  ... print("* Split with spaces:", columns)
  ...
  ... # If the strings contain spaces, you can use commas instead
  ... columns = 'name, age, gender, address, account type'.split(', ')
  ... print("* Split with commas:", columns)
  ...
  * Literals: ['name', 'age', 'gender', 'address', 'account_type']
  * Split with spaces: ['name', 'age', 'gender', 'address', 'account_type']
  * Split with commas: ['name', 'age', 'gender', 'address', 'account type']

  如上所示,split()默认情况下,该方法使用空格作为分隔符,并根据字符串创建字符串列表。值得注意的是,当您创建包含某些包含空格的元素的字符串列表时,可以选择使用其他类型的分隔符(例如,逗号)。
  这种用法受到一些内置功能的启发。例如,当你创建一个元组类,我们可以这样做:Student = namedtuple(“Student”, [“name”, “gender”, “age”])。字符串列表指定了元组的“属性”。但是,也可以通过以下方式定义该类来本地支持它:Student = namedtuple(“Student”, “name gender age”)。对于另一个实例,创建一个Enum类支持相同的替代解决方案。

 4.三元表达

  在许多用例中,我们需要根据条件定义具有特定值的变量,并且我们可以简单地使用if ... else语句来检查条件。但是,它需要几行代码。如果仅处理一个变量的赋值,则可能需要使用三元表达式,该表达式检查条件并仅用一行代码即可完成赋值。此外,它的格式更短,从而使代码更加简洁。考虑以下示例。
  # The typical way
  if score > 90:
      reward = "1000 dollars"
  else:
      reward = "500 dollars"
  # Do this instead
  reward = "1000 dollars" if score > 90 else "500 dollars"

  有时,我们可以从已定义的函数中获取一些数据,并且可以利用这一点并编写三元表达式的简单操作,如下所示。

  # Another possible scenario
  # You got a reward amount from somewhere else, but don't know if None/0 or not
  reward = reward_known or "500 dollars"
  # The above line of code is equivalent to below
  reward = reward_known if reward_known else "500 dollars"

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


回复

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

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