Skip to content

Latest commit

 

History

History
469 lines (365 loc) · 17.3 KB

File metadata and controls

469 lines (365 loc) · 17.3 KB
Error in user YAML: (<unknown>): found a tab character that violate indentation while scanning a plain scalar at line 3 column 3
---
- oeasy Python 0159
- 这是 oeasy 系统化 Python 教程,从基础一步步讲,扎实、完整、不跳步。愿意花时间学,就能真正学会。
- 本教程同步发布在: 
	- 个人网站: `https://oeasy.org` 
	- 蓝桥云课: `https://www.lanqiao.cn/courses/3584` 
	- GitHub: `https://github.com/overmind1980/oeasy-python-tutorial` 
	- Gitee: `https://gitee.com/overmind1980/oeasypython` 
---

逻辑与 and

回忆

  • 上次完成了猜丁壳
    • 程序可以优化
    • 也需要提高鲁棒性

图片描述

  • 注意 鲁棒性的判断
0 <= choice <= 2:
  • 相当于2个比较都为真
    1. 0 <= choice
    2. choice <= 2
  • 这里面 的逻辑 是什么呢??🤔

布尔运算

0 <= choice <= 2:
  • 等价于
0 <= choice and choice <= 2:

  • and 是
    • 逻辑与运算符

帮助手册

help
  • 去帮助手册

图片描述

布尔运算

  • 布尔运算其实有三种
    • 逻辑与 and
    • 逻辑或 or
    • 逻辑非 not
  • not 我们见过了

图片描述

  • and 是两个 bool型的运算

逻辑与 and 的真值表

  • bool 型变量总共就两个
    • True
    • False
  • 我们遍历一下
    • 全真得真 有假得假

图片描述

  • 为什么有 and运算 呢?

逻辑来源

  • 逻辑来源于电路
    • 两个开关量
    • 必须为 True

图片描述

  • 整个电路 才连起来

图片描述

  • 生活中这种例子也常见

有首歌

  • 如果
    • 你快乐并且感到了
    • 那就拍拍手
    • 不快乐不拍
    • 感受不到不拍
  • 都有的时候才拍

图片描述

  • 一个巴掌 拍不响
    • 就和 搞对象 一样

搞对象

  • 比如 说俩人 搞对象 谈恋爱
    • 必须 俩人都认为是 谈恋爱
    • 才算是谈恋爱
  • 否则的话
    • 只有一个人认为 是谈恋爱
    • 那 算是什么

图片描述

  • 算是追求吧。。。应该是

声控灯

  • 就像声控灯似的
    • 也要满足两个条件

图片描述

  • 满足哪两个条件呢?

声控灯

  • 光敏开关 得满足条件
    • 声控开关 也满足条件
    • 得都 满足条件
    • 有一个不满足
    • 就 不行

图片描述

  • 有一个不满足 就不亮
    • 差一个 都不行

图片描述

  • 用户名密码
    • 都有 都对才行
    • 差一点 都不对

旅游

  • 大巴得等 人都上来了
    • 才能开

图片描述

  • 不能说 来一个人 就开

图片描述

  • 5v5 得都准备好才开
    • 你说我等不急了
    • 谁先进去谁先开
  • 那不行

地铁

  • 地铁人多的时候
    • 什么时候发车

图片描述

  • 得等到 门都关好之后 发车
    • 你说有个门 也不知道 关没关好
    • 强行开车?
  • 那就很可能出危险

数字 and

  • 如果有 0
    • 就返回 0
  • 如果都不是零
    • 就返回后面的

图片描述

  • 最终结果是
    • 可以通过 bool 转化的

图片描述

  • 字符串如何呢?

字符串 and

  • 有空串 返回空串
    • 没空串 返回后面的

图片描述

  • 判断的是
    • 是不是空串

图片描述

  • 还有什么数据类型呢?

容器 and

图片描述

  • 有空容器
    • 返回空容器
  • 没有空容器
    • 返回后面的

图片描述

  • 如果是
    • 两个不同类型的 空容器呢?

容器

  • 其实返回什么空容器
    • 不是很重要

图片描述

  • 各种空容器 对应的布尔值 是相同的

拒绝猜测

  • 逻辑运算像 四则运算 一样
    • 可以 连续 计算

图片描述

  • 上图中 第二种表述 加了括号
    • 逻辑含义 更明确
  • 符合禅意
    • In the face of ambiguity, refuse the temptation to guess.
    • 面对不明确的 语义时
    • 拒绝猜测
  • 可以放心加括号
    • 越明确清晰越好
    • 拒绝猜测

老中医辨证施治

  • 经典的多条件判断
if 发热 and 口渴 and 黄痰	
	风热
elif 怕冷 and 流清涕 
	风寒
else 
	食积/气虚

限号规则

  • 北京市机动车限号规则

图片描述

  • 真的太复杂了
    • 多个条件
    • 层层嵌套
"""
Author by chenmengde
"""
from datetime import datetime

def is_traffic_limited(day, day_of_week, license_plate_tail):   # 定义一个函数,内含日期、星期、车牌尾号三个参数

    #   2023.4.3 - 2023.7.2规则:
    if (datetime(2023, 4, 3) <= day <= datetime(2023, 7, 2) and
            day_of_week == "Monday" and license_plate_tail in ["4", "9"]):
        return True
    elif (datetime(2023, 4, 3) <= day <= datetime(2023, 7, 2) and
            day_of_week == "Tuesday" and license_plate_tail in ["5", "0"]):
        return True
    elif (datetime(2023, 4, 3) <= day <= datetime(2023, 7, 2) and
            day_of_week == "Wednesday" and license_plate_tail in ["1", "6"]):
        return True
    elif (datetime(2023, 4, 3) <= day <= datetime(2023, 7, 2) and
            day_of_week == "Thursday" and license_plate_tail in ["2", "7"]):
        return True
    elif (datetime(2023, 4, 3) <= day <= datetime(2023, 7, 2) and
            day_of_week == "Friday" and license_plate_tail in ["3", "8"]):
        return True

    #   2023.7.3 - 2023.10.1规则:
    elif (datetime(2023, 7, 3) <= day <= datetime(2023, 10, 1) and
            day_of_week == "Monday" and license_plate_tail in ["3", "8"]):
        return True
    elif (datetime(2023, 7, 3) <= day <= datetime(2023, 10, 1) and
            day_of_week == "Tuesday" and license_plate_tail in ["4", "9"]):
        return True
    elif (datetime(2023, 7, 3) <= day <= datetime(2023, 10, 1) and
            day_of_week == "Wednesday" and license_plate_tail in ["5", "0"]):
        return True
    elif (datetime(2023, 7, 3) <= day <= datetime(2023, 10, 1) and
            day_of_week == "Thursday" and license_plate_tail in ["1", "6"]):
        return True
    elif (datetime(2023, 7, 3) <= day <= datetime(2023, 10, 1) and
            day_of_week == "Friday" and license_plate_tail in ["2", "7"]):
        return True

    #   2023.10.2 - 2023.12.31规则:
    elif (datetime(2023, 10, 2) <= day <= datetime(2023, 12, 31) and
            day_of_week == "Monday" and license_plate_tail in ["2", "7"]):
        return True
    elif (datetime(2023, 10, 2) <= day <= datetime(2023, 12, 31) and
            day_of_week == "Tuesday" and license_plate_tail in ["3", "8"]):
        return True
    elif (datetime(2023, 10, 2) <= day <= datetime(2023, 12, 31) and
            day_of_week == "Wednesday" and license_plate_tail in ["4", "9"]):
        return True
    elif (datetime(2023, 10, 2) <= day <= datetime(2023, 12, 31) and
            day_of_week == "Thursday" and license_plate_tail in ["5", "0"]):
        return True
    elif (datetime(2023, 10, 2) <= day <= datetime(2023, 12, 31) and
            day_of_week == "Friday" and license_plate_tail in ["1", "6"]):
        return True

    #   2024.1.1 - 2024.3.31规则:
    elif (datetime(2024, 1, 1) <= day <= datetime(2024, 3, 31) and
            day_of_week == "Monday" and license_plate_tail in ["1", "6"]):
        return True
    elif (datetime(2024, 1, 1) <= day <= datetime(2024, 3, 31) and
            day_of_week == "Tuesday" and license_plate_tail in ["2", "7"]):
        return True
    elif (datetime(2024, 1, 1) <= day <= datetime(2024, 3, 31) and
            day_of_week == "Wednesday" and license_plate_tail in ["3", "8"]):
        return True
    elif (datetime(2024, 1, 1) <= day <= datetime(2024, 3, 31) and
            day_of_week == "Thursday" and license_plate_tail in ["4", "9"]):
        return True
    elif (datetime(2024, 1, 1) <= day <= datetime(2024, 3, 31) and
            day_of_week == "Friday" and license_plate_tail in ["5", "0"]):
        return True
    else:
        return False



choose1 = input("您的机动车是否悬挂北京市牌照?悬挂北京市牌照请输入\"1\",悬挂外埠牌照请输入\"0\":")   # 判断是否京牌
# 本地
if choose1 == str(1):   # 若京牌:
    choose2 = input("您的机动车是否属于以下类别?属于请输入\"1\",不属于请输入\"0\"。"
                "(一)警车、消防车、救护车、工程救险车;\n"
                "(二)公共电汽车、省际长途客运车辆及大型客车、京B号段号牌出租汽车(不含租赁车辆)、邮政专用车、"
                "持有市交通行政管理部门核发的旅游客车营运证件的车辆、经市公安交通管理部门核定的单位班车和学校校车;\n"
                "(三)车身喷涂统一标识并执行公务的行政执法车辆和清障专用作业车辆;\n"
                "(四)环卫、园林、道路养护、应急通信保障的专项作业车辆,殡仪馆的殡葬车辆;\n"
                "(五)悬挂“使”字头号牌车辆及经批准临时入境的车辆;\n"
                "(六)纯电动小客车(以可充电电池作为唯一动力来源、由电动机驱动的小客车)。\n")   # 判断是否特种车辆
    if choose2 == str(1):   # 若是特种车辆:
        print("不限行")
    elif choose2 == str(0):   # 若不是特种车辆:
        choose3 = input("您的机动车是否是公务用车?是请输入\"1\",不是请输入\"0\"。")   # 判断是否公车:
        if choose3 == str(1):   # 若是公车:
            day = datetime.today()  # 获取当前日期
            day_of_week = datetime.now().strftime("%A")  # 获取当前星期几
            license_plate_tail = input("\n请输入您的机动车车牌尾号(机动车车牌尾号为字母的请输入“0”): ")  # 获取车牌尾号
            if is_traffic_limited(day, day_of_week, license_plate_tail):
                print("今日全天限行,范围为北京市全域。")
            else:
                print("今日不限行。")
        elif choose3 == str(0):  # 若非公车,即是普通车:
            day = datetime.today()  # 获取当前日期
            day_of_week = datetime.now().strftime("%A")  # 获取当前星期几
            license_plate_tail = input("\n请输入您的机动车车牌尾号(机动车车牌尾号为字母的请输入“0”): ")  # 获取车牌尾号
            if is_traffic_limited(day, day_of_week, license_plate_tail) and int("700") <= int(datetime.now().strftime("%H%M")) <= int("2000"):
                print("当前至20时限行,范围为五环路以内道路(不含五环路)。")
            else:
                print("当前至(次日)7时不限行,可放心行驶。")
        else:
            print("\n错误!请输入\"1\"或\"0\"。")   # 错误处理,下同
    else:
        print("\n错误!请输入\"1\"或\"0\"。")
#   外地
elif choose1 == str(0):  # 若外地牌:
    choose4 = input("您的机动车是载客汽车还是载货汽车?载客汽车请输入\"1\",载货汽车请输入\"0\"。")  # 判断车辆类型
    if choose4 == str(1):  # 若是客车:
        choose5 = input("您的机动车是否已办理\"进京通行证\"?已办理请输入\"1\",未办理请输入\"0\"。")  # 判断是否已办通行证
        if choose5 == str(1):  # 已办:
            choose6 = input("您办理的进京通行证属于以下那种类型?\"进京通行证(六环内)\"请输入\"1\",\"进京通行证(六环外)\"请输入\"0\"。")  # 判断通行证类型
            if choose6 == str(1):  # 六环内:
                day_of_week = datetime.now().strftime("%A")  # 获取当前星期几
                import datetime
                from datetime import datetime
                if int("700") <= int(datetime.now().strftime("%H%M")) <= int("900") or int("1700") <= int(datetime.now().strftime("%H%M")) <= int("2000"):  # 判断时间,工作日高峰期限行
                    print("禁止在五环路主辅路及其以内道路和大兴区部分道路行驶")
                elif int("900") <= int(datetime.now().strftime("%H%M")) <= int("1700"):  # 平峰按规则判断
                    day = datetime.today()  # 获取当前日期
                    day_of_week = datetime.now().strftime("%A")  # 获取当前星期几
                    license_plate_tail = input("\n请输入您的机动车车牌尾号(机动车车牌尾号为字母的请输入“0”): ")  # 获取车牌尾号
                    if (is_traffic_limited(day, day_of_week, license_plate_tail) and int("900") <= int(datetime.now().strftime("%H%M")) <= int("1700")):
                        print("\n当前至20时限行,范围为五环路以内道路(不含五环路),禁止驶入二环路(含)以内道路、建国门外大街、复兴门外大街、复兴路(木樨地桥至新兴桥段)。")
                    else:
                        print("\n当前至17时不限行,禁止驶入二环路(含)以内道路、建国门外大街、复兴门外大街、复兴路(木樨地桥至新兴桥段)。")
                else:
                    print("当前至(次日)7时不限行,禁止驶入二环路(含)以内道路、建国门外大街、复兴门外大街、复兴路(木樨地桥至新兴桥段)。")
            elif choose6 == str(0):  # 六环外:
                print("不限行,您可在通行证规定的区域(六环路及以外道路、通州区以外道路)放心行驶。")
            else:  # 错误处理
                print("错误!请输入\"1\"或\"0\"。")
        elif choose5 == str(0):  # 未办理:
            print("禁止驶入北京市行政区域内道路。")
        else:
            print("错误!请输入\"1\"或\"0\"。")
    elif choose4 == str(0):  # 若是货车:
            choose7 = input("您的机动车是黄标车吗?是请输入\"1\",不是请输入\"0\"。")  # 判断是否黄标
            if choose7 == str(1):  # 黄标:
                print("禁止驶入北京市行政区域内道路。")
            elif choose7 == str(0):  # 不是黄标:
                if int("600") <= int(datetime.now().strftime("%H%M")) <= int("2400"):  # 判断时间,6-24时限行
                    print("禁止驶入六环路(含)以内道路")
                else:
                    choose8 = input("您的机动车是否为整车运送鲜活农产品车辆?是请输入\"1\",不是请输入\"0\"。")  # 判断是否绿通
                    if choose8 == str(1):  # 若是绿通:
                        print("可驶入六环路(含)以内道路,全天禁止驶入长安街(新兴桥至国贸桥)、人民大会堂南侧路、西侧路、广场东、西侧路、南、北池子大街,南、北长街,府右街、王府井大街,台基厂路、中关村南路、科学院南路(知春路至北四环路)、三里河路(木樨地路口至甘家口)、万寿路(万寿路口至万寿路北口)、朱各庄路(万寿路北口至西四环中路东辅路)等道路。")
                    elif choose8 == str(0):  # 若不是绿通:
                        choose9 = input("您的机动车是否已办理\"进京通行证\"?已办理请输入\"1\",未办理请输入\"0\"。")  # 判断是否办理货车通行证
                        if choose9 == str(1):  # 已办理:
                            print("可驶入六环路(含)以内道路,全天禁止驶入长安街(新兴桥至国贸桥)、人民大会堂南侧路、西侧路、广场东、西侧路、南、北池子大街,南、北长街,府右街、王府井大街,台基厂路、中关村南路、科学院南路(知春路至北四环路)、三里河路(木樨地路口至甘家口)、万寿路(万寿路口至万寿路北口)、朱各庄路(万寿路北口至西四环中路东辅路)等道路。")
                        elif choose9 == str(0):  # 未办理:
                            print("禁止驶入六环路(含)以内道路")
                        else:  # 错误处理,下同
                            print("错误!请输入\"1\"或\"0\"。")
                    else:
                        print("错误!请输入\"1\"或\"0\"。")
            else:
                print("错误!请输入\"1\"或\"0\"。")
    else:
        print("错误!请输入\"1\"或\"0\"。")
else:
    pint("错误!请输入\"1\"或\"0\"。")

总结

  • 这次学习了 and
    • and 是一个逻辑与运算符
    • 都是 True 的时候
      • 才返回 True
      • 其余都返回 False
  • 这个运算符变量可以
    • 有数字、字符串、容器之类的
    • 逻辑还是零、空串、空容器对应 False
  • 一旦出现 False
    • 就返回逻辑值 False 对应的变量

图片描述

  • 什么时候
    • 一定要用嵌套条件
    • 不能用分支条件呢?
  • 下次再说 👋

  • 本文来自 oeasy Python 系统教程。
  • 想完整、扎实学 Python,
  • 搜索 oeasy 即可。