python语言基础(七)条件判断和循环控制

程序的三大流程

顺序 —— 从上向下,顺序执行代码
分支(条件) —— 根据条件判断,决定执行代码的 分支
循环 —— 让 特定代码 重复 执行
在这里插入图片描述

顺序执行(了解)

Python代码在执行过程中,从上至下,遵循下面的基本原则:

  • 普通语句,直接执行;
  • 碰到函数,将函数体载入内存,并不直接执行,只有被调用的时候才执行,调用函数放在函数体下面
  • 碰到类,执行类内部的普通语句,但是类的方法只载入,不执行
  • 碰到if、for等控制语句,按相应控制流程执行
  • 碰到@,break,continue等,按规定语法执行
  • 碰到函数、方法调用等,转而执行函数内部代码,执行完毕继续执行原有顺序代码

程序主入口(熟悉)

一个 .py,除了可以被直接运行外,还可以作为模块,被其他 .py文件导入。不管是直接运行还是被导入,.py 文件的最顶层代码都会被运行(Python 用缩进来区分代码层次)。
但是当一个 .py 文件作为模块被导入时,我们可能不希望一部分代码被运行。那么就可以将这部分代码的调用写在主程序中(if name == ‘main’。

def func_one():
    print('func_one')

def func_two():
    print('func_two')

func_one()  
func_two()
# 运行结果为func_one,func_two
print(__name__)  # __main__,而被调用的时候,调用函数输出的是这个文件的名字
# 如果再建立一个py文件,想要调用本文件,调用时不想让func_two被调用,就可以放到主函数中
if __name__ == '__main__':
    func_two()
# func_two()写在这个地方,另外的文件调用时候就调用不到

条件判断(掌握)

如果 条件满足,才能做某件事情;如果 条件不满足,就做另外一件事情,或者什么也不做。
条件判断是通过一条或多条判断语句的执行结果(True 或者 False)来决定执行的代码块。在Python 语法中,使用 if、elif 和 else 三个关键字来进行条件判断。elif 和 else 都必须和 if 联合使用,而不能单独使用;可以将 if、elif 和 else 以及各自缩进的代码,看成一个 完整的代码块。

条件判断使用原则

  • 每个条件后面要使用 冒号 作为 判断行的结尾,所有符号都是英文状态下的,表示接下来是 满足条件(结果为True)后要执行的语句块。
  • 除了 if 分支 必须有,elif 和 else 分支都可以根据情况 省略
  • 使用 缩进 来 划分语句块,相同缩进数的语句在一起组成一个语句块。
  • 顺序判断每一个分支,任何一个分支首先被命中并执行,则其后面的所有分支被忽略,直接跳过!
  • 可以有多个 elif ,但只能有一个 else
  • 如果用多个if 代替 elif,则每个if都是单独的模块,不管条件成立与否,都会把每一个if都执行一遍,不会在条件成立后跳出循环。
  • 在 Python 中 没有 switch – case 语句。

在这里插入图片描述

```python
if 条件1:
    条件1满足执行的代码
    ……
elif 条件2:
    条件2满足时,执行的代码
    ……
elif 条件3:
    条件3满足时,执行的代码
    ……
else:
    以上条件都不满足时,执行的代码
    ……
s_ipt = input('今天发工资了吗?y/n:')
if s_ipt.upper() == 'Y':
    print('吃大餐')
elif s_ipt.lower() == 'n':
    print('吃泡面')
else:
    print('输入有误!')

if 语句以及缩进部分是一个 完整的代码块;冒号等一定是英文状态下的;缩进尽量是一个tab键(四个空格);elif后面跟条件,else后面不要跟条件;elif可以有多个,else只能有一个;顺序执行,执行满足条件的语句后,跳出程序,剩下的语句不再执行。

逻辑运算

在程序开发中,通常 在判断条件时,会需要同时判断多个条件,只有多个条件都满足,才能够执行后续代码,这个时候需要使用到 逻辑运算符(与 and/或 or/非 not ),逻辑运算符 可以把 多个条件 按照 逻辑 进行 连接,变成 更复杂的条件。

print(1 and 0)  # and只有前后都为真是才为真,1为真,0为假,返回右边的0
print(1 and 2)  # 1为真,2为真,and左边条件成立会向右找,后面也为真,就返回后面的2
print(0 and 2)  # 左边条件不成立,直接返回左边的0
print(1 or 2)   # 左边成立,直接返回左边的1
print(0 or 2)  # 左边不成立,判断右边,右边成立,返回右边的2
print(not 4)  # 返回False
print(not 0)  # 返回True
print(not "")  # 返回True
if 条件1 and 条件2:
    条件1满足 并且 条件2满足 执行的代码
    ……
练习1: 定义一个整数变量 age,编写代码判断年龄是否正确
age = 100

# 要求人的年龄在 0-120 之间
if age >= 0 and age <= 120:
    print("年龄正确")
else:
    print("年龄不正确")
# 练习2: 定义两个整数变量 python_score、c_score,编写代码判断成绩
python_score = 50
c_score = 50

# 要求只要有一门成绩 > 60 分就算合格
if python_score > 60 or c_score > 60:
    print("考试通过")
else:
    print("再接再厉!")

条件判断嵌套

if…elif…else 语句可以嵌套,也就是把 if…elif…else 结构放在另外一个 if…elif…else 结构中。elif 的应用场景是:同时 判断 多个条件,所有的条件是 平级 的。
在开发中,使用 if 进行条件判断,如果希望 在条件成立的执行语句中 再 增加条件判断,就可以使用 if 的嵌套。
if 的嵌套 的应用场景就是:在之前条件满足的前提下,再增加额外的判断。
if 的嵌套 的语法格式,除了缩进之外 和之前的没有区别。

if 条件 1:
    条件 1 满足执行的代码
    ……
    
    if 条件 1 基础上的条件 2:
        条件 2 满足时,执行的代码
        ……    
        
    # 条件 2 不满足的处理
    else:
        条件 2 不满足时,执行的代码
        
# 条件 1 不满足的处理
else:
    条件1 不满足时,执行的代码
    ……

在这里插入图片描述

s_ipt = input('今天发工资了吗?y/n:')
if s_ipt.upper() == 'Y':
    salary = float(input('请输入您的工资:'))
    debt = float(input('请输入欠花呗的金额:'))
    remain = salary - debt
    print(f'您还完花呗后剩余{remain}')
    if remain > 1000:
        print('吃大餐')
    else:
        print('吃土')
elif s_ipt.lower() == 'n':
    print('吃泡面')
else:
    print('输入有误!')

例题 掷色子

import random
guess = input("请猜大小:")
ret = random.randint(1, 6)
if ret <= 3 and guess == "小":
    print("你赢了")
elif ret >= 3 and guess == "大":
    print("你赢了")
else:
    print("你输了")

random.randint

import random
导入模块后,可以直接在 模块名称 后面敲一个 . 然后按 Tab 键,会提示该模块中包含的所有函数
random.randint(a, b) ,返回 [a, b] 之间的整数,包含 a 和 b
random.randrange(a,b),返回 [a, b) 之间的整数,包含 a ,但是不包含 b
例如:
random.randint(12, 20) # 生成的随机数n: 12 <= n <= 20
random.randint(20, 20) # 结果永远是 20
random.randint(20, 10) # 该语句是错误的,下限必须小于上限

循环控制

循环控制,就是让 程序循环运行某一段代码 直到 满足退出的条件,才 退出循环。
循环的作用就是让 指定的代码 重复的执行
Python 用关键字 forwhile 来进行循环控制

while循环

当程序从上至下执行时,遇到 while 循环语句,则会判断表达式 是否成立 ,当 成立时 则会进入 while 循环体内,执行 循环体内部执行的代码块。直到判断表达式 不成立时 ,则 终止循环,执行循环后面的语句。
while 循环最常用的应用场景就是 让执行的代码 按照 指定的次数 重复 执行,切记需要计数器累加,while 语句以及缩进部分是一个 完整的代码块。
如果忘记 在循环内部 修改循环的判断条件(如计数器忘记了累加),导致循环持续执行,程序无法终止!
常见的计数方法有两种,可以分别称为:
自然计数法(从 1 开始)—— 更符合人类的习惯
程序计数法(从 0 开始)—— 几乎所有的程序语言都选择从 0 开始计数,除非需求的特殊要求,否则 循环 的计数都从 0 开始。

初始条件设置 —— 通常是重复执行的 计数器

while 条件(判断 计数器 是否达到 目标次数):
    条件满足时,做的事情1
    条件满足时,做的事情2
    条件满足时,做的事情3
    ...(省略)...
    
    处理条件(计数器 + 1)

在这里插入图片描述

练习1.打印 5 次 hello xiaoming

n = 1  # 计数器
while n <= 5:
    print('hello xiaoming')
    n += 1

练习2.求1-100之间的和

n = 1  # 初始化n, 相当于计数器,记录循环的次数
sum = 0
while n <= 100:
    sum += n
    n += 1
print(sum)
第一种:
result = 0
i = 0  # 计数器
while i <= 100:  # 开始循环
    # 判断偶数
    if i % 2 == 0:
        print(i)
        result += i
    # 处理计数器
    i += 1
print("0~100之间偶数求和结果 = %d" % result)

第二种:
result = 0
i = 0  # 计数器
while i <= 100:  # 开始循环    
    result += i
    # 处理计数器
    i += 2
print("0~100之间偶数求和结果 = %d" % result)

在程序开发中,通常会遇到 利用循环 重复计算 的需求,我们可以在 while 上方定义一个变量(sum),用于 存放最终计算结果,在循环体内部,每次循环都用 最新的计算结果,更新 之前定义的变量(sum)。

break 与 continue 语句

break:
某一条件满足时,退出循环,不再执行后续重复的代码。当 循环体 执行的过程中想要 退出循环体,就可以使用到 break 语句。
continue:
continue 某一条件满足时,不执行后续重复的代码。用于 跳过 当前循环体 剩余部分的代码,直接 开始下一轮循环。它 不会退出和终止循环。
break 和 continue 只针对 当前所在循环 有效

当n=8时,终止循环
n = 1  # 初始化n, 相当于计算器,记录循环的次数
sum = 0
while n <= 100:
    print(n)
    if n == 8:
        break  # 退出整个循环,不是if的语句
    sum += n
    n += 1
print(sum)
当n=8时,退出当前循环,进入下一次循环
n = 1  # 初始化n, 相当于计算器,记录循环的次数
sum = 0
while n <= 100:

    n += 1  # (也可以把此句写道continue上方,在if内执行+1)
    if n == 8:
        continue  # 退出当前循环,进入下一次循环
    # n += 1  # 此时 n一直为8,不会执行+1的操作
    sum += n
    print(n)
print(sum)

while 的 else 从句

while 循环还可以增加一个 else 从句。当 while 循环 正常执行 完毕,会执行 else语句;当while里面有break的时候,不会执行else,break是强制结束循环体,所以不会执行else里的语句。
注意:

  • else 与 while 平级的缩进方式,并不是if的从句。
  • 如果是被 break 等机制 强制 提前 终止 的循环,不会执行 else 语句。

while循环嵌套使用

if 判断可以嵌套,while 当然也可以嵌套。但是建议大家不要嵌套 3 层以上,那样的效率会很低。

while 嵌套就是:while 里面还有 while
 
while 条件 1:
    条件满足时,做的事情1
    条件满足时,做的事情2
    条件满足时,做的事情3
    ...(省略)...
    
    while 条件 2:
        条件满足时,做的事情1
        条件满足时,做的事情2
        条件满足时,做的事情3
        ...(省略)...
    
        处理条件 2
    
    处理条件 1

练习:
打印输出如下

*
**
***
****
第一种方法:
row = 1
while row <= 4:
    print(row * '*')
    row += 1
第二种方法:双while嵌套。每行显示的星星和当前所在的行数是一致的,嵌套一个小的循环,专门处理每一行中 列 的星星显示
row = 1
while row <= 4:
    lor = 1   # 控制列循环
    while lor <= row:
        print('*', end='')
        lor += 1
    print('')
    row += 1

作业1
作业调查,实现学习调研系统,效果如下:当输入为yes时,给出选项1.2.3;当选项为3,则退出系统;当选项不在选择范围内,则提示重新选择;当用户没有学习,则输出提示并退出系统;输入除yes/no其它值时,则提示输入有误。

ipt = input('最近学习了吗?y/n?:')
while True:
    if ipt.lower() == 'yes':
        print('very good!')
        ips = input('1.python\n2.高数\n3.退出\n请输入学习选项:')
        if ips == '1':
            print('python真不错!')
            break
        elif ips == '2':
            print('高数真难')
            break
        elif ips == '3':
            print('已退出')
            break
        else:
            print('选项输入有误,请重新输入:')
    elif ipt.upper() == 'NO':
        print('年轻人,好自为之!')
        break
    else:
        print('输入有误')
        break

作业2
生成了N个1~1000之间的随机整数(N<=1000),N是用户输入的,
对于其中重复的数字,只保留一个,把其余相同的数字去掉,然后再把这些数从小到大排序。

import random
ipt = int(input('请输入生成的个数:'))
s = set()
for i in range(1, ipt+1):
    num = random.randint(1, 1000)
    s.add(num)
print(sorted(s))  #集合没有append,sorted方法

作业3
打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,
其各位数字立方和等于该数本身。
例如:153是一个"水仙花数",5.1^3 + 5^3+ 3^3 = 153

方法一:
for i in range(100, 1000):
    a = i // 100
    b = i % 100 // 10
    c = i % 10
    if a**3 + b**3 + c**3 == i:
        print(f'水仙花数为:{i}')

方法二:
for i in range(100, 1000):
    s = str(i)
    if int(s[0])**3 + int(s[1])**3 + int(s[2])**3 == i:
        print(f'水仙花数为:{i}')

for循环

range(start,stop,step),默认步长为1,里面是逗号不是冒号(区别于切片),默认从0开始,返回的是range()对象,左闭右开。

print(type(range))  # <class 'type'> range 是类

print(range(10))  # range(0, 10),默认从0开始,返回的是range()对象
print(list(range(10)))  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],左闭右开

# range(start, stop, step)
print(list(range(1, 10, 2)))  # [1, 3, 5, 7, 9] 步长默认为1,不是切片的”:“

虽然与 while 一样都是循环的关键字,但 for 循环通常用来遍历 可迭代 的对象。

for i in iterable:
    pass

注意:

  • for … in …: 属于固定格式
  • iterable 表示 可迭代的对象
  • i 是 变量名(可更改),代表可迭代对象里面的每个元素
for i in '12':
    print(type(i), i)  # <class 'str'> 1 2,字符串1和2
    
for i in 12:  # 整数是不可迭代的对象
    print(i)  # 报错,'int' object is not iterable
    
for i in range(4):  # range(4) --> [0, 1, 2, 3]
    print(type(i), i)  # <class 'int'> 0 1 2 3,整数

练习1:大小写转换

如下列表
ch_num = [‘零’,‘壹’,‘贰’,‘叁’,‘肆’,‘伍’,‘陆’,‘柒’,‘捌’,‘玖’]
ch = [‘圆’,‘拾’,‘佰’,‘仟’,‘萬’]
实现当 for循环嵌套

"""
取大写数字,比如12,1对应'壹',2对应'贰',直接循环打印出12,对应ch_num相应的下标 ch_num[int(i)]可以用列表的下标取值
取单位,与字符串的长度有关,2位数对应ch的下标1和0,3位数对应下标2,1和0 
len('12') --> 2-1 --> ch[2-1] 取到'拾'  ch[2-1-1] 取到'圆'
"""

ipt = input('请输入金额:')
len_ipt = len(ipt)
for i in ipt:
    len_ipt -= 1
    # print(i)
    # print(ch_num[int(i)], end="")
    # print(ch[len_ipt], end="")  # 也可以合成一句打印
    print(f'{ch_num[int(i)]}{ch[len_ipt]}', end="")
print('整')

练习2:打印输出九九乘法表

1 * 1 = 1
1 * 2 = 2 2 * 2 = 4
1 * 3 = 3 2 * 3

# 外层循环控制行,控制的是1,2,3的值,
# 内层循环控制列,控制的是 第1行的1,第2行的 1,2 第3行的1,2,3
第一种for循环实现
for i in range(1, 10):
    for j in range(1, i+1):
        print(f'{j}*{i}={i*j}',end="\t")
    print()
第二种while循环实现
i = 1
while i <= 9:
    j = 1
    while j <= i:
        print('{}*{}={}'.format(j, i, i*j), end='\t')
        j += 1
    i += 1
    print()

break 与 continue 语句

在 while 循环中,拥有 break 与 continue 语句,那 for 循环中也有 break 与continue 语句,并且作用一致。

break
for i in range(1, 10):
    # print(i) # 1-9
    if i == 7:  # 当i=7时退出循环
        break
    print(i)  # 1-6
continue
for i in range(1, 10):
    # print(i) # 1-9
    if i == 7:  # 当i=7时跳过当前循环下的代码,执行下次循环
        continue
    print(i)  # 1-6,8,9

问题:

  • 怎么跳出双层循环?在内层写break只能退出内层循环,没有退出外层循环,要在外层循环也要break
    实现:
  • 第一层循环建立标志 flag=False
  • 第二层循环改变标志为True,达到退出循环效

打印三三乘法表

第一种实现
for i in range(1, 10):
    if i ==4:
        break
    for j in range(1, i+1):
        if j ==4:
            break
        print(f'{j}*{i}={i*j}',end="\t")

    print()
建立循环标志
"""定义的循环标志默认是False,在外层循环不会执行,内层循环达到停止条件的时候,
改变flag的值为True,外层循环就会停止执行"""
flag = False
for i in range(1, 10):
    if flag:
        break
    for j in range(1, i+1):
        if j == 3:
            flag = True
        print(f'{j}*{i}={i*j}',end="\t")

    print()
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值