python3小点

python3小点

1、locals(); 查看当前所有变量

测试是否定义过一个值 f in locals();

2、丰富的else语句:

在 Python 中,else 语句不仅能跟 if 语句搭,构成“要么怎样,要么不怎样”的语境;Ta 还能跟循环语句(for 语句或者 while 语句),构成“干完了能怎样,干不完就别想怎样”的语境;其实 else 语句还能够跟我们刚刚讲的异常处理进行搭配,构成“没有问题,那就干吧”的语境。

3、with语句:

使用 with 语句可以使你不比再担心文件打开后却忘了关闭的尴尬,with 语句会自动处理文件的打开和关闭,如果中途出现异常,会执行清理代码,然后确保文件自动关闭,with 语句处理多个项目的时候,可以用逗号隔开写成一条语句:
with A() as a, B() as b:

4、多条语句

python中一行可以写多个语句,用分号(;)分开即可

5、短路逻辑(and not or)

逻辑操作符有个有趣的特性:在不需要求值的时候不进行操作。这么说可能比较“高深”,举个例子,表达式 x and y,需要 x 和 y 两个变量同时为真(True)的时候,结果才为真。因此,如果当 x 变量得知是假(False)的时候,表达式就会立刻返回 False,而不用去管 y 变量的值。
这种行为被称为短路逻辑(short-circuit logic)或者惰性求值(lazy evaluation)

6、python四舍五入

int() 将小数转换为整数,小数取整会采用比较暴力的截断方式,即向下取整。(注:5.5 向上取整为 6,向下取整为 5)。
“四舍五入”法:int(5.4+0.5) == 5;int(5.6+0.5) == 6

7、中文变量名

Pyhton3 源码文件默认使用utf-8编码(支持中文),可以给变量命名中文名;
你好 = 'haha,我是中文变量名'

8、逻辑操作符优先级(and not or)

not or and 的优先级是不同的:not > and > or;

9、断言 assert

assert:断言;当这个关键字后边的条件为假的时候,程序自动崩溃并抛出AssertionError的异常。
可以用 assert **Error 来自定断言异常类型

10、for i in *

for i in lists:
in 是“成员资格运算符”,所以 for i in 5:会报错;

11、append()和extend()方法

append() 方法是将参数作为一个元素增加到列表的末尾、
extend() 方法则是将参数作为一个列表去扩展列表的末尾。

12、负数索引

python支持负数索引,正常索引是从左到右索引,负数索引是从右到左

列表内容 1 13 33 28 56 88
正常下标 0 1 2 3 4 5
负数下标 -6 -5 -4 -3 -2 -1

13、分片:

分片:list1 = [1, 3, 2, 9, 7, 8];

  1. list1[::2] -> [1,2,7]
  2. list1[::0] -> error 步长不能为0
  3. list1[::-2]-> [8,9,3] 步长可以是负数

14、列表排序

顺序排序:list1.sort()
逆序排序:list1.sort().reverse() 或者 list1.sort(reverse = True);

15、列表、元组

列表:一个大仓库,你可以随时往里边添加和删除任何东西;
元组:封闭的列表,一旦定义,就不可改变(不能添加、删除或修改)

16、元组推导式

tuple1 = (x**2 for x in range(10))
tuple1是一个生成器,用__next__()方法调用

17、R/r

r是原始字符串操作符。

18、序列:

列表、元组、字符串统称为序列,共同点:

  1. 都可以通过索引得到每一个元素
  2. 默认索引值总是从0开始(当然灵活的Python还支持负数索引)
  3. 可以通过分片的方法得到一个范围内的元素的集合
  4. 有很多共同的操作符(重复操作符、拼接操作符、成员关系操作符)

19、DRY

Don’t Repeat Yourself

20、global、nonlocal

修改全局变量的值用global关键字;
在嵌套的函数中,内部函数想修改外部函数的局部变量,使用nonlocal关键字;

21、递归

  1. 函数调用自身
  2. 设置了正确的返回条件

22、字典

字典不支持一键多值。

23、fromkeys()

fromkeys方法是直接创建一个新的字典,不要试图使用它来修改一个原有的字典,因为它会直接无情的用把整个字典给覆盖掉。

24、frozenset()

不可变集合:frozenset();

25、集合是无序的

集合是无序的,不可用索引值索引;set1 = {1, 1.0}为{1.0},1和1.0在set里等值;

26、open()

open()函数默认的打开模式是’rt’,即可读、文本的模式打开。

27、f.seek()

f.seek()定位的文件指针是按字节为单位进行计算的。

28、pickle

pickle的实质就是利用一些算法将你的数据对象存储成二进制文件,存储在磁盘上,当然也可以放在数据库或者通过网络传输到另一台计算机上。

29、类:封装、继承、多态

封装 对外部隐藏对象的工作细节
继承 子类自动共享父类之间数据和方法的机制
多态 可以对不同类的对象调用相同的方法,产生不同的结果

30、类的定义:

类的属性和方法定义应该尽可能的抽象,更符合面向对象的思维。

31、__init__()方法

__init__()特殊方法不应当返回除了 None 以外的任何对象,只能返回None。
__init__() should return None

32、子类定义了父类的方法

当子类定义了与父类相同的属性和方法时,会将父类属性或方法覆盖,子类对象调用的时候会调用到覆盖之后的新属性或方法,父类的仍然存在,只是子类对象’看不到’。

33、super()函数

super()函数的超级之处在于你不需要明确的给出任何基类的名字,它会自动的帮你找出所有的基类以及对应的方法,由于你不用给出基类的名字,这就意味着你如果需要改变了类继承关系,你只要改变 class 语句里的父类即可,而不必在大量代码中去修改所有被继承的方法。

34、钻石继承(菱形继承)


多重继承容易导致重复调用问题,程序应该可控,而不能受到继承关系影响。

35、issubclass(class, classinfo)

issubclass(class, classinfo) 函数:判断一个类是否为另一个类的子类

  1. 一个类被认为是其自身的子类。
  2. classinfo 可以是类对象组成的元祖,只要 class 与其中任何一个候选类的子类,则返回 True。
  3. 在其他情况下,会抛出一个 TypeError 异常。

36、isinstance(object, classinfo)

isinstance(object, classinfo) 函数:判断对象 a 是否为 类 A 的实例对象

  1. 如果 objec t是 classinfo 的子类的一个实例,也符合条件。
  2. 如果第一个参数不是对象,则永远返回False。
  3. classinfo 可以是类对象组成的元祖,只要class与其中任何一个候选类的子类,则返回 True。
  4. 如果第二个参数不是类或者由类对象组成的元祖,会抛出一个 TypeError 异常。

37、python修饰符

python修饰符:其实 Python 的修饰符就是一种优雅的封装,但要注意的是只可以在模块或类定义内对函数进行修饰,不允许修饰一个类,一个修饰符就是一个函数,它将被修饰的函数做为参数,并返回修饰后的同名函数或其它可调用的东西。

@something
def f():
     print("I love FishC.com!")
# 相当于
def f():
     print("I love FishC.com!")
f = something(f)

38、魔法方法

魔法方法总是被双下划线包围,例如__init__()__init__()方法的返回值一定是None,不能是其它。当重写__init__() 方法时一定不能忘记。

39、__new__()方法

__new__() 是在一个对象实例化的时候所调用的第一个方法。它跟其他魔法方法不同,它的第一个参数不是 self 而是这个类(cls),而其他的参数会直接传递给 __init__() 方法的。

40、python三大容器

python基于序列的三大容器是列表、元组、和字符串。

41、迭代

迭代:迭代是重复反馈过程的活动,其目的通常是为了接近并到达所需的目标或结果。每一次对过程的重复被称为一次“迭代”,而每一次迭代得到的结果会被用来作为下一次迭代的初始值。迭代器不是一个容器,是实现了__next__()方法的对象。

42、迭代器不能取上一个值

迭代器性质决定没有办法回退,只能往前进行迭代。不能获取上一个值。

43、如何判断是否有迭代功能

判断一个容器是否拥有iter()和next()方法来判断是否具有迭代功能。

44、访问set元素

对于无法随机访问的数据结构 set 而言,迭代器是唯一的访问元素的方式。

45、协同程序

协同程序就是可以运行的独立函数调用,函数可以暂停或者挂起,并在需要的时候从程序离开的地方继续或者重新开始。Python 是通过生成器来实现类似于协同程序的概念:生成器可以暂时挂起函数,并保留函数的局部变量等数据,然后在再次调用它的时候,从上次暂停的位置继续执行下去。

46、生成器、迭代器

生成器所能实现的任何操作都可以用迭代器来代替,因为生成器实际上就是基于迭代器实现的,生成器只是一个yield语句,内部自动创建__iter__()__next__()方法。将一个函数改为生成器说白了就是将return改为yield
生成器的最大作用是使得函数可以“保留现场”,当下一次执行该函数是从上一次结束的地方开始,而不是重头再来。

  1. generator 是用来产生一系列值的
  2. yield 则像是 generator 函数的返回结果
  3. yield 唯一所做的另一件事就是保存一个 generator 函数的状态
  4. generator 就是一个特殊类型的迭代器(iterator)
  5. 和迭代器相似,我们可以通过使用 next() 来从 generator 中获取下一个值
  6. 通过隐式地调用 next() 来忽略一些值

47、python手动定义 const 常量定义,实现 const.NAME = ‘你好’,NAME为常量不可变。

简单实现:不可改变,常量名全部大写。

class Const:    
    def __setattr__(self, name, value):
        if name in self.__dict__:
            raise TypeError('常量无法改变!')   
        if not name.isupper():
            raise TypeError('常量名必须由大写字母组成!')
        self.__dict__[name] = value
import sys
sys.modules[__name__] = Const()

sys.modules 是一个字典,它包含了从 Python 开始运行起,被导入的所有模块。键就是模块名,值就是模块对象。

import sys
sys.modules[__name__] = A();

48、python包

python的包必须有一个__init__().py文件,可以为空文件,但必须有。用来告诉python将该文件夹当成一个包处理。

猜你喜欢

转载自blog.csdn.net/guoqiankunmiss/article/details/82426775