秀!学妹看见都惊呆的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中global语句下全局变量的值的修改
Jun 16 Python
python实现八大排序算法(2)
Sep 14 Python
python正则表达式及使用正则表达式的例子
Jan 22 Python
python 遍历目录(包括子目录)下所有文件的实例
Jul 11 Python
Python 实现中值滤波、均值滤波的方法
Jan 09 Python
python多线程+代理池爬取天天基金网、股票数据过程解析
Aug 13 Python
python绘制玫瑰的实现代码
Mar 02 Python
Python并发concurrent.futures和asyncio实例
May 04 Python
Python如何定义有可选参数的元类
Jul 31 Python
Python+OpenCV图像处理—— 色彩空间转换
Oct 22 Python
详解Python中list[::-1]的几种用法
Nov 16 Python
接口自动化多层嵌套json数据处理代码实例
Nov 20 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面向对象全攻略 (五) 封装性
2009/09/30 PHP
深入理解PHP之源码目录结构与功能说明
2016/06/01 PHP
php array_reverse 以相反的顺序返回数组实例代码
2017/04/11 PHP
PHP框架实现WebSocket在线聊天通讯系统
2019/11/21 PHP
Laravel5.1 框架Request请求操作常见用法实例分析
2020/01/04 PHP
PHP 加密 Password Hashing API基础知识点
2020/03/02 PHP
jQuery DOM操作实例
2014/03/05 Javascript
深入浅析JavaScript函数前面的加号和叹号
2016/07/09 Javascript
Bootstrap时间选择器datetimepicker和daterangepicker使用实例解析
2016/09/17 Javascript
JavaScript中如何使用cookie实现记住密码功能及cookie相关函数介绍
2016/11/10 Javascript
Jquery Easyui菜单组件Menu使用详解(15)
2016/12/18 Javascript
微信JSAPI支付操作需要注意的细节
2017/01/10 Javascript
详解如何使用webpack打包Vue工程
2017/05/27 Javascript
jquery处理checkbox(复选框)是否被选中实例代码
2017/06/12 jQuery
微信小程序HTTP接口请求封装代码实例
2019/09/05 Javascript
详解vue中v-model和v-bind绑定数据的异同
2020/08/10 Javascript
vue界面发送表情的实现代码
2020/09/11 Javascript
Python连接SQLServer2000的方法详解
2017/04/19 Python
Python爬虫获取图片并下载保存至本地的实例
2018/06/01 Python
解决pycharm remote deployment 配置的问题
2019/06/27 Python
python Django的web开发实例(入门)
2019/07/31 Python
python如何获取apk的packagename和activity
2020/01/10 Python
python中图像通道分离与合并实例
2020/01/17 Python
使用Django清空数据库并重新生成
2020/04/03 Python
Django之富文本(获取内容,设置内容方式)
2020/05/21 Python
linux centos 7.x 安装 python3.x 替换 python2.x的过程解析
2020/12/14 Python
美国创意礼品网站:UncommonGoods
2017/02/03 全球购物
初中科学教学反思
2014/01/21 职场文书
企业仓管员岗位职责
2014/06/15 职场文书
党员自我对照检查材料
2014/08/19 职场文书
2015年八一建军节慰问信
2015/03/23 职场文书
党员进社区活动总结
2015/05/07 职场文书
工作年限证明模板
2015/06/15 职场文书
又涨知识了,自律到底多重要?
2019/06/27 职场文书
Python中zipfile压缩包模块的使用
2021/05/14 Python
浅谈TypeScript 索引签名的理解
2021/10/16 Javascript