• Python 基础


    pycharm professional 2018.1 激活

    https://blog.csdn.net/sunqiande88/article/details/80137151


    print(r'test ') # 所有内容当做普通字符打印

    '''
    三个单引号内可以随意使用单引号和双引号
    '''

    print('test
    more line') # 测试换行

    # Python是动态强类型语言
    # 静态语言:可以在编译时进行检查,动态语言只能在运行时发现错误
    # 强类型语言:需要自己强制转换变量类型

    # 常量:没有所谓的常量。放在内存中固定的位置,叫字面常量

    # Python3除法:1/5=0.2(自然除) 1//5=0(整除)
    # Python2除法:1/5=0(整除)
    # Python3:2的3次方:2**3

    # 成员运算符:in、not in

    # 身份运算符:is、is not

    # 运算符优先级:算数运算符 > 位运算符 > 身份运算符 > 成员运算符 > 逻辑运算符

    # 内存管理
    # 引用计数:一个对象被多少个变量引用
    # b = 6 表示6被b对象引用了一次
    # 当变量引用数=0时,会被垃圾回收机制GC,包括内存整理。同Java

    # 程序控制:顺序、分支、循环

    # 分支
    if 2>1:
    print('1 less than 2')

    # 多分支
    if condition1:
      block1
    elif condition2:
      block2
    elif condition3:
      block3
    ...
    else:
      block

    # block: 1 表示代码块; 2 表示阻塞

    # 真值表
    # 1   ""       假
    # 2   "str"   真
    # 3   0     假
    # 4   非0    真
    # 5   ()     假
    # 6   []    假
    # 7   {}    假
    # 8   None   假

    # while循环
    while condition:
      block

    # for循环(操作集合)
    for element in iteratable:
      block
    # 举例
    for i in range(10):
      print(i+1)
    # range
    # 1 可以使用ipython进行帮助查看 help(range)
    # 2 语法:range(stop) 仅指定结束。举例:range(10)是0-9
    # 3 语法:range(start,stop[, step]) 指定开始和结束,并指定步长step

    # continue 结束本次循环,进入下次循环
    # break 退出循环

    # 数据类型
    # 数值型:int、float、complex、bool
    # int:python3都是长整形
    # complex:用于科学计算,由实数和虚数部分组成
    # 序列对象:str、list、typle
    # 键值对:set、dict

    # 数据类型转换
    # int(x) 返回一个整数
    # float(x)
    # complex(x)
    # bool(x)

    # math
    # 向下取整:math.floor(1.8) 结果1
    # 向上取整:math.ceil(1.8) 结果2

    #round
    # 四舍六入五取偶:round()

    # 数字处理函数
    # min()
    # max()
    # pow(x,y)x的平方=x**y
    # math.sqrt() 开平方

    # 进制
    # bin() 十进制转二进制
    # oct() 十进制转八进制
    # hen() 十进制转十六进制
    # int(其他进制,要转换的进制)
    # int('1010', 2) '1010'转换为二进制,结果10

    # 类型判断
    # type() 查看类型
    # isinstance(6, int) 判断类型
    # isinstance(6, (int, str)) 是否属于多种类型的一种


    # 列表list:[]

    # 可以放任意类型的元素、有序、元素可重复
    # 有序:可以使用索引
    # list长度是可变的
    # list = list() 空
    # list = [] 空
    # list = [2, 'xiao', 10]
    # list = list(range(5))
    # Python不能初始定义大小
    # 正索引:从0开始
    # 负索引:从-1开始

    # 列表查询
    # 定义:lst = [1, 2, 3, 4, 2, 5, 2]
    # 查看list中元素的索引:lst.index(2),返回1
    # lst.index(value, [start, [stop]]) start表示索引开始,stop表示索引结束
    # lst.count(2),返回3

    # 时间复杂度:表示算法的效率
    # O(1) :表示一次就能算出结果。执行有限次数
    # O(n) :表示n次就能算出结果。执行跟元素相同的次数
    # 随着数据规模的增加,效率会下降

    # 列表长度:有一个地方记录此值
    # len(lst) len()是内置函数,公用

    # 列表元素修改
    # lst[5] = 100

    # 列表追加、插入
    # lst.append(object)
    # lst.append(99) 返回值是None - Python3.5
    # 时间复杂度是O(1)


    # lst.insert(index, object) - list中少使用,链表比较适合insert
    # lst.insert(index, object) 返回值是None
    # 时间复杂度:大数据量时,只要不是尾部,需要挪动大量元素,效率极低

    # 再次定义列表
    # lst1 = [1, 2, 3]
    # lst2 = [4, 5, 6]
    # lst3 = lst1 + lst2 连接lst1和lst2,定义lst3
    # lst4 = lst1*2 重复lst1,定义lst4
    # extend(iteratable) 返回None
    # lst1.extend(lst2) 重新定义lst1,追加lst2

    # 列表删除
    # lst.clear() 清空列表,大规模 会引起垃圾回收问题
    # lst.remove(value)
    # lst.remove(2) 从左到右移除一个值,少用
    # lst.pop([index])
    # lst.pop() 弹出最后的元素,效率高
    # lst.pop(0) 弹出第0个元素,少用

    # 列表翻转
    # reversed()


    # 列表排序
    # sort(key=None, reverse=False)
    # lst.sort() 默认升序
    # lst.sort(reverse=True) 降序
    # lst.sort(key=str, reverse=True) 按str排序

    # 20 in lst 20是否在集合内
    # 30 not in lst
    # [3, 4] in lst
    # for x in lst:

    # 列表复制
    # lst0 = list(range(4))
    # lst2 = list(range(4))
    # id(lst0) 返回78677128
    # id(lst2) 返回72007368 表明内存id不一样
    # lst0 == lst2 比较值,返回True
    # lst0 is lst2 比较内存地址,返回False
    # lst0 = lst1 同时指向同一个内存地址
    # lst5 = lst0.copy()
    # lst5 == lst0 True
    # lst5 is lst0 False,内存地址不同

    # 拷贝:浅拷贝、深拷贝
    # 浅拷贝:只对第一层负责,嵌套内容不管
    # 深拷贝:对嵌套内容也进行拷贝
    # import copy
    # lst5 = copy.deepcopy(lst0) 


    # 随机数
    # import random
    # random.randint(a, b) 随机整数,返回[a,b]
    # random.choice([1, 2, 3, 4, 5]) 给定序列选择
    # random.randrange([start,]stop[,step])
    # random.randrange(1, 10, 2) 返回奇数
    # random.shuffle(list) 打乱列表 


     # 元组tuple:()

    # 不可变集合,有序可重复。
    # 不可变,节省内存
    # tuple() 空元组基本没有
    # tuple(iterable)
    # tuple(range(1, 7, 2))
    # tuple(1, 2, 3, 4, 9)
    # tuple(1,) 一个元素的元组
    # tuple(1,)*5

    # 元组元素的访问
    # 正索引:从0开始,从左到右
    # 负索引:从-1开始,从右到左
    # tuple[index]

    # 元组查询
    # index(value,[start,[stop]]) 返回第一个匹配的值
    # count(value) 返回匹配的次数
    # index和count时间复杂度O(n),随着规模增加,效率下降
    # len(tuple) 长度

    # 命名元组 namedtuple
    # namedtuple(typename, field_names, verbose=False, rename=False)
    # field_names可以用空格分割,verbose/rename不用理会
    from collections import namedtuple
    Student = namedtuple('Student', 'name age') 比类占用内存小
    tom = Student('tom', 20)
    jerry = Student('jerry', 18)
    tom.name
    jerry.name


     # 冒泡排序:基础冒泡排序,每趟比较次数减1次

    lst = [1, 9, 8, 5, 6, 7, 4, 3, 2]
    length = len(lst)
    for i in range(length):
      for j in range(length-i-1):
        if lst[j] > lst[i]:
        tmp = lst[j]
        lst[j] = lst[j+1]
        lst[j+1] = tmp
    print(lst)

    # 冒泡排序:某一趟扫描,如果发现没有可交换的,可以退出
    lst = [1, 2, 3, 4, 5, 6, 7, 9, 8]
    length = len(lst)
    for i in range(length):
      flag = False
      for j in range(length-i-1):
        if lst[j] > lst[i]:
        tmp = lst[j]
        lst[j] = lst[j+1]
        lst[j+1] = tmp
        flag = True
      if not flag: # 内部循环一趟后,发现flag不是True,表示没有交换
      break # 没有交换退出外层循环,冒泡排序结束
    print(lst)

    # 冒泡排序:时间复杂度O(n平方)


     # 字符串:有序的字符集合

    # 可以使用单引号、双引号、三引号引住
    # 不可变
    # Python3中默认是utf8
    # slq = """select * from user where name='tom';"""
    # for i in sql: 有序,可迭代
    # print(i)
    # 字符串列表:lst = list(sql)

    # 字符串连接
    # 加号:+
    # str.join(iterable) 返回字符串
    # str = 'abc'
    # ' '.join(str) 输出'a b c d',用空格隔开str中的每个字符
    # lst = ['1', ['a','b'], '2'] 不能join(lst),引用类型不能被join

    # 字符串分割*
    # split:返回列表
    # split(sep=None, maxsplit=-1) 从左边开始切
    s1 = "I'm a super student."
    s1.split() 按空格切割,返回["I'm", "a", "super", "student"]
    # rsplit(sep=None, maxsplit=-1) 从右边开始切
    # splitlines([keepends]) 按照行分割字符串
    # 行分隔符包括: 、 、 等
    'ab c de fg kl '.splitlines() 不保留最后的
    'ab c de fg kl '.splitlines(True) 保留最后的

    # partition:返回元组
    # partition(sep)从左到右,遇到分隔符就切一刀,返回(head, sep, tail)
    # rpartition(sep) 从右到左

    # 字符串大小写
    upper() - str.upper()
    lower() - str.lower()
    swapcase() - str.swapcase() 交互大小写

    # 字符串排版
    str.titile() 标题每个单词都大写
    str.capitalize() 首个单词大写
    str.center(width[, fillchar]) width:打印宽度;fillchar:填充字符
    str.zfill(width) width:打印宽度
    str.ljust(width[, fillchar]) str左对齐
    str.rjust(width[, fillchar]) str右对齐

    # 字符串修改*
    str.replace(old, new[,count])
    'www.magedu.com'.replace('w', 'p') w全部替换成p
    'www.magedu.com'.replace('w', 'p', 2) w替换成p,仅替换两次

    strip([chars])
    str = ' You are so nice '
    # 去除两端空格:str.strip()
    # 去除两端的e: str.strip('e')
    # 去除左边空格:str.lstrip()
    # 去除右边空格:str.rstrip()

    # 字符串查找
    # find(sub[, start[, end]]) 返回int,没有返回-1
    # [start, end)找到就立即返回
    # rfind(sub[, start[, end]]) 从右向左

    # index(sub[, start[, end]]) 没找到抛异常ValueError
    # rindex(sub[, start[, end]]) 从右向左

    # count(sub[, start[, end]]) 统计子串出现的次数 *

    # 时间复杂度O(n)
    # len(string) 时间复杂度O(1)

    # 字符串判断*
    # endswith(suffix[, start[, end]]) 返回布尔值
    # 在指定区间[start, end),字符串是否以suffix结尾
    # startswith(perfix[, start[, end]]) 返回布尔值
    # 在指定区间[start, end),字符串是否以perfix开头

    # 字符串判断is系列
    # isalnum() 是否字母数字组成
    # isalpha() 是否是字母
    # isdecimal() 是否包含十进制数字
    # isdigit() 是否全部数字(0~9)
    # isidentifier() 是不是字母和下划线开头,其他都是字母、数字、下划线
    # islower() 是否小写
    # isupper() 是否大写
    # isspace() 是否只包含空白符

    # 字符串格式
    "I am %03d" % (20,) %03d表示3位数字,0是占位使用
    "I am %s" % 'python'
    "I am %-5d" % (20,) 负号表示左对齐

    # 字符串格式化* (代替字符串拼接)
    # "{}{xxx}".format(*args, **kwargs) 返回str
    # args位置参数,是一个元组
    # kwargs关键字参数吗,是一个字典
    # {}表示占位符
    # {n}索引匹配
    # {xxx}表示关键字参数中名称一致
    # {{}}表示打印花括号

    # 位置参数:"{}:{}".format('192.168.1.100', '8888')
    # 关键字参数:"{server}{1}:{0}".format(8888, '192.168.1.100', server='Ip info: ')
    # 访问元素:"{0[0]}.{0[1]}".format(('mama', 'com'))
    # t = ('mama', 'com')
    # "{}.{}".format(t[0].t[1]) 打印出mama.com

    # 对齐
    # "{0}*{1}={2:>02}".format(3, 2, 2*3) 打印3*2=06
    # "{:^30}".format('centered') 打印 centered
    # "{:*^30}".format('centered') 打印***********centered***********

    # 进制


     # bytes字节、bytearray字节数组(主要解决字符串问题)

    # Python3引入两个新的类型
    # bytes:不可变字节序列
    # bytearray:字节数组,可变

    # 编码与解码
    # 编码:str.encode(encoding='utf-8', errors='strict') 返回bytes
    # 解码:bytes.decode(encoding='utf-8', errors='strict') 返回str
    # bytearray.decode(encoding='utf-8', errors='strict') 返回str

    # bytes定义
    # bytes() 空
    # bytes(int)
    # bytes(iterable_of_ints) bytes[0, 255]的放int的可迭代对象
    # bytes([1, 3, 5]) 返回b开头的内容,表示不是字符串
    # bytes(string, encoding[, errors]) bytes等价于string.encode()
    # bytes(bytes_or_buffer) 从一个字节序列或buffer拷贝出一个新的不可变的bytes对象

    # b前缀
    # 基本ASCII:b'abc9'
    # 使用16进制表示:b'x41x61'

    # bytes操作
    # tmp = b'abcdef'
    # tmp.split(b'') 方法中参数也要加b前缀
    # tmp.replace(b'f', b'k')
    # tmp.find(b'b')
    # bytes.fromhex(string) string必须是2个字符的16进制形式
    # hex()返回16进制表示的字符串
    # 'abc'.encode().hex()
    # 索引:b'abcdef'[2] 返回该字节对应的数,int类型

    # bytearray定义
    # bytearray()
    # bytearray(int)
    # bytearray(iterable_of_ints)
    # bytearray(string, encoding[, errors])
    # bytearray(bytes_or_buffer)
    # bytearray(b'abc'.encode())

    # bytearray操作
    # tmp = b'abcdef'
    # bytearray(tmp).split(b'') 方法中参数也要加b前缀
    # bytearray(tmp).replace(b'f', b'k')
    # bytearray(tmp).find(b'b')
    # bytearray(tmp).fromhex(string) string必须是2个字符的16进制形式
    # hex()返回16进制表示的字符串
    # bytearray(tmp).hex()
    # 索引:bytearray(tmp)[2] 返回该字节对应的数,int类型

    # bytearray操作
    # append(int)
    # insert(index, int)
    # extend(iterable_of_ints)
    # pop(index=-1)
    # remove(value) 找不到抛异常
    # 上述int类型值在[0, 255]
    # clear()
    # reverse()


    # 切片:通过索引区间取出一段数据
    # 线性结构:列表、元组、字符串、bytes、bytearray
    # 可迭代:for ... in
    # len() 可以获取长度
    # 通过下标访问
    # 可以切片

    # sequence[start:stop] 表示返回[start,stop]区间的子序列
    # 支持负索引
    # start为0,可以省略
    # stop为末尾,可以省略
    # 超过右边界,取到末尾;超过左边界,取到开头
    # start一定要在stop左边
    # [:]取出全部元素,等效于copy()

    # tmp = 'www.baidu.com'
    # tmp = [4:10]
    # tmp = [:10]
    # tmp = [4:]
    # tmp = [:]
    # tmp = [:-1] 返回 'www.baidu.co'

    # 步长:[start:stop:step] step可以正可以负
    # step要和start:stop同向,否则返回空序列
    # list('www.baidu.com')[4:10:2]
    # tuple('www.baidu.com')[4:10:2]
    # b'www.baidu.com'[4:10:2]
    # bytearray(b'www.baidu.com')[4:10:2])


     # IPython技巧(用于测试使用)

    # help(name)查看指定名字的帮助,python的帮助
    # obj? 列出obj对象的详细信息
    # obj?? 列出更加详细信息

    # Ipython特殊变量
    # _ 表示前一次输出
    # __表示倒数第二次输出
    # ___表示倒数第三次输出
    # _dh 目录历史
    # _oh 输出历史

    # Ipython的shell命令
    # !command执行
    # !ls -l
    # files=!ls -l ls结果保存到列表中

    # Ipython魔术方法
    # %开头的方法
    # % 行magic
    # %% 多行magic
    # %alias 定义一个系统命令的别名
    # alias ll ls -l
    # %timeit statement
    # -n 一个循环loop执行语句多少次
    # -r 循环执行多少次loop,取最好的结果
    # %%timeit setup_code
    # %cd
    # %pwd
    # %ls
    # 注:%为Ipython内部实现;!依赖当前操作系统
    # %%js、%%javascript 在cell中运行js脚本


      # 集合 Set

    # set翻译为集合
    # collection翻译为集合类型,是一个大的概念
    # set:无序、可变、不重复

    # set定义
    # set()
    # set(iterable)

    s1 = set()
    s2 = set(range(5))
    s3 = set(list(range(10)))
    s4 = {} # dict
    s5 = {9, 10, 11} # set
    s6 = {(1, 2), 3, 'a'}
    a7 = {[1], (1,), 1} # ?

    # set元素
    # set元素要求必须可以hash
    # 目前絮聒不可hash的类型有list、set
    # 元素不可以索引
    # set可以迭代

    # set增加
    # add(elem) 增加,如果元素已经存在,什么都不做
    # update(*others)
    # 合并其他元素到set中
    # 参考others必须是可迭代对象
    # 就地修改

    # set删除
    # remove(elem) 移除,元素不存在则抛出KeyError异常
    # discard(elem) 移除,元素不存在则什么都不做
    # pop() -> item 移除并返回任意元素,空集合返回KeyError异常
    # clear() 移除所有元素

    # set修改
    # 要么删除、要么增加新元素

    # set查询
    # 非线性结构,无法索引
    # 根据key的hash值来查找,效率极高

    # set遍历
    # 可以遍历所有元素

    # 成员运算符
    # in、not in 判断元素是否在set中 (效率很高)

    # set成员运算符的比较
    # list和set的比较
    # lst1 = list(range(100))
    # lst2 = list(range(1000000))
    # -1 in lst1 看耗时 1.22微秒
    # -1 in lst2 看耗时 32ms 随着规模的增大,耗时增加
    # set1 = set(range(100))
    # set2 = set(range(1000000))
    # -1 in set1 看耗时 32ns
    # -1 in set2 看耗时 32.3ns 随着规模的增大,耗时不会受到太大影响

    # set和线性结构
    # 线性结构查询的时间复杂度O(n),随着规模增大和增大
    # 所以,线性结构查询时,尽量用索引
    # set、dict等结构,内部使用hash值作为key,时间复杂度可以做到O(1),查询时间跟规模无关

    # 可hash类型
    # 数值型:int float complex
    # 布尔型:True、False
    # 字符串:string、bytes
    # tuple
    # None
    # 以上都是不可变类型,称为可哈希类型 - hashable

    # 重点*
    # set中的元素必须是hashable的
    # set构造函数的元素是可迭代的,可迭代里面的元素必须是可hash

    # set集合概念
    # 全集:所有有元素的集合。如:实数集合
    # 子集:A集合所有元素都在集合B中,A是B的子集,B是A的超集
    # 真子集:A是B的子集,且A不等于B,A是B的真子集
    # 真超集:A是B的子集,且A不等于B,B是A的真超集
    # 并集:多个集合合并
    # 交集:多个集合的公共部分
    # 差集:集合中去除和其他集合的公共部分

    # 集合运算 - 并集
    # union(*others)返回多个集合合并后的新的集合
    # | 运算符等同union
    # update(*others):返回多个集合合并后的结果,就地修改
    # |= 运算符等同update
    # a = {1,2,3}
    # b = {1,2,4}
    # tmp = a.union(b) - 等同于 tmp = a | b > 结果a、b不变,生成新的集合tmp
    # tmp = a.update(b) - 等同于 tmp = a |= b > 结果a改变、b不变、tmp没有值

    # 集合运算 - 交集
    # intersection(*others) 返回和多个集合的交集
    # & 运算符等同intersecton
    # intersection_update(*others) 返回和多个集合的交集,就地修改
    # &= 运算符等同于intersection_update

    # 集合运算 - 差集
    # difference(*others) 返回和多个集合的差集
    # - 运算符等同difference
    # difference_update(*others) 返回和多个集合的交集,就地修改
    # -= 运算符等同于difference_update

    # 集合运算 - 对称差集
    # symmetric_difference(other) 返回两个集合不同的部分的集合
    # ^ 运算符等同symmetric_difference
    # symmetric_difference_update(*others) 返回两个集合不同的部分的集合,就地修改
    # ^= 运算符等同于symmetric_difference_update

    # 集合运算
    # issubset(other) <= 判断当前集合是否是另一个集合的子集
    # set1 < set2 判断set1是否是set2的真子集
    # issuperset(other) >= 判断当前集合是否是另一个集合的超集
    # set1 > set2 判断set1是否是set2的真超集
    # isdisjoint(other) 当前集合和另一个集合没有交集,返回True
    
    
    
    
    # 选择排序:选择极大或极小值,跟第一个进行交换
    lst = [1, 3, 9, 8, 5, 2, 7, 4, 6]
    length = len(lst)
    for i in range(length):
    maxValueIndex = i # 先假定第一个为最大值
    for j in range(i+1, length): # 从第二个开始跟第一个比较
    if lst[j] > lst[maxValueIndex]:
    maxValueIndex = j;

    if i != maxValueIndex: # 找到最大值的index后,进行交换
    tmp = lst[i]
    lst[i] = lst[maxValueIndex]
    lst[maxValueIndex] = tmp

    print(lst)

    print('-------------------------------------')
    # 选择排序:优化 - 每趟分别找到最大值和最小值
    lst = [1, 3, 9, 8, 5, 2, 7, 4, 6]
    length = len(lst)
    for i in range(length // 2): # 循环少一半
    maxValueIndex = i # 先假定第一个为最大值
    minValueIndex = -i-1 # 假定最后一个为最小值
    minOrigin = minValueIndex # 记录最小值的原始index
    for j in range(i+1, length-i): # 从第二个开始跟第一个比较
    if lst[j] > lst[maxValueIndex]:
    maxValueIndex = j
    if lst[- j - 1] < lst[minValueIndex]:
    minValueIndex = - j - 1

    if i != maxValueIndex: # 找到最大值的index后,进行交换
    tmp = lst[i]
    lst[i] = lst[maxValueIndex]
    lst[maxValueIndex] = tmp
    # 如果最小值被交换过,更新索引
    if i == minValueIndex or i == length + minValueIndex:
    minValueIndex = maxValueIndex

    # 最小值索引不同,但值相同,不用交换了
    if minOrigin != minValueIndex and lst[minOrigin] != lst[minValueIndex]:
    tmp = lst[minOrigin]
    lst[minOrigin] = lst[minValueIndex]
    lst[minValueIndex] = tmp

    print(lst)

    print('-------------------------------------')
    # 选择排序:优化 - 最大值最小值相等,跳出循环
    lst = [1, 3, 9, 1, 1, 1, 1, 1, 1]
    length = len(lst)
    for i in range(length // 2): # 循环少一半
    maxValueIndex = i # 先假定第一个为最大值
    minValueIndex = -i-1 # 假定最后一个为最小值
    minOrigin = minValueIndex # 记录最小值的原始index
    for j in range(i+1, length-i): # 从第二个开始跟第一个比较
    if lst[j] > lst[maxValueIndex]:
    maxValueIndex = j
    if lst[- j - 1] < lst[minValueIndex]:
    minValueIndex = - j - 1

    # 如果元素相同,结束循环
    if lst[maxValueIndex] == lst[minValueIndex]:
    break

    if i != maxValueIndex: # 找到最大值的index后,进行交换
    tmp = lst[i]
    lst[i] = lst[maxValueIndex]
    lst[maxValueIndex] = tmp
    # 如果最小值被交换过,更新索引
    if i == minValueIndex or i == length + minValueIndex:
    minValueIndex = maxValueIndex

    # 最小值索引不同,但值相同,不用交换了
    if minOrigin != minValueIndex and lst[minOrigin] != lst[minValueIndex]:
    tmp = lst[minOrigin]
    lst[minOrigin] = lst[minValueIndex]
    lst[minValueIndex] = tmp

    print(lst)


  • 相关阅读:
    姚班
    xxx
    1358B
    1368A
    莫烦Tensorflow 建造自己的NN
    莫烦Tensorflow 入门
    linux服务器安装Apache (Centos)
    C++ 获取Linux 服务器CPU占用率+内存空闲率(亲测绝对可以运行)
    MySQL主键从初始值自增
    基础练习 矩阵乘法
  • 原文地址:https://www.cnblogs.com/lizitest/p/8971725.html
Copyright © 2020-2023  润新知