JavaScript 的单线程模型
JavaScript 语言的单线程模型和事件队列
转战机器学习了,补齐一点 Python 基本知识,并没有太深入, 只需要满足基本的机器学习代码能跑起来就可以,所以整理一些基本知识。
注:下文 Python 代指 Python3。
Object
#
标识,多行注释同多行字符串.py
结尾。Python 中一切皆对象,数字、字符串、元组、列表、字典、函数、方法、类、模块等等都是对象。
不同的编程语言以不同的方式定义“对象”。 某些语言中,它意味着所有对象必须有属性和方法;另一些语言中,它意味着所有的对象都可以子类化。
在Python中,定义是松散的,某些对象既没有属性也没有方法,而且不是所有的对象都可以子类化。 简单可以解释为:Python 中的一切都可以赋值给变量或者作为参数传递给函数。
所有对象都有三个共同特征:
id(obj)
得到type()
来查看对象的类型大部分 Python 对象有属性、值或方法,使用句点 .
标记法来访问属性。
最常见的属性是函数和方法,一些 Python 对象也有数据属性,如:类、模块、文件等。
字符串、数字数据在内存中均为引用类型,即栈内存保存数据本身,堆内存维护一个变量池,如下实例:
# 开辟内存存储数据'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'
。
其他数据类型,类似;如列表、字典:
a = [1,2,3,4]
# 变量a的指针不改变
a[0] = 5
# 变量a的指针改变
a = [2,3,4,5]
变量 a
更改列表子数据时,列表本身的指针和位置不会改变,但将a本身重新赋值时,则同上:原列表数据销毁、指针指向新列表数据。
Python中支持删除变量对对象的引用,使用 del
语句,如下:
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 中变量都是指向某一对象的引用,当多个变量都引用了相同的对象,称为共享引用。
如下代码:
# 由于变量仅是对对象数据的一个引用,因此改变 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()
函数查询一个对象计数器的值。
import sys
sys.getrefcount(1)
# 实测python的编译过程和打印乃至getrefcount这个函数本身都会对目标对象造成多余的引用计数
三种类型:
int(num)
float(num)
complex(a, b)
运算相关:
方法:str()
包含一堆内建函数
三种符号表示方式(三引号保持原有格式):
'str'
"str"
'''str'''
"""str"""
两种操作/读取方式:
str[0]
str[:]
例子:
var1 = 'Hello World!'
print ("已更新字符串 : ", var1[:6] + 'Surmon!')
# 已更新字符串 : Hello Surmon!
简单说:类似数组,可嵌套,可作为堆栈使用
基本格式:['str', 1, ['hello']]
,拥有各种类似数组操作的方法,访问方式可使用下标、中括号 [index:index]
。
简单说:类似列表,但只读。
基本格式:('', '')
,和列表类似,拥有只读特性,可拼接,拥有基本操作方法。
简单说:是一个无序不重复元素的序列
基本格式:{ }
字面量 或 set()
方法,创建一个空集合必须用 set()
而不是 { }
字面量,因为 { }
字面量是用来创建一个空字典。
复杂说:类似于数学中的集合,可以进行成员关系测试(交、差、并、补集),还可以用来去重。
BTW:类似于 JavaScript 中的 Set
数据结构。
简单说:就是对象
与 JavaScript 并无太大异样,多了一些方法,和一些方法名称的不同,仅可通过 obj[key]
访问成员。
就是 JavaScript 中的 Generator
和 yield
,一句话的话就是:交出函数(运算)的执行权,即暂停执行。
两个参考链接:
普通函数基本没区别,区别的地方:
函数形参可以加一个 *
将函数所有不固定参数合并在一个元组,若参数为空,则返回一个空元组。
和 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数据的处理time
、calendar
多线程类似于同时执行多个不同程序,多线程运行有很多优点。
线程分为:
Python3 中线程相关的两个模块:
一般可以使用函数或者用类来包装线程对象。
...剩下的略复杂还没看,日后补上
初次学习,若有不足,多多指教!
完
刚才发布出错控制台
回复:
这得看是啥错误呢,大兄弟
17年之前,我必须利用最新的前端框架,搭建出和你一样的个人网站👆
回复:
来吧
<>听不错的
作为学友,鼓励一个哈😂
回复:
学友好🌚