1.for i in xxx
xxx: 序列(列表,元祖,字符串)
xxx: 可迭代对象
>>> for i in "abc":
... print(i) #对字符串做了一次遍历
... # i是变量,也可以用别的字符
a
b
c
第一次:取a存到i里面,然后执行for的代码块
第一次:取b存到i里面,然后执行for的代码块
第一次:取c存到i里面,然后执行for的代码块
>>> for x in ["s",1.4,{1:2}]: #对列表做了一次遍历
... print(x)
...
s
1.4
{1: 2}
>>> sum=0
>>> for i in s:
... print("i的取值:",i) #输出简洁明了的格式
... sum+=i
... print("sum的临时计算结果:",sum) #输出简洁明了的格式
...
i的取值: 1
sum的临时计算结果: 1
i的取值: 2
sum的临时计算结果: 3
i的取值: 3
sum的临时计算结果: 6
i的取值: 4
sum的临时计算结果: 10
2.in
>>> "a" in [1,2,3,4]
False
>>> "a" in (1,2,3,4)
False
>>> "a" in "absflasjg"
True
3.not in
>>> "a" not in [1,2,3,4]
True
>>> "a" not in (1,2,3,4)
True
>>> "a" not in "absflasjg"
False
4. range()
>>> range(10) #range(10),默认从0开始
range(0, 10) #生成一个类实例的文档字符串,在内存中进#存放的是一个类,较python2节省内存。动态管理数据,仅在使用数据时生成数据。
>> list(range(1,20))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] #快速生成连续列表的方法,list,强制转换
>>> for i in range(5):
... print(i) #实现了对range(5)的遍历,0,1,2,3,4
...
0
1
2
3
4
>>> for i in range(2,5): #range(2,5),从2开始
... print(i)
...
2
3
4
>>> range(1,11,2) #[1,11)内步长为2,
>>> list(range(2,11,2))
[2, 4, 6, 8, 10]
>>> for i in range(2,11,2):
... print(i) #输出2,4,6,8,10
...
2
4
6
8
10
5.while xxx:
xxx是true,就会执行下面的代码块
注意:能用for就不用while.
原因:while太复杂
举例:循环3次
>>> for i in range(3): #for循环2行搞定
... print(i)
...
0
1
2
>>> a=0
>>> while a<3: #while循环4行解决。需要实现声明一个变量,
... print(a) #并且随着循环,变量的值也要动态变化
... a+=1
...
0
1
2
必须使用while的情况:死循环
>>> while 1:
... print("8")
...
8
8
8
6.break #彻底结束循环(对for与while均生效)
>>> for i in range(10):
... if i==3:
... break #i ==3时,彻底结束循环,所以结果未打印3
... print(i)
...
0
1
2 #结果到2为止
7.continue:(结束本次循环)
>>> for i in range(10):
... if i==3:
... continue #当前i==3循环和后面代码均不执行,所以结果未打
... print(i) #印3,开始下次循环
...
0
1
2 #结果中无3
4
5
6
7
8
9
8.no break #循环语句未执行任何break语句,便会执行no break
#该语句是python特有的
>>> for i in range(3):
... print(i) #此循环未执行任何break语句
... else:
... print("no break")
...
0
1
2
no break #所以会执行no break
>>> for i in range(3):
... print(i)
... if i==3:
... break #此种情况虽然有break语句,但是i==3未执行到
... else: #所以依然会执行no break
... print("no break")
...
0
1
2
no break
>>> for i in range(5):
... print(i)
... if i==3:
... break #当i==3时,彻底结束循环,break下面的均未执行
... else:
... print("no break")
...
0
1
2
3 #输出结果仅有0,1,2,3
>>> for i in range(5):
... print(i)
... if i==3:
... continue
... else:
... print("no break")
...
0
1
2
3 #print(i)在判断i==3前面,所以会输出3
4
no break #continue对no break无效,依然会执行no break
总结:
只要循环体内没有执行break就会执行else部分的代码
小知识:
1.调试技巧
1) 把所有的变量值打印出来
2) 把中间临时计算的结果打印出来
3) 把每一个中间临时计算的结果和你期望的结果进行比对,结果发现不一致,就定位到问题所在。
2.模板字符串%d,%s
1) %d:整型占位符
>>> a=int(input("请输入一个数字:"))
请输入一个数字:8
>>> "%d is a number" %a #%a %d限定了a必须是个数字,不能是字符串
'8 is a number' #等类型
>>> a=input("请输入一个数字:")
请输入一个数字:5
>>> "%d is a number" %a #%a 此处a是个字符串,故会报错
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: %d format: a number is required, not str
2) %s:万能占位符
>>> "%s is a number" %"早上好" #%s是万能占位符,后面可以是str
'早上好 is a number'
>>> "%s is a number" %{1:2} #也可以是dict
'{1: 2} is a number'
>>> "%s is a number" %1.2 #也可以是float
'1.2 is a number'
>>> "%s is a number" %3 #也可以是int
'3 is a number'
>>> "%s is a number" %"早上好".encode("gbk") #也可以是bytes
"b'\xd4\xe7\xc9\xcf\xba\xc3' is a number"
3.大数据处理的思想
以前小数据处理数据,有两种方式:
1) 把所有的数据放到内存里面处理
2) 用到数据,取什么数据就把数据放到内存中
大数据处理的思想:
2) 每次处理一部分数据,处理完了就把数据从内存清除出去
range(10)
在python3中就是使用的大数据处理的思想,每次遍历的时候,动态的生成数据
在python2中使用的是小数据处理数据的方式,直接生成所有数据。
4.类:
类不是序列,也不一定是可迭代对象
类中都会默认自带两个方法:
__iter__()
__next__()
实现了如上方法,就是可以迭代的对象。
5.用到死循环的经典场景
1) 服务器端:一般死循环
你可以不来,(服务器端)我在死等。不操作不能无响应
2) 你也不知道循环多少次,就要用死循环。(输入数字游戏)
6.continue与break的区别
break:彻底结束循环(对for与break均生效)
continue:结束本次循环,开始下一次循环
小练习1:
使用for循环,求列表[1,2,3,4]所有元素的和
>>> s=[1,2,3,4]
>>> sum=""
>>> sum=0
>>> for i in s:
... sum+=i
...
>>> print(sum)
10
小练习2:
列表[1,2,3,4,5,7],你输入一个数字,判断一下是否在这个list中,执行3次这个逻辑。
算法:
1.输入一个数据,存到某个变量里面
2. 判断在不在这个列表里
3. 在就打印一下,不在也打印一下
4. 循环3次截止
自己的程序:
>>> s=[1,2,3,4,5,7]
>>> a=input("请输入一个数字:")
请输入一个数字:10
>>> for i in range(3):
... if a in s:
... print("输入的数字在s中")
... else:
... print("输入的数字不在s中")
...
输入的数字不在s中
输入的数字不在s中
输入的数字不在s中
该程序的错误为:循环3次理解错误。并不是输入一次数值后便判断3次,无任何意义。正确的应该是输入1次数值,判断结果并输出。循环执行3次。
更改后的程序为:
>>> s=[1,2,3,4,5,7]
>>> for i in range(3):
... a=int(input("请输入一个数值:")) #input语句执行完毕后的类型均是str
... if a in s: #判断a是否在s中
... print("a在s中")
... else:
... print("a不在s中")
...
请输入一个数值:4
a在s中
请输入一个数值:3
a在s中
请输入一个数值:8
a不在s中
注意:
- 需要将输入的数字转换为int类型,否则输入任何数值其类型均是str,输出结果均是False
>>> s=[1,2,3,4,5,7]
>>> for i in range(3):
... a=input("请输入一个数值:") #未经过强制类型转换
... if a in s: #判断str在list中
... print("a在s中")
... else:
... print("a不在s中")
...
请输入一个数值:3 #虽然输入的数字是3,但是为str类型,所
a不在s中 #以所有的结果均是False
请输入一个数值:4
a不在s中
请输入一个数值:5
a不在s中
- a=int(input("请输入一个数值:"))
该代码健壮性差,如果输入的内容不是数字,就会报错。稍后会学习异常处理。
>>> s=[1,2,3,4,5,7]
>>> for i in range(3):
... a=int(input("请输入一个数值:"))
... if a in s:
... print("a在s中")
... else:
... print("a不在s中")
...
请输入一个数值:5
a在s中
请输入一个数值:8
a不在s中
请输入一个数值:a
Traceback (most recent call last): # a=int(input("请输入一个数值:"))
File "<stdin>", line 2, in <module> #限制了输入的内容必须为int
ValueError: invalid literal for int() with base 10: 'a'
小练习3:
输入数字,判断是奇数还是偶数。当输入的数据是100的时候,结束死循环。
程序:
>>> a=input("请输入一个数字:")
请输入一个数字:67
>>> while int(a)%2==0:
... if int(a)==100:
... break;
... else:
... print("请再次输入")
...
输入67后一直死循环在“请再次输入”。明显“请输入一个数字”的位置不对
改进程序:
>>> while 1:
... a=int(input("请输入一个数字:")) #输入数字的程序在循环中
... if a%2==0:
... if a==100: #判断==100的程序在前面
... break #break 结束死循环
... else:
... print("%s 是偶数" %a)
... else:
... print("%s 是奇数" %a)
...
请输入一个数字:89
89 是奇数
请输入一个数字:67
67 是奇数
请输入一个数字:45
45 是奇数
请输入一个数字:100 #输入100后自动退出循环,没有打印10偶数,原因为==100的位置不同,输出便不同
老师的程序:
>>> while 1:
... a=int(input("请输入一个数字:"))
... if a%2==0:
... print("%s 是偶数" %a)
... else:
... print("%s 是奇数" %a)
... if a==100: #a==100的条件判断偶数判断后,自然会输出
... break #100是偶数后,结束
...
请输入一个数字:67
67 是奇数
请输入一个数字:89
89 是奇数
请输入一个数字:78
78 是偶数
请输入一个数字:100
100 是偶数