本次的内容将涉及for的循环,以及简单的列表内容
for的循环
1:回顾上期的while:
代码如下:
i = 1
while i < 11:
if i % 2 == 0:
print (i)
i +=1
print('循环结束')
输出结果为
2
4
6
8
10
循环结束
不做过多解释
****2:for 的简单使用
for i in 'python':
print(i)
输出结果为:
p
y
t
h
o
n
for后接的一个变量,把可迭(dié)代对象(字符串,元祖,列表,字典)里的元素依次赋给对象
for的循环和迭代对象长度有关
3:for的使用要求
代码1:
for i in 1234:
print(i)
1234为整数不满足可迭代对象的条件
运行报错
代码2:
for i in 12.34:
print(i)
12.34为浮点数,不满足可迭对象的条件
运行报错
!!!若要判断一类内容是否为 可迭代对象,可以使用
!!!dir函数查询
代码3:
dir查询对象方法的属性
print(dir(1234))
输出结果为:(即1234的可使用的方法):
[‘abs’, ‘add’, ‘and’, ‘bool’, ‘ceil’, ‘class’, ‘delattr’, ‘dir’, ‘divmod’, ‘doc’, ‘eq’, ‘float’, ‘floor’, ‘floordiv’, ‘format’, ‘ge’, ‘getattribute’, ‘getnewargs’, ‘gt’, ‘hash’, ‘index’, ‘init’, ‘init_subclass’, ‘int’, ‘invert’, ‘le’, ‘lshift’, ‘lt’, ‘mod’, ‘mul’, ‘ne’, ‘neg’, ‘new’, ‘or’, ‘pos’, ‘pow’, ‘radd’, ‘rand’, ‘rdivmod’, ‘reduce’, ‘reduce_ex’, ‘repr’, ‘rfloordiv’, ‘rlshift’, ‘rmod’, ‘rmul’, ‘ror’, ‘round’, ‘rpow’, ‘rrshift’, ‘rshift’, ‘rsub’, ‘rtruediv’, ‘rxor’, ‘setattr’, ‘sizeof’, ‘str’, ‘sub’, ‘subclasshook’, ‘truediv’, ‘trunc’, ‘xor’, ‘bit_length’, ‘conjugate’, ‘denominator’, ‘from_bytes’, ‘imag’, ‘numerator’, ‘real’, ‘to_bytes’]
可迭代对象的方法为:iter,显然是没有的
代码4:dir的查询
print(dir('1234'))
输出结果为:(即‘1234’可以使用的方法)
[‘add’, ‘class’, ‘contains’, ‘delattr’, ‘dir’, ‘doc’, ‘eq’, ‘format’, ‘ge’, ‘getattribute’, ‘getitem’, ‘getnewargs’, ‘gt’, ‘hash’, ‘init’, ‘init_subclass’,
‘iter’,
‘le’, ‘len’, ‘lt’, ‘mod’, ‘mul’, ‘ne’, ‘new’, ‘reduce’, ‘reduce_ex’, ‘repr’, ‘rmod’, ‘rmul’, ‘setattr’, ‘sizeof’, ‘str’, ‘subclasshook’, ‘capitalize’, ‘casefold’, ‘center’, ‘count’, ‘encode’, ‘endswith’, ‘expandtabs’, ‘find’, ‘format’, ‘format_map’, ‘index’, ‘isalnum’, ‘isalpha’, ‘isdecimal’, ‘isdigit’, ‘isidentifier’, ‘islower’, ‘isnumeric’, ‘isprintable’, ‘isspace’, ‘istitle’, ‘isupper’, ‘join’, ‘ljust’, ‘lower’, ‘lstrip’, ‘maketrans’, ‘partition’, ‘replace’, ‘rfind’, ‘rindex’, ‘rjust’, ‘rpartition’, ‘rsplit’, ‘rstrip’, ‘split’, ‘splitlines’, ‘startswith’, ‘strip’, ‘swapcase’, ‘title’, ‘translate’, ‘upper’, ‘zfill’]
而在这里我们就能找到iter,也就是说可以字符串类型可以作为可迭代对象。
3:range的使用
代码1:
for i in range(0,10):
print(i)
输出结果为:
0
1
2
3
4
5
6
7
8
9
通过range我们可以方便的使用数字!
再看一下输出的结果和指令,我们不难推断出range输出数字满足左输右不输的法则,
也就是数学上常说的左闭右开。
代码2:range的步增(step)
for i in range(0,11,2):
if i % 2 ==0:
print(i)
则输出结果为:
0
2
4
6
8
10
在range中前两位表示首位,最后一位表示中间的递进关系,通常默认为1
当我们修改为2,for作循环的每一步就会增加2
代码3:尝试做出下列代码的运算结果(巩固练习)
for i in range(1,12):
if i % 2==0 or i %3==0:
continue
else:
print(i)
分析:如果取余2或者取余3为0,则跳出循环,不再执行其他指令,返回开头,
也就意味着,在(1,10)(左闭右开)除去2和3整倍数字
所以输出结果:
1
5
7
11
代码4:尝试做出下列代码的运算结果(巩固练习)
for i in range(1,12):
if i % 2==0 or i %3==0:
continue
elif i % 4 ==0:
break
else:
print(i)
分析:在(1,12)(左闭右开)
当取余2或者取余3为0是时,跳出循环回到开头,
而elif取余4为0,其实是多余的条件,因为取余4为0,那么取余2必为0,所以在刚开始,也就是elif之前就跳出了循环,所以没有值满足elif的条件。
运行结果:
1
5
7
11
4:列表推导式
我们来看下面一个代码
for i in range (1,10):
if i % 2==0:
print(i)
这个代码很简单
输出结果为
2
4
6
8
如果我们修改这个代码
修改为:
for i in range (1,10):
if i % 2==0:
a = print(i)
print(a)
则输出结果为:
2
4
6
8
None
显然是不一致的,print只是单纯的输出函数,是不能去接收的,如果我们想接收些数字,只需要将这些数字放入一个容器中,然后print这个容器即可,这里我们通常创建一个列表。
li=[]
for i in range (1,10):
if i % 2==0:
li.append(i)
print(li)
列表的创建必须用中括号
append的意思将值添加到列表中(后面会讲到),
输出的结果当然也要以列表的形式,即:
[2, 4, 6, 8]
!!!
!!!
!!!!
列表的推导式:
其实就是上一个代码的简化
将for循环直接放入列表
li=[i for i in range (1,10) if i %2==0]
print(li)
我们观察到在for循环之前还有一个i,这个i不可缺少,这是后面for循环得到结果保存的位置
输出结果为
[2, 4, 6, 8]
列表推导式与三目运算的结合:
!!!
回忆三目运算:
a='晴天'
print('我们去打球吧') if a=='晴天' else print('那就不去了')
输出结果为:
我们去打球吧
结合范例:
print([i if i %2==0 else '*' for i in range (0,10)])
三目运算要放在列表式的前面(语法规则)
里面是一个列表,外边是一个print函数。
最开始的i还是最后得到的i保存位置
翻译下来就是,在(1,10)(左闭右开)如果i取余2为0,输出原数,否则输出*
输出结果:
[0, '*', 2, '*', 4, '*', 6, '*', 8, '*']