python汇编指令_Python基础语法

阅读目录:

第一节:编程基础

第一节:编程基础

第二节:语言分类

第三节:高级语言的发展

第四节:程序program

第五节:Python解释器

第六节:Python基础语法

第七节:程序控制

第八节:额外扩展(以后会有介绍)

第九节:内置数据结构-数值and列表

内容:

第一节:编程基础

1、程序:

一组能让计算机识别和执行的指令

2、现代计算机结构体系-冯诺依曼体系架构

CPU由运算器和控制器组成

运算器,完成各种算数运算、逻辑运算、数据传输等数据加工处理

控制器,控制程序的执行

存储器,用于记忆程序和数据,例如内存

输入设备,将数据或者程序输入到计算机中,例

如键盘、鼠标

输出设备,将数据或程序的处理结果展示给用户,

例如显示器、打印机等

3、计算机语言:

人与计算机之间的交互的语言

4、机器语言:

一定位数组成二进制的0和1的序列,称为机器指令,机器指令的结合就是机器语言

5、汇编语言:

用一些助记符号代替机器指令,称为汇编语言,如:ADD A B将寄存器A 的数和寄存器B的数相加的数放到寄存器A 中

汇编语言写好的程序需要汇编程序转换成机器指令

第二节:语言分类

1、低级语言:

面向机器的语言,包括机器语言,汇编语言

不同的机器不能通用,不同的机器需要不同的机器指令或汇编程序

2、高级语言:

接近自然和数学语言的计算机语言

高级语言手写要书写源程序,通过编译程序吧源程序转换成机器的指令程序

3、编译语言和解释语言的区别:

编译语言:把源代码转换成目标机器的cpu指令

解释语言:解释后转换成字节码,运行在虚拟机上,解释器执行中间码

如:C 、C++等语言的源代码需要本地编译

java、Pyhton、C#的源代码需要被解释器编译成中间码(Bytecode),在虚拟机上运行

第三节:高级语言的发展

1、非结构化语言:

编号或标签,GOTO,子程序可以有多个入口和出口     如:ADD A B将寄存器A 的数和寄存器B的数相加的数放到寄存器A 中

有分支,循环

2、结构化语言:

任何基本结构只允许是唯一入口或出口

有顺序,分支,循环,废弃GOTO

3、面向对象语言

更加接近人类认知世界的方式,万事万物抽象成对象,对象间关系抽象成类和继承

封装、继承、多态

4、函数式语言:

古老的编程范式,用用在数学奇数,并行处理的场景,引入到了很多现代高级语言中。

第四节:程序program

1、程序:

程序= 算法+数据结构

数据一切程序的核心

第五节:Python解释器:

官方CPython:C语言开发,最广泛的Python解释器

IPython:一个交互式,功能增强的Cpython

PyPy:Python语言写的Python解释器,JIT技术,动态编译Pyhton代码

Jython:Python的源代码编译成java的字节码,跑在JVM

IronPython:与Jython类似,运行在.NET平台上的解释器,Python代码被编译成.NET字节码

第六节:Python基础语法

1、关于编码:

在Python中 需要插入: #-*-conding:utf-8-*-   ,Python3默认使用unicode编码。

gbk 两个字节表示一个字符,utf-8 三个字节表示一个字符,unicode至少两个字节。

gbk 和 utf-8 之间不能直接转换,必须通过unicode

2、注释:

单行注释使用 : # 被注释内容

多行注释使用: '''  被注释内容 '''

3、pyc文件:

执行Python代码时,如果导入了其他的.py文件,那么执行过程中会自动产生一个与其同名的.pyc文件,该文件就是Python解释器编译之后产生的字节码。

注:字节码通过反编译可以得到代码。

4、变量:

a、声明变量:

1 name = 'JerryZao' #name是一个变量,JerryZao是变量的值

b、理解变量在内存中的变现形式

name1 = ‘jack’

给name1赋值的时候,在内存中开辟一个空间,而name1 则是存放在jack的内存地址(可以用id()查看)

c、变量的定义规则:

只能用字母,数字,下划线,不能以数字开头,不能使用关键字

5、Python的语言类型:

a、python是动态语言,强类型语言

1)静态编译语言:

实现声明变量类型,类型不能再改变, 如:int a = 10

编译时检查

2)动态编译语言:

不用事先声明类型,随时可以复制为其他类型

编译时不知道是什么类型,很难判断

3)强类型语言:

不同类型之间的操作,必须先强制类型转换为同一类型,如 : print(‘a’ + str (1))

4) 弱类型语言:

不同类型间可以操作,自动隐式转换,如:js中 console.log(1 + 'a')

6、数字:

在Python中不区分long 和 int ,所有的整形 int

整数,bool(True,False),浮点数,复数

1 num = '0011'

2 v = int(num,base = 16) #0011作为16进制数,转换为10进制数

3 y = int(num,base = 10)4 z = int(num,base = 2)5 print(v,y,z)6

7 17 11 3

8

9

10 num = '24'

11 v = int(num,base = 16)12 y = int(num,base = 10)13 #z = int(num,base = 2) #错,2进制没有大于1 的数字

14 print(v,y)15

16 36 24

7、字符串

使用 '   " 单双引号用的字符的序列

''' 和 """单双三引号,可以跨行、可以在其中自由的使用单双引号

在字符串前面加上R  或 r 前缀,表示该字符串不做特殊处理

8、转义序列

\\   \t   \  r  \n  \'  \"

前缀 r ,把里面的所有字符当作普通字符对待

9、缩进:

未使用C等语言的花括号,而是采用缩进的方式表示层次关系

约定使用4个空格

10、续航

在行尾使用\   ,如果使用各种括号,认为括号内是一个整体,不需要使用\

11、运算符:

a、算数运算符:

+   -   *    /  **    //    %

** :求幂

// :整除,返回商的整数部分

% :求余

b:成员运算符:

in    、  not in

1 'a' in 'sadsa'

2

3 True

c、比较运算符:

==  > =

!=  、 <>  :表示不等于

d、逻辑运算符:

and  、 or 、not

e、赋值运算符:

=  +=     -=   +=   /=   **=   //=   %=

f、位运算符:

& :按位与

| :按位或

~ :按位取反

1 0000 1100 12

2 1111 0011 补码 -1

3 1000 1101 原码 -13

4

5 12按位取反,是1111 0011 在计算器中认为这是补码,最高位1 ,就是负数,但是人要看原码,在补码一次,1000 1101

^ :异或(异则为 1)

<< :左移

1 a = -1 << 2

2 print(a)3

4 -4

1 print(~12) 13

注:

is  和 "=="的区别:

==  判断左右两边的值是否相等

is    判断内存地址是否相等, id()值来判断

小数据池 (常量池),会对字符串进行缓存,为了节省空间,id一样. str boor int 有小数据池

"在python中如果单纯定义一个字符串会被添加到小数据池中"

12、原码、反码、补码、负数

1)反码:正数的反码是原码本身,负数的反码符号为不变其余按位取反

2)补码:正数的补码的原码本身,负数的补码符号位不变其余为按位取反后+1

1 5-1

2 5的原码+ -1 的补码

1 10 ^ 9

2

3 0000 1010 10

4 0000 1001 9

5 0000 0011 3

6

7 10^-9

8

9 0000 1100

10 1000 1001 -9反码11 1111 0111 -9补码12 1111 1101异或的补码13 1000 0011

13、运算符优先级:

算数运算符 > 位运算符> 身份(成员)运算符 > 成员运算符 > 逻辑运算符

第七节:程序控制

1、常用控制结构:顺序,分支,循环

2、单分支结构

1 ifconditon:2 代码块3 condition必须是一个bool类型,这个地方有一个隐式转换bool(condition)4

5 代码块:6 类似于if 语句的冒号后面的就是一个语句块7 在if、for 、def、class等关键字后使用代码块

3、多分支结构:

1 if...elif...else语句2 ifcondition1:3 代码块14 elifcondition2:5 代码块26 elifcondition3:7 代码块38 ......9 else:10 代码块

4、分支嵌套:

1 score = 80

2 if score<0:3 print('wrong')4 else:5 if score==0:6 print('egg')7 elif score <= 100:8 print('right')9 else:10 print('too big')

5、循环语句——while语句

1 语法2 whilecondition:3 block4 当条件满足即condition为True,进入循环体,执行block5 举例6 flag=10

7 whileflag:8 print(flag)9 flag -= 1

6、循环——for语句

1 语法2 for element initeratable:3 block4 当可迭代对象中有元素可以迭代,进入循环体,执行block

注:

a、range()函数:

a = range(1,4)

print(a)

a 是一个可迭代对象

1 a = range(1,8,2)2 b = range(1,8,-1)3 c = range(8,1,-1)4 d =range(0)5

6 for i inc:7 print(i)8

9 8

10 7

11 6

12 5

13 4

14 3

15 2

7、循环continue语句

8、循环 break语句

1 count =02 for i in range(0,1000,7):3 print(i)4 count += 1

5 if count >= 20:6 break

示例

1 02 7

3 14

4 21

5 28

6 35

7 42

8 49

9 56

10 63

11 70

12 77

13 84

14 91

15 98

16 105

17 112

18 119

19 126

20 133

输出

总结:

continue和break是循环的控制语句,只影响当前循环,包括while、for循环

如果循环嵌套, continue和break也只影响语句所在的那一层循环

continue和break 不是跳出语句块,所以 if cond: break 不是跳出if,而是终止if外的break所

在的循环

第八节:额外扩展(以后会有介绍)

1、引用计数:

1 import sys2

3 sys.getrefcount(x)

2、内置函数divmod()

divmod(54321,10000)

---->   (5, 4321)

1 divmod(x, y, /)2 Return the tuple (x//y, x%y). Invariant: div*y + mod == x.

3、判断是否是偶数的方式

1 i & 1 按位与,奇数的话,各位肯定是1,偶数各位肯定是0

第九节:内置数据结构-数值and列表

1、分类:

数值型

int、 float、complex(复数,不常用),boo

序列对象

字符串str、 列表list 、元组tuple

键值对

集合set、字典dict

*2、数值型:

数值型

int,float,complex。bool都是class,而具体的数据 1,2.2等都是对象即实例。

注:bool是 int 的子类,仅有True 和 False 对应1 、0,可以和整数直接运算

类型转换(built-in)

int(x),float(x),complex(x), bool(x)

3、数字的处理函数:

首先导入 math 模块,使用 round() ,floor(), ceil()  int()  //

1 a = int(2.5)2 b = int(2.1)3 c = int(2.6)4 d = int(-2.4)5 e = int(-2.5)6 f = int(-2.7)7 print(a,b,c,d,e,f)8

9 2 2 2 -2 -2 -2

10

11 #int 就是对浮点数取整数部分

int 对浮点数的处理

1 importmath2

3 print(math.floor(2.5),math.floor(-2.5)) #向地板 2 -3

4 print(math.ceil(2.5),math.ceil(-2.5)) #向天花板 3 -2

floor和ceil的区别

1 print(7//2,7//-2,-7//2,-(7//2)) #向下取整 3 -4 -4 -3

2 print(2//3,-2//3,-1//3) #0 -1 -1

// 的取整放向

1 print(round(2.5),round(2.5001),round(2.6)) #2 3 3 四舍六入五取偶(取偶是取离其最近的偶数)

2 (不是严格的四舍六入,只要大于5就入,小于5就舍)

round()取整

4、数字的处理函数

min()、max()、pow()== x**y、math.sqrt() 开方

进制函数,返回值是字符串:bin()   oct()    hex()

math.pi -----π    math.e 自如常数

1 bin(2) #'0b10' 是字符串

2 oct(8) #'0o10'

3 0x10 #16 是数字 int

importmath

math.sqrt(9)3.0 得到的是浮点数

5、类型判断:

type(obj),返回类型,而不是字符串

a = 1type(a)

得到str,但是 str 没有引号!! 是 str 类

1 type(1 + True + 2.1) #float

2

3 type(True+ 1) #int

注:

只要有浮点数,就有隐式转换 ,变为  float  型

不同的类型之间不能比较,但是可以用 ==  或 !=

isinstance(obj,class_or_tuple):返回bool值

1 isinstance('a',str) #True

2 isinstance(1,(str,bool))#False bool虽然是int的子集,但是也不对

3 isinstance(1,(str,bool,int)) #True

1 In [61]: isinstance(1,bool)2 Out[61]: False3

4 In [62]: isinstance(False ,bool)5 Out[62]: True6

7 In [63]: isinstance(False , int)8 Out[63]: True

*6、列表 list

列表的特点:

列表内的个体称为元素,由若干个元素组成列表

元素可以是任意的

列表内元素有顺序,可以索引

列表的元素可以被迭代

线性的数据结构

使用 [ ] 表示

列表是可变的

列表list 、链表 linked、队列queue、 stack栈的差异:

列表:连续的内存空间,有序的,可索引的,追加(O(1)),查询都很快(通过索引值,偏移量),但是删除、增加元素,比较慢,需要遍历元素

链表:非连续的内存空间,但是也是有序的,可以索引(在内存空间中是散落的,但是内存地址不是连续的),查询比较慢,都得从开头找,插队,删除都比较快,只需要找前后的内存地址就可以。

队列:先进先出,基于地址指正遍历数据可以从进的一端或者出的一端 ,但是不能同时访问,不需要开辟新的空间

栈:后进先出,遍历数据只能从入口端遍历,如果查找一个最先放进去的数据,需要遍历所有的数据,同时遍历数据需要开辟新的内存空间

列表定义,初始化:

方法一:[ ]

方法二:list(iterable)

注:列表不能一开始就定义大小,但是会有一个大概的内存空间。

1 l =list()2 l =[]3 l = [2,3,4,[2,3,4]]4 l = list(range(5))

列表索引访问:

索引,也叫下标

正索引:从左到右,从0开始

负索引:从右到左,从-1开始

索引都不可以越界,否则会出现IndexError

列表通过索引访问:list [index]

1 l = list(range(5)) #[0, 1, 2, 3, 4]

2 print(l[-2]) #3

列表查询:

index(value,[ start,[stop ] ]) # a = l.index(4,6,8) ,6 和 8是索引,但是这里不能用负数做索引

通过值value ,从指定区间查找列表内的元素是否匹配

匹配到第一个就立即返回索引

匹配不到,抛出ValueError 异常

1 l = list(range(1,5)) [1,2,3,4]2 a = l.index(1)3 print(a) #0

count(value)

返回列表中匹配Value的次数,  如果 value 不存在,不会抛异常

1 l = list(range(1,5))2 b = l.count(5)3 print(b) #0

时间复杂度:

index 和 count 方法都是O(n)

随着列表数据规模的增大,而效率下降,而且两者都要遍历,所以一般都少用!!!!

n:元素的个数

O(1):表示一步到位,如后面说的append()

返回列表元素的个数:

len(l):默认不需要遍历,会在列表最后有记录

注:有顺序的可以索引,但不一定可以迭代

列表元素修改:

索引访问修改:

list [ index ] = value  注:index不能越界,抛出 IndexError异常

1 l = [1,2,3,4]2 l[2] = 333

3 print(l) #[1, 2, 333, 4]

列表增加、插入元素:(一次只能插,追加一个元素)

append(object) 返回 None,也就意味着在原列表追加,时间复杂度为O(1),一步到位。

insert(index,obj)返回None,时间复杂度为 O(n),所以少用。

注: 所以可以越界,越上界,尾部追加,否则,首部追加,没有任何意义!

1 l = [1,2,3,4]2 l.append('a') #append()是把任何当成一个具体对象,直接追加到最后,而且只能表示为一个,否则抛出SyntaxError

3 l.append(range(5))4 l.append([2,3,3])5 print(l) #[1, 2, 3, 4, 'a', range(0, 5), [2, 3, 3]]

6

7

8

9 l = [1,2,3,4]10 l.insert(0,2)11 l.insert(3,[2,3,4])12 print(l) #[2, 1, 2, [2, 3, 4], 3, 4]

extend(iteratable) 返回None

1 l = [1,2,3,4,4,4,435,4,35,435,3]2 l.extend(range(5))3 print(l) #[1, 2, 3, 4, 4, 4, 435, 4, 35, 435, 3, 0, 1, 2, 3, 4]

+   生成新的 list

1 l = [1,2,3,4,35,435,3]2 a = l + [55,55]3 print(a) #[1, 2, 3, 4, 35, 435, 3, 55, 55]

4 print(l) #[1, 2, 3, 4, 35, 435, 3]

*  生成新的list

1 l = [1,2,3,4,35,435,3]2 a = l * 2

3 print(a) #[1, 2, 3, 4, 35, 435, 3, 1, 2, 3, 4, 35, 435, 3]

4 print(l) #[1, 2, 3, 4, 35, 435, 3]

注: * 使用的坑:

1 x = [[1,2,3]]*2

2 print(x) #[[1, 2, 3], [1, 2, 3]]

3 print(x[1][2]) #3

4

5 y = [1] * 5

6 print(y) #[1, 1, 1, 1, 1]

注:关于 *

1 l1 = [1,2,3,3]2 l2 = l1 * 3

3 l1[2] =04 l2[2] =05 print(l1)6 print(l2)7 ----------------------->

8 [1, 2, 0, 3]9 [1, 2, 0, 3, 1, 2, 3, 3, 1, 2, 3, 3]10

11

12

13 l1 = [[1,2]] #里边的 [1,2]是一个地址引用,放的是地址,所以乘3 就是地址复制三分(不同于上面例子,单个简单元素)

14 l2 = l1 * 3

15 l2[1][1] = 6

16 print(l2)17 ----------------------->

18 [[1, 6], [1, 6], [1, 6]]

l2[2] = 99

print(l2) # [[1, 2], [1, 2], 99]

19

20

21 l1 = [[1,2],[1,2],[1,2]] #因为不是同一个地址,不像上面,*3 形成,所以只改一个

22 l1[2][1] = 6

23 print(l1)24 ----------------------->

25 [[1, 2], [1, 2], [1, 6]]

列表删除元素:

remove(value) :返回None,在原列表删除,O(n)

pop([ index ])-- item

不指定索引,就从列表的尾部弹出一个元素

指定索引,就从索引弹出一个元素,索引越界 抛出IndexError

clear()--- 返回None

清除列表的所有元素,剩下一个空列表

列表的其他操作:

reverse()  :返回None

将列表元素反转,就地修改

sort( key = None,reverse = False)  返回None

对列表元素进行排序,就地修改,默认升序

reverse = True ,反转,降序

key 一个函数,指定key 如何排序

lsi.sort(key = functionname)

sort(key=str,reverse=True) # 元素以str 排序

in  :   [3,4] in [1,2,[3,4]]    , for x in [1,2,3,4]

注:Python中是没有变量的!

随机数:random模块

random.randint()  # 闭区间的整数 random.randint(2,3) ,返回int类型

random.randrange() # 左闭右开 random.range(1,7,2),返回int类型

random.choice(iteration) #  随机去一个,但是原数据集不变

1 l = [1,2,34,4,'s']2 print(random.choice(l))3 print(l)

random.shuffle() # 就地修改,返回None,(洗牌,打乱)

1 l = [1,2,34,4,'s']2 print(random.shuffle(l))3 print(l)4

5 None6 [2, 4, 34, 1, 's']

random.sample(ierater,k) # 取k个不同的元素  (理解这里的不同:l[1] = l[2] ,但是是不同的元素) ,返回一个新列表

random.sample(['a','b','c','d'],2)

random.sample(['a','a','a'],2)     #  ['a','a']

1 l = [1,2,3,4,2,2,2,2,2,34,4,'s']2 print(random.sample(l,3))3 print(l)4

5 [2, 2, 4]6 [1, 2, 3, 4, 2, 2, 2, 2, 2, 34, 4, 's']

**列表的复制:浅复制,深复制

--------------------->  赋值

1 l1 = list(range(5))2 l2 = list(range(5))3 print(l1 == l2) #== 内容相同

4 l3 =l15 l1[2] = 9

6 print(l3)7 ---------------------->

8 True9 [0, 1, 9, 3, 4]

In [106]: l1 = [1,2,3,[4,5]]

In [107]: l2 = l1

In [108]: l2[1] = 22

In [109]: l2[3][1] = 55

In [110]: l1

Out[110]: [1, 22, 3, [4, 55]]

In [111]: l2

Out[111]: [1, 22, 3, [4, 55]]

------> copy,生成新的列表(shadow copy 影子拷贝)

1 l1 = list(range(4))2 l2 =l1.copy()3 print(l2)4 l2[2] = 99

5 print(l1,l2) #[0, 1, 2, 3] [0, 1, 99, 3]

6

7 l3 = [1,2,3,[5,6]]8 l4 =l3.copy()9 print(l4)10 #l3[3] = 10

11 #print(l3,l4) # [1, 2, 3, 10] [1, 2, 3, [5, 6]]

12 l3[3][1] = 9

13 print(l3,l4) #[1, 2, 3, [5, 9]] [1, 2, 3, [5, 9]]

------> deepcopy,深拷贝

1 importcopy2 l1 = [1,2,3]3 l2 =copy.deepcopy(l1)4 #print(l2)

5 l2[2] = 99

6 #print(l2) [1, 2, 99]

7 l3 = [1,2,[3,4]]8 l4 =copy.deepcopy(l3)9 print(l4)10 l3[2][1] = 99

11 print(l3,l4) #[1, 2, [3, 99]] [1, 2, [3, 4]]

12

13 l3[2] = 999

14 print(l3,l4) #[1, 2, 999] [1, 2, [3, 4]]

列表补充:

1、切片:

1 li = [1, 12, 3, 4, [2, 2, [3, 4]], 2, '232', 'dsd']2 a =li[0]3 print(a)4 b = li[0:1]5 print(b)6 c = li[0:-1]7 print(c)8 d = li[0:5:2] #从左往右隔一个取值

9 print(d)10 e = li[-1::-1] #从右往左一个一个取

11 print(e)12 f = li[-1::-2] #从右往左隔一个取

13 print(f)14 g = li[-1::-3]15 print(g)16 h = li[1:]17 print(h)18 i =li[:]19 print(i)20

21 1

22 [1]23 [1, 12, 3, 4, [2, 2, [3, 4]], 2, '232']24 [1, 3, [2, 2, [3, 4]]]25 ['dsd', '232', 2, [2, 2, [3, 4]], 4, 3, 12, 1]26 ['dsd', 2, 4, 12]27 ['dsd', [2, 2, [3, 4]], 12]28 [12, 3, 4, [2, 2, [3, 4]], 2, '232', 'dsd']29 [1, 12, 3, 4, [2, 2, [3, 4]], 2, '232', 'dsd']

2、连接成字符串:(全是字符串的元素 才可以)

1 li1 = ['ww','wwwq','wqw']2 s = ''.join(li1)3 print(s)4

5 wwwwwqwqw

元组也可以:

tu = ('ss','we',)

s = ''.join(tu)

print(s)

3、del 删除元素

1 a = [1,2,3,4]2 del a[1]3 print(a)

[1, 3, 4]

注:del是根据索引删除元素,remove是根据元素删除,从左往右,第一个匹配到的

4、列表如何转换为字符串:

列表转换为字符串,在列表基本操作里介绍了

tu= (11, 22, 33, [9, 3], 44,)

s= ''

for i intu:

s= s +str(i)print(s)

print(type(s)) #

PeachPy 是一个用于编写高性能汇编内核的 Python 框架,可在汇编中编写模块。 它自动化了一些细节,并允许使用 Python 生成重复的汇编代码序列。PeachPy 旨在简化编写优化的汇编内核,同时保留传统的汇编所有优化机会。一些特性:用于 Windows,Unix 和 Golang 程序集的通用汇编语法.PeachPy 可以直接生成 ELF,MS COFF 和 Mach-O 对象文件以及 Golang 工具链的汇编列表自动适应不同的调用约定和 ABIs用于不同平台的功能可以从汇编相同的源生成支持 Microsoft x64 ABI, System V x86-64 ABI (Linux 和 OS X), Linux x32 ABI, Native Client x86-64 SFI ABI, Golang AMD64 ABI, Golang AMD64p32 ABI自动分配寄存器PeachPy 是灵活的,而且允许在同一代码中混合自动分配寄存器和硬编码寄存器汇编编程中常规任务的自动化:函数 prolog 和 epilog 由 PeachPy 生成数据常量的重复数据删除 (e.g. Constant.float32x4(1.0))分析在函数中使用的 ISA 扩展支持 x86-64 指令,最高可达 AVX-512 和 SHA包含 3dnow! , XOP, FMA3, FMA4, TBM 和 BMI2.不包括 x87 FPU 和大多数系统指令使用自动生成的测试 auto-generated tests 进行严格测试,以生成与 binutils 相同的操作码自动生成元数据文件具有模块依赖性的Makefile (-MMD 和-MF 选项)C 头文件生成的函数JSON 格式的函数元数据基于 Python 的元编程和代码生成多个指令流的复用(有助于软件流水线)兼容 Python 2 和 Python 3,CPython 和 PyPy在线 DEMO: PeachPy.IO 标签:PeachPy
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值