一个非常基础的例子,用于生成包含连续数字的列表:
mylist = [i for i in range(10)]
print(mylist)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
由于可以使用表达式,因此可以通过更复杂的数学方法来生成列表:
squares = [x**2 for x in range(10)]
print(squares)
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
甚至也可以调用外部函数:
def some_function(a):
return (a + 5) / 2
my_formula = [some_function(i) for i in range(10)]
print(my_formula)
[2, 3, 3, 4, 4, 5, 5, 6, 6, 7]
最后,也可以用if作为生成条件来对列表进行过滤。在下面的例子中,只有偶数被保留:
filtered = [i for i in range(20) if i%2==0]
print(filtered)
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
5、检查对象的内存占用情况
通过sys.getsizeof(object)命令可以查看任何对象的内存使用情况:
import sys
mylist = range(0, 10000)
print(sys.getsizeof(mylist))
48
这是因为range函数返回的是一个类对象,这个类对象表现为一个列表。因此使用range函数比使用实际的包含一万个数字的列表要更加节省内存。可以通过上面第四条中提到的列表解析式创建一个同样大小的实际列表:
import sys
myreallist = [x for x in range(0, 10000)]
print(sys.getsizeof(myreallist))
87632
实际内存占用87632字节,远高于通过range函数生成的对象。
6、返回多个值
Pyhon中的函数都可以返回多个变量,而不需要字典,列表或者类作为返回对象。方法如下:
def get_user(id):
fetch user from database
…
return name, birthdate
name, birthdate = get_user(4)
对于有限数量的返回值,这是可以的。但是任何超过3个值的内容都应该放到一个(data)类中。
7、使用 data 类
从3.7版本开始,python提供了 data 类。与常规类或其他替代方法(如返回多个值或字典)相比,有以下几个优点:
-
数据类需要至少一定数量的代码
-
可以通过 eq 方法来比较不同的data类对象
-
可以 repr 通过很容易地打印一个数据类来进行调试
-
数据类需要类型提示,因此减少了 bug
一个data类的例子如下:
from dataclasses import dataclass
@dataclass
class Card:
rank: str
suit: str
card = Card(“Q”, “hearts”)
print(card == card)
True
print(card.rank)
‘Q’
print(card)
Card(rank=‘Q’, suit=‘hearts’)
8、就地变量交换
一个简洁的技巧,可以节省几行代码:
a = 1
b = 2
a, b = b, a
print (a)