秀!学妹看见都惊呆的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 import自定义模块方法
Feb 12 Python
python判断完全平方数的方法
Nov 13 Python
windows下搭建python scrapy爬虫框架步骤
Dec 23 Python
Python实现FTP弱口令扫描器的方法示例
Jan 31 Python
python实现词法分析器
Jan 31 Python
python之mock模块基本使用方法详解
Jun 27 Python
python调试神器PySnooper的使用
Jul 03 Python
jupyternotebook 撤销删除的操作方式
Apr 17 Python
python:解析requests返回的response(json格式)说明
Apr 30 Python
详解python3 GUI刷屏器(附源码)
Feb 18 Python
python爬虫爬取某网站视频的示例代码
Feb 20 Python
OpenCV3.3+Python3.6实现图片高斯模糊
May 18 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获取网页内容方法总结
2008/12/04 PHP
新手菜鸟必读:session与cookie的区别
2013/08/22 PHP
PHP JSON格式的中文显示问题解决方法
2015/04/09 PHP
简单解决新浪SAE无法上传文件的问题
2015/05/13 PHP
PHP多进程编程实例详解
2017/07/19 PHP
php curl上传、下载、https登陆实现代码
2017/07/23 PHP
Javascript var变量隐式声明方法
2009/10/19 Javascript
jQuery选择头像并实时显示的代码
2010/06/27 Javascript
理解Javascript_08_函数对象
2010/10/15 Javascript
js中使用DOM复制(克隆)指定节点名数据到新的XML文件中的代码
2011/07/27 Javascript
关于JavaScript中的关联数组分析
2013/04/09 Javascript
对new functionName()定义一个函数的理解
2014/05/22 Javascript
jQuery控制frames及frame页面JS的方法
2016/03/08 Javascript
手机端图片缩放旋转全屏查看PhotoSwipe.js插件实现
2016/08/25 Javascript
AngularJS+Bootstrap实现多文件上传与管理
2016/11/08 Javascript
概述一个页面从输入URL到页面加载完的过程
2016/12/16 Javascript
Angular异步变同步处理方法
2018/08/13 Javascript
基于JavaScript实现大文件上传后端代码实例
2020/08/18 Javascript
[01:35]辉夜杯战队访谈宣传片—LGD
2015/12/25 DOTA
python随机数分布random测试
2018/08/27 Python
深入浅析python3中的unicode和bytes问题
2019/07/03 Python
Python安装及Pycharm安装使用教程图解
2019/09/20 Python
python 实现的车牌识别项目
2021/01/25 Python
从一次项目重构说起CSS3自定义变量在项目的使用方法
2021/03/01 HTML / CSS
美国牛仔品牌:True Religion
2018/11/16 全球购物
英国婚礼商城:Wedding Mall
2019/11/02 全球购物
什么是WEB控件?使用WEB控件有哪些优势?
2012/01/21 面试题
酒店采购员岗位职责
2014/03/14 职场文书
2014年“向国旗敬礼”网上签名寄语活动方案
2014/09/27 职场文书
2014年世界艾滋病日演讲稿
2014/11/28 职场文书
2014年学前班工作总结
2014/12/08 职场文书
2015年团支书工作总结
2015/04/03 职场文书
中标通知书范本
2015/04/17 职场文书
2015年学校安全管理工作总结
2015/05/11 职场文书
运动会3000米加油稿
2015/07/21 职场文书
幼儿园亲子活动感想
2015/08/07 职场文书