python0-常规操作

1,固定小数点后的位数

'''字符串格式化输出'''
'%.3f'%(10.1111111111)
'{:.3f}'.format(10.3333333333)
'''浮点数四舍五入'''
>>> a = 0.123456789
>>> for i in range(9):
...     round(a, i)

2,文件校验器

import hashlib
res = hashlib.sha256()
i = 0
with open('pycharm-community-2021.1.1.exe', 'rb') as f:
    for line in f:
        print(line)
        res.update(line)
        i+=1
print(res.hexdigest())
print(i)

source = input('原始编码:')
print(str(res.hexdigest()) == source)

3,进制转换

3.1,

3.2,十进制转为固定长度的二进制
'{:032b}'.format()

4,运行脚本后进入交互模式

python -i 脚本

5,虚拟环境设置与启动

virtualenv ~

或者使用 --system-site-packages,但会将真实环境所有的库都复制过来

virtualenv --system-site-packages ~
  • 启动
cd 到虚拟环境路径下的 Scripts 路径中
./activate

6,控制台输出带颜色的文字方法

https://www.cnblogs.com/Eva-J/p/8330517.html
如果要在cmd中显示颜色,需要加上

from colorama import init
init(autoreset=True)

7,python源码打包及加密(PyInstaller、Nuitka;cython、jmpy3、docker;PyArmor-收费;法律约束条款;靠服务收费而非产品收费;BeeWare)

  • 一、桌面图形程序(PyQt5、Tkinter、WxPython 等框架编写的图形程序)加密
    • 使用 PyInstaller: pyinstaller -F ***.py 进行打包,生成平台的二进制运行文件,比如 Windows 下的 exe 文件。但是使用 PyInstaller 编译打包出来的程序,很容易被反编译回去;比如,使用pyinstxtractor这个工具,就能把 PyInstallers 编译出来的 exe 还原回去;之后,再对还原出来的 pyc 文件进行反编译即可。
    • Nuitka 会将 Python 程序转化为 C 语言程序,然后再进行编译打包为二进制文件。众所周知,反编译 C 程序的难度是巨大的。以此,我们就极高地保障了图形界面程序的源码安全性。
  • 二 、Web 应用程序
    • 将 Python 代码文件编译为 C 文件,然后再将 C 文件编译为操作系统的动态链接库文件(Linux 下的 .so 文件和 Windows 下的 .pyd 文件)。以上步骤需要使用第三方库 cython,然后编写一个setup.py文件用来指定需要处理的 Python 文件,例如:
    from distutils.core import setupfromCython.Buildimport cythonizesetup(ext_modules = cythonize(["zmister.py"]))
    
    • 有一个第三方库 jmpy3 对上述流程进行了优化,支持单个文件和整个项目进行编译,使用起来更加友好
    • 需要注意的是,使用这种方式加密后的文件需要使用生成时的 Python 版本,这也算是一个小缺点。但是这个缺点可以通过打包为 Docker 镜像的方式解决掉。
  • 三、通用加密
    • PyArmor 是一个用于加密和保护 Python 脚本的工具。它能够在运行时刻保护 Python脚本的二进制代码不被泄露,设置加密后 Python 源代码的有效期限,绑定加密后的Python源代码到硬盘、网卡等 硬件设备。它的保障机制主要包括:
      • 加密编译后的代码块,保护模块中的字符串和常量
      • 在脚本运行时候动态加密和解密每一个函数(代码块)的二进制代码
      • 代码块执行完成之后清空堆栈局部变量
      • 通过授权文件限制加密后脚本的有效期和设备环境
    • 除了对 Python 代码进行加密,PyArmor 还能设置 Python 程序的许可方式,比如设置程序的使用期限、设置允许运行的设备、扩展其他认证方式等
    • 需要注意的是,pyarmor 是一个共享软件,安装之后处于试用模式,在试用模式下有一些限制,如果购买的话需298
    pip install pyarmor
    pyarmor obfuscate foo.py  #使用obfuscate选项对代码进行加密
    pyarmor licenses \--expired "2018-12-31" \--bind-disk "100304PBN2081SF3NJ5T" \--bind-mac "70:f1:a1:23:f0:94" \--bind-ipv4 "202.10.2.52" \        r001  #使用licenses      选项生成许可文件
    pyarmor obfuscate --with-license licenses/r001/license.lic foo.py  #使用--with-license参数指定许可文件
    pyarmor pack foo.py  #使用pack选项打包脚本
    

https://mp.weixin.qq.com/s/qsLoVIB1tC8cVRMp2jmSUw

  • 四、打包为Android包
    BeeWare

8,反射(由字符串获取与之同名的对象的值,getattr,globals())

  • getattr(object, name[, default]): 用于返回一个对象属性值,获取对象属性后返回值可直接使用。
>>>class A(object):
...     bar = 1
... 
>>> a = A()
>>> getattr(a, 'bar')        # 获取属性 bar 值
1
>>> getattr(a, 'bar2')       # 属性 bar2 不存在,触发异常
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'A' object has no attribute 'bar2'
>>> getattr(a, 'bar2', 3)    # 属性 bar2 不存在,但设置了默认值
3
>>>
  • 对于当前全局变量进行反射有两种方法: getattr, globals()
'''方法1'''
>>> a = 1
>>> getattr(sys.modules['__main__'], 'a')
1
'''方法2'''
>>> globals()['a']
1
  • globals()还可以用于使用字符串生成变量名
>>> globals()['cccc']=1
>>> cccc
1

9,Python图像库PIL的类Image及其方法

https://blog.csdn.net/leemboy/article/details/83792729

10,Python与C混编

Cython入门教程 : https://www.jianshu.com/p/cfcc2c04a6f5
用Cython加速Python到“起飞”:https://www.jb51.net/article/166720.htm
Python/C API Reference Manual: https://docs.python.org/3/c-api/index.html

11,cupy-一个由 CUDA 加速的 NumPy 兼容数组库

  • 安装
# For CUDA 8.0
pip install cupy-cuda80
 
# For CUDA 9.0
pip install cupy-cuda90
 
# For CUDA 9.1
pip install cupy-cuda91
 
# For CUDA 9.2
pip install cupy-cuda92
 
# For CUDA 10.0
pip install cupy-cuda100
 
# For CUDA 10.1
pip install cupy-cuda101
 
# Install CuPy from source
pip install cupy

12,样板代码合集网站

https://www.programcreek.com/python/

13,安装python后cmd输入python和pip无效

\python以及\python\Scripts配置到环境变量中

14,pip配置国内镜像源

https://blog.csdn.net/weixin_42151880/article/details/108084264
pycharm中也可以设置

15,dll注入

  • dll(dynamic lick library,动态链接库;与静态链接库相对),是windows系统中实现共享函数库概念的一种方法,这些库函数的扩展名是'.dll','.ocx'(包含activex控制的库),'.drv'(旧式的系统驱动)。
  • dll注入:可以利用dll机制实现进程通信或控制其他进程的应用程序。dll注入是让进程A前行加载程序B给定的a.dll,并执行程序B给定的a.dll中的代码。进程A不会主动加载B给定的a.dll,需要程序B通过某种手段让A加载,此时a.dll进入进程A的地址空间,并对进程A产生影响。
  • 正常需要dll注入的情况:
    • 为目标进程添加新的实用功能;
    • 需要一些手段辅助调试被注入dll的进程;
    • 为目标进程安装钩子程序(API Hook,可以截获数据流中的数据,对数据进行修改后发送给指定的进程/或者直接丢弃,pytorch中也有类似的概念)。
  • dll注入的方法:
    • 修改注册表
    • 使用CreateRemoteThread函数对运行中的进程注入dll
    • 使用SetWindowsHookEx函数对应用程序挂钩(HOOK)迫使程序加载dll(杀毒软件常用钩子进行处理)
    • 替换应用程序一定会使用的dll
    • 将dll作为调试器注入
    • 用CreateProcess对子程序注入dll
    • 修改被注入进程的exe的导入地址表
  • 利用python调用SetWindowsHookEx函数对应用程序挂钩(HOOK)迫使程序加载dll
    • ctypes是python外部函数库,从python2.5开始引入,提供了c兼容的数据类型,并且允许调用动态链接库/共享库中的函数,它可以将这些库包装起来给python使用。
    • ctypes.windll.user32
  • 消息钩子:Windows操作系统为用户提供了GUI(Graphic User Interface,图形用户界面),以事件驱动方式工作。在操作系统中借助键盘、鼠标、选择菜单、按钮、移动鼠标、改变窗口大小时,操作系统会将事先定义好的消息发送给相应的应用程序,应用程序分析收到的消息并进行执行。也就是说,敲击键盘时,消息会从操作系统移动到应用程序,消息钩子则可在此期间提取这些信息。

16,字典根据value得到key:

'''方法1'''
def get_key(value):
    for k,v in dict.items():
        if value == v:
            return k
'''方法2:反转字典'''
new_dict = {v:k for k,v in dict.items()}

17,多重条件排序

sorted中的key函数返回元组,会先按照元组第一个元素排序;如果第一个元素相同,按照元组第二个元素排序。

  • 按照元组的第一个从小到大排序
  • 如果第一个相同 则按照元组第2个从大到小 排序
a = [[2,3],[4,1],(2,8),(2,1),(3,4)]
b = sorted(a,key=lambda x: (x[0], -x[1]))
print b
musicBase = {'a': 5, 'b': 4, 'c': -2, 'd': -1, 'e': -1, 'f': 4}
musicSorted = sorted(musicBase.items(), key=lambda x: (x[1], -ord(x[0][-1])), reverse=True)

18,Python 实现按键精灵的功能-Windows版

https://blog.csdn.net/qq_37924224/article/details/103665301
ModuleNotFoundError: No module named ‘windows‘

19,第三方库安装的三种方式

20,打日志logging

'''基础用法'''
import logging
logging.basicConfig(level=logging.DEBUG, format=' %(asctime)s - %(levelname)s - %(message)s')
logging.disable(logging.CRITICAL)

logging.debug('Some debugging details.')
logging.info('The logging module is working.')
logging.warning('An error message is about to be logged.')
logging.error('An error has occurred.')
logging.critical('The program is unable to recover!')
  • logging相比于print的优势:
    • 输入 import logging 和 logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')有一点不方便。你可能想使用 print() 调用代替,但不要屈服于这种诱惑!在调试完成后,你需要花很多时间,从代码中清除每条日志消息的 print() 调用。你甚至有可能不小心删除一些 print() 调用,而它们不是用来产生日志消息的。日志消息的好处在于,你可以随心所欲地在程序中想加多少就加多少,稍后只要加入一次 logging.disable(logging.CRITICAL)调用,就可以禁止日志。不像 print(), logging 模块使得显示和隐藏日志信息之间的切换变得很容易。只要向 logging.disable() 传入一个日志级别,它就会禁止该级别和更低级别的所有日志消息。
    • 日志级别的好处在于,你可以改变想看到的日志消息的优先级。向basicConfig()函数传入 logging.DEBUG 作为 level 关键字参数,这将显示所有日志级别的消息(DEBUG是最低的级别)。但在开发了更多的程序后,你可能只对错误感兴趣。在这种情况下,可以将 basicConfig() 的 level 参数设置为 logging.ERROR,这将只显示 ERROR和 CRITICAL 消息,跳过 DEBUG、 INFO 和 WARNING 消息。(日志级别等级CRITICAL > ERROR > WARNING > INFO > DEBUG)
    • 对于用户希望看到的消息,例如“文件未找到”或者“无效的输入,请输入一个数字”,应该使用 print() 调用。我们不希望禁用日志消息之后,让用户看不到有用的信息。
  • 将日志记录到文件
    logging.basicConfig() 函数接受 filename 关键字参数,像这样:
    import logging
    logging.basicConfig(filename='myProgramLog.txt', level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
    
    • 日志信息将被保存到 myProgramLog.txt 文件中。虽然日志消息很有用,但它们可能塞满屏幕,让你很难读到程序的输出。将日志信息写入到文件,让屏幕保持干净,又能保存信息,这样在运行程序后,可以阅读这些信息。
  • 多通道(屏幕显示且保存)
    • logging库提供了多个组件:Logger、Handler、Filter、Formatter。Logger对象提供应用程序可直接使用的接口,Handler发送日志到适当的目的地,Filter提供了过滤日志信息的方法,Formatter指定日志显示格式。另外,可以通过:logger.setLevel(logging.Debug)设置级别,当然,也可以通过fh.setLevel(logging.Debug)单对文件流设置某个级别。
    import logging
    showHandler = logging.StreamHandler()
    fileHandler = logging.FileHandler(filename='test.txt', mode='a', encoding='utf-8')
    logging.basicConfig(level=logging.DEBUG, 
                        format=' %(asctime)s - %(levelname)s - %(message)s',
                        handlers=[showHandler, fileHandler])
    logging.disable(logging.DEBUG)
    logging.info('test')
    
  • 扩展:https://www.cnblogs.com/Eva-J/articles/7228075.html#_label14

21,Python项目打包成wheel笔记

pip install setuptools
pip install wheel
python setup.py bdist_wheel
运行完成后会在setup.py同级目录下生成dist文件夹,文件夹下有.whl文件

22,python动态获取属性和方法-反射

  • 对象
    • dir([obj]):调用这个方法将返回包含obj大多数属性名的列表(会有一些特殊的属性不包含在内)。obj的默认值是当前的模块对象。
    • hasattr(obj, attr): 这个方法用于检查obj是否有一个名为attr的值的属性,返回一个布尔值。
    • getattr(obj, attr): 调用这个方法将返回obj中名为attr值的属性的值,例如如果attr为’bar’,则返回obj.bar。
    • setattr(obj, attr, val):调用这个方法将给obj的名为attr的值的属性赋值为val。例如如果attr为’bar’,则相当于obj.bar = val。
    • __doc__: 文档字符串。如果类没有文档,这个值是None。
    • __name__: 始终是定义时的类名。
    • __dict__: 包含了类里可用的属性名-属性的字典;也就是可以使用类名.属性名访问的对象。
    • __module__: 包含该类的定义的模块名;需要注意,是字符串形式的模块名而不是模块对象。
    • __bases__: 直接父类对象的元组;但不包含继承树更上层的其他类,比如父类的父类。

23,Python模块及不同目录下导入模块方法

24,Pyinstaller打包

##################################Pyinstaller打包##################################
* V1
pyinstaller -c -D xxx.py  
  -c是运行时打开控制台,
  -D是最后生成两个文件夹dist和build,exe就放在dist里,文件大小较-F大,但是打开以及运行贼快。
* V2
pyinstaller -w -F xxx.py  
  -w是运行时隐藏控制台,
  -F生成单个exe文件,文件大小比-D小,但是打开以及运行贼慢,而且还经常有些小错误。
* -c,-w  和  -D,-F  可以交叉混合使用
* V3
pyinstaller -F -w -i xxx.ico xxx.py -p x:\...\site_packages
  -i:添加xxx.ico图标

##################################修改以及使用spec文件##################################
* 生成spec文件(pyinstaller也会生成spec文件)
pyi-makespec main.py
  运行后会得到main.spec文件
* 要在main.spec文件第一行,也就是a = Analysis([‘main.py’])这里面添加你的所有的.py文件,注意是所有的而且只能是.py文件,第一个是代码你的入口文件。另外假如.py文件不是与你的主入口文件main.py文件在同一个目录下,那么该文件要写绝对路径。
* 修改datas(放一些图片音频等文件),这里面是放非.py文件,这里是以元组的形式,(“文件夹的绝对路径”,“文件夹名”)注意这里不是写具体的文件名,而是文件夹。
* 或者在pathex中加入前缀路径,在datas中以元组加入 
datas=[
       ('formmain.ui', '.'),
       ('formmain2.ui', '.'),
       ('demo.jpg', '.')
       ]
* 使用
pyinstaller -c -D -i tubiao.ico main.spec  运行后会得到一个dist文件夹,文件夹里面又一个以main命名的文件夹,在mian文件夹里面找到exe即可

##################################一些问题##################################
* warning: *** _C.cp37-win_amd64.pyd is already exists 什么什么的
找到.spec配置文件修改配置文件,在配置文件中加入以下代码:
for d in a.datas:
	if '_C.cp37-win_amd64.pyd' in d[0]:
		a.datas.remove(d)
		break

25,argparse模块

笔记

笔记1-python3中sort函数key如何对两个参数做对比
笔记2-装饰器模板
笔记3-递归
笔记4-抽象类
笔记5-新式类广度优先多继承的继承顺序
笔记6-网络编程
笔记7-类的装饰器(property, classmethod, staticmethod)
笔记8-多进程
笔记9-多线程
笔记10-协程

posted @ 2021-06-30 20:02  tensor_zhang  阅读(209)  评论(0编辑  收藏  举报