第四章 流程控制

流程控制

一、判断语句

1、if语句(单一条件分支)

  • 格式

    if 表达式:
        语句
    
  • 逻辑

    当程序运行到if语句时,首先计算“表达式”的值,如果“表达式”的值为真,则执行“语句”。如果“表达式”的值为假,则结束if语句继续向下执行

    特点 :只有条件为真才会走

  • 代码

    if 1:
        print("lucky is a good man")
        print("lucky is a nice man")
    
    if 1:
        print("lucky is a good man")
        # 语句嵌套
        if 1-1:
            print("lucky is a cool man")
    

2、if-else语句(双向条件分支)

  • 格式

    if 表达式:
        语句1
    else:
        语句2
    
  • 逻辑

    当程序运行到if-else语句时,首先计算“表达式”的值。如果“表达式”的值为真,则执行“语句1”,执行完“语句1”结束整个if-else语句继续向下执行。如果“表达式”的值为假,则执行“语句2”,执行完“语句2”结束整个if-else语句继续向下执行

  • 代码

    if 0:
        print("lucky is a good man")
    else:
        print("lucky is a nice man")
    

if语句的简写

num = 5
print("hello" if num==5 else "world")
1 if 5>3 else 0

3、if-elif-else语句(多向条件分支)

  • 格式

    格式:
    if 表达式1:
        语句1
    elif 表达式2:
        语句2
    elif 表达式3:
        语句3
    ……
    elif 表达式n:
        语句n
    else:
        语句e
    
  • 注意

    最后的else部分可有可无

  • 逻辑

    当程序运行到if-elif-else语句时,首先计算“表达式1”的值,如果“表达式1”的值为真则执行“语句1”,执行完“语句1”则结束整个if-elif-else语句继续向下执行。如果“表达式1”的值为假则计算“表达式2”的值,如果“表达式2”的值为真则执行“语句2”,执行完“语句2”则结束整个if-elif-else语句继续向下执行。如果“表达式2”的值为假则计算“表达式3”的值,如此直到某个表达式的值为假才停止,如果没有表达式为真且有else语句则执行“语句e”,否则结束整个if-elif-else语句继续向下执行

  • 代码

    从控制台输入一个数字,如果是1则输出星期一,2则输出星期二,依次类推

    num = int(input())
    
    # 全部使用if语句可以实现
    if num == 1:
        print("星期一")
    if num == 2:
        print("星期二")
    if num == 3:
        print("星期三")
    if num == 4:
        print("星期四")
    if num == 5:
        print("星期五")
    if num == 6:
        print("星期六")
    if num == 7:
        print("星期日")
    
    num = int(input())
    
    # 使用if-elif-else语句
    if num == 1:
        print("星期一")
    elif num == 2:
        print("星期二")
    elif num == 3:
        print("星期三")
    elif num == 4:
        print("星期四")
    elif num == 5:
        print("星期五")
    elif num == 6:
        print("星期六")
    elif num == 7:
        print("星期日")
    else:
        print("输入有误")
    

4、if-elif-else精髓

  • 精髓:每一个elif都是对它上面所有表达式的否定

从控制台输入一个年龄
小于等于0 输入有误
0~3 婴儿
4~8 童年
9~18 少年
19~29 青年
30~39 壮年
40~49 中年
50~150 老年
150以上 老妖怪


- 普通人刚学习编程写法

```python
age = int(input())

if age <= 0:
    print("输入有误")
elif 0 < age and age <= 3:
    print("婴儿")
elif 4 <= age and age <= 8:
    print("童年")
elif 9 <= age and age <= 18:
    print("少年")
elif 19 <= age and age <= 29:
    print("青年")
elif 30 <= age and age <= 39:
  print("壮年")
elif 40 <= age and age <= 49:
  print("中年")
elif 5 <= age:
    print("妖怪")
  • 体验精髓

    if age <= 0:
        print("输入有误")
    elif age <= 3:
        print("婴儿")
    elif age <= 8:
        print("童年")
    elif age <= 18:
        print("少年")
    elif age <= 29:
        print("青年")
    elif age <= 39:
      print("壮年")
    elif age <= 49:
      print("中年")
    else:
        print("妖怪")
    

二、循环语句

1、为什么要使用循环?

循环做某件事情

print("lucky is a good man")
print("lucky is a good man")
print("lucky is a good man")
print("lucky is a good man")
print("lucky is a good man")

2、while语句

  • 格式

    while 表达式:
        语句
    
  • 注意:如果条件为真就一直执行 也就是死循环

  • 逻辑

    当程序执行到while语句时,首先计算“表达式”的值。如果表达式的值为假则结束整个while语句继续向下执行,如果“表达式”的值为真则执行“语句”,执行完“语句”再次计算“表达式”的值。如果表达式的值为假则结束整个while语句继续向下执行,如果“表达式”的值为真则执行“语句”,执行完“语句”再次计算“表达式”的值。如此循环往复直到“表达式”的值为假才停止循环

  • 实现多次打印

    index = 0
    while index < 5:
        print("lucky is a good man", index+1)
        index += 1
    
  • 计算1+2+3+……+100的和

    5的和
    4的和+5
    3的和+4+5
    2的和+3+4+5
    1的和+2+3=4+5
    1+2+3+4+5

    sum = 0
    while num <= 100:
         sum = sum + num
         num += 1
    print("sum = %d"%sum)
    

打开程序异步模式

import os
  import time
  os.system("calc") #同步模式,一个程序执行结束,执行下一个
  os.system("start calc") #异步模式
  time.sleep(1) #暂停1秒

3、while-else语句

  • 格式

    while 表达式:
        语句1
    else:
        语句2
    
  • 逻辑

    当“表达式”的值为假时会执行“语句2”,执行完“语句2”结束整个while-else语句继续向下执行

  • 代码

    num = 1
    sum = 0
    while num <= 5:
         sum = sum + num
         num += 1
    else:
        print("%d不符合条件"%num)
    print("sum = %d"%sum)
    
  • whlie的简写

    flag = 1
    while (flag<=3): print ('欢迎');flag+=1
    

4、for语句

  • 格式

    for 变量名 in 集合:
        语句
    
  • 逻辑

    当程序执行到for语句时,按顺序从“集合”中获取元素,“变量”保存当前循环得到的集合中的元素值,再去执行“语句”。如此循环往复,直到取完“集合”中所有元素才停止

  • 实现多次打印

    for x in [1,2,3,4,5]:
        print("----------%d"%x)
    
  • range()

    原型:range([start, ]stop[, step])
    range(stop)
    range(start, stop)
    range(start, stop, step)
    功能:生成集合
    参数:
    start:表示列表起始值,包含, 默认为0
    stop:表示列表结束值,但是不包含
    step:阶跃值, 默认为1

    print(list(range(10)))
    print(list(range(1, 10)))
    print(list(range(1, 10, 2)))
    
  • 使用range()实现多次打印

    for x in range(5):
        print("lucky is a good man")
    
  • 计算1+2+3+……+100的和

    sum = 0
    for x in range(1, 101):
        sum += x
    print("sum = %d"%sum)
    
  • 遍历列表

    words = ["good", "nice", "cool", "handsome"]
    # 遍历列表,获取到的是列表中的元素的值
    for word in words:
        print(word)
    # 同时遍历列表的下标和元素
    for index, word in enumerate(words):
        print(index, word)
    

5、死循环

概念:条件始终为真的循环称为死循环

while 1:
    print("lucky is a good man")

三、关键字(pass&break&continue)

1、pass

作用:当语句要求不希望任何命令或代码来执行时使用

说明:

  1. pass语句表示一个空操作,在执行时没有任何的响应,pass的位置最终应该有代码来执行,只不过暂时写不出来
  2. 可以使用在流程控制和循环语句中
if 1:
    pass

2、break

作用:退出循环
注意:只能跳出距离最近的for或者while循环

  • for

    for x in range(10):
        if x == 5:
            # 结束循环(跳出循环)
            break
        print("x = %d"%x)
    
    for x in range(3):
        for y in range(5):
            if y == 3:
                break
            print("******", y)
        print("-------", x)
    
  • while

    while循环语句可以有else子句,表达式为假时会被执行,但是使用break终止while循环后else中的子句不执行

    num = 0
    while num < 8:
        print("num = %d"%num)
        num += 1
        if num == 8:
            break
    else:
        print("--------else")
    

3、continue

作用:跳过本次循环后面的剩余语句,然后继续下一次循环
注意:只能跳过距离最近的for或者while循环

  • for

    for x in range(10):
        if x == 5:
            continue
        print("x = %d"%x)
    
  • while

    num = 0
    while num < 10:
        if num == 5:
            num += 1
            continue
        print("num = %d"%num)
        num += 1
    

四、遍历字典和set集合

1、遍历字典

定义一个学生字典

stu = {"name": "lucky", "age": 18, "sex": "男", "height": 173.5, "weight":80, "id": 1}
  • for key in stu

    遍历字典的key

    for key in stu:
        print(key, stu[key])
    
  • for value in stu.values()

    遍历字典元素

    for value in stu.values():
        print(value)
    
  • for key, value in stu.items()

    遍历字典的Key和Value

    for key, value in stu.items():
        print(key, value)
    
  • for index, key in enumerate(stu)

    枚举遍历,可以得到类似下标的顺序值,但是注意,字典是无序的

    for index, key in enumerate(stu):
        print(index, key)
    

2、遍历set集合

定义一个集合

s = set([1,2,3,4,5])
  • for key in s

    for key in s:
        print("--------", key)
    
  • for index, key in enumerate(s)

    for index, key in enumerate(s):
        print(index, key)
    

五、案例

1、中奖的概率

import random
num = 432

# for i in range(100,500):
i= 0
while True:
    Winning = random.randrange(100,500) #产生一个区间范围的随机数
    I+=1
    if num == Winning:
        print("中奖了 中奖号码是{}".format(num))
        break
print(i)

2、求一个范围的 偶数 基数

#求偶数
for i in range(1,101):
    if(i%2==0):
        print(i)
#等同于
for  i  in range(1,101):
    if i%2==1:
        continue
    print(i)
#求基数
for i in range(1,101):
    if(i%2!=0):
        print(i)

3、淘汰某一行 淘汰某一列

for  i  in  range(8):
    if i == 5:#淘汰某一行
        continue
    for j  in  range(10):
        if j==5:  #淘汰某一列
            continue
        print(j, end=" ")
    print(' ')

4、 判断俩个数的大小 如果x>y 将俩个变量交换

x = 3
y = 1
if(x>y):
    z = x
    x = y
    y = z
print(x,y)
不使用临时变量

我们也可以不创建临时变量,用一个非常优雅的方式来交换变量:

x,y = y,x

5、猜数字

   num2 = 10.1
   while True:
   try:
       num = eval(input("请输入你要猜的数字"))
       if num == num2:
           print("您猜的真准")
           break
       elif num>num2:
           print("您输入的数字太大了")
       else:
           print("您输入的数字太小了")
   except:
       print("请输入正确的数字")

6、三角形

(1)、for实现左侧正三角形
#左侧正三角形
for j in range(1,10):
    for i in range(1,j+1):
        print(i,end='')
    print('')
(2)、for实现右侧正三角形
#右侧正三角形
for j in range(1,10):
    for x in range(1,10-j):
        print(' ',end='')
    for i in range(1,j+1):
        print(i,end='')
    print('')
(3)、for实现左侧倒三角形
#左侧倒三角形
mylist = list(range(1,10))
mylist.reverse()
for j in mylist:
    for i in range(1,j+1):
        print(i,end='')
    print('')
(4)、for实现右侧倒三角形
#右侧倒三角形
mylist = list(range(1,10))
mylist.reverse()
print(mylist)
for j in mylist:
    for x in range(1,10-j): #输出空格
        print(' ',end='')
    newlist = list(range(1,j+1))
    newlist.reverse()
    for i in newlist:
        print(i,end='')
    print('')
(5)、while实现左侧正三角形
#while三角形  左正三角形
j = 1
while j<=9:
    i = 1
    while i<=j:
        print(i,end='')
        I+=1
    j+=1
    print('')
(6)、while实现右侧正三角形
#右侧正三角形
j = 1
while j<=9:
    k = 1
    while k<=9-j:
        print(' ',end='')
        k+=1
    i = j
    while i>=1:
        print(i,end='')
        I-=1
    j+=1
    print('')
(7)、while实现左侧倒三角形
#左侧倒三角形
j = 9
while j>=1:
    i = 1
    while i<=j:
        print(i,end='')
        I+=1
    j-=1
    print('')
(8)、while实现右侧倒三角形
#右侧倒三角形
j = 9
while j>=1:
    k = 1
    while k<=9-j:
        print(' ',end='')
        k+=1
    i = j
    while i>=1:
        print(i,end='')
        I-=1
    j-=1
    print('')

7、猜21点游戏

import random,time
user1 = input('请输入玩家1的名称')
user2 = input('请输入玩家2的名称')
# 存储赢的次数的字典
user_info = {user1:{'win':0},user2:{'win':0}}
while True:
    computer1_num = random.randint(1, 10)
    computer2_num = random.randint(1, 10)
    # 获取俩个用户想要输入的数字
    user1_num = input('{}:请输入一个数字(按q退出游戏)'.format(user1))
    user2_num = input('{}:请输入一个数字(按q退出游戏)'.format(user2))
    # 如果有人输入了q则代表结束
    if user1_num == 'q' or user2_num == 'q':
        print('欢迎下次在玩')
        break
    user1_sum = int(computer1_num) + int(computer2_num) + int(user1_num)
    user2_sum = int(computer1_num) + int(computer2_num) + int(user2_num)
    print('底牌数字为:',computer1_num,computer2_num)
    if abs(user1_sum-21) > abs(user2_sum-21):
        print('{}:点数为:{} {}:点数为:{} 结果:{}获胜'.format(user1,user1_sum,user2,user2_sum,user2))
        user_info[user2]['win'] += 1
    else:
        print('{}:点数为:{} {}:点数为:{} 结果:{}获胜'.format(user1, user1_sum, user2, user2_sum, user1))
        user_info[user1]['win'] += 1
    print('计算机正在重新洗牌')
    time.sleep(2)

8、 登录

dbUserName = 'admin'
dbUserPass = '123456'

while True:
    loginName = input('请输入用户名') #动态获取用户名
    loginPass = input('请输入密码') #动态获取用户输入的密码
    state = 1 #给一个用户名的状态值 默认为1
    if loginName != dbUserName:  #判断用户名是否不存在
        print("该用户名不存在")
        state = 2

    if state == 1: #判断用户名的状态值 如果为1 证明 用户名正确 所以该判断下面的密码了
        if dbUserPass == loginPass: #判断密码是否正确
            print('欢迎',loginName)
            break
        else:
            print("请输入正确的密码")

           
#作业:加上验证码   验证码的要求 随机数(不能每次都是一样的)
dbUserName = 'admin'
dbUserPass = '123456'
while True:
    loginName = input('请输入用户名') #动态获取用户名
    loginPass = input('请输入密码') #动态获取用户输入的密码

    if loginName == dbUserName: #判断用户名是否和之前已经注册过的用户名相同(有人就是该用户是否存在)
        if loginPass == dbUserPass:#如果用户名正确 判断密码是否正确
            print("欢迎",loginName)
            break #r如果密码正确跳出循环体
        else:
            print("请输入正确的密码")
    else:
        print("该用户不存在!请输入正确的用户名")

print("我是登录成功以后的内容")

9、 阶乘

# 通过用户输入数字计算阶乘
 
# 获取用户输入的数字
num = int(input("请输入一个数字: "))
factorial = 1
 
# 查看数字是负数,0 或 正数
if num < 0:
   print("抱歉,负数没有阶乘")
elif num == 0:
   print("0 的阶乘为 1")
else:
   for i in range(1,num + 1):
       factorial = factorial*i  =1*1*2*3*4
   print("%d 的阶乘为 %d" %(num,factorial))

10、使用系统命令 拿while循环

import os
while True:
cmd = input("cmd")
if cmd=="记事本":
    os.system("notepad")
elif cmd=="进程":
    os.system("tasklist")
elif cmd=="退出":
    break
else:
    os.system("echo  other")

11、冒泡排序

冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端。

bubbleSort.gif
def bubbleSort(arr):
    n = len(arr)
 
    # 遍历所有数组元素
    for i in range(n):
 
        # Last i elements are already in place
        for j in range(0, n-i-1):
 
            if arr[j] > arr[j+1] :
                arr[j], arr[j+1] = arr[j+1], arr[j]
 
arr = [64, 34, 25, 12, 22, 11, 90]
 
bubbleSort(arr)
 
print ("排序后的数组:")
for i in range(len(arr)):
    print ("%d" %arr[I]),

执行以上代码输出结果为:

排序后的数组:
11
12
22
25
34
64
90

12、判断闰年

闰年的判定方法:

①、普通年能被4整除且不能被100整除的为闰年。(如2004年就是闰年,1900年不是闰年)

②、世纪年能被400整除的是闰年。(如2000年是闰年,1900年不是闰年)

year = int(input("输入一个年份: "))
if (year % 4) == 0:
   if (year % 100) == 0:
       if (year % 400) == 0:
           print("{0} 是闰年".format(year))   # 整百年能被400整除的是闰年
       else:
           print("{0} 不是闰年".format(year))
   else:
       print("{0} 是闰年".format(year))       # 非整百年能被4整除的为闰年
else:
   print("{0} 不是闰年".format(year))
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,427评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,551评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,747评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,939评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,955评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,737评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,448评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,352评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,834评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,992评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,133评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,815评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,477评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,022评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,147评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,398评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,077评论 2 355

推荐阅读更多精彩内容