秀!学妹看见都惊呆的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 相关文章推荐
python实现图片批量剪切示例
Mar 25 Python
Python Web框架Flask下网站开发入门实例
Feb 08 Python
Python使用QQ邮箱发送Email的方法实例
Feb 09 Python
Python通过OpenCV的findContours获取轮廓并切割实例
Jan 05 Python
Python实现扣除个人税后的工资计算器示例
Mar 26 Python
浅析Python四种数据类型
Sep 26 Python
对django的User模型和四种扩展/重写方法小结
Aug 17 Python
python DataFrame转dict字典过程详解
Dec 26 Python
python numpy数组复制使用实例解析
Jan 10 Python
python实现从尾到头打印单链表操作示例
Feb 22 Python
Python中super().__init__()测试以及理解
Dec 06 Python
使用python将HTML转换为PDF pdfkit包(wkhtmltopdf) 的使用方法
Apr 21 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读取超大文件的实例代码
2012/04/01 PHP
php配合jquery实现增删操作具体实例
2013/12/12 PHP
php实现的css文件背景图片下载器代码
2014/11/11 PHP
PHP生成静态HTML页面最简单方法示例
2015/04/09 PHP
PHP连接MYSQL数据库实例代码
2016/01/20 PHP
PHP迭代器和生成器用法实例分析
2019/09/28 PHP
PHP执行普通shell命令流程解析
2020/08/24 PHP
二行代码解决全部网页木马
2008/03/28 Javascript
JavaScript全局函数使用简单说明
2011/03/11 Javascript
js动态添加删除,后台取数据(示例代码)
2013/11/25 Javascript
详解AngularJS中的表达式使用
2015/06/16 Javascript
jQuery ajax中使用confirm,确认是否删除的简单实例
2016/06/17 Javascript
微信小程序 http请求的session管理
2017/06/07 Javascript
详解原生js实现offset方法
2017/06/15 Javascript
在Vue-cli里应用Vuex的state和mutations方法
2018/09/16 Javascript
JavaScript学习笔记之DOM基础操作实例小结
2019/01/09 Javascript
Vuex modules模式下mapState/mapMutations的操作实例
2019/10/17 Javascript
vue接通后端api以及部署到服务器操作
2020/08/13 Javascript
[57:41]Secret vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
[01:18]PWL开团时刻DAY4——圣剑与抢盾
2020/11/03 DOTA
python实现从web抓取文档的方法
2014/09/26 Python
Flask入门教程实例:搭建一个静态博客
2015/03/27 Python
解读Python编程中的命名空间与作用域
2015/10/16 Python
tensorflow实现简单的卷积神经网络
2018/05/24 Python
Django model update的多种用法介绍
2020/03/28 Python
pandas如何处理缺失值
2019/07/31 Python
pandas数据处理进阶详解
2019/10/11 Python
python实现滑雪者小游戏
2020/02/22 Python
在ipython notebook中使用argparse方式
2020/04/20 Python
Python中的特殊方法以及应用详解
2020/09/20 Python
JYSK加拿大:购买家具、床垫、家居装饰等
2020/02/14 全球购物
Envie de Fraise意大利:法国网上推出的孕妇装品牌
2020/10/18 全球购物
入股协议书
2014/04/14 职场文书
考察邀请函范文
2015/01/31 职场文书
2015年感恩母亲节的演讲稿
2015/03/18 职场文书
Win10防火墙白名单怎么设置?Win10添加防火墙白名单方法
2022/04/06 数码科技