本文所记述的是一些基础知识点中平时用的比较少的方法。
一、赋值魔法
1.不对等赋值
当赋值符号左右两端长度不相等时,可以使用(*)来收集多余的值。
>>> a, b, *rest = [1, 2, 3, 4]
>>> rest
[3, 4]
这个星号(*)也可以放在其他位置。
>>> name = "Albus Percival Wulfric Brian Dumbledore"
>>> first, *middle, last = name.split()
>>> middle
['Percival', 'Wulfric', 'Brian']
2.链式赋值
即:x = y = 'abc',但是个人不提倡这种方法,除非已经明确x和y互为引用。
二、条件语句
1.是否“相等”
注意“==”运算符和“is”的差别(!=与is not同理)的差别,前者表示值相等,后者表示为同一对象(地址相等)。
2.断言
断言assert的作用是为了让程序在错误条件出现时立即崩溃以防止发生进一步的错误。断言语句的后面可以接续说明性的字符串,例如:
>>> age = -1
>>> assert 0 < age < 100, 'The age must be realistic'
Traceback (most recent call last):
File "<stdin>", line 1, in ?
AssertionError: The age must be realistic
三、循环语句
1.遍历字典
字典可以作为可迭代对象进行遍历,通常有两种方式,对于以下字典:
d = {'x': 1, 'y': 2, 'z': 3}
# 方法1
for key in d:
print(key, 'corresponds to', d[key])
# 方法2
for key, value in d.items():
print(key, 'corresponds to', value)
2.迭代时获取索引
使用下标list[i]的方法也能达到相同的目的,但是手法略显笨拙。可以使用enumerate获取列表index:
for index, element in enumerate(list):
if 'xxx' in element:
list[index] = '[censored]'
3.简单的列表推导式
个人认为为了便于阅读,列表推导最好不要过于复杂。下面这个例子使用了两层循环和条件判断:
>>> girls = ['alice', 'bernice', 'clarice']
>>> boys = ['chris', 'arnold', 'bob']
>>> [b+'+'+g for b in boys for g in girls if b[0] == g[0]]
['chris+clarice', 'arnold+alice', 'bob+bernice']
四、执行存储字符串中的python代码
主要有exec和eval两个方法,其中exec将执行字符串中的python语句,而eval将计算(返回)字符串中包含的python语句的结果。
1.exec
最简单的用法:
>>> exec("print('Hello, world!')")
Hello, world!
但是,为了代码安全性考虑,可以给exec指定第二个参数,作为其命名空间,例如:
>>> exec('sqrt = 1', scope)
>>> scope['sqrt']
1
这样,exec所得到的结果就不会与math中的sqrt方法相冲突了。
2.eval
将字符串作为python代码执行兵计算结果:
>>> eval("2 * 3")
6
eval也会有命名空间的问题,例如:
>>> scope = {}
>>> scope['x'] = 2
>>> scope['y'] = 3
>>> eval('x * y', scope)
6
注:命名空间在形式和使用上可以理解为一个字典。
网友评论