3.2 多重条件判断

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

我们来介绍继续介绍复杂些的条件判断语句。

我们朝着预定的目标再次前进。这次准备再次区分优秀,所谓优秀,就是指大于等于90分。先试着按照最直观的汉字方式写出来:

对应的Python代码是:

grade = int(input())
if grade >= 90:
    print('优秀')
if grade >= 60 and grade < 90:
    print('及格')
if grade < 60:
    print('不及格')

这个应该不难理解。其中最为复杂的就是中间那个判断条件,大家应该能猜的出来,是的,and就表示并且的意思,只有两个条件都满足才表示为真,即条件满足。

不过,代码显得很麻烦,而且刚才那个问题依然存在,也就是,如果已经判断为优秀,剩下的就不用再判断了。先写成汉字版本:

再次使用else写成Python代码:

grade = int(input())
if grade >= 90:
    print('优秀')
else:
    if grade >= 60 and grade < 90:
        print('及格')
    if grade < 60:
        print('不及格')

虽然嵌套有点复杂,但是大家一定要保证代码良好的缩进格式,这种代码的对齐不仅可以表达准确的嵌套结构,同时也有助于我们看清程序的结构,防止潜在的错误。

同样我们再次将else里面的那个第二个条件也变成else:

grade = int(input())
if grade >= 90:
    print('优秀')
else:
    if grade >= 60 and grade < 90:
        print('及格')
    else:
        if grade < 60:
            print('不及格')

这种写法虽然缩进略显复杂,但是整体代码运行效果很高,任何情况只要有一个条件判断通过,就不再进行下面的其他判断了。

能不能把代码简化呢?我们大胆的将else:和下面的if连成一个elif,看看效果:

代码为:

grade = int(input())
if grade >= 90:
    print('优秀')
elif grade >= 60 and grade < 90:
    print('及格')
elif grade < 60:
    print('不及格')

完全可以,效果一样,代码即保证了较高的执行效率,同时在排版上也很清楚。这其实构成了多重条件判断,也就是说,通过多个elif,可以继续增加更多条件的判断,这里是三重,继续增加条件,四重五重都可以,这在很多代码判断中用途很广。

按照这个思路,我们写出了完整的代码:

grade = int(input())
if grade >= 90:
    print('优秀')
elif grade >= 80 and grade < 90:
    print('良')
elif grade >= 70 and grade < 80:
    print('中')
elif grade >= 60 and grade < 70:
    print('及格')
elif grade < 60:
    print('不及格')

正如前文所说,编写出代码往往难度并不很大,但是要想调试成功保证不出错,那就需要经验和能力了。这段代码有没有问题呢?

如果我们输入101或者-1会怎么样?

 

虽然程序似乎还能正常输出,但是我们此时输入的成绩明显有问题,正确的程序反映应该予以提示,而不是仍然显示对应的等级。

进一步修改,加入的必要的验证,这是目前我们写出的最终代码:

grade = int(input())
if grade >= 90 and grade <= 100:
    print('优秀')
elif grade >= 80 and grade < 90:
    print('良')
elif grade >= 70 and grade < 80:
    print('中')
elif grade >= 60 and grade < 70:
    print('及格')
elif grade >= 0 and grade < 60:
    print('不及格')
else:
    print('错误的成绩输入')

最后,我们对判断条件再次说明两个常见的问题:

第一,虽然一般都是使用一些诸如大于、等于之类的逻辑判断和诸如并且、或者之类的条件运算符来表达这些条件,但是正如前文所说,Python的真假布尔类型其实是整数,因此只要条件结果不为0,就是表示为真,即条件满足。

观察下面的代码输出:

grade = int(input())
if grade:
    print(grade)

你会发现如果你输入0,没有输出,但是你输入其他任何数值,都会显示输入的数值。

原因就在于此,grade为0表示条件不满足,自然没有输出。

第二,对于浮点数,大家在进行比较时,不能简单判断相等不相等。

num = 1 / 3
if num == 0.33333333333333:
    print('OK')

按照更多人的理解,两种表示就是一个数值。但是你会发现可能系统会认为不相等,而没有任何输出。原因也好理解,因为Python默认的浮点数精度更高,确实比条件中的那个小数还有更多的小数位3,显然更大一些。事实上,在绝大多数64位电脑上你输入0.3333333333333333(16个3)来替换上述的小数,你会发现Python认为条件满足了。

这显然依赖于电脑对浮点数表达的精度。

因此,更为合理的浮点数判断应该通过一种差值范围来进行:

num = 1 / 3
if abs(num - 0.3333) <= 0.0001:
    print('OK')

输出为:OK。这里abs表示绝对值函数,可以保证数值变化具有上下误差范围。

配套学习资源、慕课视频:

Python大数据分析-李树青icon-default.png?t=M1FBhttps://www.njcie.com/python/

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think>我们正在使用ThinkPHP 3.2框架,需要实现表格动态变色功能。根据引用[3]中提到的volist标签多重嵌套循环和隔行变色的思路,我们可以结合ThinkPHP的模板引擎和jQuery来实现。 实现思路: 1. 使用volist循环输出表格行,并为每一行设置一个唯一的ID或自定义属性(如data-id)以便于后续操作。 2. 在volist循环中,我们可以通过设置key值(如key="k")来获取当前行的索引,然后根据索引的奇偶性来设置不同的背景色(即隔行变色)。 3. 如果需要根据数据内容动态变色(如根据某个数值条件),可以在模板中使用条件判断来设置不同的class。 4. 为了增强交互性,我们可以引入jQuery来实现鼠标悬停、点击等动态变色效果。 步骤: 一、PHP模板中实现静态隔行变色(基于奇偶行) 在ThinkPHP模板中,我们可以使用volist的key属性来获取当前行的索引(从1开始),然后通过判断奇偶性来设置不同的class。 示例代码: ```html <table> <tr> <th>ID</th> <th>姓名</th> <th>薪资</th> </tr> <volist name="employeeList" id="vo" key="k"> <tr class="<eq name=&#39;k%2&#39;>0</eq>"> <!-- 注意:这里eq标签的用法在ThinkPHP3.2中可能不适用,我们换一种写法 --> <!-- 或者使用PHP代码 --> <tr class="<?php echo ($k % 2 == 1)?&#39;odd&#39;:&#39;even&#39;;?>"> <td>{$vo.id}</td> <td>{$vo.name}</td> <td>{$vo.salary}</td> </tr> </volist> </table> ``` 但是,在ThinkPHP模板中,我们更推荐使用内置的标签,因此可以这样写: ```html <volist name="employeeList" id="vo" key="k" mod="2"> <tr class="<eq name=&#39;mod&#39; value=&#39;0&#39;>even<else/>odd</eq>"> <td>{$vo.id}</td> <td>{$vo.name}</td> <td>{$vo.salary}</td> </tr> </volist> ``` 或者使用更简洁的条件判断: ```html <volist name="employeeList" id="vo" key="k"> <tr <if condition="$k % 2 eq 0">class="even"<else/>class="odd"</if>> <td>{$vo.id}</td> <td>{$vo.name}</td> <td>{$vo.salary}</td> </tr> </volist> ``` 二、根据数据内容动态变色 例如,根据薪资水平设置不同的背景色: ```html <volist name="employeeList" id="vo"> <tr class="<?php echo ($vo[&#39;salary&#39;] > 10000) ? &#39;high-salary&#39; : &#39;low-salary&#39;; ?>"> <td>{$vo.id}</td> <td>{$vo.name}</td> <td>{$vo.salary}</td> </tr> </volist> ``` 三、使用jQuery实现交互动态变色 在模板中引入jQuery,然后编写脚本实现鼠标悬停、点击变色等效果。 示例: ```html <style> .odd { background-color: #f9f9f9; } .even { background-color: #efefef; } .high-salary { background-color: #d4edda; } .low-salary { background-color: #f8d7da; } .hover { background-color: #ffecb3 !important; } /* 悬停颜色 */ .selected { background-color: #bbdefb !important; } /* 选中颜色 */ </style> <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> <script> $(function() { // 鼠标悬停效果 $(&#39;tr&#39;).hover( function() { $(this).addClass(&#39;hover&#39;); }, function() { $(this).removeClass(&#39;hover&#39;); } ); // 点击选中效果 $(&#39;tr&#39;).click(function() { // 移除其他行的选中状态 $(&#39;tr&#39;).removeClass(&#39;selected&#39;); // 为当前行添加选中状态 $(this).addClass(&#39;selected&#39;); }); }); </script> ``` 四、整合静态和动态效果 注意:由于我们已经在行上设置了静态的class(如odd/even或high-salary/low-salary),在设置hover和selected时,我们使用了!important来覆盖原有的背景色。但更好的做法是提高选择器的优先级,或者通过调整CSS顺序来避免使用!important。 五、考虑动态添加行的情况 如果表格行是通过AJAX动态添加的,那么事件绑定需要使用事件委托。修改jQuery代码: ```javascript $(document).on(&#39;hover&#39;, &#39;tr&#39;, function() { // 因为hover是两个事件,所以需要分开写 $(this).addClass(&#39;hover&#39;); }, function() { $(this).removeClass(&#39;hover&#39;); }); $(document).on(&#39;click&#39;, &#39;tr&#39;, function() { $(&#39;tr&#39;).removeClass(&#39;selected&#39;); $(this).addClass(&#39;selected&#39;); }); ``` 完整示例(ThinkPHP模板): ```html <style> tr.odd { background-color: #f9f9f9; } tr.even { background-color: #efefef; } tr.high-salary { background-color: #d4edda; } tr.low-salary { background-color: #f8d7da; } tr.hover { background-color: #ffecb3; } tr.selected { background-color: #bbdefb; } </style> <table border="1"> <tr> <th>ID</th> <th>姓名</th> <th>薪资</th> </tr> <volist name="employeeList" id="vo" key="k"> <tr class="<if condition=&#39;$vo.salary gt 10000&#39;>high-salary<else/>low-salary</if> <if condition=&#39;$k%2 eq 0&#39;>even<else/>odd</if>"> <td>{$vo.id}</td> <td>{$vo.name}</td> <td>{$vo.salary}</td> </tr> </volist> </table> <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> <script> $(function() { // 使用事件委托,以便动态添加的行也能有事件 $(&#39;table&#39;).on(&#39;mouseenter&#39;, &#39;tr&#39;, function() { $(this).addClass(&#39;hover&#39;); }).on(&#39;mouseleave&#39;, &#39;tr&#39;, function() { $(this).removeClass(&#39;hover&#39;); }).on(&#39;click&#39;, &#39;tr&#39;, function() { $(&#39;tr&#39;).removeClass(&#39;selected&#39;); $(this).addClass(&#39;selected&#39;); }); }); </script> ``` 注意:这里我们同时应用了两种静态样式(薪资条件和奇偶行),并且通过jQuery添加了交互样式。当鼠标悬停和点击时,会覆盖原有的背景色,但鼠标离开后会恢复。当点击选中后,选中的背景色会覆盖其他背景色。 六、优化CSS 为了避免样式冲突,我们可以调整CSS的优先级,或者使用更具体的选择器。另外,可以添加过渡效果使颜色变化更平滑: ```css tr { transition: background-color 0.3s ease; } ``` 这样,我们就实现了在ThinkPHP 3.2框架中表格的动态变色功能。 引用说明: 在ThinkPHP3.2中,volist标签的key属性可以获取当前行的索引,通过mod属性可以取模运算,这些在手册中都有详细说明[^1]。同时,我们参考了多重嵌套循环中条件判断的用法[^3]。</think>在 ThinkPHP 3.2 框架中实现表格动态变色功能,可以通过结合模板标签和前端技术实现。以下是几种实现方法,参考了 ThinkPHP 手册和最佳实践[^1]: ### 方法1:使用 volist 标签实现隔行变色 ```html <volist name="dataList" id="vo" key="k"> <tr class="<eq name=&#39;k%2&#39;>0</eq>"> <td>{$vo.id}</td> <td>{$vo.name}</td> <td>{$vo.salary}</td> </tr> </volist> <style> .row-odd { background-color: #f9f9f9; } .row-even { background-color: #ffffff; } .row-odd:hover, .row-even:hover { background-color: #e6f7ff; } </style> ``` **原理**:利用 `volist` 的 `key` 属性生成行索引,通过 `eq` 标签判断奇偶行应用不同样式[^3]。 ### 方法2:基于数据值动态变色 ```html <volist name="dataList" id="vo"> <tr class="salary-{$vo.salary|getSalaryLevel}"> <td>{$vo.id}</td> <td>{$vo.name}</td> <td>{$vo.salary}</td> </tr> </volist> <style> .salary-high { background-color: #d4edda; } /* >10000 */ .salary-medium { background-color: #fff3cd; } /* 5000-10000 */ .salary-low { background-color: #f8d7da; } /* <5000 */ </style> ``` 在模型中添加方法: ```php // 模型方法 public function getSalaryLevel($salary) { if ($salary > 10000) return &#39;high&#39;; if ($salary >= 5000) return &#39;medium&#39;; return &#39;low&#39;; } ``` ### 方法3:jQuery 交互式变色 ```html <table id="dynamicTable"> <volist name="dataList" id="vo"> <tr data-id="{$vo.id}"> <td>{$vo.id}</td> <td>{$vo.name}</td> <td>{$vo.salary}</td> </tr> </volist> </table> <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> <script> $(function() { // 隔行基础色 $(&#39;#dynamicTable tr:even&#39;).addClass(&#39;row-even&#39;); $(&#39;#dynamicTable tr:odd&#39;).addClass(&#39;row-odd&#39;); // 悬停效果 $(&#39;#dynamicTable tr&#39;).hover( function() { $(this).addClass(&#39;row-hover&#39;); }, function() { $(this).removeClass(&#39;row-hover&#39;); } ); // 点击选中 $(&#39;#dynamicTable tr&#39;).click(function() { $(this).toggleClass(&#39;row-selected&#39;) .siblings().removeClass(&#39;row-selected&#39;); }); }); </style> <style> .row-even { background-color: #fff; } .row-odd { background-color: #f9f9f9; } .row-hover { background-color: #e6f7ff; } .row-selected { background-color: #cfe2ff; } tr { transition: background-color 0.3s; } </style> ``` ### 方法4:AJAX 动态更新变色 ```php // 控制器 public function getData() { $data = M(&#39;table&#39;)->select(); $this->ajaxReturn($data); } ``` ```javascript // 前端 $.getJSON(&#39;{:U("controller/getData")}&#39;, function(data) { let html = &#39;&#39;; $.each(data, function(i, item) { const rowClass = item.salary > 10000 ? &#39;salary-high&#39; : &#39;&#39;; html += `<tr class="${rowClass}" data-id="${item.id}">`; html += `<td>${item.id}</td><td>${item.name}</td><td>${item.salary}</td>`; html += &#39;</tr>&#39;; }); $(&#39;#ajaxTable&#39;).html(html); }); ``` ### 最佳实践建议 1. **静态数据**:使用 `volist` + 条件判断实现基础隔行变色[^3] 2. **数据驱动变色**:结合模型方法动态生成 CSS 类 3. **交互需求**:引入 jQuery 实现悬停、选中等效果 4. **性能优化**:大型表格使用分页加载避免渲染卡顿 5. **样式分离**:将 CSS 规则放在单独文件中便于维护 在 ThinkPHP 3.2 中,推荐优先使用模板标签实现基础功能,再通过 jQuery 增强交互体验[^1]。对于复杂场景,可参考官方手册中的 `volist` 高级用法[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

leeshuqing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值