浅谈Python中的if,可能有你不知道的
Python中的if,没那么简单,虽然也不难
https://docs.python.org/zh-cn/3.9/reference/compound_stmts.html#if python语言参考手册->8. 复合语句
if 子句
if是大多数语言中用来做条件判断的关键词
表达式比较简单
if 条件表达式:
为真做的事情
else:
为假做的事情官方
if_stmt ::= "if" assignment_expression ":" suite
("elif" assignment_expression ":" suite)*
["else" ":" suite]
它通过对表达式逐个求值直至找到一个真值(请参阅 布尔运算 了解真值与假值的定义)在子句体中选择唯一匹配的一个;然后执行该子句体(而且 if 语句的其他部分不会被执行或求值)。 如果所有表达式均为假值,则如果 else 子句体如果存在就会被执行这里涉及表达式为真这个概念
简单来说
age = 18
if age>=18:
print('你是成年人,请进')
else:
print('你是未成年,请回家!')
emmmmm,这应该谁都会;稍微进阶一点呢,就是此处的表达式的多样性,涉及布尔运算。
布尔运算
https://docs.python.org/zh-cn/3.9/reference/expressions.html#booleans 6.11 布尔运算
官方说明
在执行布尔运算的情况下,或是当表达式被用于流程控制语句时,以下值会被解析为假值: False, None, 所有类型的数字零,以及空字符串和空容器(包括字符串、元组、列表、字典、集合与冻结集合)。 所有其他值都会被解析为真值。 用户自定义对象可通过提供 __bool__() 方法来定制其逻辑值
归纳一下:
假:False, None, 所有类型的数字零,以及空字符串和空容器(包括字符串、元组、列表、字典、集合与冻结集合)
非假即真
简单示例
if 0 or False or None or '' or [] or () or {} or set() or frozenset():
print('上面都是假的,你看不到这句话打印')
else:
print('...') # 最终输出这个
if True and 1 and 2 and 'a' and ['a'] and (1,) and {'name':'wuxianfeng'} and {'a','b'}:
print('上面都是真的') # 会打印
那对象呢?
bool 魔术方法
https://docs.python.org/zh-cn/3.9/reference/datamodel.html#object.__bool__
3.3.2 自定义属性访问上部
★★★★★以下很重要★★★★★
调用此方法以实现真值检测以及内置的
bool()
操作;应该返回False
或True
。如果未定义此方法,则会查找并调用__len__()
并在其返回非零值时视对象的逻辑值为真。如果一个类既未定义__len__()
也未定义__bool__()
则视其所有实例的逻辑值为真
官方还说了一句话, 用户自定义对象可通过提供 __bool__() 方法来定制其逻辑值。
我们来演示一下
示例1
class A:
pass
a = A()
if a:
print('类的实例,其布尔值往往是真') # 你会看到这个输出
示例2
class B:
def __init__(self,name):
self.name = name
def __bool__(self):
if self.name == 'wuxianfeng': # 实例名叫wuxianfeng才是真的
return True
else:
return False
b1 = B('haha')
if b1:
print(f'B这个类的实例名字叫{b1.name},所以是真')
else:
print(f'B这个类的实例名字叫{b1.name},所以是假') # 打印
b2 = B('wuxianfeng')
if b2:
print(f'B这个类的实例名字叫{b2.name},所以是真') # 打印
else:
print(f'B这个类的实例名字叫{b2.name},所以是假')
print('----注意----')
print(b1 == False) # 不对的 结果是False
print(b2 == True) # 不对的 结果是False
len魔术方法
class C:
def __init__(self,age):
self.age = age
def __len__(self):
return 1 if self.age >= 18 else 0
c = C(16)
if c:
print(f'c的年龄是{c.age},成年')
else:
print(f'c的年龄是{c.age},未成年')
小Demo
自动化的时候经常要封装元素存在与否来断言,看懂下面的你需要有一定的selenium基础
当然我也只是简单的作个demo演示,没有考虑太多细节,比如嵌入显式等待等
要强调的是,当元素存在的时候return driver.find_element(*locator),这个返回是WebElement对象,就是典型的一个对象,它没有定义bool和len的魔术方法。
from selenium import webdriver
def get_element(driver,locator):
try:
return driver.find_element(*locator)
except:
return False
driver = webdriver.Chrome()
driver.get('http://106.14.1.150:8090/forum.php')
ele_username_locator = 'id','ls_usernam' # ls_usernam-->不存在 # ls_username --> 存在
if get_element(driver,ele_username_locator): #
print('元素存在')
else:
print('元素不存在')
最新文章
- tomcat虚拟路径
- linux启动流程及自定义gurb
- LINQ标准查询操作符(四) —AsEnumerable,Cast,OfType,ToArray,ToDictionary,ToList,ToLookup,First,Last,ElementAt
- win10的安装、win10启动盘制作
- springmvc(2)--参数绑定
- 当用DJANGO的migrate不成功时。。。。
- react-native迁移版本遇到的问题
- Razor button
- centos7 高速安装 mariadb(mysql)
- MongoDB学习总结(四) —— 索引的基本用法
- TensorFlow实战之实现AlexNet经典卷积神经网络
- Android学习——移植tr069程序到Android平台
- 华为防火墙USG6000V使用总结
- Dynamic CRM 2015学习笔记(6)没有足够的权限 - 您没有访问这些记录的权限。请联系 Microsoft Dynamics CRM 管理员
- 从无文件技术到使用隐写术:检查Powload的演变
- [No0000196]一文读懂Java 11的ZGC为何如此高效
- 【第五课】LNMP环境的入门
- [.NET开发] C#实现剪切板功能
- 基于HttpClient JSONObject与JSONArray的使用
- Java之集合(九)LinkedHashMap
热门文章
- 第2-1-4章 SpringBoot整合FastDFS文件存储服务
- 46.drf过滤、搜索、排序
- 推荐三个实用的 Go 开发工具
- API 如何选择 REST,GraphQL还是gRPC
- 我引用中没有Spire.Pdf,但是发现无法解析的“Spire.Pdf”的不同版本之间存在冲突
- C温故补缺(七):函数指针与回调函数
- 移动 VR 开发时要避免的 PC 渲染技术
- 协程Part1-boost.Coroutine.md
- 3.5:基于Python的KNN算法简单实现
- 关于JavaScript每句结尾是否需要添加分号问题