• [技术干货] python中的getter与setter
    因为java开发的习惯,想要在python开发中使用类似JavaBean的结构。在python可以直接结合java中的编写习惯编写getter和setter方法class  DataBean:    """bean类"""    def __init__(self):        """构造方法"""        self.username: str = ""        self.password: str = ""    def set_username(self, username: str):        """设置用户名"""        self.username = username    def set_password(self, password: str):        """设置密码"""        self.password = password    def get_username(self):        """获取用户名"""        return self.username    def get_password(self):        """"获取密码"""        return self.password这是结合java的习惯与python类的使用写出的getter和setter结构,当然也可以完全按照java中的写法class  DataBean:    """bean类"""    # 用户名    username: str = ""    # 密码    password: str = ""    def set_username(self, username: str):        """设置用户名"""        self.username = username    def set_password(self, password: str):        """设置密码"""        self.password = password    def get_username(self):        """获取用户名"""        return self.username    def get_password(self):        """"获取密码"""        return self.password使用python的装饰器在python内置的装饰器中,@property和@XXX.setter是针对于getter和setter方法的不二之选。当一个方法(函数)的最终目的是返回一个值时,可以@property装饰该方法(因为java的使用习惯,我更想称之为注解),这样就可以达成getter方法。当在一个方法的上方使用XXX.setter装饰时,代表可以直接通过类实例对象名称.变量名为其变量赋值,其中XXX代表变量名同时也是方法(函数)名称,具体可以看下方示例:class  DataBean:    """bean类"""    # 替代setter方法    @username.setter    def username(self, username: str):        """设置用户名"""        self.username = username    @password.setter    def password(self, password: str):        """设置密码"""        self.password = password    # 替代getter方法    @property    def username(self):        """获取用户名"""        return self.username    @property    def password(self):        """"获取密码"""        return self.password# 测试data_bean = DataBean()# 直接赋值date_bean.username = "123"print(data_bean.username)
  • [常见FAQ] 为什么python提交的显示 “打开选手输出文件失败”
    【功能模块】【操作步骤&问题现象】1、2、【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [技术干货] Python 实现循环最快方式(转)
    文章转自微信公众号-Python之禅众所周知,Python 不是一种执行效率较高的语言。此外在任何语言中,循环都是一种非常消耗时间的操作。假如任意一种简单的单步操作耗费的时间为 1 个单位,将此操作重复执行上万次,最终耗费的时间也将增长上万倍。while 和 for 是 Python 中常用的两种实现循环的关键字,它们的运行效率实际上是有差距的。比如下面的测试代码:12345678910111213141516171819202122232425262728import timeit  def while_loop(n=100_000_000):    i = 0    s = 0    while i < n:        s += i        i += 1    return s  def for_loop(n=100_000_000):    s = 0    for i in range(n):        s += i    return s  def main():    print('while loop\t\t', timeit.timeit(while_loop, number=1))    print('for loop\t\t', timeit.timeit(for_loop, number=1))  if __name__ == '__main__':    main()# => while loop               4.718853999860585# => for loop                 3.211570399813354这是一个简单的求和操作,计算从 1 到 n 之间所有自然数的总和。可以看到 for 循环相比 while 要快 1.5 秒。其中的差距主要在于两者的机制不同。在每次循环中,while 实际上比 for 多执行了两步操作:边界检查和变量 i 的自增。即每进行一次循环,while 都会做一次边界检查(while i < n)和自增计算(i +=1)。这两步操作都是显式的纯 Python 代码。for 循环不需要执行边界检查和自增操作,没有增加显式的 Python 代码(纯 Python 代码效率低于底层的 C 代码)。当循环的次数足够多,就出现了明显的效率差距。可以再增加两个函数,在 for 循环中加上不必要的边界检查和自增计算:1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950import timeit  def while_loop(n=100_000_000):    i = 0    s = 0    while i < n:        s += i        i += 1    return s  def for_loop(n=100_000_000):    s = 0    for i in range(n):        s += i    return s  def for_loop_with_inc(n=100_000_000):    s = 0    for i in range(n):        s += i        i += 1    return s  def for_loop_with_test(n=100_000_000):    s = 0    for i in range(n):        if i < n:            pass        s += i    return s  def main():    print('while loop\t\t', timeit.timeit(while_loop, number=1))    print('for loop\t\t', timeit.timeit(for_loop, number=1))    print('for loop with increment\t\t',          timeit.timeit(for_loop_with_inc, number=1))    print('for loop with test\t\t', timeit.timeit(for_loop_with_test, number=1))  if __name__ == '__main__':    main()# => while loop               4.718853999860585# => for loop                 3.211570399813354# => for loop with increment          4.602369500091299# => for loop with test               4.18337869993411可以看出,增加的边界检查和自增操作确实大大影响了 for 循环的执行效率。前面提到过,Python 底层的解释器和内置函数是用 C 语言实现的。而 C 语言的执行效率远大于 Python。对于上面的求等差数列之和的操作,借助于 Python 内置的 sum 函数,可以获得远大于 for 或 while 循环的执行效率。12345678910111213141516171819202122232425262728293031323334import timeit  def while_loop(n=100_000_000):    i = 0    s = 0    while i < n:        s += i        i += 1    return s  def for_loop(n=100_000_000):    s = 0    for i in range(n):        s += i    return s  def sum_range(n=100_000_000):    return sum(range(n))  def main():    print('while loop\t\t', timeit.timeit(while_loop, number=1))    print('for loop\t\t', timeit.timeit(for_loop, number=1))    print('sum range\t\t', timeit.timeit(sum_range, number=1))  if __name__ == '__main__':    main()# => while loop               4.718853999860585# => for loop                 3.211570399813354# => sum range                0.8658821999561042可以看到,使用内置函数 sum 替代循环之后,代码的执行效率实现了成倍的增长。内置函数 sum 的累加操作实际上也是一种循环,但它由 C 语言实现,而 for 循环中的求和操作是由纯 Python 代码 s += i 实现的。C > Python。再拓展一下思维。小时候都听说过童年高斯巧妙地计算 1 到 100 之和的故事。1…100 之和等于 (1 + 100) * 50。这个计算方法同样可以应用到上面的求和操作中。12345678910111213141516171819202122232425262728293031323334353637383940import timeit  def while_loop(n=100_000_000):    i = 0    s = 0    while i < n:        s += i        i += 1    return s  def for_loop(n=100_000_000):    s = 0    for i in range(n):        s += i    return s  def sum_range(n=100_000_000):    return sum(range(n))  def math_sum(n=100_000_000):    return (n * (n - 1)) // 2  def main():    print('while loop\t\t', timeit.timeit(while_loop, number=1))    print('for loop\t\t', timeit.timeit(for_loop, number=1))    print('sum range\t\t', timeit.timeit(sum_range, number=1))    print('math sum\t\t', timeit.timeit(math_sum, number=1))  if __name__ == '__main__':    main()# => while loop               4.718853999860585# => for loop                 3.211570399813354# => sum range                0.8658821999561042# => math sum                 2.400018274784088e-06最终math sum 的执行时间约为 2.4e-6,缩短了上百万倍。这里的思路就是,既然循环的效率低,一段代码要重复执行上亿次。索性直接不要循环,通过数学公式,把上亿次的循环操作变成只有一步操作。效率自然得到了空前的加强。最后的结论:实现循环的最快方式—— —— ——就是不用循环对于 Python 而言,则尽可能地使用内置函数,将循环中的纯 Python 代码降到最低。当然,内置函数在某些情况下还不是最快的。比如在创建列表的时候,是字面量写法的速度更快
  • [技术干货] Python 3行代码提取音乐高潮部分
     1.遍历整首歌曲。 2.将选定长度的部分与其他部分比较并计算相似度,以查看是否重复。 3.寻找重复次数较大、且间隔长的片段。检测时用到的相似函数是这样的:这主要是因为歌曲由12个基本音符的帧的集合而组成,v1和v2是任意两段音乐的音符矢量,如果说两段音乐非常相似,那么右边的式子将接近于0. 如果说 1-右边的式子 得分非常高,则说明两段音乐非常相似pip install pychorusfrom pychorus import find_and_output_choruschorus_start_sec = find_and_output_chorus("你的音乐文件", "提取结果的目标路径", 要多少秒的高潮部分)# Python 实用宝典# 提取音乐高潮部分# 2020/06/11import osimport sysfrom pychorus import find_and_output_chorusdef extract_all_file(files_path):    """    批量提取音乐高潮    Args:        files_path (str): 文件夹路径    """    # 文件夹路径    modpath = os.path.dirname(os.path.abspath(sys.argv[0]))    for filepath in os.listdir(files_path):        # 路径处理        datapath = os.path.join(modpath, files_path + filepath)        # output文件夹是否存在        targets = f"{modpath}\output\"        if not os.path.exists(targets):            os.makedirs(targets)        # 提取音乐高潮至当前output文件夹下        find_and_output_chorus(            datapath, f"{targets}{filepath.split('.')[0]}_high.wav", 40        )extract_all_file("F:\push\20200611\music\")
  • [技术干货] python图片格式转换脚本
    常见的图像任务通常需要把照片统一成相同的格式,所以此文章正是为了统一格式而生,常见的主要有cv2和PIL.Image的相关操作,照片格式是一串数字加上后缀名pip install opencv-python之后就可以import cv2import osimport cv2import sysimport numpy as np路径设置path = r"C:\\Users\\86775\\PycharmProjects\\pythonProject2\\ResNet\\test_change\\"path2 = r"C:\\Users\\86775\\PycharmProjects\\pythonProject2\\ResNet\\test_change2\\"改格式重新传用os.path.splitext()来判断images = os.listdir(path)for i in os.listdir(path):    print(os.path.splitext(i))  # ('34474006827920603', '.png')    if os.path.splitext(i)[1] == ".jpeg":        img = cv2.imread(path + i)        # print(img)        new_imagename = i.replace(".jpeg", ".jpg")        cv2.imwrite(path2 + new_imagename, img)    elif os.path.splitext(i)[1] == ".png":        img = cv2.imread(path + i)        # print(img)        new_imagename = i.replace(".png", ".jpg")        cv2.imwrite(path2 + new_imagename, img)    elif os.path.splitext(i)[1] == ".JPG":        img = cv2.imread(path + i)        # print(img)        new_imagename = i.replace(".JPG", ".jpg")        cv2.imwrite(path2 + new_imagename, img)    elif os.path.splitext(i)[1] == ".PNG":        img = cv2.imread(path + i)        # print(img)        new_imagename = i.replace(".PNG", ".jpg")        cv2.imwrite(path2 + new_imagename, img)    elif os.path.splitext(i)[1] == ".jpg":        img = cv2.imread(path + i)        # print(img)        cv2.imwrite(path2 + i, img)用split()来判断images = os.listdir(path)for i in os.listdir(path):    print(i.split("."))    if i.split(".")[1] == "jpeg":        img = cv2.imread(path + i)        # print(img)        new_imagename = i.replace(".jpeg", ".jpg")        cv2.imwrite(path2 + new_imagename, img)    elif i.split(".")[1] == "png":        img = cv2.imread(path + i)        # print(img)        new_imagename = i.replace(".png", ".jpg")        cv2.imwrite(path2 + new_imagename, img)    elif i.split(".")[1] == "JPG":        img = cv2.imread(path + i)        # print(img)        new_imagename = i.replace(".JPG", ".jpg")        cv2.imwrite(path2 + new_imagename, img)    elif i.split(".")[1] == "PNG":        img = cv2.imread(path + i)        # print(img)        new_imagename = i.replace(".PNG", ".jpg")        cv2.imwrite(path2 + new_imagename, img)    elif i.split(".")[1] == "jpg":        img = cv2.imread(path + i)        # print(img)        cv2.imwrite(path2 + i, img)查看结果
  • [技术干货] Python时间包使用
    # 导入包与模块 # 第一种导入方法:from datetime import datetime   # 第一个 datetime 是包 ;第二个 datetime 是模块 # 第二种导入方法:import datetime     # 直接导入 datetime 包  # 使用方法: # 如果我们使用第一种导入方法,那么我们就可以直接通过 datetime 模块调用 now() 函数:print(datetime.now()) # >>> 执行结果如下:# >>> 2020-01-16 14:20:19.534920# >>> 返回的是当前 年、月、日、时、分、秒、毫秒的 datetime 对象  # 使用第二种导入方法,那么我们就需要 datetime.datetime.now() 的方式来调用now() 函数:print(datetime.datetime.now()) # >>> 执行结果如下:# >>> 2020-01-16 14:22:11.534920# >>> 返回的是当前 年、月、日、时、分、秒、毫秒的 datetime 对象from datetime import datetimefrom datetime import timedelta     # 使用方法:timeobj = timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0) # days:间隔的天数# seconds:间隔的秒数# microseconds:间隔的毫秒数# milliseconds:间隔的微秒数# minutes:间隔的分钟数# hours:间隔的小时数# weeks:间隔的周数 # 传入类型为 整型 ,支持整数与负数,建议使用正数。# 获取时间对象from datetime import datetimenow = datetime.datetime.now() # 时间对象转为字符串date_str = now.strftime(format)from datetime import datetime  date = datetime.now() str_date = date.strftime('%Y-%m-%d %H:%M:%S')   # 括号内为时间类型的格式化标准的字符集合print(str_date) # >>> 执行结果如下:# >>> 2020-01-16 15:44:26      # 符合时间格式的字符串
  • [技术干货] 《看漫画学Python》笔记系列:三. 数字类型的数据;四.运算符
    上一章: 一.准备出发 二.编程基础    三. 数字类型的数据1.Python中的数据类型               python中有6种主要的内置数据类型:数字、字符串、列表、元组、集合和字典。               *列表、元组、集合和字典都是容器类型,只不过容器之间的内部结构不同。              不同的数据类型在计算机内部存储时会有所不同。不同的数据类型有时候不兼容,需要进行类型转换才可以计算,相同的数据类型是可以进行计算的2. 数字类型              有4种数字类型:整数类型、浮点类型、复数类型和布尔类型。              (1)整数类型为int类,表示的是不带小数的数字。有四种进制表示方式,分别是十进制、二进制、八进制和十六进制。              (2)浮点类型为float类,有两种表示方式,一是小数,二是科学技术法。              (3)复数类型为complex类。              在计算机中被表示为a+bj,其中a称为实部,b称为虚部,j称为虚数单位。              两个复数可以进行相加,实部和实部相加,虚部和虚部相加,形成新的复数。              (4)布尔类型为bool类,只有两个值:True和False              布尔类型属于整数类型,或说布尔类型是整数类型的一个子类。              Python任何类型的数据都可以通过bool()函数转换为布尔值,那些“没有的”、“空的”值会被转换成False,反之转换为True。3. 数字类型的相互转换              两种:隐式类型转换(自动转换)、显式类型转换(非自动)              比如,使用布尔类型的函数转换就是显式类型转换              <1>隐式类型的装换              看一个例子              <2>显式类型的装换              除复数外,三种数字类型如整数、浮点和布尔都有自己的转换函数,分别是int()、float()、和bool()函数    四.运算符1.算术运算符              主要是针对数字类型的运算,但是有些运算符也可以用于字符串以及列表类型的运算。              *注意除和地板除法区别,除结果为float类型,地板除法结果为整数类型。注意下述例子中负数的地板除,注意True的大小写,注意True被当作整数1参与运算。2.比较运算符              也称为关系运算符,结果为布尔值,即True或False              注意下方例子中浮点数与整数都可以进行比较3.逻辑运算符              “逻辑与”与“逻辑或”具有短路特征              注意下方例子,在不进行短路计算,结果不确定时,f1()函数会被调用。而在进行短路计算,有确定结果时,f1()函数不会被调用。【def f1():  #定义一个函数,冒号后为函数内容】5.位运算符              在计算机中,数据按照字节进行存放,1个字节为8位二进制数,此8位二进制数可以按位进行计算。              (1) ~ 取反 ,二进制数,不是0就是1,0取反就是1,1取反就是0。但!错啦!具体运算比较复杂,涉及到原码、补码、反码的问题。                   公式:~a = (a + 1) x -1 ,比如下面例子中a十进制数9,则~a为-10,如a十进制数为-9,则~a为10                   ❶ 所以,你知道正负数的原码、补码、反码分别如何计算吗?❷你知道在上述9和-10的例子中,按位取反具体是如何运算的吗?              【请耐心阅读,文末为大家解答哦~】              (2) & :如果两个位都为1的情况下,结果为1,只要一个为0,结果就位0              (3)  | :只有一个为1的情况下,结果就为1              (4)  ^ :如果一个是0,一个是1,结果就是1;如果都是为1,或者都是为0,结果为0              (5)>>右移:按二进制形式把所有的数字向右移动对应的位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1              如  00001010>>2=00000010;   10001010>>3=11110001              右移一位相当于除2,右移n位相当于除以2的n次方。这里是取商哈,余数就不要了。              (6)<< 左移:按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。              要求右操作数必须是非负值,在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方。              若a=15,即二进制数00001111,左移2位得00111100,没有1溢出,则左移两位相当于15乘2^2,15<< 2=60,即乘了4,即十进制数60。以下是左移两位溢出的高位中包含1的情况,64<<2为256。127<<2为5086.赋值运算符7.运算符的优先级———————————————————————————————————今天的学习就到这里,一起来看下帖中的2个问题。❶ 问:你知道正负数的原码、补码、反码分别如何计算吗?首选请注意分清下概念:取反:逻辑非“!”,逻辑取反, false变true,true变false,在C中,只要不是0就是真,所以!5值是0反码:正数的反码是其本身,对于负数其符号位不变其它各位取反(0变1,1变0)按位取反(~): 按位取反1变0,0变1。好了,现在解决问题疑问,请看机器数、真值、原码、反码、补码的相关定义1、机器数一个数在计算机中的二进制表示形式,叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号,正数为0,负数为1.比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是00000011。如果是 -3 ,就是 10000011 。那么,这里的 00000011 和 10000011 就是机器数。2、真值机器数的第一位是符号位,后边才是真正的数值,所以机器数的形式值就不等于真正的数值。例如上面的有符号数10000011,其最高位1代表负,其真正数值是 -3 而不是形式值131(10000011转换成十进制等于131)。所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。例:0000 0001的真值 = +000 0001 = +11000 0001的真值 = –000 0001 = –13. 原码原码就是符号位加上真值的绝对值,即用第一位表示符号,其余位表示值。比如如果是8位二进制:[+1](原码) = 0000 0001[-1](原码) = 1000 0001第一位是符号位。因为第一位是符号位,所以8位二进制数的取值范围就是:[1111 1111 , 0111 1111]。即[-127 , 127]原码是人脑最容易理解和计算的表示方式。4. 反码反码的表示方法是: 正数的反码是其本身,负数的反码是在其原码的基础上,符号位不变,其余各个位取反。[+1] = [00000001](原码)= [00000001](反码)[-1] = [10000001](原码)= [11111110](反码)可见如果一个反码表示的是负数,人脑无法直观的看出来它的数值。通常要将其转换成原码再计算。5. 补码补码的表示方法是:正数的补码就是其本身,负数的补码是在其原码的基础上,符号位不变,其余各位取反,最后+1 (即在反码的基础上+1)。[+1] = [00000001](原码) = [00000001](反码) = [00000001](补码)[-1] = [10000001](原码) = [11111110](反码) = [11111111](补码)对于负数,补码表示方式也是人脑无法直观看出其数值的。通常也需要转换成原码在计算其数值。❷你知道在上述例子中,按位取反具体是如何运算的吗?如何得到9按位取反为-10,10按位取反为-9的?(1)正数9按位取反——>(~9),计算步骤如下:正数原码=反码=补码所以9的原码/反码/补码: 0000 1001对补码取反 1111 0110(符号位一起取反)对其取反码: 1000 1001(符号位不变)取补码: 1000 1010(反码+1)最终结果  1000 1010,即-10(2)负数-10按位取反——>(~10)正数原码=反码=补码-10 原码:1000 1010-10反码: 1111 0101(符号位不变)-10补码: 1111 0110(反码+1)补码取反:0000 1001(符号位一起取反)正好得到一个整数,正数原码、反码、补码都一样所以最后结果 0000 1001,二进制为-9特殊:0按位取反,即(~0)为-1总结:按位取反公式:~a = (a + 1) x -1下一章:...
  • [常见FAQ] python 选手程序运行失败 路径读取写入相关 问题解决方案
    首先先排除其他基本问题造成的影响,如编码问题(使用UTF-8),引入包问题(比赛不支持pandas,请仅使用numpy和python3.7.3内置包), 1. 注释掉读取写入路径相关代码,上传压缩包,查看报错是否为 “打开选手输出文件失败”,(如报错为“选手程序运行失败”,说明不仅仅是路径有问题。请再好好阅读SDK文档) 2. 如1成立,依次取消路径读取,写入的代码的注释(写入可以随意往solution.txt里面写东西) 一,一,测试, 注:路径的定义请尝试使用*单引号*定义,如  'data/demand.csv' 3. 取消写入solution.txt的代码提交后如果出现 “分配方案不合法”,那么恭喜你,说明他找到了你的结果文件,路径方面的问题排查完了。 逻辑很简单,但希望能帮到一些人
  • [常见FAQ] 请问python编译环境下的pypy库是否是默认调用加速的
    请问python编译环境下的pypy库是否是默认调用加速的
  • [常见FAQ] 选手程序运行失败 Python
    哪位大佬可以给看看这样对吗
  • [区域初赛赛题问题] python支持包
    请问Python中支持random库和copy库吗
  • [区域初赛赛题问题] python本地编译运行正确,上传程序运行失败,希望能查一下后台报错
    【功能模块】python代码在本地虚拟机上(系统为ubuntu18.04)编译运行没问题,上传后提示选手程序运行失败【操作步骤&问题现象】1、2、【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [区域初赛赛题问题] python能否使用math configparser os 包
  • [区域初赛赛题问题] python本地编译运行正确,上传程序运行失败,希望查下后台报错
    【功能模块】python在云服务器(Ubuntu 18.04.4 LTS)编译正常运行无报错,上传后提示程序运行失败【操作步骤&问题现象】【截图信息】【日志信息】(可选,上传日志内容或者附件)队伍名:等着被优化用户名: april_wg提交语言:pypy提交时间:2022-03-17 17:59:21
  • [区域初赛赛题问题] python提交之后报 选手程序运行失败 错误
    打的zip包是CodeCraft-2022.zip ,zip包的的目录格式是CodeCraft-2022/src/CodeCraft-2022.pysrc下还包括其它几个文件,如下图所示不知道为什么运行不通过在我自己的电脑上和云linux主机上是可以跑的
总条数:2474 到第 页
上滑加载中