浅谈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('元素不存在')
浅谈Python中的if,可能有你不知道的的更多相关文章
- 浅谈python中得import xxx,from xxx import xxx, from xxx import *
在python中import跟from import都是用来导入的,但是导入的机制不同 1.import xxx:导入模块,或者文件夹,对于调用模块或者文件夹中子模块的变量或者函数,需要使用" ...
- 浅谈python中的“ ==” 与“ is”
在python中,== 与 is 之间既有区别,又有联系,本文将通过实际代码的演示,力争能够帮助读到这篇文章的朋友以最短的时间理清二者的关系,并深刻理解它们在内存中的实现机制.扯淡的话不多说,下面马上 ...
- 浅谈python中文件和文件夹的相关操作
文件操作 文件的打开与关闭 打开文件 使用open(文件名,访问方式)函数,可以打开一个已存在的文件,或者创建一个新的文件. 示例如下: f = open('test.txt') # 访问方式可以省略 ...
- 浅谈python中字典append 到list 后值的改变问题
看一个例子 ? 1 2 3 4 d={'test':1} d_test=d d_test['test']=2 print d 如果你在命令行实践的话,会发现你改动的是d_test ,但是d 也跟着改变 ...
- 浅谈python中的闭包函数
闭包函数初探 通常我们定义函数都是这样定义的 def foo(): pass 其实在函数式编程中,函数里面还可以嵌套函数,如下面这样 def foo(): print("hello worl ...
- 浅谈python中的“ ==” 与“ is”、还有cmp
总之,比较内容相等使用 ‘==’ 1.is" 是用来比较 a 和 b 是不是指向同一个内存单元,而"=="是用来比较 a 和 b指向的内存单元中的值是不是相等 2.pyt ...
- 浅谈Python中函数式编程、面向对象编程以及古怪的PythonIC
1.函数式编程作为结构化编程的一种,正在受到越来越多的重视.那么什么事函数式编程呢? 在维基百科中给出了详细的定义,函数式编程又称泛函数编程,是一种编程规范,它将函数运算视为数学上的函数计算.简单的来 ...
- 浅谈python中__str__和__repr__的区别
很多时候我们在创建一个类的时候,在终端打印类或者查看的时候一般都不会得到一个太满意的结果 class T: def __init__(self): self.color="red" ...
- 浅谈Python 中 __getattr__与__getattribute__的区别
__getattr__与__getattribute__均是一般实例属性截取函数(generic instance attribute interception method),其中,__getatt ...
- 浅谈python 中正则的一些函数
主要的函数有 : match() search() findall() group() groups() split() match (): 含义 开头匹配,匹配成功返回一个对象失败则 ...
随机推荐
- Linux学习环境搭建流程
Linux学习环境搭建 Vmware安装 VMware下载:https://www.vmware.com/go/getworkstation-win 运行安装程序,该重启安装驱动就重启,不需要就下一步 ...
- go GMP
动态栈 操作系统的线程一般都有固定的栈内存(通常为2MB),而 Go 语言中的 goroutine 非常轻量级,一个 goroutine 的初始栈空间很小(一般为2KB),所以在 Go 语言中一次创建 ...
- K8Snode节点管理集群资源方法
1.1 方法1 1.将master的admin.conf 文件拷贝到 node节点 [root@k8s-m ~]#scp /etc/kubernetes/admin.conf root@192.168 ...
- 基于python的数学建模---轮廓系数的确定
直接上代码 from sklearn import metrics import matplotlib.pyplot as plt from sklearn.cluster import KMeans ...
- vue3和vue2 的区别,vue3和vu2到底哪个好呢?
vue3 正式发布有两年多了,之前也做过一些学习和研究.vue3 发布后给某培训机构开发了一套vue3课程课件,自己也开源了一套基于vue3的后台管理系统(因为个人懒的原因,半年后才上传到gitHub ...
- 关于python导包问题(新手向)
包和模块 首先要弄清这两个概念, 在python 中 一个文件夹中包含__init__.py 文件(这个文件是包的初始化文件,在你导入包或包下面的模块的时候,这个文件会最开始运行),就会被python ...
- 关于linux建立u盘legacy启动方式引导
前言 我一直在用linux,但是我在linux制作pe启动盘无法实现,windows有很多制作pe启动盘的软件,如大白菜,u深度什么的,但是linux没有对应的软件,所以我想写一个类似的工具,那么就有 ...
- MySQL 常用到的几个字符处理函数
修改某字段的内容,用于英文 首先解释用到的函数: CONCAT(str1,str2)字符连接函数 UPPER(str)将字符串改为大写字母 LOWER(str)将字符串改为小写字母 LENGTH(st ...
- JS逆向实战9——cookies DES加密混淆
cookie加密 DES 混淆 目标网站:aHR0cHM6Ly90bGNoZW1zaG9wLnlvdXpoaWNhaS5jb20vbWFpbi90ZW5kP05vdGljZUNhdGVJZD0xJk5 ...
- css网页布局设置总结
目录 1 网页样式 1.1 引入方法 1.1.1内联样式 1.1.2内部样式表 1.1.3链接外部样式 1.1.4导入外部样式 1.2 基础语法 1.3 选择器的分类 1.3.1标记选择器 1.3.2 ...