python代码学习——for循环和while循环
循环
1.循环的定义:重复做某件事情
2.执行循环存在触发条件,终止循环存在终止条件,没有终止条件的话就不能停止,此时循环体就会进入死循环。具体体现在while循环,for循环不会出现死循环
3.如果想要遍历一个范围区间的的元素,可使用for循环来进行遍历。遍历的定义:访问一个范围区间的每一个元素,按照顺序进行访问
1.for循环的语法及应用
for循环的语法——遍历字符串、列表
- for循环存在十分重要的一个作用:遍历区间范围中的每一个元素。
- for循环的语法:
for 变量 in 数据范围:
代码块
- 备注 :for循环语法的意思是:挨个访问数据范围中的每一个元素,然后赋值给变量。数据范围可以是列表、字符串、字典、元组或者range函数等
示例代码如下:
item_list = [12, 45, 67, 'python'] # 定义列表信息
for item in item_list: # 使用for循环遍历
print(item)
print(" == == == == == =也可以这样, 直接将列表、字符串等放在数据范围上 == == == == == == == =")
for item in [12, 45, 67, 'python']: # 使用for循环遍历
print(item)
print(" == == == == == =数据范围可以是嵌套列表,使用列表读取后遍历嵌套列表中的值 == == == == == == == =")
item_list = [[12, 45, 67, 'python'], [12, 55, 66, "njfnj"]] # 定义列表信息
for item in item_list[1]: # 使用for循环遍历
print(item)
print(" == == == == == =数据范围可以是字符串 == == == == == == == =")
item_list = "woaibei" # 定义字符串信息
for item in item_list: # 使用for循环遍历
print(item)
===================run_result================
12
45
67
python
== == == == == =也可以这样, 直接将列表、字符串等放在数据范围上 == == == == == == == =
12
45
67
python
== == == == == =数据范围可以是嵌套列表,使用列表读取后遍历嵌套列表中的值 == == == == == == == =
12
55
66
njfnj
== == == == == =数据范围可以是字符串 == == == == == == == =
w
o
a
i
b
e
i
for循环遍历字典
for循环遍历字典时:
- 遍历字典的key,使用字典名.keys()表示区间范围
- 遍历字典的值,使用字典名.values()表示区间范围
- 根据字典的key,来变量value
- 如果要遍历字典中的key和value,可使用字典名.items()表示区间范围
- 如果一个可变类型的序列,使用for循环遍历,不能一边遍历序列,一边给该序列增加或者删除元素,否则会报错;建议使用while True和break结合
- python3中,keys,values和items方法返回一个类似生成器的可迭代对象,不会把函数的返回结构复制到内存中,实际上是在原集合上进行迭代的
- python2中,上面的方法会返回一个新的列表,占据内存空间,因此python2建议使用iterkeys,itervalues,iteritems,这些方法返回的是一个迭代器,而不是一个copy。
具体的示例详见以下代码块
item_dict = {"name": "yezi", "code": "100", "sex": "girl"} # 定义字典
for key in item_dict.keys(): # 遍历字典的key并打印
print("only print key:",key)
for value in item_dict.values(): # 遍历字典的value,并打印
print("only print value:",value)
for item in item_dict: # 根据key来遍历字典的值
print("Print value based on key:",item_dict[item])
for value, key in item_dict.items(): # 遍历字典中所有的键值对
print("print value and key:",value, key)
===========run_result================
only print key: name
only print key: code
only print key: sex
only print value: yezi
only print value: 100
only print value: girl
Print value based on key: yezi
Print value based on key: 100
Print value based on key: girl
print value and key: name yezi
print value and key: code 100
print value and key: sex girl
使用如何生成一个整数序列?range
在pyhon中,如何自动生成一个整数序列?答:可使用range函数
- range函数存在三个参数,可生成一个指定范围的整数序列
- range(m,n,k)m=开头,n=结束,k=步长,遵循取头不去尾的规则,类似与字符串的切片
- 步长:可理解为等差数列
- 如果没有步长,则默认长度为1;如果没有开头,则默认从0开始
- range函数的值直接看不到,如果想看到这个函数的值,可将range函数的结果强制转换成列表即可
其示例代码块如下:
x = list(range(1,10,2)) # 生成1-10的数字序列,其间隔为2,转换数据类型为列表
y = list(range(2,5))#生成2-5的数字序列,间隔默认为1.转换数据类型为列表
z = list(range(5))#生成5个数的数字序列,默认从0开始,间隔为1,转换数据类型为列表
print(x,y,z)
for循环与range函数的结合使用
使用以下示范,来具体显示下for循环与range函数的使用
例:求1-100的和
思路:第一,想办法拿到1-100的整数,使用range函数。
第二,想办法把他取出来,使用for循环遍历后相加
sum = 0 #定义一个求和的变量
for item in range(1,101): #遍历1-101的整数序列(1,2,3^100)
sum+=item #循环体,sum = sum + item
print(sum)#打印sum
for循环的本质
在使用for循环的时候,其循环次数是由数据区间范围中的元素个数决定的
嵌套for循环
for循环中,如果存在在遍历一个区间范围的基础上,再去遍历另外一个区间,可使用嵌套for循环,例如:遍历一个excel表中单元格的元素或者九九乘法表,可使用以下例子来查看以下嵌套for循环:遍历嵌套列表中的每一个值
做嵌套循环的时候,最重要的是:找两者之间的关系之后,使用代码表达出来
item_list = [
[1, 2], # 列表
{"name": "yezi", "code": "100"}, # 字典
"hdv" # 字符串
]
for item in item_list: # 变量列表中的值后并打印
for value in item: # 遍历列表中嵌套区间的值并打印
print(value)
print(item)
例题:使用for循环实现九九乘法表
count = 0
for x in range(1,10):#外循环,for循环取x的值
for y in range(1,x+1):#内循环,for循环取y的值,根据range函数的性质,取值到x+1
count = x * y
print("{0} * {1} ={2}".format(x,y,count),end = " ")#end = “” 叫做每次循环之后不换行输出
print()#一个print语句,表示自动换行
打印菱形
例题:打印以下菱形:
*
***
*****
*******
*****
***
*
【思路】
行号 | 元素个数 | 前空格 | 总空格 |
---|---|---|---|
1 | 1 | 3 | 6 |
2 | 3 | 2 | 4 |
3 | 5 | 1 | 2 |
4 | 7 | 0 | 0 |
5 | 5 | 1 | 2 |
6 | 3 | 2 | 4 |
7 | 1 | 3 | 6 |
从上面标表格总可以看到,前空格数是对称的,总空格数是前空格数的两倍,因此在使用range函数的时候可以考虑对称,即以0为分界点向两边延伸,具体代码如下:
for i in range(-3,4):
if i<0:
count= -i
else:
count=i
print(" "*count + "*"*(7-count*2))
菱形变种题
打印以下图形
*
**
***
*******
***
**
*
【思路】
行号 | 元素个数 | 前空格 | 后空格 | 总空格 |
---|---|---|---|---|
1 | 1 | 3 | 3 | 6 |
2 | 2 | 2 | 3 | 5 |
3 | 3 | 1 | 3 | 4 |
4 | 7 | 0 | 0 | 0 |
5 | 3 | 3 | 1 | 4 |
6 | 2 | 3 | 2 | 5 |
7 | 1 | 3 | 3 | 6 |
从以上表格中可以看到,前空格的前三行每次递减,只0之后,固定为3,因此可使用if判断,前三行取绝对值之后乘空格,后三行乘3,中间直接使用*乘7,元素为每一行的中心值(4)减去后空格数即可,具体代码如下:
for i in range(-3,4):
if i < 0:
count = -i
print(" " * count + "*" *(4-count) )
elif i== 0:
print("*" * 7)
else:
count = i
print(" "* 3 + "*" * (4-count))
方法二:
for i in range(-3,4):
if i < 0:
count = -i
print(" " * count + "*" *(i+4) )
elif i== 0:
print("*" * 7)
else:
count = 3
print(" "* 3 + "*" * (7-(count+i)))
range函数和for的循环结合求立方
例如:计算1-10的立方和
item_list = [] #定义一个空列表
sum = 0 #定义sum初始值为0
for value in range(1,11): #for循环遍历1-10的数值
item_list.append(value ** 3) #得出1-10的立方值后添加进空列表\
for item in item_list:#遍历空列表中的值
sum += item #求和
item += 1 #遍历一次后,列表中的下标+1
print(item_list) #打印立方列表
print(sum)#打印和
for循环之立方、平方列表
平方/立方的列表可通过一句话来进行获得,格式如下:
[变量名 ** x for 变量名 in range(m,n,k)]
【备注】x代表几次方,m代表整数序列的初始值,n代表整数序列的结束值,k代表步长
如1-10的立方获得方式:
item = [ value ** 3 for value in range(1,11)]
print(item)
所以以上1-10的立方和代码可以优化为:
item_list = [ value ** 3 for value in range(1,11)]
sum = 0
for item in item_list:
sum +=item
item +=1
print(item_list)
print(sum)
求100000以内的所有素数
【思路】
- 素数只能被1和自己整除,因此要排除2之外的所有偶数,因此在最外层for循环时,步长为2,
- 求100000以内的,因为100000不是素数,因此边界可以直接赋值10万
- 10以内的奇数,除了9和10之外,都是素数,因此直接打印即可,因为已经打印,最外层for循环从11开始
- int((key0.5))+1 ,表示循环到这个数的(根号2+1)处,原因:假设一个数值为15,他的计算公式为:1X15 3X5 5X3 15X1,根号15的结果是3.87,那么直接计算1-3.87之间是否有整除的即可,3.87的int型为3,如果写在边界值会减1,因此直接使用int((key0.5))+1
- 因为分子全部是奇数,分母为偶数的话肯定不会整除,因此内循环的步长也为2
- 分子除以坟墓,如果可以整除,说明这个数不是素数,如果不能整除,说明这个数是素数,直接打印即可
#求100000以内所有的素数
print(1,2,3,5,7)
for key in range(11,100000,2):
for value in range(3,int((key**0.5))+1,2):
if key%value==0:
break
else:
print(key,end=" ")
猴子摘桃
问:猴子吃桃子:猴子摘了n个桃子,第一天吃了一半多一个,第二天吃剩下的一半多一个,以此类推,到了第10天就剩下一个,请问,猴子最初摘了多少个桃子?
【思路】
total = n 每天剩余:
1:n/2-1
2:(n/2-1)/2-1
3:((n/2-1)/2-1)/2-1
…
9.(((((((((n/2-1)/2-1)/2-1)/2-1)/2-1)/2-1)/2-1)/2-1)/2-1)=1
第9天已经剩下1个,第10天发现,因此一共迭代9次
因为计算剩余的时候,用的是:n/2-1,因此倒推时,计算公式为:(n+1)*2,推导公式:(n/2)-1 = n n+1 = n/2 n=(n+1)*2
代码如下:
n=1#第9天剩余的桃子数
for i in range(1,10):
n=(n+1)*2
print(n)
2.while循环的语法及应用
如何去记while循环?——答:记语法
- while 关键字 不能做标识符
- while 条件表达式 后面可以加条件表达式(比较运算,逻辑运算,成员运算,数据非空和空的情况考虑),其后可以加的表达式与if是一致的
while循环的语法及用法
while循环的格式及用法:
- 格式:
while 条件表达式:(冒号,下面的语句要放子代码,注意缩进)
你要循环的代码/循环体/执行语句
-
备注:while后面跟的可以理解为是布尔值(True或False)
-
用法:while 后面的条件成立就执行下面的代码,不成立就不执行
-
重点:每次执行完while下的子代码,后会重新判断while后面的条件,再决定是否执行
-
死循环的定义 死循环:只存在触发条件,没有终止条件的循环,一旦出现就会无休止的循环下去
-
如何来破解死循环? ——设置终止条件(break)或者加一个终止条件,一旦触发了终止条件,即可跳出循环
-
技巧:尽量不要让while后面一直是True,就是要比较的运算结果是可变的——>推荐使用
while死循环的示例代码
1.while死循环的代码:
while True:
print("这是一个死循环")
while循环的终止
while循环之break
while后面加break为终止条件的代码,while中,见break即跳出循环。出现break就直接跳出循环,不再执行循环体的任何代码
while True:
print("这是一个死循环")
break
备注:若以上代码是这样的,break在print之前,则print语句不会被执行
while True:
break
print("这是一个循环")
while循环之continue
在while语句中使用continue,可与break语句对比使用
- continue的意思结束本次循环,不执行continue下面的语句,返回执行下一次循环。
- 在while循环中,可添加一个变量(一般为比较运算)+终止条件(break、continue)来控制次数,推荐使用break
- 如果while与else结合使用,break语句在结束循环,else下面语句也不执行,但是continue语句在执行完while的循环后,执行else 后的语句
- 例如以下代码可对break和continue进行对比
代码如下:
a = 0
while a < 10:#判断a的值是否小于10
a += 1
if a % 2 == 0:#判断奇偶数,如果是偶数,跳过,是奇数,就打印
continue#返回至循环初始的地方继续执行,不执行循环体后面的语句
print("奇数:",a)
else:
print("偶数:",a)
print("=================分界线=================")
a = 0
while a < 10:
a += 1
if a % 2 == 0:
break #break 直接跳出循环,不再执行
print("奇数:",a)
else:
print("偶数:",a)
while循环之限制条件
while后面添加限制条件,一旦触发即可跳出循环,一般限制条件为比较运算,逻辑运算,成员运算等,例如让print语句打印10次
方式一:
count =1 #给count变量赋一个值
while 1: # while 后面跟while 后面跟所有非空的数据、非0的数据,都相当于True,和if一致
print("这是一个循环") #打印语句
count += 1 #打印之后,count值+1
if count > 10:#如果count=10
break#跳出循环
方式二:写代码的时候,进行不要让while后面的布尔值为True,例如,使用比较运算符使while后面的布尔值可变
i=1
while i <=10:#限制条件,i大于10即可跳出循环
i += 1
print("这是一个循环")
while循环的代码示例
例题1:使用while来编写求1-100的和
i=1 #定义变量i
sum = 0 #定义求和变量
while i <= 100: #使用for循环,计算循环次数
sum+=i #求和
i+=1 #求和一次,i+1
print(sum) #打印和
例题2:有一个字典: {“广东”:[“深圳”,“广州”,“阳江”], “湖南”:[“长沙”,“益阳”,“怀化”], “湖北”:[“武汉”,“襄阳”,“黄冈”]},
1.若你从控制台输入一个省份,根据你的省份判断 你可以选择哪些城市。
2.当你选择完毕后,就打印一个信息到控制台,告诉你,你选择了XX省份XX城市 。
3.如果省份不存在 或者是城市不存在 那么就告诉你 省份/城市输入错误,重新输入
4.如果不想在输入,输入值为q时,退出输入状态,结束循环
使用while循环的答案如下:
x = 0#给x赋值
y = 0#给y赋值
dict_province = {"广东":["深圳","广州","阳江"], "湖南":["长沙","益阳","怀化"], "湖北":["武汉","襄阳","黄冈"]}#字典变量
while x< 1:#while循环,因为0<1,所以结果必定为True
province = input("请输入省份:")
if province in dict_province.keys():#判断输入的省份
city_list = dict_province[province]#如果正确,将省份的列表赋值给变量
while y < 1:#判断y的值,因为0<1,所以结果必定为True
city = input("请输入城市:")
if city in city_list:#判断输入的城市是否在所选省份的列表中
print("您选择的是{0}省{1}市".format(province, city))#如果是,打印省份城市
break#城市输入正确后,执行break语句,直接跳出第二重循环
else:
print("城市错误,请重新输入")#如果不在,打印输出错误,重新开始循环
break#省份输入正确后,执行break语句,直接跳出第一重循环,判断城市
elif province == "q":#判断输入的是否为q
print("省份输入错误,直接退出")#是的话,打印语句
break#直接跳出第一重循环
else:
print("省份输入错误,请重新输入")
例题3:一个足球队在寻找年龄在10岁到12岁的小女孩(包括10岁和12岁)加入。编写一个程序,询问用户的性别(m表示男性,f表示女性)和年龄,然后显示一条消息指出这个人是否可以加入球队,询问10次后,输出满足条件的总人数。
注意:写代码的时候,需要注意一件事:思考这个功能我们会用到什么样的技术,然后再去理清逻辑写程序
思路:读题干,看到是否,会用到的技术是:if条件判断,询问用到的技术是input函数,询问10次,则使用循环,for与range结合 或者while与判断语句控制
if 女生 10-12:
可以加入
else :
不可加入
#以下是使用while来进行的代码
i = 0
x=1
while x<= 10:#while判断次数
sex = input("请输入您的性别:")#询问,获取性别信息
if sex == "f":#判断性别
age = int(input("请输入您的年龄:"))#询问,获取年龄信息,input获取为字符串,强制转换为int
if 10 <= age <= 12:#判断年龄
print("您可以参加球队")
i+=1#一个符合条件,i+1,用于统计最后符合的结果
else:
print("您不可以参加球队")#内判断,不符合条件,不可以参加
else:
print("您不可以参加球队")#外判断,不符合条件,不可以参加
x+=1#只要循环一次,变量+1,控制次数
print(x)
print("符合球队的人数为:{}人".format(i))
#以for和range函数来写的代码
count = 0
for i in range(0,10):#for循环判断次数
sex = input("请输入您的性别")
age = int(input("请输入您的年龄"))
if sex == "f" and 10<= age <=12: #上面代码使用的嵌套判断,也可以写成一个,使用and链接
print("您可以参加球队")
count += 1
else:
print("您不可以参加球队")
print("符合条件的人数为{}".format(count))
例题4:利用for循环,完成a=[1,7,4,89,34,2]的冒泡排序: 冒泡排序:小的排前面,大的排后面。
#冒泡排序
a=[1,7,4,89,34,2]
for x in range(1,len(a)):
for y in range(0,len(a)-x):
if a[y] > a[y+1]:
a[y],a[y+1] = a[y+1],a[y]
print(a)
例题5:万科笔试题:
有一组用户的登录信息存储在字典 login_ifno 里面,字典格式如下:login_info={“admin”:“root”,“user_1”:“123456”}。key表示用户名,value表示密码,请编写函数满足如下条件:
1)设计1个登陆的程序, 不同的用户名和对成密码存在个字典里面, 输入正确的用户名和密码去登陆,
2)首先输入用户名,如果用户名不存在或者为空,则一直提示输入正 确的用户名
3)当用户名正确的时候,提示去输入密码,如果密码跟用户名不对应, 则提示密码错误请重新输入。
4)如果密码输入错误超过三次,中断程序运行。
5)当输入密码错误时,提示还有几次机会
6)用户名和密码都输入正确的时候,提示登陆成功!‘’’
[备注]
1.“用户名不正确就一直提示请输入正确的用户名”意味着死循环,可使用while来实现
2.使用if来判断用户名是否正确,如果正确需输入密码,使用break跳出循环,错误时出现提示信息并重新输入用户名(while)
3.使用if来判断密码是否正确,如果正确则提示登录成功,如果错误,使用while判断密码疏忽如错误的次数,循环一次+1
4.当密码输入错误的次数等于3时,出现密码输入超过3次,没有机会登录,自动退出的提示,并使用break跳出循环
5.因为密码和用户名需要一一对应。所以使用==
而不是用 in
login_info={"admin":"root","user_1":"123456"}
a = 0
active = True#判断开关
while active:
user = input("请输入用户名:")
if user in login_info.keys():
while a<3:#判断密码可输入错误次数
a+=1
pwd = input("请输入密码:")
if pwd ==login_info[user] :
print("登陆成功")
active= False#登录成功,终止循环
break
elif a == 3:
print("您已经没有登录机会,自动退出")
active =False#密码输入三次,终止循环
break
else:
print("密码错误,请重新输入,您还有{}次机会".format(3-a))
else:
print("请输入正确的用户名")
循环的else子句
- 在for和while循环中,都可以使用else子句
- 在下面语法中,如果循环正常结束,就执行else语句,如果遇到break或者异常处理终止,else不会执行;详见下方截图
- 语法:
while中使用else子语句的用法:
while buer:
语句块
else:
语句块
============================
for 元素 in iteratable:
语句块
else:
语句块
- 代码示例:
data = [1,2,3,4,5]
for i in data:
print(i)
else:
print("i不在列表中,进入while循环")
while i<10:
i+=1
print(i)
else:
print("i大于10")
- 执行结果:
1
2
3
4
5
i不在列表中,进入while循环
6
7
8
9
10
i大于10