1.切分
2.遍历
3.列表生成式
4.生成器
5.迭代器
1.切分
l = [1, 2, 3, 4, 5, 6]
# 取第0到第3个元素
print(l[0:3]) #[1, 2, 3]
print(l[:3]) #[1, 2, 3]
# 取倒数第0到第2个元素
print(l[-2:]) #[5, 6]
l1 = list(range(10))
# 前6个每隔2个取值
print(l1[:6:2]) #[0, 2, 4]
# 所有的数每隔3个取值
print(l1[::3]) #[0, 3, 6, 9]
# 原list不变
print(l1[:]) #[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 字符串的切分
s = "ABCDEFG"
print(s[:3]) #ABC
print(s[::2]) #ACEG
输出结果:
[1, 2, 3]
[1, 2, 3]
[5, 6]
[0, 2, 4]
[0, 3, 6, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
ABC
ACEG
相当于Java里的str.subString(start,end),包含头不包含尾。
2.遍历
l = [1, 2, 3, 4, 5, 6]
d = {"A": 1, "B": 2, "C": 3}
# 遍历list
for i in l:
print(i)
# 遍历dict的key
for j in d:
print(j)
# 遍历dict的value
for j in d.values():
print(j)
# 遍历dict的key和value
for j in d:
print(j, d[j])
# 遍历dict的key和value
for i, j in d.items():
print(i, j)
# 遍历字符串
s = "ABC"
for i in s:
print(i)
输出结果:
1
2
3
4
5
6
A
C
B
1
3
2
A 1
C 3
B 2
A 1
C 3
B 2
A
B
C
只要是可迭代数据类型,都可以使用for循环遍历,无需关心被迭代的对象是一个list还是dict或是String,可通过collections模块的iterable类型判断;
from collections import Iterable
print(isinstance(s, Iterable))
print(isinstance(123,Iterable))
输出结果:
True
False
3.列表生成式
# 生成1到10的list
print(list(range(1, 11)))
# 通过普通for循环生成1*1,2*2...10*10的list
l = []
for i in range(1, 11):
l.append(i * i)
print(l)
# 通过python生成式生成1*1,2*2...10*10的list
print([i * i for i in range(1, 11)])
# 生成式里加入条件判断
print([i * i for i in range(1, 11) if i % 2 == 0])
# for循环里套for循环
print([i + j for i in "ABC" for j in "123"])
import os
# 列出当前目录下的文件名
print([f for f in os.listdir('.')])
# 将一个list里的字母全部变小写
L = ['A', 'B', 'C', 1, 'D']
print([s.lower() for s in L if isinstance(s, str)])
输出结果:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
[4, 16, 36, 64, 100]
['A1', 'A2', 'A3', 'B1', 'B2', 'B3', 'C1', 'C2', 'C3']
['.git', '.idea', 'First.iml', 'learning.py', 'test1_1.py', 'test1_2.py', 'test1_3_list.py', 'test1_4_if.py', 'test1_5_map.py', 'test1_6_func.py', 'test1_7_dg.py', 'test2_1.py', 'test2_2.py', 'test2_3.py']
['a', 'b', 'c', 'd']
4.生成器
通过列表生成式创建列表如果生成一个很大的列表会占用很大的内存空间,如果创建后又只使用了前面几个元素会造成内存浪费,所以生成器就来了,生成器可以在循环的过程中通过推算得出下一个值,而不用直接生成一个完整的大list,在某些情况下会节省很多内存。
# 创建一个generator
g = (x * x for x in range(4))
# 获取generator生成的列表里的值
print(next(g), next(g))
# 通过迭代取值
for x in g:
print(x)
输出结果:
0 1
4
9
5.迭代器
可直接作用于for循环的数据类型有以下几种:
一类是集合数据类型,如list、tuple、dict、set、str等;
一类是Genarator和带yield的function;这些可用for循环迭代的对象统称为可迭代对象:Iterable;
Genarator不仅可以作用于for循环,还可以通过不断调用next()返回下一个值,这种可以被next()取值的对象就是迭代器:Iterator;
集合数据类型是可迭代对象,并不是迭代器,想将集合数据类型变成迭代器,可通过iter()函数
iter([1,2,3])