嵌套循环
假设外层循环的循环次数为 n 次,内层循环的循环次数为 m 次,那么内层循环的循环体实际上需要执行 n × m 次。
# 外层循环
for i in range(0, 5) :
j = 0
# 内层循环
while j < 3 :
print("i的值为: %d , j的值为: %d" % (i, j))
j += 1
其实不仅可以两层甚至三层、四层,都可以把内层循环当外层循环的循环体来对待就可以了。
for表达式
用于利用其他区间、元组、列表等可迭代对象创建新的列表。
for 表达式的语法格式 如下:
[表达式 for 循环计数器 in 可法代对象]
for 表达式和for循环之间的差别:
①在 for 关键字之前定义一个表达式,该表达式通常会包含循环计数器
②for 表达式没有循环体,因此不需要冒号。
for 表达式最终返回的是列表,因此 for 表达式也被称为列表推导式
a_range = range(10)
# 对a_range执行for表达式
a_list = [x * x for x in a_range]
# a_list集合包含10个元素
print(a_list)
解释:程序生成的a_list同样包含10个元素,每个元素都是a_range中每个元素的平方(由表达式x*x控制)
添加if判断,只迭代那些符合条件的元素
b_list = [x * x for x in a_range if x % 2 == 0]
# a_list集合包含5个元素
print(b_list)
将 for 表达式的方括号改为圆括号, for 表达式将不再生成列表,而是生成一个生成器 (generator),该生成器同样可使用 for 循环选代。这种 for 表达式也被称为生成器
# 使用for表达式创建生成器
c_generator = (x * x for x in a_range if x % 2 == 0)
# 使用for循环迭代生成器
for i in c_generator:
print(i, end='\t')
print()
for表达式也支持多层循环:
d_list = [(x, y) for x in range(5) for y in range(4)]
# d_list列表包含20个元素
print(d_list)
其中x可以迭代5次,y可以迭代4次。所以一共是20次 等同于如下:
dd_list = []
for x in range(5):
for y in range(4):
dd_list.append((x, y))
print(dd_list)
三层嵌套:
e_list = [[x, y, z] for x in range(5) for y in range(4) for z in range(6)]
# 3_list列表包含120个元素
print(e_list)
for表达式多层循环也支持添加if条件。
需求:程序要将两个列表种的数值按“能否整除”的关系配对在一起。
src_a = [30, 12, 66, 34, 39, 78, 36, 57, 121]
src_b = [3, 5, 7, 11]
# 只要y能整除x,就将它们配对在一起
result = [(x, y) for x in src_b for y in src_a if y % x == 0]
print(result)
常用工具函数
zip()函数可以把两个列表“压缩” 成一个 zip 对象(可迭代对象)。
zip()函数压缩的两个列表长度不相等, 那么 zip()函数将以长度更 短的列表为准。
zip()函数压缩得到的对象是由原列表元素组成的元组。
Python2.x的zip函数直接返回列表,而不是返回zip对象
Python2.x的zip函数返回的列表所包含的元素和Python3.x的zip返回的zip对象所包
含的元素相同。
zip()函数也可以压缩多个列表,压缩N个列表,zip函数返回的可迭代对象的元素就是
长度为N的元组。
a=['a','b','c','d','e']
b=['1','2','3']
print([x for x in zip(a,b)])
输出结果:
[(‘a’, ‘1’), (‘b’, ‘2’), (‘c’, ‘3’)]
a=['a','b','c','d','e']
b=['1','2','3']
c=['Hello','Word']
print([x for x in zip(a,b,c)])
输出结果:
[(‘a’, ‘1’, ‘Hello’), (‘b’, ‘2’, ‘Word’)]
reversed()可以将数可接收各种序列(元 组、列表、区间等)参数, 然后返回一个“反序排列”的法代器,该函数对参数本身不会产生任何影响
a=['a','b','c','d','e']
print([x for x in reversed(a)])
print(a)
#输出结果:
[‘e’, ‘d’, ‘c’, ‘b’, ‘a’]
[‘a’, ‘b’, ‘c’, ‘d’, ‘e’]
reversed()当然也可以对列表、元组进行反转。实现在不影响字符串本身的前提下,对字符串进行反序遍历。
#反转列表
b = ['a','fkit',20,3.4,50]
[x for x in reversed(b) ]
#输出结果:
[50,3.4,20,'fikt','a']
d='Hello World'
print([x for x in reversed(d)])
#输出结果:
[‘d’, ‘l’, ‘r’, ‘o’, ‘W’, ’ ', ‘o’, ‘l’, ‘l’, ‘e’, ‘H’]
sorted()函数, 返回一个对元素排序的列表;函数也不会改变所传入的可迭代对象, 该函数只是返回一个 新的、排序好的列表
e=[12,34,5,7,90,-23,56]
print(sorted(e))
print(e)
sorted()函数:reverse 参数,如果将该参数设置为 True,则表示反向排序
例如:sorted(a,reverse=True) a = [90,30,-1.2,3.6,3.5,-1.2]
也可根据字符串长度排序。该指定一个key参数,比如希望根据字符串长度排序,则可以key参数传入len函数。
f = ['banana','orange','apple']
sorted(f,key=len)
和sorted()函数结合,对可迭代对象按照由小到大的顺序进行遍历。
例如:
my_list = ['fkit', 'crazyit', 'Charlie', 'fox', 'Emily']
for s in sorted(my_list, key=len):
print(s)