news 2026/5/11 7:02:42

Python中一些不为人知的基础技巧总结

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python中一些不为人知的基础技巧总结

前言

本文主要给大家总结介绍了关于Python的一些基础技巧,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。

1.startswith()和endswith()参数可以是元组

当检测字符串开头或结尾时,如果有多个检测值,可以用元组作为startswith()和endswith()参数:

1

2

3

4

5

6

7

8

9

10

11

12

# bad

ifimage.endswith('.jpg')orimage.endswith('.png')orimage.endswith('.gif'):

pass

# good

ifimage.endswith(('.jpg','.png','.gif')):

pass

# bad

ifurl.startswith('http:')orurl.startswith('https:')orurl.startswith('ftp:'):

pass

# good

ifurl.startswith(('http:','https:','ftp:')):

pass

2.enumerate()设置start参数做为索引起始值

当用enumerate()迭代同时要得到索引时,可以设置start参数作为索引起始值:

1

2

3

4

5

6

# bad

forindex, vinenumerate(data):

print(index+1, v)

# good

forindex, vinenumerate(data, start=1):

print(index, v)

3.对切片命名

当代码中到处都是硬编码的切片索引时,我们的代码将变得无法阅读。可以对切片命名解决此问题:

1

2

3

4

5

6

7

record='....................100.................513.25......'

# bad

cost=int(record[20:23])*float(record[40:46])

# good

SHARES=slice(20,23)

PRICE=slice(40,46)

cost=int(record[SHARES])*float(record[PRICE])

作为一条基本准则,代码中如果有很多硬编码的索引值,将导致可读性合可维护性都不佳。一般来说,内置的slice()函数会创建一个切片对象,可以用在任何允许进行切片操作的地方。例如:

1

2

3

4

5

6

7

8

9

10

11

12

13

>>> items=[0,1,2,3,4,5,6]

>>> a=slice(2,4)

>>> items[2:4]

[2,3]

>>> items[a]

[2,3]

>>> items[a]=[-2,-3]

>>> items

[0,1,-2,-3,4,5,6]

>>>delitems[a]

>>> items

[0,1,4,5,6]

>>>

4.上下文管理器可以同时管理多个资源

假设你要读取一个文件的内容,经过处理以后,写入到另一个文件。你能写出pythonic的代码,所以你使用了上下文管理器,满意地的写出了下面这样的代码:

1

2

3

withopen('input.txt','r') as source:

withopen('output.txt','w') as target:

target.write(source.read())

你已经做的很好了,但是上下文管理器可以同时管理多个资源,上面这段代码还可以这样写:

1

2

withopen('input.txt','r') as source,open('output.txt','w') as target:

target.write(source.read())

5.else子句

Python中的else子句不仅能在if语句中使用,还能在for、while、和try语句中使用。

在for循环或是while循环正常运行完毕时(而不是通过break语句或是return语句或是异常退出循环),才会运行else块。

举个例子:

1

2

3

4

5

6

7

8

9

10

>>>foriinrange(3):

...print(i)

...else:

...print('Iterated over everything')

...

0

1

2

Iterated over everything

>>>

如上,for循环正常结束,所以运行了后面的else块。

1

2

3

4

5

6

7

8

9

10

>>>foriinrange(3):

...ifi==2:

...break

...print(i)

...else:

...print('Iterated over everything')

...

0

1

>>>

由此可以看出,for循环如果没有正常运行完毕(如上面是break结束循环的),是不会运行后面的else块。

仅当try块中没有异常抛出时才运行else块。一开始,你可能觉得没必要在try/except块中使用else子句。毕竟,在下述代码片段中,只有dangerous_call()不抛出异常,after_call()才会执行,对吧?

1

2

3

4

5

try

dangerous_call()

after_call()

exceptOSError:

log('OSError...')

然而,after_call()不应该放在try块中。为了清晰明确,try块中应该只包括抛出预期异常的语句。因此,向下面这样写更好:

1

2

3

4

5

6

try:

dangerous_call()

exceptOSError:

log('OSError...')

else:

after_call()

现在很明确,try块防守的是dangerous_call()可能出现的错误,而不是after_call()。而且很明显,只有try块不抛出异常,才会执行after_call()。但要注意一点,else子句抛出的异常不会由前面的except子句处理,也就是说此时after_call()如果抛出异常,将不会被捕获到。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/11 6:52:14

Redis分布式锁进阶第五十七篇

Redis分布式锁进阶第二十五篇:联锁深度拆解 多资源交叉死锁根治 复杂业务多级加锁绝对有序方案一、本篇前置衔接 第二十四篇我们完成了全系列终局复盘,整理了故障排查SOP与企业级落地铁律。常规单资源锁、热点分片锁、隔离锁全部讲透,但真实…

作者头像 李华
网站建设 2026/5/11 6:52:13

VSIPL:嵌入式信号处理的跨平台解决方案

1. VSIPL:嵌入式信号处理的工业级解决方案在实时嵌入式多计算机系统的开发中,代码的可移植性一直是困扰工程师的难题。1990年代末,来自政府、学术界和工业界的专家们共同创建了VSIPL(Vector Scalar Image Processing Library&…

作者头像 李华
网站建设 2026/5/11 6:49:52

本地大模型推理引擎:高性能、可编程的部署与优化实战

1. 项目概述:一个为本地大模型打造的“瑞士军刀”式推理引擎如果你最近在折腾本地部署的大语言模型,比如Llama、Qwen或者DeepSeek,那你大概率遇到过这样的场景:模型文件下载好了,推理框架也装上了,但实际跑…

作者头像 李华