• 第二篇 流程控制


    一. if 条件语句

    基础语法1:

    if C1:
        pass1
    else:
        pass2
    
    当条件C1满足时,执行pass1部分;
    当条件不满足C1时,执行pass2部分

    基础语法2:

    if C1:
        pass1
    #  elif是分支语句,是不限制数量的,可以有多个
    elif C2:
        pass3
    else:
        pass2

    练习:随机生成一个数字,你猜这个数字是多少

    生成随机数字,要用到random模块,需要先import random 进行导入

    random.randint(0,100):在0,100区间内生成随机整数

    import random
    score = random.randint(0,10)
    data = int(input("请输入一个0~10的数字,我跟你比大小
    "))
    if score == data:
        print("恭喜,你猜中了")
    elif score > data:
        print("哈哈,你猜的数小了,我的数字是{},你猜的数字是{}".format(score,data))
    else:
        print("你猜的数大了些哦,我的数字是{},你猜的数字是{}".format(score,data))

    bool()函数:判断值是True 还是 False

    可以认为所有空的,其值都是false
    # 空的值都是faise:0,None,"",(),{},[],False,
    print(bool(0))
    print(bool(""))
    print(bool({}))
    print(bool(()))
    print(bool([]))
    print(bool(None))
    print(bool(False))
    
    #非空的其值是TRUE
    print(bool(" "))  # 空格
    print(bool("0.0"))
    
    
    #输出
    False
    False
    False
    False
    False
    False
    False
    True
    True

    boo()函数的作用:

    1. 判断值是true 还是 false

    2. 当条件语句没有按照你预期执行时,可以在前面加个bool()函数,打印出来看表达式的值是否满足

    import random
    score = random.randint(0,10)
    data = int(input("请输入一个0~10的数字,我跟你比大小
    "))
    
    print(bool(score == data))
    print(bool(score > data))
    
    if score == data:
        print("恭喜,你猜中了")
    elif score > data:
        print("哈哈,你猜的数小了,我的数字是{},你猜的数字是{}".format(score,data))
    else:
        print("你猜的数大了些哦,我的数字是{},你猜的数字是{}".format(score,data))
    # 练习
    '''
    学习成绩>=90分的同学用A表示,60~89分用B表示,60分以下用C表示
    '''
    
    score = float(input("请输入你的分数:"))
    if score >89:
        print("A")
    elif 60<=score<=89:
        print("B")
    else:
        print("C")
    
    '''
    个人所得税
    '''
    
    salary = float(input("请输入你的工资:"))
    taxPay = salary - 3500
    
    if taxPay <= 1500:
        print("应纳税额为{}".format(taxPay*0.03 - 0))
    elif  1500<taxPay<=4500:
        print("应纳税额为{}".format(taxPay*0.1 - 105))
    elif  4500<taxPay<=9000:
        print("应纳税额为{}".format(taxPay*0.2 - 555))
    elif  9000<taxPay<=35000:
        print("应纳税额为{}".format(taxPay*0.25 - 1005))
    elif  35000<taxPay<=55000:
        print("应纳税额为{}".format(taxPay*0.3 - 2755))
    elif  55000<taxPay<=80000:
        print("应纳税额为{}".format(taxPay*0.35 - 5505))
    elif  80000<taxPay:
        print("应纳税额为{}".format(taxPay*0.45 - 13505))

    二. 循环语句

    关键词:while...else... ; for...esle...;  break; continue;

    1. while循环

    基础语法1

    while contition:
        statement1

    基础语法2:while循环里加了一个else,这个是与其他语言不同的

    while contition:
        statement1
    
    else:
        statement2

    while循环退出的条件:

    1. while后面的条件表达式为false,就退出

    2. 循环语句块里面有break,当break条件满足时退出

    while contition:
        statement1
        break
    # 输入一个随机数,猜数字,猜中了就停止,没猜中就一直猜
    # 方式1
    while True: score = random.randint(0, 10) data = int(input("请输入一个0~10的数字,我跟你比大小 ")) if score == data: print("恭喜,你猜中了") break elif score > data: print("哈哈,你猜的数小了,我的数字是{},你猜的数字是{}".format(score,data)) else: print("你猜的数大了些哦,我的数字是{},你猜的数字是{}".format(score,data))
    # 方式2
    import random
    
    while True:
        score = random.randint(0, 10)
        data = int(input("请输入一个0~10的数字,我跟你比大小
    "))
        if score == data:
            print("恭喜,你猜中了")
            break
        else:
            print("我的数字是{},你猜的数字是{}".format(score,data))

    while ... else...语句练习

    1. 始终执行else语句,循环没有break

    count = 0
    
    while count < 10:
        count +=1   # count = count + 
    print(count)

    else:
    print("这里是else语句:{}".format(count))
    
    # 输出
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    这里是else语句:10
    # print语句的位置不同,所得到的结果也不同,注意体会
    
    count = 0
    
    while count < 10:
        print(count)
        count +=1   # count = count + 1
    else:
        print("这里是else语句:{}".format(count))
    
    # 输出
    0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    这里是else语句:10

    2. 不执行else语句,循环被break中断后,不再执行else

    上面两个例子都执行了else语句,那什么时候不会走到else语句里呢?

    # 什么时候不会走到else语句里面呢?
    count = 0
    
    while count < 10:
        print(count)
        count +=1   # count = count + 1
        if count > 6:
            break
    else:
        print("这里是else语句:{}".format(count))
    
    #输出
    0
    1
    2
    3
    4
    5
    6

    2. for 循环

    for循环与while循环的区别:

    1. while循环只要条件满足一直可以循环下去

    2. for循环,采用的是遍历机制,有多个少条件满足就循环多少次

    基础语法1:

    for data in iterator:
        statement1

    基础语法2:

    for data in iterator:
        statement1
        
    else:
        statement2

    基础语法3:

    for data in iterator:
        statement1
        break
    
    # for循环里有break,条件满足是就不执行else部分了
    else:
        statement2

    range()函数:

    print(list(range(3)))        # 第一个参数没有指定,默认是0开始
    print(list(range(1,10)))     # 最后一个10不计算在内
    print(list(range(1,10,2)))   # 2 表示步长,即每隔2位取一个数
    
    # 输出
    [0, 1, 2]
    [1, 2, 3, 4, 5, 6, 7, 8, 9]
    [1, 3, 5, 7, 9]

    练习:把上面的while循环改成for循环

    1. 执行else语句

    count = 0
    
    for count in  range(5):
        print(count)
        count +=1   # count = count + 1
    else:
        print("这里是else语句:{}".format(count))
    
    # 输出
    0
    1
    2
    3
    4
    这里是else语句:5
    

    2. for循环中条件满足break语句后,不执行else语句

    count = 0
    
    for count in  range(5):
        print(count)
        count +=1   # count = count + 1
        if count > 4:
            break
    else:
        print("这里是else语句:{}".format(count))
    
    #输出
    0
    1
    2
    3
    4

    3. Continue

    当continue被执行后,直接就会进入下一次循环,之后的逻辑就不会被再次执行了

    for i in range(10):
        if i % 2 == 0:
            continue
        print(i)
    
    # 解释
    '''
    当i=0时,0 除以2的余数是0,满足if语句,if语句中的逻辑是continue,所以直接进行下一次循环,而不执行print语句
    当i=1时,1 除以2的余数是1,不满足if语句,if语句中的逻辑不被执行,执行print语句,打印1
    当i=2时,2 除以2的余数是0,满足if语句,if语句中的逻辑是continue,所以直接进行下一次循环,而不执行print语句
    ...
    ''' # 输出 1 3 5 7 9

    循环练习

    1. 有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?分别是多少?

    count = 0
    for baiwei in range(1,5):
        for shiwei in range(1,5):
            for gewei in range(1,5):
                if baiwei == shiwei or baiwei == gewei or shiwei == gewei:
                    continue
                count +=1
                print("{0}{1}{2}".format(baiwei,shiwei,gewei))
    
    print("不重复的数字一共有{}个".format(count))

    2. 有一分数序列:2/1 、3/2 、5/3、8/5、13/8、21/13....求出这个数列的前20项之和

    方面1:通过中间变量的方式

    fenzi,fenmu = 2,1
    result = 0
    for i in range(1,21):
        result += fenzi/fenmu
        # 这里需要用到一个临时变量,把前一个分式的分子临时存下来
        temp = fenzi
        fenzi = fenzi+fenmu  # 如果上面不用临时变量存,这里就会改变分子的值了,那么下一个数据的分母就不是上一个数的分子了
        fenmu = temp
    print(result)

    方法2:不用中间变量的方式

    result,fenzi,fenmu = 0, 2, 1
    for i  in range(20):
        result += fenzi/fenmu
        # 把他们写在一行,这里就是同时赋值了
        fenzi,fenmu  = fenzi+fenmu,fenzi
    print(result)

    3. 输入字符串,判断是否为回文

    方法一:for...else...

    '''
    解法思路:
    1. 先求出字符串的长度:len()
    2. 取字符串的第一个字母和最后一个字母一次比对
    3. 如果所有字符串都相同,就一直比对,循环比对完了,没有执行到if语句块里去,就是回文,否则就不是回文
    4. 字符串从前往后取,是从索引0开始的;而从后往前取,是从索引-1开始的
    
    '''
    data = input("请在下方输入一个英文字符串:
    ")
    for i in range(len(data)):
        if data[i] != data[-(i+1)]:  # 难点在这里,怎么样从后往前取字符串的字母
            print("这个不是回文")
            break
    else:
        print("这个是回文")

    方法二:切片的反转方法

    切片基础知识

    data = "abcdefghigk"
    
    print(data[0:5])  # abcde  顺序取到第5个
    print(data[0:5:2]) # ace   隔两个取一次
    print(data[:5:2]) # ace   开头不写,默认是从索引0开始,隔两个取一次
    print(data[::2]) # acegik   开头和结尾都不写,默认是从索引0开始,取到最后一个,隔两个取一次
    print(data[::-1]) # kgihgfedcba   开头和结尾都不写,默认是从索引-1开始往前取,相当于就是把字符串翻转了
    
    print(data[5:0:-1]) # fedcb   从第五个开始,取到0截止,-1 代表的是往反方向取
    data = input("请在下方输入一个英文字符串:
    ")
    
    if data == data[::-1]:
        print("是回文")
    else:
        print("不是回文")

     练习:写程序破解下面的密码

    明文 密文
    abc  bcd
    wxy xyz
    请问这里明文是什么? cfmjfwf!zpvstfmg"

    需要知识点:

    ord()函数:查看字符的十进制值

    chr()函数:查看数字对应的字符

    # ord是查看字符的十进制值
    print(ord('A'))
    # chr是查看数字对应的字符
    print(chr(97))
    
    
    # 65
    # a
    '''
    解题:根据给出的两个明文和密文,密文是在明文的基础上+1个字符得到的
    推断:
    1. 先遍历取到密文的所有单个字符,用ord()函数查找到对应的十进制数字
    2. 对该十进制数字-1,用chr()函数查找到该十进制数字对应的字符
    3. 让后把这些字符拼接起来
    '''
    
    方法1:join()方法
    miwen = 'cfmjfwf!zpvstfmg"'
    li=[]
    for x in miwen:
        y = chr(ord(x)-1)
        li.append(y)
    print("".join(li))
    
    
    方法2:字符串拼接
    miwen = 'cfmjfwf!zpvstfmg"'
    y=''
    for x in miwen:
        y += chr(ord(x)-1)
    print(y)
    miwen = 'cfmjfwf!zpvstfmg"'
    for x in miwen:
        print(chr(ord(x)-1), end="")
    
    # 利用print()函数,end参数实现拼接

    三. 异常(Exception)

    不符合程序预期或者程序处理不了,需要进行异常处理。

    基础语法1

    try:
        可能存在异常的程序
    except Exception:
        statement2
    else:
        statement3
    finally:
        statement4
    raise Exception

    基础语法2

    try:
        可能存在异常的程序
    except Exception as error:
        statement2
    finally:
        有没有异常都会执行的语句
        比如关闭文件数据库等,担心有异常而不能执行时,都可以在这里操作
    raise Exception

    基础语法3: 异常的嵌套

    当在except处理时,可能也存在异常,所以需要用到异常嵌套

    try:
        print(1)
        1/0
        print(2)
    except ZeroDivisionError as error:
        try:
            print(a)
        except NameError:
            print("嵌套处理异常")
    except Exception as error:
        print(type(error))
    finally:
        print("这里肯定会执行!")

    自定义异常,raise

    # raise异常,是需要提前自定义好的
    class MyException(Exception):
        pass
    
    raise MyException
    try:
        1/0
    except Exception as error: #  想知道这个异常对象是什么,可以用 as error
        print(error)
        print(type(error))
    
    # 输出
    division by zero
    <class 'ZeroDivisionError'>

     练习:九九乘法表

    for i in range(1,10):
        for j in range(1,i+1):
            print("{}*{}={}	".format(j, i, i * j),end='')
        print("")  # 这个打印的目的是换行,从下一行开始新的循环
    
    # 输出
    1*2=2    2*2=4    
    1*3=3    2*3=6    3*3=9    
    1*4=4    2*4=8    3*4=12    4*4=16    
    1*5=5    2*5=10    3*5=15    4*5=20    5*5=25    
    1*6=6    2*6=12    3*6=18    4*6=24    5*6=30    6*6=36    
    1*7=7    2*7=14    3*7=21    4*7=28    5*7=35    6*7=42    7*7=49    
    1*8=8    2*8=16    3*8=24    4*8=32    5*8=40    6*8=48    7*8=56    8*8=64    
    1*9=9    2*9=18    3*9=27    4*9=36    5*9=45    6*9=54    7*9=63    8*9=72    9*9=81    
  • 相关阅读:
    线程池原理分析
    强引用-软引用-弱引用
    并发编程之多线程
    linux关于获取时间的几个函数
    gdb安装和使用
    c++四种显式类型转换
    ARP协议
    Vmware 共享文件夹不显示的问题
    gdb基本使用
    动态二维数组实现
  • 原文地址:https://www.cnblogs.com/victorm/p/11243638.html
Copyright © 2020-2023  润新知