读书笔记-ethan-funny/explore-python
Python2 的默认编码是 ascii,Python3 的默认编码是 utf-8
python2的input 本质上是使用 raw_input 实现的,如下:
def input(prompt):
return (eval(raw_input(prompt)))
列表负索引是 numbers[4:0:-1]
当使用一个负数作为步长时,必须让左边索引大于右边索引;
对正数步长,从左向右取元素;对负数步长,从右向左取元素;
sort
sort 方法用于对列表进行排序,注意该方法会改变原来的列表,而不是返回新的排序列表,另外,sort 方法的返回值是空。
如果我们不想改变原列表,而是希望返回一个排序后的列表,可以使用 sorted 函数
a = (12,) # 在值后面再加一个逗号
a = (12) # int
字符串和元组一样,也是不可变的
字符串是不可变对象,调用对象自身的任意方法,也不会改变该对象自身的内容。相反,这些方法会创建新的对象并返回。
d = {'name': 'ethan', 'age': 20}
for i in d:
if i == 'name':
del d[i]
报错,RuntimeError: dictionary changed size during iteration
应该用for i in list(d.keys())
d1 = {1:2}
d2 = d1
d2 = {}
此时d1 d2的修改互不影响
除非用clear(),或者修改字典
原因: 当你将一个字典赋值给另一个变量时,你实际上是创建了一个新的引用指向同一个字典对象、
copy 方法实现的是浅复制(shallow copy)。它具有以下特点:
对可变对象的修改保持同步;
对不可变对象的修改保持独立;
和浅复制对应的是深复制(deep copy),它会创造出一个副本,跟原来的对象没有关系,可以通过 copy 模块的 deepcopy 函数来实现
多返回值的函数返回的result是个元组
默认参数应该使用不可变对象。下面的L会每次调用时候改变
>>> def add_to_list(L=[]):
... L.append('END')
... return L
它们在使用的时候是有顺序的,依次是必选参数、默认参数、可变参数*和关键字参数**。
reduce 函数的使用形式如下:
reduce(function, sequence[, initial])
如果有 initial,则作为初始值调用
注意在 python2 和 python3 中,map/reduce/filter 的返回值类型有所不同,python2 返回的是基本数据类型,而 python3 则返回了迭代器;
像上面这种情况,一个函数返回了一个内部函数,该内部函数引用了外部函数的相关参数和变量,我们把该返回的内部函数称为闭包(Closure)。
闭包的最大特点就是引用了自由变量,即使生成闭包的环境已经释放,闭包仍然存在。
我们应尽量避免在闭包中引用循环变量,或者后续会发生变化的变量。
函数 hello 被 makeitalic 装饰后,它的函数名称已经改变了
为了消除这样的副作用,Python 中的 functools 包提供了一个 wraps 的装饰器:
partial 的功能:固定函数参数,返回一个新的函数。
种一棵树最好的时间是十年前,其次是现在。