BING
斯是陋室,唯吾芳馨
原创

两小时 Python 之旅

共 4,611 字,需阅读 12 分钟2017/04/14 下午6,075 次阅读

转战机器学习了,补齐一点 Python 基本知识,并没有太深入, 只需要满足基本的机器学习代码能跑起来就可以,所以整理一些基本知识。

注:下文 Python 代指 Python3。

#基本信息

  • 和 JavaScript 一样,面向对象、解释型、动态数据类型
  • 一切皆为对象(Object),包含原始数据类型也由内置构造函数创建,高阶对象为 Object
  • 单行注释使用 # 标识,多行注释同多行字符串
  • 靠缩进约束逻辑分支,无大括号等多余运算符
  • 支持多行单语句、单行多语句
  • 变量无需声明,必须赋值才会正式声明
  • 有自己的模块系统
  • 文件以 .py 结尾。

#基本构成

Python 中一切皆对象,数字、字符串、元组、列表、字典、函数、方法、类、模块等等都是对象。

不同的编程语言以不同的方式定义“对象”。 某些语言中,它意味着所有对象必须有属性和方法;另一些语言中,它意味着所有的对象都可以子类化。

在Python中,定义是松散的,某些对象既没有属性也没有方法,而且不是所有的对象都可以子类化。 简单可以解释为:Python 中的一切都可以赋值给变量或者作为参数传递给函数。

所有对象都有三个共同特征:

  • 身份:即对象数据(非变量)在内存中的唯一 id,可以通过函数 id(obj) 得到
  • 类型:对象的类型决定了对象可以保存什么类型的值,有哪些属性和方法,可以进行哪些操作,遵循怎样的规则。可以使用内建函数 type() 来查看对象的类型
  • :对象所表示的数据

大部分 Python 对象有属性、值或方法,使用句点 . 标记法来访问属性。 最常见的属性是函数和方法,一些 Python 对象也有数据属性,如:类、模块、文件等。

#数据存储

字符串、数字数据在内存中均为引用类型,即栈内存保存数据本身,堆内存维护一个变量池,如下实例:

          
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
# 开辟内存存储数据'hello',并创建变量a,并将a的指针指向此数据 a = 'hello' # 开辟内存存储数据'world',并更改变量a的指针,销毁数据'hello' a = 'world' # 开辟内存存储数据"hello world!",并同时创建三个变量,将三个变量的指针同时指向此数据 b = c = d = "hello world!" # 多个变量赋值,同上,分别先后对应 e, f, g = 1, 2, 'python'

实际上变量 a 在首次声明并赋值时,栈区开辟内存存储 'hello' 字符串, a 再次赋值时,栈区重新开辟内存存储数据 'world' 字符串,同时将变量 a 的指针指向数据 'world',销毁数据 'hello'

其他数据类型,类似;如列表、字典:

          
  • 1
  • 2
  • 3
  • 4
  • 5
a = [1,2,3,4] # 变量a的指针不改变 a[0] = 5 # 变量a的指针改变 a = [2,3,4,5]

变量 a 更改列表子数据时,列表本身的指针和位置不会改变,但将a本身重新赋值时,则同上:原列表数据销毁、指针指向新列表数据。

Python中支持删除变量对对象的引用,使用 del 语句,如下:

          
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
a = 10 b = 20 c = 30 d = [1,2,3,4] del a del b, c del d[0]

#对象比较

  • == 操作符用于测试两个被引用的对象的值是否相等
  • is 用于比较两个被引用的对象是否是同一个对象

#类型比较

  • type(obj) 判断数据类型
  • isinstance(object, classinfo) 判断实例是否属于某类

#缓存和内存回收机制

#缓存机制

Python 缓存了某些不变的对象对其进行复用,而不是每次创建新的对象。 在 Python 中变量都是指向某一对象的引用,当多个变量都引用了相同的对象,称为共享引用。

如下代码:

          
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
# 由于变量仅是对对象数据的一个引用,因此改变 a 并不会导致 b 的变化 a = 1 b = a a = 0 print(a) # 0 print(b) # 1 # 对 a = [1, 2, 3] b = a a[0] = 0 print(a) # [0, 2, 3] print(b) # [0, 2, 3]

#内存回收机制

每一个对象有两个标准的头部信息:

  • 类型标识符:标识对象数据类型
  • 引用的计数器:用于决定是否需要对对象进行回收

计数器记录了当前指向该对象引用的数目,一旦对象的计数器为 0,即不存在对该对象的引用,则这个对象的内存空间会被回收,和 JavaScript 中基本一致, 可以通过 sys 模块中的 getrefcount() 函数查询一个对象计数器的值。

          
  • 1
  • 2
  • 3
import sys sys.getrefcount(1) # 实测python的编译过程和打印乃至getrefcount这个函数本身都会对目标对象造成多余的引用计数

#数据类型

#数字 Numbers

三种类型:

  • int:整型 int(num)
  • float:浮点型 float(num)
  • complex:复数型 complex(a, b)

运算相关:

  • 数学常量...
  • 数学函数...
  • 随机数函数...
  • 三角函数...

#字符串 String

方法:str() 包含一堆内建函数

三种符号表示方式(三引号保持原有格式):

  • 'str'
  • "str"
  • '''str'''
  • """str"""

两种操作/读取方式:

  • 下标:str[0]
  • 中括号:str[:]

例子:

          
  • 1
  • 2
  • 3
var1 = 'Hello World!' print ("已更新字符串 : ", var1[:6] + 'Surmon!') # 已更新字符串 : Hello Surmon!

#列表 List

简单说:类似数组,可嵌套,可作为堆栈使用

基本格式:['str', 1, ['hello']],拥有各种类似数组操作的方法,访问方式可使用下标、中括号 [index:index]

#元组 Tuple

简单说:类似列表,但只读。

基本格式:('', ''),和列表类似,拥有只读特性,可拼接,拥有基本操作方法。

#集合 Sets

简单说:是一个无序不重复元素的序列

基本格式:{ } 字面量 或 set() 方法,创建一个空集合必须用 set() 而不是 { } 字面量,因为 { } 字面量是用来创建一个空字典。

复杂说:类似于数学中的集合,可以进行成员关系测试(交、差、并、补集),还可以用来去重。

BTW:类似于 JavaScript 中的 Set 数据结构。

#字典 Dictionary

简单说:就是对象

与 JavaScript 并无太大异样,多了一些方法,和一些方法名称的不同,仅可通过 obj[key] 访问成员。

#迭代器和生成器

就是 JavaScript 中的 Generatoryield,一句话的话就是:交出函数(运算)的执行权,即暂停执行

两个参考链接:

#函数

普通函数基本没区别,区别的地方: 函数形参可以加一个 * 将函数所有不固定参数合并在一个元组,若参数为空,则返回一个空元组。

#

和 JvaScript 比的话,就是 ES5 中的构造函数,ES6 中的 Class。

它用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。

对象是类的实例。就是面向对象啦,上下文不再是 this,而是类函数中的首参(一般定义为 self)。

类的专有方法:

  • __init__ : 构造函数,在生成对象时调用(对应 ES6 中的 constructor
  • __del__ : 析构函数,释放对象时使用
  • __repr__ : 打印,转换
  • __setitem__ : 按照索引赋值
  • __getitem__: 按照索引获取值
  • __len__: 获得长度
  • __cmp__: 比较运算
  • __call__: 函数调用
  • __add__: 加运算
  • __sub__: 减运算
  • __mul__: 乘运算
  • __div__: 除运算
  • __mod__: 求余运算
  • __pow__: 称方

#包和模块

Python 中,包为最大内聚单位,当然它只是抽象的,它可能是个文件夹或是其他 whatever,他的意义就是更好地管理模块的命名空间。

假设现在有个模块的名称是 A.B, 那么他表示一个包 A 中的子模块 B。 就好像使用模块的时候,你不用担心不同模块之间的全局变量相互影响一样,采用 package.moduleName 这种形式也不用担心不同库之间的模块重名的情况。

Python 中以文件为模块单位,模块中又可以区分不同的类、方法、对象或任何其他数据,和 Node.js 中的模块大同小异。

核心语句:

  • import ...
  • from ... import ...

#核心对象和模块

  • File:对文件的操作
  • OS:处理文件和目录
  • json:对json数据的处理
  • 时间:timecalendar

#多线程

多线程类似于同时执行多个不同程序,多线程运行有很多优点。

线程分为:

  • 内核线程:由操作系统内核创建和撤销
  • 用户线程:不需要内核支持而在用户程序中实现的线程

Python3 中线程相关的两个模块:

  • _thread(原 thread,已废弃)
  • threading

一般可以使用函数或者用类来包装线程对象。

...剩下的略复杂还没看,日后补上

初次学习,若有不足,多多指教!

署名 - 非商业性使用 4.0 国际 https://surmon.me/article/39
7 / 7 条看法
访客身份
在下有一拙见,不知...
  • viruse
    Viruse🇨🇳CNShanghaiWindowsChrome

    刚才发布出错控制台

    • Surmon
      Surmon🇨🇳CNXiamenMac OSChrome

      回复

      这得看是啥错误呢,大兄弟

  • like
    Like🇨🇳CNBeijingWindowsChrome

    17年之前,我必须利用最新的前端框架,搭建出和你一样的个人网站👆

    • Surmon
      Surmon🇨🇳CNXiamenMac OSChrome

      回复

      来吧

  • ss
    Ss🇨🇳CNQingzhouWindowsChrome

    <>听不错的

  • skyrover
    Skyrover🇨🇳CNXi'anMac OSChrome

    作为学友,鼓励一个哈😂

    • Surmon
      Surmon🇨🇳CNYintaiMac OSChrome

      回复

      学友好🌚