# 查看版本
python --version
# 在程序中使用sys模块查询相关的值
import sys
print(sys.version_info)
print(sys.version)
《Python Enhancement Proposal #8》(8号Python增强提案),又叫PEP8,它是针对Python风格代码而编订的风格指南。
pylint工具是一款流行的python源码静态分析工具,它可以自动检查受测代码是否符合PEP8风格指南,而且还能找出程序的多种常见错误。
下面列出几条绝对应该遵守的规则:
if a is not b
而不是if not a is b
。if len(sonelist) == 0
)来判断somelist是否为[]
或''
等空值,而是应该采用if not somelist
这种写法来判断,它会假定:空值将自动评估为False。if
语句、for
循环、while
循环及except
符合语句,而是应该把这些语句分成多行来书写,以示清晰。import
语句应该总是放在文件开头。from bar import foo
, 而不是 import foo
。from . import foo
。切片操作(slice)可以轻易访问序列中的子集。所有实现了__getitem__和__setitem__这两个特殊方法的python类均可使用切片,如list、str、bytes等。
a[:20],a[-20:]
。a = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
a[2:7] = [99, 22, 14]
print('After ', a)
->After ['a', 'b', 99, 22, 14, 'h']
# 把矩阵简化成一维列表,使原来的每个单元格都成为新列表的普通元素,可以使用两个for表达式的列表推导来实现
# 这些for表达式会按照从左到右的顺序来评估。
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flat = [x for row in matrix for x in row]
# 另一种包含多重循环的合理用法是根据输入列表来创建有两层深度的新列表。
squared = [[x**2 for x in row] for row in matrix]
# 如果在多一层循环,那么列表推导式会很长。
my_list = [
[[1, 2, 3], [4, 5, 6],
#...
]
flat = [x for sublist1 in my_lists
for sublist2 in sublist1
for x in sublist2]
# 这时不如采用循环语句来实现相同效果。
flat = []
for sublist1 in my_list:
for sublist2 in sublist1:
flat.extend(sublist2)
# 列表页支持多个if条件,处在同一循环中的多项条件,彼此之间默认形成and表达式。
a = [1, 2, 3, 4, 5, 6, 7, 8, 9,10]
b = [x for x in a if x > 4 if x % 2 == 0]
c = [x for x in a if x > 4 and x % 2 ==0]
# 同样条件增加,会导致代码很难懂。
it = (len(x) for x in open('/tmp/my_file.txt'))
print(it) # at 0x101b81480>
#逐渐调用内置的next函数,即可生成下一个值
print(next(it)) #100
print(next(it)) #57
# 生成器可以互相组合
roots = ((x, x**0.5) for x in it)
#外围的迭代器推进时会推动内部的迭代器,就产生了连锁效应
print(next(roots)) #(15, 3.872983346207417)
Python提供了内置的enumerate函数,可以把各种迭代器包装为生成器,以便稍后产生输出值。生成器每次产生一对输出值,前者表示循环下标,后者表示迭代器中获取的下一个序列元素。
flavor_list = ['vanilla', 'chocolate', 'pecan', 'strawberry']
# 使用range方式遍历元素和索引
for i in range(len(flavor_list)):
print('%d: %s' % (i+1, flavor_list[i]))
# 使用enumerate方式来遍历元素和索引
for i, flavor in enumerate(flavor_list):
print('%d: %s' % (i+1, flavor))
# 指定enumerate函数开始计数时所用的值为1,默认为0
for i, flavor in enumerate(flavor_list, 1):
print('%d: %s' % (i, flavor))
for name, count in zip(names, letters):
print(name)
# if/else,try/except/else语句块中,else的意思是如果前面的不执行,则执行else块。
# 但for/else意思与人们的理解正好相反
for i in range(3):
print('loop %d' % i)
if i == 1:
break
else:
print('Else block!')
>>> loop 0
loop 1
# for循环遍历的序列是空,则立刻执行else块。
for x in []:
print('Never runs')
else:
print('For Else block!')
>>> For Else block!
# while循环的初始条件为false,后面跟着else,也会立即执行
while False:
print('Never runs')
else:
print('For Else block!')
>>> For Else block!
#open方法必须放在try外面,因为如果打开文件时异常,程序应该跳过finally块。
handle = open('/tmp/random_data.txt') # May raise IOError
try:
data = handle.read() # May raise UnicodeDecodeError
finally:
handle.close() #always runs after try
def load_json_key(data, key):
try:
result_dict = json.loads(data) # May raise ValueError
except ValueError as e:
raise KeyError from e
else:
return result_dict[key] # May raise KeyError
- 顺利运行try块后,若想使某些操作能在finally块的清理代码之前执行,则可将这些操作写入else块中。
```python
try:
# 读取文件并处理内容
except Exception as e:
# 应对可能发生的异常
else:
# 实时更新文件并把更新中可能出现的异常上报给上级代码
finally:
#清理代码