简介

在实际项目中,我们可能一开始为了完成功能而忽视了代码的整体质量,因此,使用一些高阶的函数或方法,能够更加使我们的代码更加优雅。废话不多说,现在马上开始。

使用enumerate方法替代range(len)

enumerate()中也包含了下标和值,可以很方便的进行索引和值的遍历。

data = range(10000)
start = time.time()
data_len = len(data)
for i in range(data_len):
print(data[i])
print(time.time() - start)
start = time.time()
for index, item in enumerate(data):
print(index, item)
print(time.time() - start)

列表生成式的使用

对于一些有规律的列表需要生成时,建议使用列表生成式进行生成,方便快捷,对于一些属性稍微复杂点的可以使用map进行批量操作。例如生成[1,4,9,16]

print([item * item for item in range(1, 5)])

使用sorted对复杂对象进行排序

在对一些复杂对象进行排序时候建议使用sorted进行排序,例如字典的key或者字典的value等

sorted(Iterable, key=Callable)

假设有如下列表中嵌套字典,依据age进行排序

data = [
{"name": "Alex", "age": 18},
{"name": "Band", "age": 21},
{"name": "Coco", "age": 17},
]
print(sorted(data, key=lambda n: n["age"]))
[{'name': 'Coco', 'age': 17}, {'name': 'Alex', 'age': 18}, {'name': 'Band', 'age': 21}]

假设有如下字典,需要将字典按照value值进行排序并返回一个字典

data = {"a": 19, "c": 10, "b": 20}

print(dict(sorted(data.items(), key=lambda data: data[1])))

{'c': 10, 'a': 19, 'b': 20}

使用set存放唯一值\去重

set集合是无序的,值唯一,可以进行交、并、差等运算操作,除此之外,一般去重也可以使用set进行去重。

data = set({1, 2, 3, 1})
print(data)

使用生成器节省内存消耗

一般我们称一个函数或者方法中使用了yield方法进行返回的,则成此方法或者函数为生成器,除了这种方法之外,可以使用类似于列表生成式的方式进行操作,只需要将列表生成式的[]换成()即可,示例如下:

l_data = [i for i in range(100)]
print(l_data)
print(sys.getsizeof(l_data))
g_data = (i for i in range(100))
print(g_data)
print(sys.getsizeof(g_data))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
920
<generator object <genexpr> at 0x0000028E1A626570>
104

使用sys模块的getsizeof可以获取变量的内存占用。

generator就是生成器,它不会一次性加载全部数据到内存中,只会再for循环调用或者next()\send()方法时进行懒加载方式的输出,极大的减少了内存消耗,尤其是对于数据量较大的情况。

对于字典中值的获取时建议使用get(key, default)并设置默认值

在对于字典的value值的获取中,目前有两种方式,一种是使用索引进行获取,另一种则使用get方法去获取,如下:

data = {"a": 19, "c": 10, "b": 20}

print(data["a"])
print(data.get("a", None))
print(data.get("v", None))
print(data["v"])
19
19
None
Traceback (most recent call last):
File "c:\Users\ts\Desktop\2022.7\2022.7.20\test.py", line 76, in <module>
print(data["v"])
KeyError: 'v'

由上述可以看出,在使用索引进行对字典value值的获取时,key存在还好,不存在则会直接报错,而采用get并设置默认值的,则会返回默认值,不会抛出异常。

统计序列中各元素个数时建议使用collection中的Counter

from collections import Counter

s_data = "asdfqwrewasfasdvfare"
print(s_data.count("a"))
print(Counter(s_data))
l_data = [1, 3, 2, "a", "b", 1, "c", "a", "c"]
print(l_data.count("a"))
print(Counter(l_data))
4
Counter({'a': 4, 's': 3, 'f': 3, 'd': 2, 'w': 2, 'r': 2, 'e': 2, 'q': 1, 'v': 1})
2
Counter({1: 2, 'a': 2, 'c': 2, 3: 1, 2: 1, 'b': 1})

由上述可以看见,大部分序列都有一个count方法来获取单个元素的个数,但Counter会统计所有的个数,类似于对于每个元素进行了遍历。

格式化字符串值使用f{string}(适用于Python 3.6+)

print("key:{}".format("aaa"))
key = "aaa"
print(f"key:{key}")
print("key:%s" % (key))
key:aaa
key:aaa
key:aaa

不过在实际使用中会发现,在部分常见下f会引起异常,可使用%s替代。

拼接字符串使用join

适用于多个元素存放在某一个序列中,纯字符串建议使用如下方法。

a = "hello"
b = "world"
c = "!"
print(a + b + c)
print("{} {} {}".format(a, b, c))
print(f"{a} {b} {c}")
print("%s %s %s" % (a, b, c)) l_data = ["hello", "world", "!"]
print(" ".join(l_data))

使用双星号语法合并字典(适用于Python 3.5+)

字典之间的合并可以使用自带的update方法进行合并,注意操作的是原字典;除此之外,也可以使用双星号进行字典的合并。

d1 = {"a": 1, "b": 2}
d2 = {"c": 1, "d": 2}
d1.update(d2)
print(d1)
print({**d1, **d2})

使用切片进行字符串的切割

切片一般使用[start:end:step]

  • start:开始的索引位置,包含
  • end:结束的索引位置,不包含
  • step:步长

    需要注意切片也可以从后向前,从前向后的从0开始,从后向前的从-1开始
data = "asdsdfaf"
# 选择所有元素
print(data[::])
# 选择从开始到索引为4的元素(不包含4),步长为2的元素
print(data[:4:2])
# 选择从索引为2的位置到索引为7的位置,步长为2的所有元素
print(data[2:7:1])
# 选择最后一个元素到从后向前第6个元素,步长为1的所有元素
print(data[-6:-1:1])
asdsdfaf
ad
dsdfa
dsdfa

字典推导式

与列表生成式类似,但是不常使用

print({item: item + 1 for item in range(10)})
{0: 1, 1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}

字典setdefault与get区别

getsetdefault都是获取字典的元素,唯一不同在于get获取不到元素后不会做任何操作,setdefault则会将不存在的元素添加至字典中。

data = {"a": 1, "b": 2}
print(data.get("c", 12))
print(data)
print(data.setdefault("c", 12))
print(data)

参考

如何让python代码写的更加优雅

python代码如何写的优雅?的更多相关文章

  1. Python代码这样写更优雅(转)

    1.变量交换 大部分编程语言中交换两个变量的值时,不得不引入一个临时变量: >>> a = 1>>> b = 2>>> tmp = a>&g ...

  2. Guava - 拯救垃圾代码,写出优雅高效,效率提升N倍

    最近在看一个同学代码的时候,发现代码中大量使用了 Google 开源的 Guava 核心库中的内容,让代码简单清晰了不少,故学习分享出 Guava 中我认为最实用的功能. Guava 项目是 Goog ...

  3. 代码这样写更优雅(Python版)

    要写出 Pythonic(优雅的.地道的.整洁的)代码,还要平时多观察那些大牛代码,Github 上有很多非常优秀的源代码值得阅读,比如:requests.flask.tornado,笔者列举一些常见 ...

  4. 代码这样写更优雅(Python 版)(转载)

    转载:https://mp.weixin.qq.com/s?timestamp=1498528588&src=3&ver=1&signature=DfFeOFPXy44ObCM ...

  5. python代码这样写会更优雅

    1.链式比较操作 age = 18 if age > 18 and age < 60: print("young man") pythonic if 18 < a ...

  6. 代码这样写更优雅,15篇 Python 技术热文

    http://mp.weixin.qq.com/s?__biz=MzA4MjEyNTA5Mw==&mid=2652565527&idx=1&sn=840c1ce854afc29 ...

  7. 一行python代码能写出啥?

    1.一行代码启动一个Web服务 python -m SimpleHTTPServer 8080  # python2 python3 -m http.server 8080  # python3 2. ...

  8. 小游戏:200行python代码手写2048

    #-*- coding: utf-8 -*- import curses from random import randrange, choice from collections import de ...

  9. 【MaixPy3文档】写好 Python 代码!

    本文是给有一点 Python 基础但还想进一步深入的同学,有经验的开发者建议跳过. 前言 上文讲述了如何认识开源项目和一些编程方法的介绍,这节主要来说说 Python 代码怎么写的一些演化过程和可以如 ...

随机推荐

  1. 交互式 .Net

    名词解析 1. 交互式 交互式是指输入代码后可直接运行该代码,然后持续输入运行代码. 2. 交互式 .Net .Net 是一种编译型语言,不像 python 这类的脚本型语言,可以边输入代码边运行结果 ...

  2. MOSFET, MOS管, 开关管笔记

    MOSFET, MOS管, 开关管 MOSFET, Metal-Oxide-Semiconductor Field-Effect Transistor, 金属氧化物半导体场效晶体管 常见封装 电路符号 ...

  3. linux篇-centos7安装samba服务器

    1查看是否安装samba服务 2如果为空则没有安装,安装显示安装完成即成功 3查看samba状态 4查看配置文件的位置 5配置文件备份,直接传输到本地备份 6修改配置文件 Path共享目录位置 Val ...

  4. socket套接字补充、操作系统发展史、进程

    目录 socket套接字之UDP协议 操作系统的发展史 手工操作 批处理系统 联机批处理系统 脱机批处理系统 多道技术 进程理论 并发与并行 同步与异步 阻塞与非阻塞 同步异步与阻塞非阻塞总结 soc ...

  5. VueX数据持久化

    解决:Vue刷新时获取不到数据 解决方案:1.本地存储 2.Vuex数据持久化工具插件 本地存储 import Vue from "vue"; import Vuex from & ...

  6. Hadoop常见shell命令

    Hadoop中常见的shell命令 1.如何将Linux本地的数据上传到HDFS中? hadoop fs -put 本地的文件 HDFS中的目录hdfs dfs -put 本地的文件 HDFS中的目录 ...

  7. IIS7 网站发布常见报错问题解决方案汇总

    本文实例为大家分享了IIS7 网站发布常见问题,以及五种问题的解决方法,供大家参考,具体内容如下: 1.不是有效的Win32位应用程序 : 解决方案: 1).进入应用程序池=>选中网站=> ...

  8. HashMap 中的 hash 函数

    1. 什么是 hash 函数 hash 函数,即散列函数,或叫哈希函数.它可以将不定长的输入,通过散列算法转换成一个定长的输出,这个输出就是散列值.需要注意的是,不同的输入通过散列函数,也可能会得到同 ...

  9. 在 GitHub 上玩转开源项目的 Code Review

    一.幕后故事 时光荏苒,岁月如梭-- (太文绉绉了,这不是我的风格) 今天我准备聊聊在 GitHub 上如何玩 Code Review. 突发奇想?心血来潮?不是. 咋回事呢?(对八卦不感兴趣的可以直 ...

  10. Python数据分析--Numpy常用函数介绍(6)--Numpy中与股票成交量有关的计算

    成交量(volume)是投资中一个非常重要的变量,它是指在某一时段内具体的交易数,可以在分时图中绘制,包括日线图.周线图.月线图甚至是5分钟.30分钟.60分钟图中绘制. 股票市场成交量的变化反映了资 ...