Python特殊语法简介
列表解析(列表推导式):
在各种稀奇古怪的语法中,列表解析的使用频率应该时最高的,对于代码的简化效果也非常明显。
首先说一下什么是列表解析:
基本概念就是一种语法结构,其存在是为了方便通过已有列表,去方便快速创建新的列表。
语法:
1.[expression for iter_val in iterable]
2.[expression for iter_val in iterable if cond_expr]
举一个例子,比如1-10的平方,通常的写法如下:
a = []
for i in range(1,11):
a.append(i*i)
print(a) #[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
但如果使用列表解析,看起来就舒服多了:
a = [i ** 2 for i in range(1, 11)]
print(a) # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
针对上面的例子中,我们还可以加入if语句:i>5
a = [i ** 2 for i in range(1, 11) if i>5]
print(a) # [36, 49, 64, 81, 100]
多重列表解析:
题目:有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少?
s = []
for i in range(1,5):
for j in range(1,5):
for k in range(1,5):
if i != j and j != k and i != k :
s.append([i,j,k])
print("一共有"+str(len(s))+"个组合,分别是:",s)
一共有24个组合,分别是: [[1, 2, 3], [1, 2, 4], [1, 3, 2], [1, 3, 4], [1, 4, 2], [1, 4, 3], [2, 1, 3], [2, 1, 4], [2, 3, 1], [2, 3, 4], [2, 4, 1], [2, 4, 3], [3, 1, 2], [3, 1, 4], [3, 2, 1], [3, 2, 4], [3, 4, 1], [3, 4, 2], [4, 1, 2], [4, 1, 3], [4, 2, 1], [4, 2, 3], [4, 3, 1], [4, 3, 2]]
使用多重列表解析的写法如下:
s = [[i,j,k] for i in range(1,5) for j in range(1,5) for k in range(1,5) if i != j and j != k and i != k]
print("一共有"+str(len(s))+"个组合,分别是:",s)
一共有24个组合,分别是: [[1, 2, 3], [1, 2, 4], [1, 3, 2], [1, 3, 4], [1, 4, 2], [1, 4, 3], [2, 1, 3], [2, 1, 4], [2, 3, 1], [2, 3, 4], [2, 4, 1], [2, 4, 3], [3, 1, 2], [3, 1, 4], [3, 2, 1], [3, 2, 4], [3, 4, 1], [3, 4, 2], [4, 1, 2], [4, 1, 3], [4, 2, 1], [4, 2, 3], [4, 3, 1], [4, 3, 2]]
三元表达式:
允许将产生一个值的if-else块写到一行或一个表达式中,语法如下:
value=true-expr if condition else false-expr
举个例子:提示输入一个数字,判断是否为数字。
i = input("请输入一个数字:")
if i.isdigit():
print('数字')
else:
print('其他')
第一种:结果1 if 条件 else 结果2
i = input("请输入一个数字:")
print('数字' if i.isdigit() else '其他')
第二种:(结果2,结果1)[判断]
i = input("请输入一个数字:")
print(('其他','数字')[i.isdigit()])
第三种:{条件值1:结果1,条件值2:结果2}[判断]
i = input("请输入一个数字:")
print({True:'数字',False:'其他'}[i.isdigit()])
举例:
i = int(input("请输入一个数字:"))
if i<=10:
if i>=1:
print('该数字大于等于1,且小于等于10')
else:
print('该数字小于1')
else:
if i <= 20:
print('该数字大于10,且小于等于20')
else:
print('该数字大于20')
print(('该数字大于1,且小于等于10' if i>=1 else '该数字小于1')
if i<=10 else
('该数字大于10,且小于等于20' if i <= 20 else '该数字大于20'))
with - as的用法:
有一些任务,可能事先需要设置,事后做清理工作。对于这种场景,Python的with语句提供了一种非常方便的处理方式。一个很好的例子是文件处理,你需要获取一个文件句柄,从文件中读取数据,然后关闭文件句柄。
如果不用with语句,代码如下:
file = open("/tmp/foo.txt")
data = file.read()
file.close()
这里有两个问题。一是可能忘记关闭文件句柄;二是文件读取数据发生异常,没有进行任何处理。下面是处理异常的加强版本:
file = open("/tmp/foo.txt")
try:
data = file.read()
finally:
file.close()
虽然这段代码运行良好,但是太冗长了。这时候就是with一展身手的时候了。除了有更优雅的语法,with还可以很好的处理上下文环境产生的异常。下面是with版本的代码:
with open("/tmp/foo.txt") as file:
data = file.read()
这个语法是用来代替传统的try…finally语法的。
基本思想是with所求值的对象必须有一个__enter__()方法,一个__exit__()方法。
紧跟with后面的语句被求值后,返回对象的__enter__()方法被调用,这个方法的返回值将被赋值给as后面的变量。当with后面的代码块全部被执行完之后,将调用前面返回对象的__exit__()方法。
for - else的用法:
for和else可以搭配使用。
for正常执行完,else也会跟着执行。for没有正常执行完,中间异常退出,则else也不会执行。
a= True
for i in range(1,11):
print(i)
if i == 9:
a = False
break
if a:
print('yes')
else:
print('no')
for i in range(1,11):
print(i)
if i == 9:
break
else:
print('OK')