while循环的基本使用
程序的执行顺序分为三种:•顺序 ——从上向下,顺序执行代码
•分支 ——根据条件判断,决定执行代码的分支
•循环 ——让 特定代码 重复 执行
while循环最常用的应用场景就是 让执行的代码 按照 指定的次数重复 执行
简单练习:
'''
需求:
计算 1 ~ 100 之间所有数字的累计求和结果
使用while和for两种方式
'''
i = 1
# 定义变量保存和
sum = 0
while i<101:
sum = sum + i #非常重要的一种处理方式。
i += 1 # 修改循环变量
print(sum)
# python没有自增自减
###########用for的方式
sum = 0
for ele in range(1,101): # range(1,101)左闭右开
sum += ele
print(sum)
break和continue的使用
•break某一条件满足时,不再执行循环体中后续重复的代码,并退出循环
•continue某一条件满足时,不再执行本次循环体中后续重复的代码,但进入下一次循环判断,在整个循环中,只有某些条件,不需要执行循环代码,而其他条件都需要执行
例子:
'''
找出所有非3位回文数
'''
i=100
while i<1000:
bai=i//100
ge=i%10
zhongjianzhi=i
i+=1 #注意:使用 continue 时,条件处理部分的代码,需要特别注意,不小心会出现死循环
if bai==ge:
continue #若此处用pass,则i+=1可以放到最后
else:
print(zhongjianzhi)
'''
找到第10个5位数回文数
'''
i=10000
count=0 # 计数器,重要****,需要计数时会用到
while i<100000:
wan=i//10000
ge=i%10
qian=i%10000//1000
shi=i%100//10
if (wan==ge) and (qian==shi):
count+=1
if count==10 # 第一次满足这个条件就是第一个回文数
print(i)
break # 需要到第10次才会执行break,执行后跳出循环
i+=1
pass
一个空指令,什么都不执行。是为了保持程序结构的完整性
嵌套循环
例子:
# 打印从1到5 做3遍.********注意嵌套的例子最外面的一层表示做了几次,里面一层表示做什么
j = 1
while j < 4:
i = 1
while i < 6:
print(i)
i += 1
j += 1
嵌套循环练习:九九乘法表
lie=1
while lie<10:
hang=1
while hang<lie+1:
print('%d * %d = %d'%(lie,hang,lie*hang),end='\t')
# end=''表示不换行,\t 表示制表位,\n 表示换行, \r 表示回车 print指令如果不加后边end,默认换行
hang+=1
print()
lie+=1
for循环
•作用:遍历数据(**容器)**中的元素,任何可迭代的数据都能通过for循环遍历。字符串属于容器
例子:
#打印hello world中的每一个元素
str = 'hello world'
for ele in str:
print(ele)
in 和not in
Python in 操作符用于判断元素是否存在于容器中,如果在容器中,返回 true,否则返回 false
例子:
str = 'hello'
if 'h' in str: #判断字母是否属于字符串里
print('h' not in str)
#结果为False
for 循环中使用continue和braeak
•在for循环中也可以使用continue和break跳出循环,使用的方式和while循环一致,遍历字符串中的所有元素。
####用while的方式遍历字符串中的所有元素
str = 'hello world'
# 字符串长度
length = len(str) # 容器长度len()求取
i = 0
while i<length:
# 获取元素
ele = str.__getitem__(i) #或者用str[i]
print(ele)
# 修改变量
i += 1
循环综合练习
"""
打印字符串'hello world'中第三个'l'出现之前(不包含第三个'l')的所有元素
"""
str = 'hello world'
# 计数
count = 0 #注意计数的运用
for ele in str:
if ele == 'l':
count += 1
if count == 3:
break #break执行后立即跳出for循环结束程序
print(ele)
区间
•range()可创建一个整数列表,一般用在 for 循环中。左闭右开
区间操作
•获取区间中某一个元素_getitem_(角标)
•遍历区间 for ele in rang(1,101)
•判断某一个数是否在区间里面 if ele in rang(1,101): 在区间内的话返回Rure
循环总结
while循环和for循环区别:
•while循环是python中的条件循环语句
•for循环是python中的循环遍历语句
循环结合else
•else中的语句会在循环正常执行完(即 for 不是通过 break 跳出而中断的)的情况下执行,while循环也一样
•如果for循环中执行了break 那么else中代码将不会执行
循环结合else练习
'''
需求:
判断登录密码'hhew2383dW_fkf&E@^'是否合法
要求:
1. 密码必须是数字、字母(大小写都可以)、和下划线,否则不合法
2. 如果密码合法,就输出'密码合法,可以登录'(登录操作)
'''
pwd = 'hhew2383dW_fkf&E@^'
# 定义容器
str = '1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_'
# 计数器
count = 0
# 判断是否合法
for ele in pwd:
if ele not in str:
break
else:
print('可以登录')
# 判断合法字符个数
# count+=1
# if count == len(pwd):
# print('可以登录')
# else:
# print('不可以登录')
高级变量类型
包括:•列表•元组•集合•字符串•字典•公共语法
所有非数字型变量 都支持以下特点:
•都是一个序列 sequence,也可以理解为容器
•遍历for in
•计算长度、最大/最小值、比较、删除
•链接+ 和 重复 *
切片***
列表
专门用于存储一串 数据,存储的数据 称为 元素
列表增加,删除和修改元素,查询,排序和最值
增加
方法 | 说明 |
---|---|
append(数据) | 在末尾追加数据 |
insert(索引,数据) | 在指定位置插入数据(位置前有空元素会补位) |
extend(Iterable) | 将可迭代对象中 的元素 追加到列表 |
l.extend(ll) #在列表l后边加一个列表ll。或者理解为将列表11中的所有元素顺序添加到列表l的末尾
删除
方法 | 说明 |
---|---|
del 列表[索引] | 删除指定索引的数据 |
remove(数据) | 删除第一个出现的指定数据 |
pop() | 删除末尾数据,返回被删除的元素 |
pop(索引) | 删除指定索引数据 |
clear() | 清空列表 |
l=['李四','张三','李四']
l.remove('李四') #删除第一个李四
a=l.pop(index) #pop在删除指定元素后会有一个返回值,返回这个元素。
修改
方法 | 说明 |
---|---|
列表[索引] = 数据 | 修改指定索引的数据,数据不存在会报错 |
查询
方法 | 说明 |
---|---|
列表[索引] | 根据索引取值,索引不存在会报错 |
index(数据) | 根据值查询索引,返回首次出现时的索引,没有查到会报错 |
count(数据) | 数据在列表中出现的次数 |
len(列表) | 列表长度 |
if 数据 in 列表: | 检查列表中是否包含某元素 |
a=l.index('李四') #a=返回列表中‘李四’所在的索引号
排序
方法 | 说明 |
---|---|
sort() | 升序 |
sort(reverse=True) | 降序 |
reverse() | 逆序、反转 |
l = [6,3,2,8,1]
l.sort() #升序
maxValue = max(l) #最大值
最值
方法 | 说明 |
---|---|
max() | 最大值 |
min() | 最小值 |
列表练习:排序
冒泡排序
'''
有一个数字集合[9,8,7,6,5,4,3,2,1],请手动对这个集合正序排序(不要使用sort方法)
'''
l=[9,8,7,6,5,4,3,2,1]
i=0
while i<len(l)-1:
j=0
while j<len(l)-1-i: # 比较
a=l[j] ## 交换,核心算法是将里面的元素依次比较,并且对调次序
l[j]=l[j+1]
l[j+1]=a
j+=1
i+=1
print(l)
选择排序
l = [9, 99, 7, 105, 5, 120, 3, 2, 1]
i=0
while i<len(l):
minIndex=i # 假定最小值角标
j=i+1
while j<len(l):
if l[j]<l[minIndex] # 比较
minIndex=j # 改变角标
j+=1
# 一轮循环结束 确定最小值角标
# 交换设置的最小值和实际的最小值
# 认为的最小值l[i]
# 实际的最小值 l[minIndex]
l[i],l[minIndex]=l[minIndex],l[i]
i+=1
print(l)
列表嵌套
'''
一个学校,有3个办公室,现在有8位老师等待工位的分配,
请编写程序:
1. 完成随机的分配
2. 获取办公室信息 (每个办公室中的人数,及分别是谁)
3. 保证每个教室至少有一个人
'''
import random
classrooms=[[],[],[]] #创建嵌套的空列表
teacher=['q','w','e','r','t','y','u','i']
count=0
for room in classrooms: #先在每个教室随机分配一个人
index=random.randint(0,7-count)
room.append(teacher.pop(index)) #教师分配过之后下次不再参与分配,所以要删除分配过的人
count+=1
for ele in teacher:
classrooms[random.randint(0,2)].append(ele) #分配剩余的教师
for room in classrooms:
print('教室有%d人,分别为'%len(room),tuple(room))
列表总结
*****计数,累计相加,if执行优先条件,for和while里面的else
计数:
在循环中注意此类用法,在循环外设一个count变量,记录循环次数。count+=1
累计相加:
sum=sum+i
if执行优先条件:
if 语句执行条件应从上至下变大,上面的执行条件不能包含下面的情况。eg:<60,>=60 and <=70,>70。>70这个条件要在最上面。
for和while里面的else:
注意和if中的else区别,while没有执行时也会执行,while循环执行完也会执行,但while中break后不会执行,while中continue后还会执行。
'''列出1~1000内的所有素数-------for遍历,while循环,循环中的else,if语句综合应用'''
'''分析:遍历区间内的数并且以此除以除自身和1以为的数,如果能被整除则不是素数'''
for ele in rang(2,1000):
i=2
while i<ele:
if ele%i==0:
break
#print('不是素数')
i+=1
else: ###注意:此处while没有执行时也会执行,while循环执行完也会执行,但while中break后不会执行。
print(ele)
'''
需求:
判断登录用户名是否合法(不能用正则表达式)
用户名是数字字母或者_,需要在3到20位,必须有2个或以上大写字母,2个或以上小写字母,3个或以上数字
hhew2383dW_fkf&E@^
'''
str = "hhew2383dW_fkfE"
numberStr = '01234565789'
lowerStr = 'abcdefghijklmnopqrstuvwxyz'
upperStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
numberCount = 0
lowCount = 0
upperCount = 0
isLegel = True
for ele in str:
if ele in numberStr:
numberCount += 1
elif ele in lowerStr:
lowCount += 1
elif ele in upperStr:
upperCount += 1
elif ele == '_':
pass
else:
isLegel = False
# 判断
length = len(str)
if length>=3 and length<=20 and numberCount>=3 and lowCount>=2 and upperCount >= 2 and isLegel:
print('密码合法')
else:
print('密码不合法')