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. Java8新特性:函数式编程

    1. 概述 函数式编程学习目的: 能够看懂公司里的代码 大数据量下处理集合效率更高 代码可读性高 消灭嵌套地狱 函数式编程思想: 面向对象思想需要关注用什么对象完成什么事情.而函数式编程思想就类似于我 ...

  2. 「浙江理工大学ACM入队200题系列」问题 L: 零基础学C/C++52——计算数列和2/1,3/2,5/3,8/5......

    本题是浙江理工大学ACM入队200题第五套中的L题 我们先来看一下这题的题面. 题面 题目描述 有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13,-- 计算这个数列的前n项和.注意: ...

  3. 2022春每日一题:Day 29

    题目:Mishka and Interesting sum 这题稍微分析就能发现实际这个题就是求区间异或和异或上区间不同数的异或和,因此直接转化为HH的项链. 代码: #include <cst ...

  4. vue引用MarkDown(mavonEditor)编辑器,文档

    mavonEditor Install mavon-editor (安装) npm install mavon-editor --save 如何引入: 全局引用: // 全局注册 import Vue ...

  5. [排序算法] 希尔排序 (C++)

    前言 本文章是建立在插入排序的基础上写的喔,如果有对插入排序还有不懂的童鞋,可以看看这里. 直接/折半插入排序 2路插入排序 希尔排序解释 希尔排序 Shell Sort 又名"缩小增量排序 ...

  6. 【DL论文精读笔记】Image Segmentation Using Deep Learning: A Survey 图像分割综述

    深度学习图像分割综述 Image Segmentation Using Deep Learning: A Survey 原文连接:https://arxiv.org/pdf/2001.05566.pd ...

  7. 在Java Web中setContentType与setCharacterEncoding中设置字符编码格式的区别

    在Java Web中setContentType与setCharacterEncoding中设置字符编码格式的区别 通用解释 setCharacterEncoding只是设置字符的编码方式 setCo ...

  8. 【实战】Hadoop安装01-伪分布式-Pseudo

    Hadoop安装-伪分布式-Pseudo 〇.所需资料 一.前置环境安装 1.包含内容 (1)安装 虚拟机安装.系统安装 (2)配置 ip.host.主机名配置 关闭防火墙及selinux SSH免密 ...

  9. Dart开发服务端,我是不是发烧(骚)了?

    前言 最近一段时间,我和我的团队开发了两个 APP. 客户端方面采用了 Flutter,方便跨平台. 服务端方面剑走偏锋,没有采用 php, pythod, java之类的,而是采用了与 Flutte ...

  10. Redis的数据被删除,占用内存咋还那么大?

    通过 CONFIG SET maxmemory 100mb 或者在 redis.conf 配置文件设置 maxmemory 100mb Redis 内存占用限制.当达到内存最大值值,会触发内存淘汰策略 ...