Python的高级特性
Posted 礁之
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python的高级特性相关的知识,希望对你有一定的参考价值。
文章目录
此文章参考廖雪峰大神的官网,地址:高级特性 - 廖雪峰的官方网站 (liaoxuefeng.com)
一、切片
- 在python的使用中,对于列表、元组的元素取值是非常常见的,例如:
注意:切片是顾头不顾尾的
>>> L = ["aaa","bbb","ccc","ddd"]
>>> print(L)
['aaa', 'bbb', 'ccc', 'ddd']
#如果想取前三个元素,可以这样:
>>> print(L[0],L[1],L[2])
aaa bbb ccc
#也可以使用for循环:
>>> for i in range(3):
... a.append(L[i])
...
>>> print(a)
['aaa', 'bbb', 'ccc']
#但是明显前两种方法都比较繁琐,所以,python提供了切片(Slice)操作符,这样在取指定元素时可以变得更加简单,例如:
>>> print(L[0:3]) #表示从第0个元素取到第3个元素,由于切片是顾头不顾尾的,所以是不包含第3个元素的,只取出了前三个元素
['aaa', 'bbb', 'ccc']
>>> print(L[:3]) #默认:前面从0开始
['aaa', 'bbb', 'ccc']
#有了切片这个方法后,就可以轻松取出一段元素,例如:
>>> L = list(range(100)) #python3需要把range转换成列表,python2可以直接使用range赋值,range(100)表示0-99,同样顾头不顾尾
>>> print(L)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
>>> print(L[:]) #切片没有指定条件的话,会输出全部
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
>>> print(L[:10]) #取前10
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> print(L[10:20]) #取10-19
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
>>> print(L[:-1]) #使用负数时,是从末尾开始算的,":-1"表示从0到末尾-1,所以是0-98
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98]
>>> print(L[-10:-1]) #取倒数10到倒数1
[90, 91, 92, 93, 94, 95, 96, 97, 98]
>>> print(L[-20:-10])
[80, 81, 82, 83, 84, 85, 86, 87, 88, 89]
>>> print(L[-10:])
[90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
#如果想每个5个取一个值的话,可以这样做:
>>> print(L[::5]) #表示每隔5个值取一个元素
[0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95]
- 上面的是列表的取值案例,列表的切片最终输出的结果还是列表
- python的切片还可以引用在其他数据类型上,如元组、字符串等,例如:
#元组
>>> T = (1,2,3,4,5)
>>> print(T)
(1, 2, 3, 4, 5)
>>> print(T[1:3])
(2, 3)
>>> print(T[-3:])
(3, 4, 5)
#字符串
>>> S = "ABCDEFG"
>>> print(S)
ABCDEFG
>>> print(S[4:])
EFG
>>> print(S[::3])
ADG
-
在自己实践过之后可以发现,元组切片后的输出还是元组,同样字符串切片后还是字符串
-
这里引用一个小案例,不使用strip函数,利用切片来去除首位的空格:
# -*- coding: utf-8 -*-
def trim(s):
if s[:1] != ' ' and s[-1:] != ' ':
return s
elif s[:1] == ' ':
return trim(s[1:])
else:
return trim(s[:-1])
if trim('hello ') != 'hello':
print('测试失败!')
elif trim(' hello') != 'hello':
print('测试失败!')
elif trim(' hello ') != 'hello':
print('测试失败!')
elif trim(' hello world ') != 'hello world':
print('测试失败!')
elif trim('') != '':
print('测试失败!')
elif trim(' ') != '':
print('测试失败!')
else:
print('测试成功!')
这段代码通过切片去判断首尾是否有空格,有的话会再次调用函数,并且引用第1元素或第-1元素来去除空格,然后在函数中继续引用自身函数,直至首尾没有空格
二、迭代
- 首先要知道的是,通过for循环来遍历列表、元组、字符串等,这种遍历就称为迭代
- 需要注意的是,python中的迭代是直接通过
for in
的这种方式来完成的,而其他语言,比如C语言中的迭代是通过下标完成的,即i++
这种方式。并且python的for循环还可以使用在其他的可迭代的数据类型上 - 除了列表、元组这种有下标的数据类型,python中的for循环还可以使用在其他没有下标的可迭代数据类型上,如字典:
>>> L = "aaa":1,"bbb":2,"ccc":3
'aaa': 1, 'bbb': 2, 'ccc': 3
>>> for i in L:
... print(i)
...
aaa
bbb
ccc
#但是直接这样循环的话,可以看到,只能取到字典的key,取不到value,取value的话可以这样:
>>> for i in L.values(): #利用values函数来取到value的值
... print(i)
...
1
2
3
#想要同时取key和value的话可以使用items函数:
>>> for x,y in L.items():
... print(x,y)
...
aaa 1
bbb 2
ccc 3
要注意的是,因为字典的存储不是按照列表的方式顺序排列的,所以迭代出的结果有可能会不同
- 其他类型的一些循环:
#字符串
>>> S = "ABCDEFG"
>>> print(S)
ABCDEFG
>>> for i in S:
... print(i)
...
A
B
C
D
E
F
G
#元组
>>> T = (1,2,3,4)
>>> for i in T:
... print(i)
...
1
2
3
4
#列表
>>> L = [1,2,3,4]
>>> for i in L:
... print(i)
...
1
2
3
4
- 在上面的案例中,可以看出,for循环只要是使用于可迭代的数据类型,都可以正常运行,那怎么看是否是可迭代的数据类型呢,python提供了相应的方法:
>>> from collections.abc import Iterable #导入collections.abc模块的Iterable方法
>>> isinstance('aaaa',Iterable)
True #True表示为可迭代的数据类型
>>> isinstance([1,2,3],Iterable)
True
>>> isinstance((1,2,3),Iterable)
True
>>> isinstance(S,Iterable)
True
>>> isinstance(L,Iterable)
True
>>> isinstance(T,Iterable)
True
>>> isinstance("aaa":1,"bbb":2,Iterable)
True
- 引用其他的一些小案例:
>>> L = [1,2,3,4,5]
>>> for x,y in enumerate(L): #使用enumerate函数可以输出“下标 + 元素”的格式
... print(x,y)
...
0 1
1 2
2 3
3 4
4 5
#利用for循环来达到这种效果
>>> L = [(1,2),(3,4),(5,6)]
>>> for x,y in L:
... print(x,y)
...
1 2
3 4
5 6
#取列表中的最大值和最小值:
# -*- coding: utf-8 -*-
def findMinAndMax(L):
if L == []Python高级特性