Python学习杂记(1)

本篇文章是为了记录进一步学习python时遇到的一些问题和相对陌生的知识点。

  • range()函数返回的是一个独特的“范围类”对象!

  • for 变量 in 字符串|集合|范围|任何可迭代对象:

    可迭代对象:指该对象中包含一个–iter–方法

  • isinstance()函数,判断某个变量是否为指定类型的实例,前一个参数是要判断的变量,后一个参数是类型。如:isinstance(2, int)

  • zip()函数,将多个列表压缩为一个zip对象(可迭代对象),这样就可以使用一个循环遍历两个列表

  • reversed()函数:接受序列(元组、列表、区间等),然后返回一个“反序排列”的迭代器,sorted()类似

Chapter 5 函数和Lambda表达式

  1. 函数的参数收集(个数可变的参数),可以在调用函数时传入任意多个参数) P105

在形参前面添加一个*,多个参数当做元组传入。一般都放在形参的末尾。如果放在前面,需要将后面的参数均使用关键字参数的方式输入。此种方法输入的参数被看为元组

在形参前面添加**,多个参数当做字典传入。

  1. 逆向参数收集 P106

指的是程序在已有列表、元组、字典等对象的前提下,把他们的元素“拆开后”传给函数的参数。拆开元组使用*,拆开字典使用**。如:

1
2
3
4
5
6
7
8
9
10
def test(name, *num):
print('user:', name)
print('say:', num)
mytuple = (1,2,3)

test('canVa4',mytuple)

res>>>>
user:canVa4
say: (1,2,3)
  1. locals()和globals()函数 P111

可以globals()方法在函数内部访问全局变量(同名的被hide的全局变量)

  1. global关键字

可以global关键字在函数内部声明已经定义好的全局变量

  1. 局部函数&nonlocal关键字 P114

在函数体内定义的函数。默认对外部是隐藏的

  1. 函数变量 与 将函数作为函数的参数 P115
  2. 将函数作为返回值 P116

Chapter 6 类和对象

  1. 对象的动态性 P123

对对象(实例化后)的可以增加实例变量,直接赋值即可;同时也可以用del函数,删除对象(实例化后)的在构造函数__init__中定义的函数)。

NOTE:也可以定义动态实例方法,但是不会将自身自动传入self参数(第一个参数),再调用时需手动输入。若想可以自动填入,需要MethodType()函数

  1. 类也可以调用实例方法

但!!此时不会自动填入第一个self参数(第一个自动填入调用者本身,而类没有实例,所以也没法自动填入)。所以在使用类调用实例方法时,需要手动填入第一个self参数。

  1. 类方法与静态方法(主要使用类来直接调用) P128

使用@classmethod修饰的是类方法,使用@staticmethod修饰的是静态方法

  1. @函数修饰器 P128 一个更好的解释说明 LINK
  2. 类变量和实例变量

类变量是直接在类里面定义的变量(注意在类里面函数中定义的变量不是类变量!!!)

  1. property函数与property修饰器 P135
  2. 类的封装和隐藏 P137 python本质并没有隐藏的功能!!! 可以在方法和变量前面增加__(两个下划线)起隐藏的效果(但仍可以直接访问到)
  3. 用super()可以直接调用父类方法,或者使用父类类名来调用父类方法 LINK
  4. python的动态特性 P143 即:类可以动态的增加:方法、属性和变量等。
  5. 使用__slot__()可以限制动态的添加,slot更多细节 P144
  6. python还可以动态的创建类:使用type()函数
  7. mateclass 更好的教程:LINK[https://www.liaoxuefeng.com/wiki/1016959663602400/1017592449371072]

metaclass,直译为元类,简单的解释就是:当我们定义了类以后,就可以根据这个类创建出实例,所以:先定义类,然后创建实例。

但是如果我们想创建出类呢?那就必须根据metaclass创建出类,所以:先定义metaclass,然后创建类。

连接起来就是:先定义metaclass,就可以创建类,最后创建实例。所以,metaclass允许你创建类或者修改类。换句话说,你可以把类看成是metaclass创建出来的“实例”。

NOTE: 基本用不到

  1. 可以使用issubclass()和isinstance()来判断是不是某个类的子类 或 一个实例是否为某个类的实例
  2. 每个类都有一个__bases__属性(用来给出其父类)和一个__subclasses__()方法用来给出其直接子类
  3. 枚举类 P150

指一个类的对象(实例)是有限且固定的 更好的教程LINK