【复习记录】Python (+部分GitHub)

如何找需要的(论文的)代码
github里项目的目录结构说明
如何轻松阅读GitHub上的项目源码?
寻找安装包 再用pip安装
在cmd中用 python -m pip install --upgrade pip 更新pip时, 是被自动更了Anaconda的目录中的pip而不是Python目录中的pip 因此通常最好用Anaconda里的pip来安装 。不过实际上用 pip install xxx 时默认即是用anaconda里的pip在安装 , 不要给pip增加前缀路径即可。

编辑器等问题



Python基础篇

  • / 除法计算结果是浮点数, 即使是两个整数恰好整除, 结果也是浮点数。还有一种除法是 // 称为地板除, 两个整数的除法仍然是整数

  • str
    字符串里面用%%来表示一个%
    字符串相加即可直接拼接, 和STL中的string类同
    字符串’xxx’也可以看成是一种list, 每个元素就是一个字符。因此, 字符串也可以用类似list中的切片操作, 只是操作结果仍是字符串
    字符串str是不变对象, 例如用str.replace(‘a’, ‘A’)把str中的a替换为A后 并不能真正的使str发生改变, 但可以str2 = str1.replace(‘a’, ‘A’)

  • list :
    初始化定义list时是用方括号 如[1, 2, 3],不同于C中的大括号。list里面的元素的数据类型可以不同
    要取最后一个元素时,除了计算索引位置外,还可以用-1做索引。以此类推,-2获取倒数第2个 ······
    取list的切片时也是左闭右开, ist[0:-1]包括list[0]但不包括list[len(list)-1] 取前9个元素即list[0:9]或list[:9] 取后9个元素即list[-9:]
    对于tuple和字符串 , 也可以用上一行的同样方法来截取切片
    如果生成一个0-99的数列 L = list(range(0, 100)) 再从中每隔3个取一个 则可 L[::3]
    如果生成一个0-99的平方的数列, 则可使用列表生成式, 如 L = [x*x for x in range(0, 100)]
    如果生成上述时仅需要偶数的平方, 则用[x*x for x in range(1, 11) if x%2==0] 但如果要带else则必须将if…else…语句放在for之前
    如果使用两层循环, 还可以生成两个字母组合的全排列 如[m+n for m in ‘ABC’ for n in ‘XYZ’]
    如果把一个列表生成式的[]改成() 就可以创建生成器generator, 这可以解决list容量有限的问题, 可以代替列表生成式来无限存储
    如果用类似列表生成式的for循环无法创建generator的时候, 还可以用函数来创建, 只需要把其中的print(x)改为yield x 示例详见
    .append(x) 追加元素x到末尾    \quad\quad\quad\quad\quad\,\, .pop() 删除末尾的元素
    .insert(i, x) 把元素x插入到指定的位置i \quad\quad .pop(i) 删除指定位置i的元素
    把某个元素替换成别的元素, 可以直接赋值给对应的索引位置, 像C中对数组的赋值

  • tuple :
    初始化定义tuple时是用圆括号, tuple和list非常类似, 但是tuple一旦初始化就不能修改。它也没有.append() .insert()这样的方法
    其他获取元素的方法和list是一样的,可以正常地使用tuple[0],tuple[-1],但不能赋值成另外的元素。
    tuple也可以看成是一种list, 唯一区别是tuple不可变。因此, tuple也可以用类似list中的切片操作, 只是操作的结果仍是tuple
    Python在显示只有1个元素的tuple时,也会加一个逗号, 定义只有1个元素的tuple定义时也必须加一个逗号,

  • dict
    即相当于STL中的map 。dict的key必须是不可变对象,因为在其内部需要保证hash的正确性
    初始化定义方法例如mp = {‘Michael’: 95, ‘Bob’: 75, ‘Tracy’: 85}
    添加键值对方法例如mp[‘Jack’] = 90   \, 删除方法例如mp.pop(‘Bob’)   \, 访问方法例如mp[‘Bob’]
    通过in判断key是否存在 : >>> ‘Jack’ in mp

  • set
    与STL不同的是此处的set无序。set的原理和dict一样, 所以同样不可以放入可变对象
    要初始化(创建)一个set, 需要提供一个list作为输入集合, 例如 s = set([1, 2, 3])
    s.add(x) 添加元素x      \quad\quad\quad\quad\quad\,\,\,\, s.remove(x) 删除元素x
    s1 & s2 取集合s1和s2的交集 \quad\quad s1 | s2 取集合s1和s2的并集

  • 函数
    查询想要使用的函数时, 可以直接从Python的官方网站查看文档
    定义函数时 : 如果要设置默认参数, 则, 必选参数在前,默认参数在后
       \quad\quad\,\, 牢记 : 默认参数必须指向不变对象!如果实在需要用可变对象, 可用None这个不变对象来实现, 详见其中的红色部分
       \quad\quad\,\, 如果参数需要是可变参数, 即传入的参数个数是可变的, 则可以在参数名前面加一个*号。例如 def myfunc(*numbers): 此时在函数内部, 参数numbers接收到的是一个tuple, 调用该函数时可以传入任意个参数, 包括0个参数。调用该函数时 : 如果已经有一个(假设变量名为nums的)list或者tuple, 则为了简便可以也在nums前面加一个*号来传入参数, 例如 myfunc(*nums)
       \quad\quad\,\, 如果参数需要是关键字参数, 则可以在参数名前面加**号。例如 def myfunc(name, age, **other): 此时在函数内部, 参数other接收到的是一个dict, 调用该函数时可以传入任意个数的关键字参数, 例如 myfunc(‘Bob’, 25, gender=‘M’, job=‘Engineer’) 调用该函数时 : 如果已经有一个(假设变量名为mp的)dict, 则为了简便可以也在mp前面加上**号来传入参数, 例如 myfunc(‘Bob’, 25, **mp) \quad **mp表示把mp这个dict的所有key-value用关键字参数传入到函数的**other参数,other将获得一个dict, 不过other获得的dict是mp的一份拷贝, 对other的改动不会影响到函数外的mp \quad
       \quad\quad\,\, 如果要限制关键字参数的名字, 就可以用命名关键字参数, 例如, 只接收city和job作为关键字参数。这种方式定义的函数例如 def myfunc(name, age, *, city, job): 但如果函数定义中已经有了一个可变参数 , 后面跟着的命名关键字参数就不再需要一个特殊分隔符*了, 例如 def myfunc(name, age, *args, city, job): \quad 不过要特别注意, 使用命名关键字参数时, 如果缺少*则定义的参数都会被视为普通的位置参数, 例如def myfunc(name, age, city, job): \quad 调用该类型的函数时, 命名关键字参数必须传入参数名, 这和普通的位置参数不同, 例如myfunc(‘Bob’, 25, ‘Beijing’, ‘Engineer’)则调用错误, 应该用myfunc(‘Bob’, 25, city=‘Beijing’, job=‘Engineer’)
       \quad\quad\,\, 上述提到的必选参数、默认参数、可变参数、关键字参数、命名关键字参数, 这5种参数都可以组合使用。但是要注意参数定义的顺序必须是 : 必选参数、默认参数、可变参数、命名关键字参数、关键字参数。例如def myfunc1(a, b, c=0, *args, **kw): 或 def myfunc2(a, b, c=0, *, d, **kw):
       \quad\quad\,\, Python的函数可以返回多个值, 用逗号隔开即可。不过这只是一种假象, 实际上这时是返回一个tuple。

  • 函数式编程
    lambda表示匿名函数, 例如 lambda x: x*x 冒号前面的x表示函数参数, 后面是返回的表达式。注意:匿名函数只能有一个表达式
    函数作为返回值时, 返回的函数并没有立刻执行,而是直到调用了这个返回的函数时才执行。
    由于上述原因,返回闭包时牢记一点:返回函数不要引用任何循环变量,或者后续会发生变化的变量。
    装饰器decorator实质上就是一个返回函数的高阶函数, 这种方式可以在代码运行期间动态增加(函数的?)功能。用法可见



常用函数

  • 获取对象的信息
    isinstance() 可以判断一个对象是否是某种类型。还可以判断一个变量是否是某些类型中的一种, 如 isinstance(123, (int, str, bytes))
    dir() 可以获得一个对象的所有属性和方法。
    hasattr() 测试一个对象是否有某个属性。如obj是否有属性’x’即 hasattr(obj, ‘x’)
    setattr()   \, 额外为一个对象设置某个属性。如对obj设置一个属性’y’即 setattr(obj, ‘y’, 19)
    getattr()   \, 获取一个对象拥有的某个属性。如获取obj的属性’y’即 getattr(obj, ‘y’) 还可再加参数xxx让属性不存在时返回xxx
    len(x) 函数内部实际上在调用对象x的__len__()方法。我们自己写的类, 如果也想用len(MyObj) 就自己在类中写一个__len__()方法
  • int() 可以把字符串转换为整数。但int()函数还提供额外的base参数,默认值为10。
    如果传入base参数,就可以将输入的数字字符串当做base进制数而用int转换为十进制数。例如 int(‘100’, 2)



面向对象编程基础篇

  • 基本概念
    方法 : 类中的函数称为方法
    实例 : 根据类来创建的对象
    属性 : 实例属性属于各自实例所有, 互不干扰;类属性属于类所有, 所有实例共享一个属性;不要对实例属性和类属性使用相同的名字
    包和模块 : 一个.py文件就称之为一个模块(Module);包(Package)可以通俗的理解成一个文件夹
    import 和 from import 区别 : 例如 import xx.xx.xx 最后的一个xx可以是package或者module,但绝对不能是函数或者类的名字。
      \quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\, 而 from Module import Other 是引入模块中的类或函数或变量。
    from x.xxx import func 直接导入模块中某函数, 直接func()就可用。 from Module import * 是引入模块中的所有’公开’成员, 并且该模块中所有函数可以直接使用。

  • 安装 、导入模块等时候遇到过的问题 :
    __int__.py文件是用于标识当前目录是一个包
    新建一个文件夹来存放自己写的或者下载的模块, 但import时无此路径, 则可 : 将自己的路径永久添加到PYTHONPATH中

  • __init__ 方法的第一个参数永远是self, 表示创建的实例本身。在__init__方法内部, 就可以把各种属性绑定到self, 因为self就指向创建的实例本身。有了__init__方法, 在创建实例的时候就不能传入空的参数了, 必须传入与__init__方法匹配的参数, 但self不需要传, Python解释器自己会把实例变量传进去。如 def __init__(self, name, age):

  • 和普通的函数相比, 在类中定义的函数只有一点不同, 就是第一个参数永远是实例变量self, 并且调用时不需要传递该参数。
    除此之外, 类的方法和普通函数没有什么区别, 仍然可以用默认参数、可变参数、关键字参数和命名关键字参数。

  • 如果要让内部属性不被外部访问, 可以把属性的名称前加上两个下划线__ 而单下划线开头如_name的变量名则表示尽量不要去访问。
    在Python中, 实例的变量名如果以__开头, 就变成了一个私有变量(private), 只有内部可以访问, 外部不能访问。 但需要注意的是, 在Python中, 变量名类似__xxx__的, 是特殊变量, 特殊变量是可以直接访问的, 不是private变量, 所以不能用__name__这样的变量名。

  • 创建子类时, 父类必须包含在当前文件中, 且位于子类的前面。通过继承, 子类能获得父类的全部功能并新增。如class Dog(Animal):
    子类中 def __init__(self, ···): 时,可以在该函数内使用 super.__init__(···) 这句来获得父类的所有属性。super名称来源于superclass,父类也称为超类
    对于父类的方法, 都可以在子类中对其进行重写, 重新定义相应的函数来覆盖父类的函数即可。这就是继承的另一个好处 : 多态。
    多态 : 对扩展开放 : 允许新增父类(如Animal)的子类;对修改封闭 : 不需要修改依赖父类(如Animal)类型的函数;



面向对象编程进阶篇



Ref :

廖雪峰教程参考链接
编程教程网站参考链接 (含各类语言和TensorFlow等)

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值