Python基础语法快速复习-高级特性
1、切片
取list或tuple的部分元素
L = ['Chen','Yu','Long','Murasamelory']
L[0:3]
['Chen', 'Yu', 'Long']
切片取元素时,按照给定范围采取左闭右开的方式取元素。
支持倒数切片
print(L[-2:])
print(L[-2:-1])
['Long', 'Murasamelory']
['Long']
按照步长切片
#快速创建列表
L = list(range(100))
#步长切片
L[::5]
[0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95]
特殊:字符串'xxx'可以看作为一种list,每个元素是一个字符,可以对字符串进行切片操作。
"ABCDEFG"[:3]
'ABC'
2、迭代
使用for循环遍历的过程叫做迭代。
python中迭代通过for...in来完成
python的for循环可以作用于所有可迭代对象上,无论有无下标,都可以迭代。
#迭代字典的key
d = {'a':1,'b':2,'c':3}
for key in d:
print(key)
print('='*10)
#迭代字典的value
for value in d.values():
print(value)
print('='*10)
#同时迭代字典的key和value
for k,v in d.items():
print(k,v)
a
b
c
==========
1
2
3
==========
a 1
b 2
c 3
判断对象是否可迭代,采用collections模块中的Iterable类型判断
from collections import Iterable
print(isinstance('abc',Iterable))
print(isinstance([1,2,3],Iterable))
print(isinstance(123,Iterable))
True
True
False
:1: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated since Python 3.3, and in 3.9 it will stop working
from collections import Iterable
实现下标循环:采用python内置enumerate函数将list变为索引-元素队,采用同时迭代的方法取出索引和元素本身
for i,value in enumerate(['A','B','C']):
print(i,value)
0 A
1 B
2 C
3、列表生成式
快速生成[1x1, 2x2, 3x3, ..., 10x10]
[x*x for x in range(1,11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
在for循环后加上if判断筛选出仅偶数的平方。
[x*x for x in range(1,11) if x%2==0]
[4, 16, 36, 64, 100]
两层循环的全排列
[m+n for m in 'ABC' for n in 'XYZ']
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
列出当前目录下的所有文件和目录名
import os
[d for d in os.listdir('.')]
['.ipynb_checkpoints', '函数.ipynb', '高级特性.ipynb']
使用两个变量生成list
d = {'x':'A','y':'B','z':'C'}
[k+'='+v for k,v in d.items()]
['x=A', 'y=B', 'z=C']
[x if x % 2 == 0 else -x for x in range(1, 11)]
[-1, 2, -3, 4, -5, 6, -7, 8, -9, 10]
for 前面的if...else是表达式,而for后面的if是过滤条件,不能带else。
3、生成器
生成器(generator):可以在循环的过程中不断推算出后续元素,这样就不需要创建完整的list,节省大量空间。
#列表生成式
L = [x*x for x in range(10)]
print(L)
#生成器创建
g = (x*x for x in range(10))
print(g)
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
at 0x000002AFC437A2E0>
遍历生成器的方法是采用for循环,因为生成器是可迭代对象。
for n in g:
print(n)
0
1
4
9
16
25
36
49
64
81
斐波拉契数列用函数直接打印(列表生成式写不出来)
def fib(max):
n,a,b = 0,0,1
while n
a,b=b,a+b
相当于
t = (b,a+b)
a = t[0]
b = t[1]
fib(6)
1
1
2
3
5
8
'done'
采用生成器写出斐波拉契数列函数
def fib(max):
n,a,b = 0,0,1
while n
fib(6)
用next()执行generator对象时候,遇到yield语句就会返回,再次执行从上次返回的yield向后执行
def odd():
print('step 1')
yield 1
print('step 2')
yield(3)
print('step 3')
yield(5)
o = odd()
print(next(o))
print(next(o))
print(next(o))
step 1
1
step 2
3
step 3
5
4、迭代器
直接作用于for循环的数据类型有以下几种:
(1)集合数据类型,如list、tuple、dict、set、str等
(2)生成器(generator)
以上都是可迭代对象(Iterable)。
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator
可以使用isinstance()判断一个对象是否为迭代器。
生成器都是迭代器对象,但list、dict、str是可迭代对象而非迭代器
将list、dict、str变为迭代器使用iter()函数
from collections.abc import Iterator
print(isinstance(iter([]), Iterator))
print(isinstance(iter('abc'), Iterator))
True
True