Alc*_*des 5 python variables if-statement semantics
这是python中用于验证日期条目的算法.我想知道这究竟是什么意思"if day"(语义).我只知道"if"对布尔表达式的影响,而不是整数或数组等变量(我见过一些).有人有解释吗?
def valid_day(day):
if day and day.isdigit():#if day
day = int(day)
if day > 0 and day <= 31:
return day
Run Code Online (Sandbox Code Playgroud)
在python中,写作
if var:
与写作具有相同的效果
if bool(var):
(bool内置bool类型在哪里,它也充当bool对象的构造函数).
如果该值已经是bool(值为True或False),则含义很明确 - bool(var)返回相同的值.对于其他类型,几乎总是转换为bool avaliable,这取决于类型.对于整数(如在C中),它与var!= 0相同; 对于列表或字符串或字符串,它与len(var)!= 0相同,依此类推.你可以在python文档中找到它.
当您定义自己的类时,您可以定义一个方法via def __nonzero__(self):,该方法将在此上下文中调用(当您的对象被bool显式传递或隐式传递给if- 或者while就此而言).
一个值得注意的例外:numpy数组对象不会转换为bool(它们引发异常).它们需要使用像(arr!=0).any()或等结构显式转换(arr>0).all()
在类似的方面:不要养成写任何一个的习惯
if x == True: # This only works as expected when x is a bool
if x is True: # Can be useful but you need to understand what it really means.
if x == None: # Often works as expected, except when it doesn't
Run Code Online (Sandbox Code Playgroud)
应该始终与无比较
if x is None:
(要么)
if x is not None:
只有一个None对象,并x is None告诉你x是否引用了该对象,并且总是给你一个bool(如果是,则为True,对于任何其他对象为False).比较x==None(我在开始使用Python时经常犯的错误)通常会起作用,但它会激活Python的通用比较机制,这不是你想要的; 如果x是类的实例,则比较可能引发异常.is简单快速,只是进行身份测试 - 它不能超载.
同样if x is True意味着"如果x是布尔对象,意思是真的,而根本没有其他对象" - 这可能很有用,但是当你只是测试真值时,它太窄了.有人可能最终传递1,这将失败'是真'测试,但其他行为非常像真.
行为因语言而异。
行为1:
将变量转换为布尔值。即,存在从不同类型到布尔值的特定于语言的转换。对于数字值,0通常将转换为,false而将其他任何值转换为true。据我所知,这就是Python的工作方式。
行为2:
布尔值是数字值。如上所述,0通常是唯一评估为false
行为3:
任何非null引用求值为true,null引用求值为false。
这应该或多或少覆盖它,但是也可能存在其他变体或组合,例如,如果没有1,则使用方法2或3的后备。关键是,这很大程度上是特定于语言的问题。
已经有很多答案以“if编程中的作用”为通用术语,所以让我为您编写代码。
def valid_day(day):
if day and day.isdigit():#if day
Run Code Online (Sandbox Code Playgroud)
if表示if块的开始,并像其他答案指出的那样工作。接下来是布尔表达式day and day.isdigit()。and是一个布尔运算符,它需要两个操作数(等式的两边,通俗地说)True才能计算为 True。在这种情况下,day和 都day.isdigit()必须评估True为if块才能运行。
在 Python 中,我们将事物视为“Truthy”和“Falsey”。用“Falsey”来定义“Truthy”更容易,因为后者是一个更短的列表:
None其他一切都是“真实的”。如果你输入while -1: print("This loops forever")它,事实上,它会永远循环。所有非零数字、所有非空容器(字符串、列表、字典、集合、元组等),任何未明确设置为False或None将评估为True. 在这种情况下,代码正在检查以确保day不是None,因为如果是,day.isdigit()则将抛出 anAttributeError并破坏代码。您可以自己尝试:输入None.isdigit()IDLE。请注意,这可能不是最简单的实现,因为这样做valid_day(31)也会抛出AttributeError. valid_day需要一个字符串,即使它正在检查数字。
day = int(day)
if day > 0 and day <= 31:
return day
Run Code Online (Sandbox Code Playgroud)
这实际上是重复的代码,因为执行int(day)确认day.isdigit()。如果这是您的代码,也许可以考虑使用 try: except 块,例如:
def valid_day(day):
try: int(day)
except ValueError as e:
return False #this means whatever you passed to it can't be converted
#into an integer: maybe a floating point string?
if day in range(1,32): return True
else: return False
Run Code Online (Sandbox Code Playgroud)
这将使您避免检查您知道可能会失败的所有内容的陷阱。相反,检查以确保您的检查能够运行,并让您的程序处理您传递给它的任何内容。这也将允许您设计一个Day包含比整数更多信息但仍将返回其日历日的类self.__int__(): return self.calendarday,valid_day(Day())并将返回 True。此外,您当前的代码None在您应该返回时返回False——正如我上面提到的,None是 Falsey,所以在大多数情况下这会起作用(例如if not valid_day: do_something_drastic()),但在某些情况下您可能想要直接处理布尔值。
好的,有很多话要说给你听。
TL;DR:if启动if块,day and day.isdigit()只有当 day 是一个包含整数的非空字符串时才为真,其余的按它说的做。