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() 操作;应该返回 FalseTrue。如果未定义此方法,则会查找并调用 __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('元素不存在')
 

浅谈Python中的if,可能有你不知道的的更多相关文章

  1. 浅谈python中得import xxx,from xxx import xxx, from xxx import *

    在python中import跟from import都是用来导入的,但是导入的机制不同 1.import xxx:导入模块,或者文件夹,对于调用模块或者文件夹中子模块的变量或者函数,需要使用" ...

  2. 浅谈python中的“ ==” 与“ is”

    在python中,== 与 is 之间既有区别,又有联系,本文将通过实际代码的演示,力争能够帮助读到这篇文章的朋友以最短的时间理清二者的关系,并深刻理解它们在内存中的实现机制.扯淡的话不多说,下面马上 ...

  3. 浅谈python中文件和文件夹的相关操作

    文件操作 文件的打开与关闭 打开文件 使用open(文件名,访问方式)函数,可以打开一个已存在的文件,或者创建一个新的文件. 示例如下: f = open('test.txt') # 访问方式可以省略 ...

  4. 浅谈python中字典append 到list 后值的改变问题

    看一个例子 ? 1 2 3 4 d={'test':1} d_test=d d_test['test']=2 print d 如果你在命令行实践的话,会发现你改动的是d_test ,但是d 也跟着改变 ...

  5. 浅谈python中的闭包函数

    闭包函数初探 通常我们定义函数都是这样定义的 def foo(): pass 其实在函数式编程中,函数里面还可以嵌套函数,如下面这样 def foo(): print("hello worl ...

  6. 浅谈python中的“ ==” 与“ is”、还有cmp

    总之,比较内容相等使用 ‘==’ 1.is" 是用来比较 a 和 b 是不是指向同一个内存单元,而"=="是用来比较 a 和 b指向的内存单元中的值是不是相等 2.pyt ...

  7. 浅谈Python中函数式编程、面向对象编程以及古怪的PythonIC

    1.函数式编程作为结构化编程的一种,正在受到越来越多的重视.那么什么事函数式编程呢? 在维基百科中给出了详细的定义,函数式编程又称泛函数编程,是一种编程规范,它将函数运算视为数学上的函数计算.简单的来 ...

  8. 浅谈python中__str__和__repr__的区别

    很多时候我们在创建一个类的时候,在终端打印类或者查看的时候一般都不会得到一个太满意的结果 class T: def __init__(self): self.color="red" ...

  9. 浅谈Python 中 __getattr__与__getattribute__的区别

    __getattr__与__getattribute__均是一般实例属性截取函数(generic instance attribute interception method),其中,__getatt ...

  10. 浅谈python 中正则的一些函数

         主要的函数有  : match() search() findall() group() groups() split()  match (): 含义  开头匹配,匹配成功返回一个对象失败则 ...

随机推荐

  1. 部署grafana+telegraf+influxdb 及 配置 jmeter后端监听

    搞性能测试,可以搭建Grafana+Telegraf+InfluxDB 监控平台,监控服务器资源使用率.jmeter性能测试结果等. telegraf: 是一个用 Go 编写的代理程序,可收集系统和服 ...

  2. mysql是如何实现mvcc的

    mvcc的概念 mvcc即多版本并发控制,是一种并发控制的策略,能让数据库在高并发下做到安全高效的读写,提升数据库的并发性能; 是一种用来解决并发下读写冲突的无锁解决方案,为事务分配单向增长时间戳,为 ...

  3. Vue3 —— 组件练习题(附源码)

    一.定义一个vue分页组件,实现客户端分页功能 1.1.子组件A(页数按钮) <!-- 本组件用于遍历分页的页数按钮 --> <template lang=""& ...

  4. mysql删库报错

    3.开发人员测试环境删库报错 #解决:在数据库的物理目录中(mysql的data目录),进入要删除的数据库目录,查看是否有文件存在,若存在,使用rm -rf 命令清除:再次执行删除数据库命令即可 [r ...

  5. 简单的sql注入2

    尝试 1 1' 1" 发现1'还是会报错,所以注入口还是1' 再试试1' and '1'='1发现报出SQLi detected! 取消空格试试1'and'1'='1 似乎可以进入,应该就是 ...

  6. vue3.0使用tui.image-editor图片编辑组件报错TypeError: Cannot convert undefined or null to object

    在vue3.0的项目中使用tui.image-editor组件.一直都是报错.查看报错位置发现代码 addEventListener() { Object.keys(this.$listeners). ...

  7. ArcGISServer 10.4 虚拟机 安装 新建站点失败 Failed to configure the server machine ''. Server machine '' is not a local

    在通过 VMware  创建的虚拟机上(win7 64位)安装ArcServer 10.4,新建站点时出现下面的错误. Failed to configure the server machine ' ...

  8. 漫谈计算机网络:应用层 ----- 从DNS域名解析到WWW万维网再到P2P应用

    2022-12-04 18:31:01 纪念一下博主的<漫谈计算机网络>连载博客 浏览量破500了! 今天更新完结篇! 面试答不上?计网很枯燥? 听说你学习 计网 每次记了都会忘? 不妨抽 ...

  9. 【Java EE】Day06 JDBC连接池介绍、C3P0连接池实现、Druid连接池实现、JDBCTemplate

    一.数据库连接池介绍 1.引入 之前:每次都要获取连接释放连接 现在:连接重复使用 2.概念: 存放数据库连接的容器 3.实现 DataSource接口 三种实现 标准实现 连接池实现 C3P0 Dr ...

  10. 深入理解Whitelabel Error Page底层源码

    深入理解Whitelabel Error Page底层源码 (一)服务器请求处理错误则转发请求url StandardHostValve的invoke()方法将根据请求的url选择正确的Context ...