读书笔记-ethan-funny/explore-python

种树人 / 2024-01-17 / 原文

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 的功能:固定函数参数,返回一个新的函数。