# python3
python -m http.server
a_list =[[1,2],[3,4],[5,6]]
print(list(itertools.chain.from_iterable(a_list)))
#or
print(list(itertools.chain.(*a_list)))
#Output:[1,2,3,4,5,6]
foo = ['hello']
print(foo)
# Output: ['hello']
bar = foo
bar += ['world']
print(foo)
# Output: ['hi', 'bye']
对可变数据类型而言,每当你将⼀个变量赋值为另⼀个可变类型的变量时,对这个数据的任意改动会同时反映到这两个变量上去。新变量只不过是⽼变量的⼀个别名⽽已。
def add(num,target=[]):
print(id(target))
target.append(num)
return target
add(1)
# Output:94637112
# [1]
add(2)
# Output:94637112
# [1,2]
add(3)
# Output:94637112
# [1,2,3]
在Python中当函数被定义时,默认参数只会运算⼀次,而不是每次被调用时都会重新运算。一般在函数中不要定义可变类型的默认参数,上面函数可修改为:
def add(num,target=None):
if target is None:
target = []
print(id(target))
target.append(num)
return target
from functools import lru_cache
@lru_cache(maxsize=12)
def fib(n):
if n < 2:
return n
return fib(n - 1) + fib(n - 2)
print([fib(n) for n in range(10)])
在Python中,每个类都有实例属性。默认情况下Python⽤⼀个字典来保存⼀个对象的实例属性。它允许我们在运⾏时去设置任意的新属性。 然而,对于有着已知属性的⼩类来说,它可能是个瓶颈。这个字典浪费了很多内存。 Python不能在对象创建时直接分配⼀个固定量的内存来保存所有的属性。因此如果你创建成千上万个对象,它会消耗掉很多内存。 不过还是有⼀个⽅法来规避这个问题。这个⽅法需要使⽤__slots__来告诉Python不要使⽤字典,而只给⼀个固定集合的属性分配空间。
# 不使⽤__slots__
class Person(object):
def __init__(self, name, age):
self.name = name
self.age = age
self.set_up()
...
# 使⽤__slots__
class Person(object):
__slots__ = ['name', 'age']
def __init__(self, name, age):
self.name = name
self.age = age
self.set_up()
...
枚举(enumerate)是Python内置函数,它允许我们遍历数据并⾃动计数。可选参数允许我们定制从哪个数字开始枚举。
my_list = ['apple', 'banana', 'grapes', 'pear']
for c, value in enumerate(my_list, 1):
print(c, value)
# 输出: (1, 'apple') (2,'banana') (3,'grapes') (4,'pear')
枚举也长用来创建包含索引的元祖列表,例如:
my_list = ['apple', 'banana', 'grapes', 'pear']
counter_list = list(enumerate(my_list, 1))
print(counter_list)
#输出:[(1,'apple'),(2,'banana'),(3,'grapes'),(4,'pear')]