文章目录
前言
在Python中,代码不是越多越好,而是越少越好。代码不是越复杂越好,而是越简单越好。
基于这一思想,我们来介绍Python中非常有用的高级特性,1行代码能实现的功能,决不写5行代码。请始终牢记,代码越少,开发效率越高。
一、切片
取一个list或tuple的部分元素是非常常见的操作。
1.取一个list中的前三个元素
L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']
#方法1
[L[0], L[1], L[2]]
#方法二
r = []
n = 3
for i in range(3):
r.append(L[i])
print(r)
而对于这种经常取指定索引范围的操作,使用循环十分麻烦。更简便的方法是采用python提供的切片(Slice)操作符:
#表示从索引0开始取(可忽略0: L[:3]),但不包括索引3
L[0 : 3]
List中可以L[-1]取倒数第一个元素,也同样支持倒数切片,倒数第一个元素的索引是-1:
L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']
L[-2:] #['Bob', 'Jack']
L[-2 : -1] #['Bob']
可以通过切片轻松取出一段数列:
L = list(range(100))
L[10:20] #[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
L[:10:2] #前10个数每两个取一个 [0,2,4,6,8]
L[::5] #所有数,每五个取一个[0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95]
#[:]就可以原样复制一个list
2.利用切片取tuple中的元素
tuple也是一种list,唯一区别是tuple不可变。因此,tuple也可以用切片操作,只是操作的结果仍是tuple
(0, 1, 2, 3, 4, 5)[:3] #(0,1,2)
3.字符串用切片操作
字符串’xxx’也可以看成是一种list,每个元素就是一个字符。
因此,字符串也可以用切片操作,只是操作结果仍是字符串:
'ABCDEFG'[:3] #‘ABC’
'ABCDEFG'[::2] #'ACEG'
Python没有针对字符串的截取函数,只需要切片一个操作就可以完成,非常简单
4.练习
利用切片操作,实现一个trim()函数,去除字符串首尾的空格,注意不要调用str的strip()方法:
方法一
# -*- coding: utf-8 -*-
def trim(s):
# 考虑s为'' or 全是空格
n = len(s)
if s == n*(' '):
return ''
#考虑直接对第一个和最后一个字符进行切片,采用循环不断消去‘’
else:
while s[0] == ' ' :
s = s[1:]
while s[-1] == ' ' :
s = s[:-1]
return s
方法二
# s[0:1]保证了s为''时,不进入循环且语法没有错误,如果用s[0]在s==''时出错
def trim(s):
while s[0:1] == ' ':
s = s[1:]
while s[-1:] == ' ':
s = s[:-1]
return s
二、迭代
如果给定一个list或tuple,我们可以通过for循环来遍历
这个list或tuple,这种遍历我们称为迭代(Iteration)。
Python的for循环不仅可以用在list或tuple上,还可以作用在其他可迭代对象上。
1. dict迭代
比如dict就可以迭代:
d = {'a': 1, 'b': 2, 'c': 3}
for key in d:
print(key) #a b c or a c b ...
因为dict的存储不是按照list的方式顺序排列,所以,迭代出的结果顺序很可能不一样
。
默认情况下,dict迭代的是key。如果要迭代value,可以用for value in d.values()
,如果要同时迭代key和value,可以用for k, v in d.items()
2.字符串迭代
由于字符串也是可迭代对象,因此,也可以作用于for循环:
for ch in 'ABC':
print(ch) # A B C
当我们使用for循环时,只要作用于一个可迭代对象,for循环就可以正常运行,而我们不太关心该对象究竟是list还是其他数据类型。
3.Iterable
类型:判断可迭代对象
通过 collections.abc
模块的Iterable
类型判断一个对象是否是可迭代对象。
>>> from collections.abc import Iterable
>>> isinstance('abc',Iterable) # str是否可迭代
True
>>> isinstance([1,2,3],Iterable) # str是否可迭代
True
>>> isinstance(123,Iterable) # 整数是否可迭代
False
4.enumerate
函数:同时迭代索引和元素本身
Python内置的enumerate函数
可以把一个list
变成索引-元素对,这样就可以在for
循环中同时迭代索引和元素本身
>>> for i, value in enumerate(['A', 'B', 'C']):
... print(i, value)
...
0 A
1 B
2 C
在python中同时引用两个变量是很常见的:
>>> for x,y in [(1,1),(2,4),(3,9)]:
... print(x, y)
...
1 1
2 4
3 9
5.练习
# 请使用迭代查找一个list中最小和最大值,并返回一个tuple:
# -*- coding: utf-8 -*-
def findMinAndMax(L):
# 考虑设置一个比较初始值max min = L[0]
if L == []:
return (None, None)
else:
max = L[0]
min = L[0]
for i in L:
if i >= max:
max = i
elif i <= min:
min = i
return (min, max)
总结
1.python中的None类型
None特性
- None不支持任何运算也没有任何内建方法
- None和
任何其他的数据类型比较永远返回False
- None有自己的数据类型NoneType,不能创建其他NoneType对象(它只有一个值None) None与0、空列表、空字符串不一样
-可以将None赋值给任何变量,也可以给None值变量赋值
None是没有像len,size等属性的
,要判断一个变量是否为None,直接使用
————————————————
2.python报错:TypeError: cannot unpack non-iterable int object
- 确保函数返回值数量一致,即函数返回值数量与调用函数返回值数量需要一致
- 如果使用
if
语句,确保if
和else
中的返回值数量一致! - 在将列表元素赋给其他变量时,并列赋值就会报错;
>>> L = (1,2,3)
>>> max, min = L[0]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: cannot unpack non-iterable int object
解决办法
:分开赋值
>>> L = (1,2,3)
>>> max = L[0]
>>> min = L[0]