如果不想去动 CMD, 且控制台输出仅做简单观测可以这样:
# -*- encoding: utf-8 -*-
import locale
lc = locale.getpreferredencoding()
s = 'GBK 控制台不能完全显示的表情(*●⁰♊⁰●)ノ'
def show_msg(msg):
# print(msg) # 注释掉后: UnicodeEncodeError: 'gbk' codec can't encode ...
print(msg.encode(lc, 'ignore').decode(lc))
show_msg(s) # GBK 控制台不能完全显示的表情(*●●)
这将忽略掉本地编码不能显示的字符, 如果要精确记录就用 utf8 编码输出到文件
from operator import itemgetter
lst = [ {'student_name': 'zhangsan', 'student_score': 65},
{'student_name': 'lisi', 'student_score': 95},
{'student_name': 'wangwu', 'student_score': 80},
{'student_name': 'maliu', 'student_score': 75},
{'student_name': 'zhuqi', 'student_score': 88} ]
top3 = sorted(lst, key=itemgetter('student_score'), reverse=True)[:3]
print top3
实例属性跟类属性是放在不同的字典里面的, print c1.x, c1.x = 233 这种操作就是字典操作
print c1.__dict__
print Cls.__dict__
这儿跟可变对象和不可变对象没啥关系;
类属性被所有实例共享, 实例都是从某个类(相当于模板)造出来的; 实例属性可各不相同, 还可以动态添加删除
这里是 foo.x=1.7 这种赋值方式的问题, 这会给实例动态添加一个(实例)属性 x, 跟类属性 x 不同
比如 print foo.y 会抛出 AttributeError, 但 foo.y=1 会动态添加一个实例属性 y
修改类属性用类名访问 Foo.x=2, 所有实例读取 x 属性时都是一样的值.(前提是没有被实例属性覆盖)
class Cls(object):
x = 1
c1 = Cls()
c2 = Cls()
print c1.x # 1
print c2.x # 1
Cls.x = 2
print c1.x # 2
print c2.x # 2
c1.x = 233
print c1.x # 233, 先得到实例属性
print c2.x # 2
print Cls.x # 2
C:\Windows\Fonts 文件夹下右键看属性, 没有属性的是字体系列, 双击打开它看里面每个字体文件的属性, 里面有该字体的名字。
这样的?
# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
song_ti = FontProperties(fname=r'C:\Windows\Fonts\simsun.ttc', size=20)
times_new_roman = FontProperties(fname=r'C:\Windows\Fonts\times.ttf', size=15)
ax = plt.gca()
ax.set_title(u'能量随时间的变化', fontproperties=song_ti)
ax.set_xlabel('Time (s)', fontproperties=times_new_roman)
ax.set_ylabel('Energy (J)', fontproperties=times_new_roman)
plt.show()
做一些会卡界面的操作放到单独线程更好, 比如在界面显示的同时要加载大量初始化数据,把加载数据的工作放在单独线程, 不阻塞界面的显示, 但是最好给出一个模态窗口提示数据正在加载,让用户稍等;
或者在主界面显示之前用闪屏提示数据正在加载,有 photoshop 的话打开看看它的界面显示过程
没有任何有效算法来判断字符串的编码。可以使用统计的方法估计编码,比如 chardet ,既然是统计,那对小样本几乎是无效的。同理,要判断两个较短的字符串是否为相同编码不大可能。如果有有效方法请纠正我。
用 python+pyqt 写过不少小工具, 都是图形界面(几乎都有用 qt designer 画控件), 都是用 pyinstaller 打包成 exe 的. 简单一个命令自动打包, 如果想要打的包精简干净去除一些不需要的东西, 需要仔细去研究 pyinstaller 的文档
https://pyinstaller.readthedocs.io/en/stable/,
我是用了几年 python 后才开始需要打包 exe 的, 写的工具要放到很多没有 python 环境的机器上运行. 入门没必要纠结怎么打包(也没必要), 可能连 pyinstaller 文档都读不下去, 就是 lz 所说的: 经验问题.
唉, 没想起在那儿搜, 前不久才注册了账号(´+ω+`)
@
Kisesy 非常感谢! 的确可行! 刚好满足需求!
可否贴一下原始地址, 唉... 对 windll 里面东西太陌生了
还想到的办法是执行 explorer /select 后获得它的进程号, 再打开同一个文件的窗口时如果有旧的进程存在就先将那个进程杀死(用 psutil)后再打开新窗口, 这样的话每个文件就需要绑定一个进程号, 不想去改那些代码了, 已经把 show_in_explorer(filename)独立出来了, 只需要给它个文件名就可以, 不想它跟其它代码发生关系
@
Kisesy 我也只找到这个, 感觉效果跟 explorer /select 是一样的, 翻了很久文档跟查找相关头文件就是找怎么用 ctypes 构造它的参数, 这方面资料太少了, 只好先用 explorer /select 先将就了下了
@
Kisesy 我试了下, 关闭窗口后 explorer 的应用进程消失, 然后转为后台进程, 但是一会儿过后这些后台进程会自动结束,
我的是 win10 1511. 所以我才寻找可以只打开一个窗口方法, 翻了很久 windows api, 至今没解决
连按几下←浏览器提示 Alt+←可以后退, 但是按 Alt+←也根本没反应!
52.0.2743.116 m (64-bit)
鼠标侧键后退也习惯了
我在实际当中使用过的一个情形:
有一大批函数都需要做相同或相似的参数检查, 每个函数里面都检查会造成大量重复代码, 那么就把检查部分提出来放到一个检查函数, 而这个检查函数返回的是经过参数检查的一系列函数, 也就是函数返回函数, python 里自然就是装饰器了, 只需要在那一系列函数上方套一个 @
check_func, 调用这一系列函数就自动完成参数检查了: 避免了重复代码, 避免了到处都要手动调用一个检查函数
另外, 也可以这样来测试
In [1]: ''.__sizeof__()
Out[1]: 21
In [2]: '1'.__sizeof__()
Out[2]: 22
In [3]: '123'.__sizeof__()
Out[3]: 24
In [4]: u''.__sizeof__()
Out[4]: 26
In [5]: u'1'.__sizeof__()
Out[5]: 28
创建一个空对象来看这个对象对应结构体的大小, 然后慢慢加字符进去看大小之差
sizeof 计算的是那个对象占用的空间(跟 C 语言的 sizeof 类似), 而 str, unicode 在底层都是一个 C 结构体表示的, 所以这样算出来的字节数是整个结构体的字节数(包括里面字符指针的内存大小)
如果要获得里面字符字节数, 需要直接访问里面的 buffer 信息
from array import array
s1 = '\xe4\xb9\xa0\xe6\x83\xaf'
s2 = u'\xe4\xb9\xa0\xe6\x83\xaf'
arr = array('c', s1)
print arr.buffer_info()[1] * arr.itemsize
uarr = array('u', s2)
print uarr.buffer_info()[1] * uarr.itemsize