秀!学妹看见都惊呆的Python小招数!【详细语言特性使用技巧】

了解过了Python的基本入门和进阶,接下来我就和大家分享一下,在Python开发中经常会用到的一些语言小技巧,帮助你在开发学习过程中节省更多的时间精力和代码量!用最短的时间写出最秀的操作!

Posted in Python onApril 27, 2021

写在前面

Hello,你好呀,我是灰小猿,一个超会写bug的程序猿!

哈哈,没错就是我,我又来写“bug”了!近期和大家分享了几篇有关Python基础入门和进阶的文章,帮助了很多小伙伴了解和学习到了很多的Python的知识和技术,在这里再和大家来一个传送门,有想学习的小伙伴可以去看一下,相信对你的Python学习是很不错的,强烈推荐收藏“常见报错及其解决”这一篇,之后遇到bug你会来感谢我的!

一、索引和切片相关操作

 

1、索引

序列(列表、元组、字符串)的索引可以为负值,此时将按逆序从序列中的取元素。

>>> chars = [‘a’, ‘b’, ‘c’, ‘d’, ‘e’]
>>> chars[-1]
‘e’
>>> chars[-2]
‘d’
>>> chars[-5]
‘a’

索引 -1 表示最后一个元素。

 

2、切片

之前介绍过切片的用法,使用它可以从序列中取出一个子序列。切片以索引区间 [起始索引:结束索引] 来表示,注意这是一个左闭右开区间。如:

>>> chars = [‘a’, ‘b’, ‘c’, ‘d’, ‘e’]
>>> chars[1:3]
[‘b’, ‘c’]

如果起始索引为 0,则可以省略起始索引。如下:

>>> chars = [‘a’, ‘b’, ‘c’, ‘d’, ‘e’]
>>> chars[:3]
[‘a’, ‘b’, ‘c’]

如果结束索引等于序列长度,则可以省略结束索引。此时相当于从起始索引一直取到最后一个元素。如下:

>>> chars = [‘a’, ‘b’, ‘c’, ‘d’, ‘e’]
>>> chars[3:]
[‘d’, ‘e’]

也可以既省略起始索引也省略结束索引,那么将取整个序列:

>>> chars = [‘a’, ‘b’, ‘c’, ‘d’, ‘e’]
>>> chars[:]
[‘a’, ‘b’, ‘c’, ‘d’, ‘e’]

起始索引和结束索引可以为负值:

>>> chars = [‘a’, ‘b’, ‘c’, ‘d’, ‘e’]
>>> chars[1:-2]
[‘b’, ‘c’]
>>> chars[-3:-1]
[‘c’, ‘d’]

切片中可以指定步长,用第三个参数表示。步长表示索引的间隔,如 [0:5:2] 表示从索引 0 至 5,每隔 2 个索引取一次值。

>>> chars = [‘a’, ‘b’, ‘c’, ‘d’, ‘e’]
>>> chars[0:5:2]
[‘a’, ‘c’, ‘e’]

步长也可以为负值,使用如下方式即可翻转一个序列:

>>> chars = [‘a’, ‘b’, ‘c’, ‘d’, ‘e’]
>>> chars[::-1]
[‘e’, ‘d’, ‘c’, ‘b’, ‘a’]

 

二、赋值相关操作

 

1、连续赋值

Python 允许连续赋值操作,如:

a = b = c = 1

其等效于:

c = 1
b = c
a = b

也就是说,连续赋值时,从右至左依次被赋值。

 

2、拆包

多个变量和多个值可以用一个赋值符号(=)做到同时赋值。赋值时,将根据位置关系,将 = 右侧的值分别赋值给左侧的变量。如:

a, b = 1, 2

>>> a
1
>>> b
2

它等效于:

a, b = (1, 2)

它将元祖中的每个元素拆解出来,然后分别赋值给前面的变量。这种操作叫作拆包.

类似的,列表、字符串、字典也可以被拆包。

>>> a, b = [1, 2]
>>> a
1
>>> b
2

>>> a, b = ‘12’
>>> a
’1’
>>> b
’2’

>>> a, b = {1: ‘a’, 2: ‘b’} # 注意字典拆包时拆出来的是每个键
>>> a
1
>>> b
2

拆包时,= 右侧的序列的长度需要与左侧的变量个数相同。如果不相同,可以使用 *变量 的形式一次接收多个元素。

a, *b = (1, 2, 3, 4)

>>> a
1
>>> b
[2, 3, 4]

*a, b = (1, 2, 3, 4)

>>> a
[1, 2, 3]
>>> b
4

a, *b, c = (1, 2, 3, 4)

>>> a
1
>>> b
[2, 3]
>>> c
4

可以看到,元组中多出来的元素被整合为了一个列表。

扩展:

交换两个变量的值,可以简单地使用

a, b = b, a

 

3、赋值中的 or 关键字

or 关键字一般用在 if 语句中,表达多个条件间的或操作。

or 也常被用在赋值中,如:

x = a or b

它表达的是,如果 bool(a)True,则将 a 赋值给 x,否则将 b 赋值给 x

>>> x = ‘ab’ or 3
>>> x
’ab’
>>> x = ‘’ or 3
>>> x
3

三、控制语句相关操作

 

1、if 三元表达式

假如我们要计算一个数的绝对值,可以使用 if else 语句来表达:

if x > 0:
    result = x
else:
    result = -x

这有一种简化的写法—— if else 三元表达式,只需要一行代码:

result = x if x > 0 else -x

>>> x = -15
>>> x if x > 0 else -x
15

if 三元表达式的读法有点不符合阅读习惯。它是从语句中间的 if 条件开始读,若条件满足,则获得左边的值 x,若条件不满足,则获得 else 下的值 -x

 

2、for else 语句

for 循环大家都很了解了,但是你可能还不知道,for 循环后面可以接一个 else 语句。如下:

for i in range(5):
    print(i)
else:
    print('所有项被迭代使用')

>>> for i in range(5):
…     print(i)
… else:
…     print(‘所有项被迭代’)

0
1
2
3
4
所有项被迭代

可以看到,如果 for 循环中所有的项被迭代,则会继续执行 else 语句中的代码。

else 中的代码总是被执行吗?也不是的。只有在 for 循环没有被 break 时,才会执行后续 else 中的代码。

for i in range(5):
    if i == 3:
        break
    print(i)
else:
    print('所有项被迭代使用')

>>> for i in range(5):
…     if i == 3:
…          break
…     print(i)
… else:
…     print(‘所有项被迭代使用’)

0
1
2

可以看到,一旦 for 循环被 break,后续的 else 语句将不被执行。

 

3、while else 语句

for else 语句类似,while 语句后也可以接 else 语句。如下:

i = 0
while i < 5:
    print(i)
    i += 1
else:
    print('这是 else 语句')

>>> i = 0
>>> while i < 5:
…     print(i)
…     i += 1
… else:
…     print(‘这是 else 语句’)

0
1
2
3
4
这是 else 语句

同样的,一旦 while 循环被 break,则后续的 else 语句将不被执行。

 

4、try except else 语句

try except 语句的后面同样可以接 else 语句:

try:
    pass
except:
    print('有异常发生,不执行 else 语句')
else:
    print('没有异常发生,执行 else 语句')

如果 try 下有异常抛出,则不执行 else 语句。如果没有异常抛出,则执行 else 语句。

>>> try:
…     pass
… except:
…     print(‘有异常发生,不执行 else 语句’)
… else:
…     print(‘没有异常发生,执行 else 语句’)

没有异常发生,执行 else 语句

>>> try:
…     raise Exception
… except:
…     print(‘有异常发生,不执行 else 语句’)
… else:
…     print(‘没有异常发生,执行 else 语句’)

有异常发生,不执行 else 语句

 

四、类相关操作

 

1、类属性 / 对象属性动态绑定

之前我们在使用类属性或对象属性时,属性是在定义类的时候一起被定义的。另外我们也可以在运行时动态地给类或对象添加属性。

如:

>>> class A:
…     pass

>>> A.apple = ‘apple’
>>> A.apple
’apple’

>>> a = A()
>>> a.banana = ‘banana’
>>> a.banana
’banana’

只要向一个不存在的属性赋值,便会创建出这个属性。

 

2、@property

装饰器 @property 可以将类中的方法转换为属性。如:

class A:
    @property
    def apple(self):
        return 'apple'

>>> a = A()
>>> a.apple
’apple’

@property 装饰的方法,可以像属性一样被使用。但是有一个限制,这个属性是只读的,不能被修改。如果修改将会报错,如下:

>>> a.apple = 'banana’
Traceback (most recent call last):
     File “”, line 1, in
AttributeError: can’t set attribute

有没有什么办法让这个属性可以被修改呢,也就是变成可写的?有的,但需要再添加一个方法:

class A:
    @property
    def apple(self):
        return self._apple
    
    @apple.setter
    def apple(self, value):
        self._apple = value

>>> a = A()
>>> a.apple = ‘banana’
>>> a.apple
’banana’

我们首先对第一个 apple() 方法使用了 @property 装饰器,这样 apple 也就变成了一个只读属性。与此同时这会自动生成出一个新的装饰器 @apple.setter,使用这个装饰器来装饰第二个 apple() 方法后,apple 属性就变成可写的了。

这里的关键是,@property 装饰一个方法,会自动生成名为 @方法名.setter 的装饰器

 

3、自定义异常

Python 中内置有很多异常,当我们需要使用异常时,从中挑选出合适的异常即可。但有些时候,可能需要根据业务场景自定义自己的异常。

自定义异常的方式很简单,只需要定义一个类,这个类继承自 Exception 类或其子类即可。如:

class FileParseException(Exception):
    pass

 

五、函数相关操作

Python 是动态类型,在写 Python 代码的时候,不需要直接指明数据类型,但这有时也会带来阅读和 IDE(或其它工具)静态分析上的障碍。

针对这个问题,我们可以考虑为函数的加上参数类型标注,以及返回值类型标注。

 

1、函数参数类型标注

函数参数类型标注的写法如下,在每个参数的后面加上冒号(:)并标明类型:

def say_hello(name: str):
	print(name, ', hello!')

上述便指明了参数 namestr 类型。

Python 并不会根据标注对参数作类型校验,这只是为了方便阅读和 IDE 静态分析。

 

2、函数返回值类型标注

函数的返回值类型标注如下,在参数列表的后面加上右箭头(->)并标明类型:

def say_hello(name) -> str:
	print(name, ', hello!')

同样的,Python 并不会根据标注对返回值作类型校验,只是方便阅读和 IDE 静态分析。

Python 相关文章推荐
Tensorflow 自带可视化Tensorboard使用方法(附项目代码)
Feb 10 Python
python for 循环获取index索引的方法
Feb 01 Python
Python2和Python3的共存和切换使用
Apr 12 Python
使用Python检测文章抄袭及去重算法原理解析
Jun 14 Python
Python 日志logging模块用法简单示例
Oct 18 Python
python对象销毁实例(垃圾回收)
Jan 16 Python
Python如何将函数值赋给变量
Apr 28 Python
pyecharts调整图例与各板块的位置间距实例
May 16 Python
Opencv图像处理:如何判断图片里某个颜色值占的比例
Jun 03 Python
python中tab键是什么意思
Jun 18 Python
Python同时处理多个异常的方法
Jul 28 Python
Python实现简单得递归下降Parser
May 02 Python
Python代码,能玩30多款童年游戏!这些有几个是你玩过的
python实现腾讯滑块验证码识别
Apr 27 #Python
python实现调用摄像头并拍照发邮箱
Apr 27 #Python
django如何自定义manage.py管理命令
Apr 27 #Python
Python爬虫之爬取二手房信息
七个Python必备的GUI库
Python实战之用tkinter库做一个鼠标模拟点击器
You might like
PHP程序员面试 切忌急功近利(更需要注重以后的发展)
2010/09/01 PHP
php下使用iconv需要注意的问题
2010/11/20 PHP
PHP防止刷新重复提交页面的示例代码
2015/11/11 PHP
php之header的不同用法总结(实例讲解)
2017/11/28 PHP
yii2 上传图片的示例代码
2018/11/02 PHP
PHP上传图片到数据库并显示的实例代码
2019/12/20 PHP
php+ajax实现文件切割上传功能示例
2020/03/03 PHP
javascript克隆对象深度介绍
2012/11/20 Javascript
用js调用迅雷下载代码的二种方法
2013/04/15 Javascript
用html+css+js实现的一个简单的图片切换特效
2014/05/28 Javascript
JavaScript正则表达式的分组匹配详解
2016/02/13 Javascript
Ionic如何创建APP项目
2016/06/03 Javascript
jQuery插件imgAreaSelect基础讲解
2017/05/26 jQuery
详解weex默认webpack.config.js改造
2018/01/08 Javascript
原生js实现淘宝放大镜效果
2020/10/28 Javascript
基于element-ui组件手动实现单选和上传功能
2018/12/06 Javascript
浅谈webpack devtool里的7种SourceMap模式
2019/01/14 Javascript
WebGL学习教程之Three.js学习笔记(第一篇)
2019/04/25 Javascript
小程序中this.setData的使用和注意事项
2019/08/28 Javascript
vue vantUI实现文件(图片、文档、视频、音频)上传(多文件)
2019/10/15 Javascript
node.js基于dgram数据报模块创建UDP服务器和客户端操作示例
2020/02/12 Javascript
python进程管理工具supervisor的安装与使用教程
2017/09/05 Python
python爬虫使用cookie登录详解
2017/12/27 Python
Python Django中间件,中间件函数,全局异常处理操作示例
2019/11/08 Python
分享PyCharm的几个使用技巧
2019/11/10 Python
关于python中的xpath解析定位
2020/03/06 Python
全球速卖通巴西站点:Aliexpress巴西
2016/08/24 全球购物
ASICS印度官方网站:日本专业运动品牌
2020/06/20 全球购物
安康杯竞赛活动总结
2014/05/05 职场文书
医生爱岗敬业演讲稿
2014/08/26 职场文书
2014年全国法制宣传日宣传活动方案
2014/11/02 职场文书
2014年企业工会工作总结
2014/11/12 职场文书
公司出纳岗位职责
2015/03/31 职场文书
企业党支部工作总结2015
2015/05/21 职场文书
送给火锅店的创意营销方案!
2019/07/08 职场文书
Python可视化动图组件ipyvizzu绘制惊艳的可视化动图
2022/04/21 Python