-
因为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)
-
【功能模块】【操作步骤&问题现象】1、2、【截图信息】【日志信息】(可选,上传日志内容或者附件)
-
文章转自微信公众号-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 代码降到最低。当然,内置函数在某些情况下还不是最快的。比如在创建列表的时候,是字面量写法的速度更快
-
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\")
-
常见的图像任务通常需要把照片统一成相同的格式,所以此文章正是为了统一格式而生,常见的主要有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)查看结果
-
# 导入包与模块 # 第一种导入方法: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 # 符合时间格式的字符串
-
上一章: 一.准备出发 二.编程基础 三. 数字类型的数据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下一章:...
-
首先先排除其他基本问题造成的影响,如编码问题(使用UTF-8),引入包问题(比赛不支持pandas,请仅使用numpy和python3.7.3内置包), 1. 注释掉读取写入路径相关代码,上传压缩包,查看报错是否为 “打开选手输出文件失败”,(如报错为“选手程序运行失败”,说明不仅仅是路径有问题。请再好好阅读SDK文档) 2. 如1成立,依次取消路径读取,写入的代码的注释(写入可以随意往solution.txt里面写东西) 一,一,测试, 注:路径的定义请尝试使用*单引号*定义,如 'data/demand.csv' 3. 取消写入solution.txt的代码提交后如果出现 “分配方案不合法”,那么恭喜你,说明他找到了你的结果文件,路径方面的问题排查完了。 逻辑很简单,但希望能帮到一些人
-
请问python编译环境下的pypy库是否是默认调用加速的
-
哪位大佬可以给看看这样对吗
-
请问Python中支持random库和copy库吗
-
【功能模块】python代码在本地虚拟机上(系统为ubuntu18.04)编译运行没问题,上传后提示选手程序运行失败【操作步骤&问题现象】1、2、【截图信息】【日志信息】(可选,上传日志内容或者附件)
-
-
【功能模块】python在云服务器(Ubuntu 18.04.4 LTS)编译正常运行无报错,上传后提示程序运行失败【操作步骤&问题现象】【截图信息】【日志信息】(可选,上传日志内容或者附件)队伍名:等着被优化用户名: april_wg提交语言:pypy提交时间:2022-03-17 17:59:21
-
打的zip包是CodeCraft-2022.zip ,zip包的的目录格式是CodeCraft-2022/src/CodeCraft-2022.pysrc下还包括其它几个文件,如下图所示不知道为什么运行不通过在我自己的电脑上和云linux主机上是可以跑的
上滑加载中
推荐直播
-
华为云码道Agent集成与鸿蒙实战2026/08/11 周二 19:00-21:00
王一男-华为云码道产品规划专家;李炎-华为云码道产品专家;彭江敏-华为云鸿蒙端云一体化开发专家
本次直播带你解读华为云码道7月份产品新特性、新功能。更有专家演示码道Agent Space × 钉钉机器集成实战,从0到1打通消息通道;码道鸿蒙端云一体化实战,快速搭建员工签到系统。
回顾中 -
华为云开发者AI素养直播课·第五期2026/09/04 周五 16:00-18:00
林华鼎-华为云AI开发者运营负责人;蒋春阳-华为云AI开发者案例开发专家
本期直播内容: AI工具体验营 · 第5-8课连讲。Agent-Team 多智能体协作完成毕业设计实践
回顾中 -
华为云开发者AI素养ClassRoom·第六期2026/09/08 周二 19:00-20:00
樊渊-2026华为软件挑战赛冠军
高手来了:看软挑高手解析二维排样问题—从工业难题到算法突破
回顾中
热门标签