前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >让你的Python代码更加Pythonic

让你的Python代码更加Pythonic

作者头像
吾非同
发布于 2022-02-22 09:20:13
发布于 2022-02-22 09:20:13
80800
代码可运行
举报
文章被收录于专栏:吾非同吾非同
运行总次数:0
代码可运行

刚开始学习Python的时候,我们就了解了python的编码风格要求,通过python终端方式输入import this可以看到它的具体描述。

这就是著名的“python之禅”,简言之,就是要写符合pythonic的代码,简洁、优雅、可读性强。

下面选取了一些常见的Python规范和代码风格,大家可以进行参考和学习。

命名

首先看一下变量的命名规范(pep8)规范:

文件夹:包名,建议仅使用小写字母命名,不建议使用下划线。

模块: 小写或者小写加下划线连接,比如 module.pydb_convert.py等。

类: 驼峰式,首字母大写,单词直接连接。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class ThisIsAClass(object):
    pass

函数:小写,用下划线隔开

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def this_is_a_func():
    pass

变量: 小写,用下划线隔开

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
this_is_a_variable = 1

**常量:**常量名所有字母大写,由下划线连接各个单词,如THIS_IS_A_CONSTANT = 1

语法风格

1.交换a 和 b的数值

其他语言的方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a = 5
b = 6
temp = a
a = b
b = temp

python中,更加简洁的方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a = 5
b = 6
a, b = b, a
print(a, b)
输出:6 5

2.多个变量赋值

python中可以一行代码,同时给多个变量赋值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a,b,c = 2,5,12

3.合并字符串

传统的字符串合并方法,由于字符串对象不可改变,每次修改会产生一个新的对象,这种方法会消耗很多内存。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
list_str = ["hello ", "python", "!"]
result = ""
for i in list_str:
    result+=i
print(result)

python中,使用join()方法更加高效,注意join()方法只适用于元素是字符串的列表、元组、集合等类型。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
list_str = ["hello ", "python", "!"]
result = "".join(list_str)
print(result)

输出:hello python!

4.列表去重

使用集合的唯一性,对列表进行去重

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a = [1, 2, 3, 1, 2,3 , 1, 3, 2, 4, 1, 3, 4, 5, 6, 5, 4, 4, 3, 6]
lst = list(set(a))
print(lst)
输出:

5.if/else 三目运算

python支持的三目运算格式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
为真时的结果 if 判断条件 else 为假时的结果(注意,没有冒号)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a=4
st = "a大于4" if a>4 else "a小于等于4"
print(st)
输出:a小于等于4

6.enumerate

enumerate()是 Python 的内置函数。可以将一个可迭代的(Iterable)对象(列表、字符串等)组成一个索引序列,可以同时获得索引和值。

获取列表元素及索引

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 一般写法
names = ['Bob', 'Alice', 'Guido']
n = len(names)
for i in range(n):
    print(f'{i} {names[i]}')

# 使用enumerate()函数
names = ['Bob', 'Alice', 'Guido']
for index, value in enumerate(names):
    print(f'{index}: {value}')
输出:
0: Bob
1: Alice
2: Guido

7.解包

解包在英文里叫做 Unpacking,就是将容器里面的元素逐个取出来。

解压列表/元组的元素,赋值给不同的变量

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a, b, c = [1,2,3]
print(a, b, c)
输出:1 2 3

函数中的解包操作

在函数调用中,* 能够将元组或列表解包成不同的参数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def func(a, b, c, d):
    print(a, b, c, d)

args = [1, 2, 3, 4]
func(*args)
输出:1 2 3 4

在函数调用中,** 会以键/值的形式解包一个字典,使其成为一个独立的关键字参数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def func(a, b, c, d):
    print(a, b, c, d)

kwargs = {"a": 1, "b": 2, "c": 3, "d": 4}
func(**kwargs)
输出:1 2 3 4

8.列表推导式

列表推导式可以利用 range 区间、元组、列表、字典和集合等数据类型,快速生成一个满足指定需求的列表。

[表达式 for 迭代变量 in 可迭代对象 [if 条件表达式] ]

[if 条件表达式] 可以省略。

生成一个列表,列表元素分别为 [1x1,2x2,3x3……nxn],假设n = 10

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 一般方法
lst = []
for i in range(1, 11):
    lst.append(i*i)
print(lst)
输出:[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
# 列表推导式
lst = [i*i for i in range(1,11)]
print(lst)
输出:[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

要求返回的序列中不存在偶数项

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
lst = [i*i for i in range(1, 11) if i % 2 != 0]
print(lst)
输出:[1, 9, 25, 49, 81]

9.使用关键字in

  • in:如果在指定的序列中找到值返回 True,否则返回 False。
  • not in:如果在指定的序列中没有找到值返回 True,否则返回 False。

判断元素是否在列表中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
number=[1,2,3,4,5]
if 1 in number:
    print("1 in number")
if 0 not in number:
    print("0 not in number")

在 for 循环中,获取列表、元组、字典的每一项:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
list = [2, 3, 4]
for num in list:
    print (num)
    
dic = {"name": "xiaoming", "age": 18}
for k, v in dic.items():
    print(k, v)

10.使用zip同步处理多个列表

zip() 函数是 Python 内置函数,它可以将多个序列(列表、元组、字典、集合、字符串等)中对应位置的元素重新组合,生成一个个新的元组。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
z = zip([1,2,3],[3,4,5])
print(list(z))
输出:[(1, 3), (2, 4), (3, 5)]

11.真值判断

当判断一个变量是否为 True 的时候,Python 具有自身独特的方式,不需要写出判断条件,只需要在 if 或 while 关键字后面直接写上该对象即可。

常见的真值为False的情况:

  • 常量:None and False.
  • 数值0值: 0, 0.0, 0j
  • 序列或者集合为空:'', (), [], {}, set(), range(0)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 对于布尔对象,建议这样写
x = True
if x:
    pass
# 不建议这样写
if x == True:
    pass

lst = []
# 对于列表对象,建议这样写
if lst:
    pass
# 不建议这样写
if len(lst) != 0:
    pass

更多关于pythonic的写法,可以参考《effctive python》这本书,还有Python官网的代码规范要求 https://www.python.org/dev/peps/pep-0008/。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-01-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 吾非同 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Java缓存穿透、击穿、雪崩解决方案
在互联网高并发的场景下,对于数据库查询频率高的数据,为了提高查询效率,常常会采用缓存技术进行优化。然而,缓存技术也会带来一些问题,比如缓存穿透、缓存击穿和缓存雪崩等。
青山师
2023/05/05
2650
redis缓存雪崩 缓存穿透 缓存击穿如何解决_缓存击穿问题
每一个put进来的值会经过几个hash函数运算(预测插入数据的数量和容错率,系统自动推断出来设置几个hash函数合适),然后映射到响应为位上,将响应位的bit置为1。当查询值是否在布隆过滤器中的时候,将该值与上述hash函数运算,如果各个位置的bit均为1,则判断该值极有可能在布隆过滤器中。
全栈程序员站长
2022/09/21
7700
redis缓存雪崩 缓存穿透 缓存击穿如何解决_缓存击穿问题
Redis 缓存穿透, 缓存击穿, 缓存雪崩的解决方案与布隆过滤器
缓存穿透解决方案 设置空值 布隆过滤器 优点 可以将存在的缓存, 位置设置为1, 然后当不存在的参数过来的时候, 会匹配到0上,这样就会直接返回不存在 缺点 存在错误判断, hash冲突 删除缓存时无法删除指定的1的位置, 应为存在多数据,同一hash, 所以无法删除 增加开发成本, 维护成本提高 可以判断一定不存在, 但是不能判断一定存在[存在误判] 使用布隆过滤器 添加依赖 <dependency> <groupId>com.google.guava</groupId> <a
彼岸舞
2022/10/04
3640
Redis 缓存穿透, 缓存击穿, 缓存雪崩的解决方案与布隆过滤器
Redis的缓存击穿、缓存穿透和缓存雪崩是什么?怎么预防?
最近在CSDN上看到了一篇博客,Redis缓存击穿、雪崩、穿透!(超详细),详细讲述了缓存穿透、缓存击穿和缓存雪崩是什么。对我这个刚刚入门的人来说,看完之后非常震撼。 但是这篇博客没有给出具体的实现,并且在浏览大部分博客之后,发现大家在实现的过程中,并不能像这篇博客一样考虑的这么周全。
小王不头秃
2024/06/19
3390
Redis的缓存击穿、缓存穿透和缓存雪崩是什么?怎么预防?
SpringBoot中如何解决Redis的缓存穿透、缓存击穿、缓存雪崩?
在使用 Redis 缓存时,可能会遇到一些缓存问题,最常见的包括缓存穿透、缓存击穿和缓存雪崩。
网络技术联盟站
2023/06/05
9450
Redis之缓存穿透,雪崩,击穿解读
当我们请求去查询一条记录,先到redis中查询后到mysql查询都发现找不到该条记录,但是请求每次都会打到数据库上面去,导致后台数据库压力暴增,这些请求像“穿透”了缓存一样直接打在数据库上,这种现象就叫做缓存穿透。这种现象我们称为缓存穿透,这个redis变成了一个摆设。
一个风轻云淡
2023/10/15
3560
Redis缓存穿透、缓存雪崩、redis并发问题分析
把redis作为缓存使用已经是司空见惯,但是使用redis后也可能会碰到一系列的问题,尤其是数据量很大的时候,经典的几个问题如下:
xcbeyond
2020/03/25
7050
Redis缓存穿透、缓存雪崩、redis并发问题分析
Redis从入门到放弃(11):雪崩、击穿、穿透
Redis作为一款高性能的缓存数据库,为许多应用提供了快速的数据访问和存储能力。然而,在使用Redis时,我们不可避免地会面对一些常见的问题,如缓存雪崩、缓存穿透和缓存击穿。本文将深入探讨这些问题的本质,以及针对这些问题的解决方案。
夕阳也是醉了
2023/10/16
2870
Redis从入门到放弃(11):雪崩、击穿、穿透
解决缓存穿透、缓存雪崩和缓存击穿
短链接平台是一种在线服务,它将长的网址(URL)转换为更短的链接。这些短链接更便于分享,特别是在字符数有限的环境中,比如社交媒体平台。使用短链接平台不仅可以节省空间,还可以提供额外的功能,如点击统计、自定义短链接、以及访问控制等。 短链接的典型格式是由平台的域名加上一串字符组成,这串字符代表了原始的长链接。当用户点击这个短链接时,短链接平台会自动将用户重定向到原始的长链接所指向的网页。这个过程对用户来说是透明的,他们可能根本意识不到链接已经被转换和重定向了。 短链接平台的一些常见应用包括但不限于:
用户10136162
2024/02/03
2240
解决缓存穿透、缓存雪崩和缓存击穿
redis缓存穿透、缓存雪崩、热点Key问题分析及解决方案
我们通常使用 缓存 + 过期时间的策略来帮助我们加速接口的访问速度,减少了后端负载,同时保证功能的更新。
阿dai学长
2019/04/25
1.6K0
Redis 缓存击穿(失效)、缓存穿透、缓存雪崩怎么解决?
原始数据存储在 DB 中(如 MySQL、Hbase 等),但 DB 的读写性能低、延迟高。
码哥字节
2022/04/08
1.6K0
Redis 缓存击穿(失效)、缓存穿透、缓存雪崩怎么解决?
spring的缓存(cache)-(缓存穿透、缓存击穿、缓存雪崩、热点数据)
注:本文篇幅有点长,所以建议各位下载源码学习。(如需要请收藏!转载请声明来源,谢谢!)
逍遥壮士
2020/09/18
2.4K0
spring的缓存(cache)-(缓存穿透、缓存击穿、缓存雪崩、热点数据)
Redis缓存穿透、缓存击穿和缓存雪崩
缓存穿透的概念很简单,用户想要查询一个数据,发现redis内存数据库没有,也就是缓存没有命中,于是向持久层数据库查询。发现也没有,于是本次查询失败。当用户很多的时候,缓存都没有命中,于是都去请求了持久层数据库。这会给持久层数据库造成很大的压力,这时候就相当于出现了缓存穿透。
后端码匠
2021/01/14
1.6K0
Redis(5)——亿级数据过滤和布隆过滤器
上一次 我们学会了使用 HyperLogLog 来对大数据进行一个估算,它非常有价值,可以解决很多精确度不高的统计需求。但是如果我们想知道某一个值是不是已经在 HyperLogLog 结构里面了,它就无能为力了,它只提供了 pfadd 和 pfcount 方法,没有提供类似于 contains 的这种方法。
我没有三颗心脏
2020/03/20
1.4K0
Redis(5)——亿级数据过滤和布隆过滤器
php解决redis的缓存雪崩,缓存穿透,缓存击穿的问题
一:前言 设计一个缓存系统,不得不要考虑的问题就是:缓存穿透、缓存击穿与失效时的雪崩效应。
郑洪志
2023/03/05
1.3K0
缓存一致性策略以及雪崩、穿透问题
高并发情境下首先考虑到的第一层优化方案就是增加缓存,尤其是通过Redis将原本在数据库中的数据复制一份放到内存中,可以减少对数据库的读操作,数据库的压力降低,同时也会加快系统的响应速度,但是同样的也会带来其他的问题,比如需要考虑数据的一致性、还需要预防可能的缓存击穿、穿透和雪崩问题等等。
慕容千语
2021/07/20
3830
看完这篇Redis缓存三大问题,保你能和面试官互扯。
日常的开发中,无不都是使用数据库来进行数据的存储,由于一般的系统任务中通常不会存在高并发的情况,所以这样看起来并没有什么问题。
码农小胖哥
2020/04/17
7260
看完这篇Redis缓存三大问题,保你能和面试官互扯。
重学SpringBoot3-集成Redis(五)之布隆过滤器
在高并发场景下,缓存是提升系统性能的重要手段。然而,常规缓存机制中,若遇到大量无效请求访问(请求的 key 不存在于缓存或数据库),就会导致 缓存穿透。为了应对这种问题,布隆过滤器 和 缓存空值 是应对缓存穿透的两大主流方案,布隆过滤器适用于大规模、复杂场景,缓存空值适用于小规模场景。布隆过滤器(Bloom Filter) 能够通过哈希算法判断一个 key 是否可能存在,减少无效请求对数据库的压力。
CoderJia
2024/10/18
3600
重学SpringBoot3-集成Redis(五)之布隆过滤器
不用背八股文!一文搞懂redis缓存击穿、穿透、雪崩!
缓存的击穿、穿透和雪崩,对于这三大缓存的问题,有很多人背过了八股文式的解决方案,面试也能答上一二,却少有人能把思路给理清的。
程序员小义
2024/04/10
4.4K0
不用背八股文!一文搞懂redis缓存击穿、穿透、雪崩!
Redis缓存雪崩、缓存穿透、热点Key解决方案和分析
转载自  https://blog.csdn.net/wang0112233/article/details/79558612
allsmallpig
2021/02/25
7130
推荐阅读
相关推荐
Java缓存穿透、击穿、雪崩解决方案
更多 >
LV.3
这个人很懒,什么都没有留下~
目录
  • 命名
  • 语法风格
    • 1.交换a 和 b的数值
    • 2.多个变量赋值
    • 3.合并字符串
    • 4.列表去重
    • 5.if/else 三目运算
    • 6.enumerate
    • 7.解包
    • 8.列表推导式
    • 9.使用关键字in
    • 10.使用zip同步处理多个列表
    • 11.真值判断
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档